|
Solari Контактные данные. Онлайн-cловари и энциклопедии. interno-luce.ru |
Старая статья так нигде и не напечатанная, ничего не буду менять, все кроме версии nmap бьет.
Выхода второй части фильма Матрица, несомненно ждали многие, но как и в большинстве хитов продолжение к сожалению получилось так себе. Это как раз тот случай, когда хорошее финансирование может испортить неплохую задумку. Вместо сюжета зритель получил картину буквально перегруженную спецеэффектами, а все остальное место заняла реклама. Все что носилось, двигалось, звонило и вообще хоть как-то присутствовало в фильме, все это часть большого рекламного ролика длиной в два часа. Но небольшой эпизод продолжительностью менее десяти секунд привлек и компьютерную общественность.
В самом конце фильма Тринити (Trinity) взламывая компьютер не использовала какие то красивые, но совсем неудобные 3D интерфейсы, а это был обычный текстовый терминал и для работы использовалась “обычная” программа Nmap (Network Mapper) и кстати использованая уязвимость также имела место в нашей реальности. Представляете, каково автору, чтобы засветить свою продукцию в этом фильме многие фирмы отвалили не мало баксюков, сайт программы (http://www.insecure.org/nmap/) буквально завалили скриншотами).
А мы немного поговорим об этой действительно замечательной программе.
И так, что такое Nmap. Это программа, предназначенная для сканирования и аудита безопасности сети. Оба, хакерскую утилиту расписываю. Да можно и так сказать. Не вина разработчика, что его программу используют чаще именно для взлома, сисадмины же в большинстве своем игнорируют, а когда хватаются, то уже поздно бывает. Я тут недавно обзаведясь Blin’ом моим знакомым которые работают в Интернет кафе сисадминами показал, что там у них действительно творится. Контроль за запущенными приложениями до этого сводился к нажатию магической комбинации из трех пальцев, если ничего подозрительного не выявлялось, значит делалось предположение — компьютер чист, что как минимум наивно. Больше всего меня поразило, что они и понятия не имеют что такое сетевой порт. Да, в дальнейшем я не буду выделять «плохих» и «хороших», ломают и те и другие только конечный результат может быть разный. И граница между хорошим плохим подчас довольно условная, все зависит от контекста. Так если бы «злобные» хакеры устроили дефейс (это когда главную страницу сайта подменяют) всенародной любимице Мясане, то возмущались бы наверное все, а вот когда хакеры атаковали некоторые сайты в знак протеста войне в Ираке, что-то я не помню чтобы кто-то вообще высказался отрицательно.
И так программа Nmap может быть использована для сканирования сетей с любым количеством хостов, определения состояния объектов сканируемой сети, а также портов и соответствующих им служб. При этом Nmap по скорости работы намного превосходит большинство известных мне утилит, например сеть «С» класса (253 хоста) сканируются меньше минуты, для примера GFI LANguard Network Security Scanner работающий под Windows (http://www.gfisoftware.com/) может сканировать под настроение и целый час. Согласен наворотов у последней довольно много, но опять же все за баксюки. А Nmap распространяется абсолютно бесплатно с исходными текстами по лиценции GPL и работает под всевозможными версиями *nix и не забыта и народная Windows. При сканировании Nmap использует много различных методов сканирования, таких, как UDP, TCP connect(), TCP SYN (полуоткрытое соединение), FTP proxy (прорыв через ftp), Reverse-ident, ICMP (ping), FIN, ACK, Xmas tree, SYN и NULL-сканирование. Более подробное их описание приведено в разделе «Опции выбора методов сканирования» в nmap_manpage-ru.html, которое поставляется вместе с программой. Самый простой вид сканирования TCP connect() основанный на особенностях одноименного протокола и не требующий привилегий root при запуске. Для начала, что такое сетевой порт. Это вопреки устоявшемуся мнению не какой то шнурок позади системного блока уходящий в просторы Интернета. Порт надо воспринимать как некую дверь, которую открывает запущенная программа. Необходимость в этой двери возникает из-за того чтобы иметь возможность различать сервисы запущенные на компьютере. Сетевой адрес, то один, а приложений может быть много. Для этого каждая программа открывает виртуальный порт с уникальным номером и клиент желающий получить нужный ему сервис в своем запросе указывает номер порта. Все соответствия номеров портов можно найти в файле /etc/services, хотя по большому счету использовать нумерацию по-умолчанию и необязательно. Но тогда прийдется указывать его или вручную или изменять в настройках программы клиента. Так, например стандартный порт WWW http — 80, т.е. набрав в строке браузера любой адрес мы обращаемся за документом именно к этому виртуальному порту, в некоторых ссылках встречается, например http://www.host:8100/ т.е. сервер слушает порт 8100 ( иногда так настраивают сервер, чтобы иметь возможность выдать документ с другой кодировкой). При этом в случае удачного запроса для открытия соединения происходит трехшаговый обмен пакетами (закрывается соединение за четыре шага). Сервер должен быть готов к приему пакетов произведя один из вызовов socket (), bind () или listen (). Клиент пытается соединиться, произведя вызов connect () при этом посылается пакет в котором указан IP-адрес сервера, номер порта и флаг SYN показывающий на желание установить соединение. Сервер если у него открыт данный порт, в ответ посылает комбинацию ACK и SYN, на что клиент отвечает пакетом с флагом ACK, после чего соединение считается установленным. Вот эта особенность и используется при сканировании методом TCP connect(). После такого сканирования можно будет знать какие сервисы реально используются на подопытном компьютере, а зная что за дверь перед тобой то можно пробовать и подобрать ключик к замку. И кстати различные трояны также используют порты, так довольно известный BackOriffice, использует 31337/31338 порты так, что наличие открытыми этих портов может свидетельствовать и об установленном трояне.
Для запуска TCP connect() используется флаг -sT, хоть nmap и позволяет сканировать сразу всю сеть (задав, например 192.168.0.0/24), но в примере будем проверять только один компьютер (а то можно и по зубам получить за хулиганство). Дополнительно для демонстрации возможностей программы используем опцию -О (Operating system detection) позволяющую определить операционную систему сканируемого хоста. При этом исследуемому хосту отправляются определенные запросы и на основании ответов на них программа делает предположение об используемой Оси (сравнивает полученный «отпечаток» с шаблонами в файле nmap-os-fingerprints). Этот метод требует наличия хотя бы одного закрытого и одного открытого порта на исследуемом хосте. Подробности в русском переводе можно просмотреть в документе Remote OS detection via TCP/IP Stack FingerPrinting (http://www.insecure.org/nmap/nmap-fingerprinting-article-ru.html). Но определение ОСи требует уже права администратора.
[root@grinder /]# nmap -sT -O 192.168.0.5
Starting nmap 3.27 ( www.insecure.org/nmap/ ) at 2003-06-18 14:49 EEST
Interesting ports on alex (192.168.0.5):
(The 1622 ports scanned but not shown below are in state: closed)
Port State Service
139/tcp open netbios-ssn
Remote operating system guess: Windows NT 3.51 SP5, NT4 or 95/98/98SE
Nmap run completed — 1 IP address (1 host up) scanned in 8.856 seconds
Все по-моему понятно, перед нами одна из операционных систем от Microsoft со своим дырявым netbios’ом. Для интереса запустим tcpdump в другой консоли и посмотрим немножечко за ходом процесса сканирования.
1.14:52:58.361819 serg > alex: icmp: echo request
2.14:52:58.362212 arp who-has serg tell alex
3.14:52:58.362266 arp reply serg is-at 0:50:bf:65:3a:38
4.14:52:58.362559 alex > serg: icmp: echo reply
5.14:52:58.797837 serg.34608 > alex.300: S 3047551943:3047551943(0) win 5840 <mss 1460,sackOK,timestamp 47179 0,nop,wscale 0> (DF)
6.14:52:58.798213 alex.300 > serg.34608: R 0:0(0) ack 3047551944 win 0
7.14:52:58.797615 serg.34607 > alex.netbios-ssn: S 3047289756:3047289756(0) win 5840 <mss 1460,sackOK,timestamp 47179 0,nop,wscale 0> (DF)
8.14:52:58.797928 alex.netbios-ssn > serg.34607: S 11207906:11207906(0) ack 3047289757 win 8760 <mss 1460,nop,nop,sackOK> (DF)
9.14:52:58.798011 serg.34607 > alex.netbios-ssn: . ack 1 win 5840 (DF)
10.14:52:58.803760 serg.34607 > alex.netbios-ssn: R 1:1(0) ack 1 win 5840 (DF)
Нумерация строк добавлена для облегчения объяснения и много строк из вывода tcpdump пропущено за ненадобностью. В строке 1 видим, что компьютер serg посылает на alex icmp-запрос т.е. проверяется наличие хоста в сети обыкновенным ping’ом если бы проверяемый компьютер не ответил на него, то дальнейшая проверка смысла бы не имела (в нашем случае). Так как программу я запустил сразу после загрузки системы и еще работающие компьютеры не разобрались кто есть кто, то в строках 2 и 3 зацепили работу интерфейсного уровня стека TCP/IP. В них при помощи протокола ARP (Addres Resolution Protocol, протокол разрешения адреса) выясняется МАС-адрес соответсвующий IP-адресу компьютера serg. В строке 4 виден ответ на icmp-запрос. Далее в строке 5 с порта 34608 компьютера serg посылается пакет синхронизации SYN (о чем говорит символ «S») на порт 300 сканируемого компьютера. В следующей строке 6 сканируемый компьютер в ответ посылает пакет RESET (буква «R»), указывающий на отсутствие сервиса на 300 порту. В строке 7 видим, что компьютер serg посылает сегмент SYN на netbios-ssn порт (139) сканируемого компьютера и получает в ответ строку 8 с установленным ACK и своим SYN сегментом. После чего в строке 9 сканирующий компьютер подтверждает прием SYN пакетом с установленным ACK. Строкой 10 сканирующий компьютер закрывает соединение посылкой RESET. Из всего увиденного можно сделать вывод, что порт netbios-ssn этого компьютера предоставляет определенный сервис и в дальнейшем нападающий уже подбирает ключики к этому порту. Этот метод сканирования самый простой и для повседневного администрирования вполне достаточен. Но он имеет множество недостатков. Среди которых непроницаемость для межсетевых экранов из-за которой можно сделать неправильный вывод об запущенных сервисах, оставление следов в лог-файлах сканируемого компьютера. Для преодоления этих проблем в nmap используется множество других ухищрений. Так например сканирование с опцией -sS («half connection») полностью не открывает соединения (не проходит всех трех этапов). При этом посылается сегмент SYN и в случае получения от сканируемого компьютера ACK (порт активный) в ответ для сброса соединения посылается RESET. Если же в ответ вместо ACK пришел RST делается очевидный вывод об не активности порта. Такое сканирование в лог-файлах следов не оставляет. Чтобы обмануть файрволы, которые иногда просто удаляют пакеты с установленным SYN, применяются различные методы, так например вместо SYN, посылается в нахалку сразу ACK якобы в ответ на запрос о соединении, если пришел в ответ RST, значит порт не фильтруется файрволом, если же сообщение о недоступности хоста значит порт защищен файрволом.
Аналогично можно отсканировать и по UDP протоколу, которое правда идет напорядок медленей.
[sergej@grinder /]# nmap -sU 192.168.0.5
Starting nmap 3.27 ( www.insecure.org/nmap/ ) at 2003-06-17 22:40 EEST
Interesting ports on alex (192.168.0.5):
(The 1469 ports scanned but not shown below are in state: closed)
Port State Service
137/udp open netbios-ns
138/udp open netbios-dgm
Nmap run completed — 1 IP address (1 host up) scanned in 25.416 seconds
Tcpdump запущенный во втором терминале покажет отличие в работе протоколов TCP и UDP.
1. 23:01:31.899891 arp who-has alex tell serg
2. 23:01:31.900275 arp reply alex is-at 0:2:44:7:fc:c4
3. 23:01:31.900324 serg > alex: icmp: echo request
4. 23:01:31.900655 alex > serg: icmp: echo reply
5. 23:01:48.568802 serg.36305 > alex.459: udp 0
6. 23:01:48.569103 alex > serg: icmp: alex udp port 459 unreachable
7. 23:01:49.386064 serg.36306 > alex.netbios-ns: [|SMB]
8. 23:01:49.386149 serg.36306 > alex.netbios-dgm:
9. 23:01:50.994801 alex.netbios-dgm > 192.168.0.255.netbios-dgm: NBT UDP PACKET(138)
10. 23:01:50.994877 alex.netbios-ns > 192.168.0.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
Здесь в строках 1,2 удалось отловить момент запроса МАС-адреса компьютера alex. Строки 3,4 представляют собой запрос утилитой ping и ответ сканируемого компьютера. В строке 5 со сканирующего компьютера с порта 36305 на порт 459 сканируемого компьютера посылается UDP пакет без данных, на что в следующей строке получаем в ответ icmp пакет гласящий о недоступности данного порта. Некоторые сисадмины, чтобы избежать DOS атак основанных на ping (bandwidth consumption) отфильтровывают их firewall’ом (-p icmp -j DENY). Данный пример показывает, что ICMP (Internet Control Message Protocol, протокол контрольных сообщений Интернет, описан в RFC 777, 792) это не только ping. Так спецификация протокола UDP говорит, что он должен подтверждать принятые датаграммы (это ложится на плечи приложений его использующих), а запретив прием ICMP можно остаться в неведении, что происходит с отправленными датаграммами. В строках 7,8 посылаются пакеты на порты 137 и 138 (netbios-dgm, netbios-ns). Но так как протокол UDP в отличие от TCP не устанавливает виртуальное соединение (как в рекламе «взула i забула», т.е. послан пакет в ответ и про него забыли) то отвечает на запрос broadcast-сообщением (всем) из которого делается вывод о том, что порт открыт.
Интересно, что сканирование Microsoft’овских систем проходит быстрее и все потому, что они в отличие от *nix, игнорируют рекомендации RFC 1812 и не ограничивают количество ICMP сообщений выдаваемых системой.
Остальные методы хорошо расписаны на сайте и в прилагающейся документации, которую можно и просто почитать в образовательных целях, чтобы разобраться с особенностями протоколов Интернет.
Напоследок хочу предостеречь некоторые буйны головы. Не смотря на то, что в описании некоторых методов присутствует заключение о том, что их трудно обнаружить, большинство утилит относящихся к так называемым системам детектирования вторжения — IDS (Intrusion Detection Systems) уже знают обо всех возможных способах сканирования. И ответ на такое сканирование, может быть установка firewall на сканирующий компьютер. Или запись информации о нем в файл /etc/hosts.deny, что полностью блокирует доступ и можно потом вообще на этот сервер больше удалено не попасть, часто сисадмины так попадаются.
ALL: $TARGET$
Где под $TARGET$ скрывается IP-адрес сканирующего компьютера.
Но, кроме того позволяет выполнить в ответ любую команду (или их набор). Это может быть и тот же nmap, traceroute и tcpdump позволяющие собрать максимум информации о сканирующем компьютере, чтобы потом поймать и уши надрать. А при определенной злобности сисадмина это может быть и что-то вроде, получи фашист гранату от советского бойца:
teardrop $TARGET$ -s $PORT$ -t 139 -n 5000
Ведь всякие там виннюки официально, по-моему еще никто не отменял. Завесить может конечно и не получиться, но перезагрузиться прийдется (писал в 2002 году когда еще Win98 была). И что самое интересное, что «злобные» хакеры вряд ли при этом пострадают. Они работают из под прокси, собственноручно написанными утилитами с нормальной системой (судя по опросу 1850 человек «Top 75 Network Security Tools» на том же сайте по адресу http://www.nmap.org/tools.html это конечно же OpenBSD). А вот «хакер» Вася Пупкин выкачавши пару готовых эксплоитов и решившийся попробовать их в деле, прямо из Windows может попасть под горячую руку. На этом все. Мы рассмотрели лишь небольшую часть известных методов, но надеюсь, что этого будет достаточно для понимая самой сути идеи сканирования. И кстати для нелюбителей работать в командной строке вместе с программой устанавливается и Gtk фронтэнд — nmapfe.
Как видите приложения подобные nmap, позволяют взглянуть на сеть глазами потенциального злоумышленника и во время закрыть всевозможные дыры. А посему очень полезны для улучшения безопасности сетей и систем и поэтому должны быть в повседневном использовании у каждого сисадмина и даже пользователя. Linux forever.