Опубликован: 20.02.2007 | Доступ: свободный | Студентов: 3483 / 787 | Оценка: 4.42 / 4.03 | Длительность: 40:03:00
Лекция 2:

Системные средства с открытым программным кодом: основы

Hping

Обычные Ping программы для проверки сетевых соединений используют запросы ICMP и ожидают ответа. Программа hping позволяет вам выполнять такое же тестирование, используя IP-пакеты, включая ICMP, UDP, и TCP.

Hping требует хорошего представления об IP-, TCP-, UDP-, и ICMP-протоколах. Использование программы hping в процессе изучения этих протоколов является отличным способом понять, что собой представляют эти протоколы, со всех сторон. В действительности hping - настолько универсальная программа, что не хватит целой книги, чтобы описать ее функции и понять какую информацию можно получить с ее помощью. Обращайтесь к README и HOWTO документации и другим ресурсам, поставляемым вместе с пакетом, чтобы увидеть возможности hping.

Реализация

Исходные тексты программы hping можно загрузить по адресу http://www.hping.org/. Процесс инсталляции детально описан в файле README, так же как и несколько примеров использования этой программы.

Примечание. Исполняемый модуль hping2 необходимо запускать, имея полномочия пользователя root, чтобы иметь возможность использовать некоторые программы сетевых интерфейсов, которые требуются для работы.
[root@originix hping2]# ./hping2 -c 4 -n -i 2 192.168.1.101
HPING 192.168.1.101 (eth0 192.168.1.101): NO FLAGS are set, 40 headers +
 0 data bytes
len=46 ip=192.168.1.101 flags=RA seq=0 ttl=128 id=54167 win=0 rtt=0.8 ms
len=46 ip=192.168.1.101 flags=RA seq=1 ttl=128 id=54935 win=0 rtt=0.7 ms
len=46 ip=192.168.1.101 flags=RA seq=2 ttl=128 id=55447 win=0 rtt=0.7 ms
len=46 ip=192.168.1.101 flags=RA seq=3 ttl=128 id=55959 win=0 rtt=0.7 ms

--- 192.168.1.101 hping statistic ---
4 packets tramitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.7/0.8/0.8 ms
2.6.

По умолчанию hping использует TCP-протокол. Программа создает пустые TCP-пакеты с размером окна равным 64 и неустановленными флагами заголовка, и посылает эти пакеты на порт с номером 0 требуемого хоста. В данном примере флаг -c 4 указывает программе на необходимость послать 4 пакета, флаг -n запрещает разрешение имен, и флаг -i 2 задает интервал между попытками равным двум секундам.

Примечание. Есть только один способ обнаружить использование программы hping в вашей сети: установить систему обнаружения вторжений, анализирующей трафик по порту с номером 0.

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

Какой ответ мы получим от системы? Параметр len полученных обратно IP-пакетов. ip, соответственно - IP-адрес. flags показывает, какие TCP-флаги установлены в получаемых обратно пакетах. В данном случае установлены флаги RESET и ACK. Другие возможные значения: SYN (S), FIN (F), PUSH (P), и URGENT (U). seq - номер последовательности, id содержит значение IP ID поля, win - размер TCP-окна, и rtt - время прохождения запроса в оба конца. Использование флага -v позволит нам получить еще немного дополнительной информации о заголовках протокола.

Сейчас все это кажется весьма загадочным. Это отлично, что мы можем получить всю эту информацию, но что мы с ней можем сделать?

Совет. Многие средства в этой лекции могут быть использованы взломщиками для кражи информации. Hping не является исключением. Hping в своих возможностях аналогичен Netcat: предоставлять контроль над сетевыми протоколами на низком уровне. Но тогда, как Netcat сосредоточен на сетевых соединениях, hping направлен на анализ заголовков протоколов. Он позволяет создавать TCP, UDP, ICMP, raw IP и другие протоколы, которые вам захочется. Программа позволяет манипулировать заголовками, полями, флагами и параметрами. Создавать отдельные пакеты, посылать их в сеть, и анализировать полученный ответ.

Пример из жизни. Использование hping для сканирования порта и определения ОС

Документ HOWTO hping описывает довольно подлый способ проведения сканирования порта, как будто это делает кто-то другой - однако фактически получить результаты сканирования! Для начала нужно обнаружить хост, который не слишком много работает с TCP/IP. Мы можем это сообщить, подав команду hping -r на машину и посмотрев номер IP ID. Опция -r указывает hping отобразить инкрементные ID вместо реальных. Это даст нам представление о том, сколько трафика задействовано в настоящее время.

[root@originix hping2]# hping -r 192.168.1.200
HPING 192.168.1.200 (eth0 192.168.1.200): no flags are set, 40 data bytes
60 bytes from 192.168.1.200: flags=RA seq=0 ttl=64 id=32385 win=0 time=74 ms
60 bytes from 192.168.1.200: flags=RA seq=1 ttl=64 id=+1 win=0 time=82 ms
60 bytes from 192.168.1.200: flags=RA seq=2 ttl=64 id=+1 win=0 time=91 ms
60 bytes from 192.168.1.200: flags=RA seq=3 ttl=64 id=+1 win=0 time=50 ms
60 bytes from 192.168.1.200: flags=RA seq=4 ttl=64 id=+1 win=0 time=73 ms
60 bytes from 192.168.1.200: flags=RA seq=5 ttl=64 id=+1 win=0 time=78 ms
2.7.

Видите, как ID увеличивается каждый раз на +1? Это означает, что он не отсылает никому никакой трафик, кроме нас. Мы нашли подходящий хост, который можно обмануть.

Чтобы справиться с этим, нам нужны два отдельных экземпляра hping. Первый экземпляр последовательно зондирует нашу жертву, поэтому мы можем подсмотреть номер ID. Второй экземпляр hping посылает пакеты на порт целевого хоста, которые создают впечатление, что они пришли от нашей поддельной машины.

Следующая команда сообщает hping сделать так, чтобы она выглядела, как "невинный" хост, 192.168.1.200, и посылает пакет SYN (-S) на порт Web-сервера ( -p 80 ) целевой машины.

[root@originix hping2]# hping2 -a 192.168.1.200 -p 80 -S targethost

Теперь, если порт 80 целевой машины открыт, целевая машина посылает пакет SYN/ACK на 192.168.1.200. Поскольку 192.168.1.200 никогда не посылал SYN в начале, то он ответит пакетом RST. Поскольку 192.168.1.200 придется участвовать в трафике IP, чтобы это завершить, то номер IP ID на нашем первом hping быстро возрастает больше, чем на 1, как только мы пытаемся зондировать порт 80. Если мы не видим изменений в приращении ID, это означает, что порт закрыт (поскольку закрытый порт на целевой машине будет просто посылать пакет RST на 192.168.1.200, что будет просто игнорироваться).

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

Снятие отпечатков пальцев OS. Номера IP ID и порядковые номера TCP. Говорят нам о многом. Анализируя ответы, которые мы получаем от применения hping к конкретному хосту, мы иногда можем предположить, с какой операционной системой работает эта машина, на основе известных особенностей реализации стека TCP/IP этой операционной системы.

Одна из таких особенностей, которую может уловить hping, состоит в том, что реализация TCP/IP в Windows применяет другой порядок байтов в своих полях IP ID. В hping есть флаг -W, который уравнивает порядок байтов и позволяет ID и инкрементам ID отображаться корректно, но если мы попытаемся провести hping2 -r без спецификации -W в окне Windows, мы увидим очень интересную конфигурацию.

[root@originix hping2]# ./hping2 -r 192.168.1.101
HPING 192.168.1.101 (eth0 192.168.1.101): NO FLAGS are set, 40 headers + 0      data bytes
len=46 ip=192.168.1.101 flags=RA seq=0 ttl=128 id=52132 win=0 rtt=0.8 ms
len=46 ip=192.168.1.101 flags=RA seq=1 ttl=128 id=+768 win=0 rtt=0.9 ms
len=46 ip=192.168.1.101 flags=RA seq=2 ttl=128 id=+512 win=0 rtt=0.9 ms
len=46 ip=192.168.1.101 flags=RA seq=3 ttl=128 id=+512 win=0 rtt=0.9 ms
len=46 ip=192.168.1.101 flags=RA seq=4 ttl=128 id=+768 win=0 rtt=1.9 ms
len=46 ip=192.168.1.101 flags=RA seq=5 ttl=128 id=+512 win=0 rtt=0.9 ms
len=46 ip=192.168.1.101 flags=RA seq=6 ttl=128 id=+4096 win=0 rtt=1.4 ms
len=46 ip=192.168.1.101 flags=RA seq=7 ttl=128 id=+2560 win=0 rtt=0.9 ms
len=46 ip=192.168.1.101 flags=RA seq=8 ttl=128 id=+512 win=0 rtt=0.8 ms
len=46 ip=192.168.1.101 flags=RA seq=9 ttl=128 id=+512 win=0 rtt=0.9 ms
2.8.

Обратите внимание на инкременты ID. Каждый инкремент кратен 256! Мы нашли машину Windows! Поскольку все Windows машины используют этот конкретный порядок байтов, любая машина, последовательно демонстрирующая этот эффект 256 является, скорее всего, Windows машиной.

В лекции ""Сканеры портов"" мы обсудим средство, называемое nmap, которое производит продвинутое снятие отпечатков пальцев на базе большой коллекции специфичных для OS конфигураций и поведения TCP/IP.

RPCINFO

Одна из наиболее мощных (и опасных) служб, которые могут быть запущены под управлением Unix, - служба регистрации RPC. RPC (Удаленный вызов процедур) обеспечивает подсистему для упрощения и стандартизации межпроцессорного взаимодействия. Тот, кто пишет приложения для RPC, пользуется специальными опциями компиляции и библиотеками для создания приложений и распространения клиентской и серверной частей приложения соответственно. Кто бы ни захотел запустить на выполнение серверную часть RPC-приложения, ему потребуется запустить и portmap или rpcbind (два синонима - rpcbind появился в последних версиях системы Solaris).

Portmap/rpcbind - это утилиты, которые прослушивают TCP- и UDP-порт с номером 111. Любые программы, которые хотят принимать RPC-запросы, должны зарегистрироваться с помощью portmapper. В процессе регистрации portmap записывает имя/номер, версию, описание, и порт, который прослушивает программа. Это важное различие. Все RPC-приложения прослушивают свой собственный порт; серверная программа или запрашивает отдельный порт для соединения или требует порт для соединения с ядром. Portmap просто сообщает клиентскому приложению, запрашивающему использование RPC-сервиса, какой порт необходимо использовать для соединения. RPC-сервисы могут соединяться напрямую без участия portmap. Популярными RPC-службами являются NFS (Network File System) и NIS/YP (Network Information Service or Sun Yellow Pages).

Примечание. Не все реализации NFS регистрируются с помощью portmapper. Эти NFS-службы по умолчанию обычно пользуются TCP- и UDP-портом 2049.

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

Реализация

rpcinfo -p hostname. Это основной способ использования rpcinfo для вывода полного списка RPC-служб, которые зарегистрированы с использованием portmapper.

rpcinfo -u hostname programid [version]. Получив ID-номер RPC-программы, версию и номер порта мы можем использовать эту команду для создания RPC-вызова и получения информации об отклике. Добавление параметра -n portnumber позволяет использовать отличный от зарегистрированного portmapper номер порта. Параметр -u означает использование UDP; чтобы использовать TCP, можно применить параметр -t. Номер версии программы - не обязательный параметр.

rpcinfo -b programid version. Эта команда позволяет сделать широковещательный RPC-запрос с целью получить соединение со всеми машинами в локальной сети и определить те из них, которые ответят. Таким способом можно выявить машины, которые используют уязвимые RPC-службы.

rpcinfo -d programid version. Это команда может получить идентификатор/номер версии "незарегистрированных" программ. Может выполняться только на локальной машине с полномочиями пользователя root.

rpcinfo -m hostname. Параметр -m то же самое, что и -p за исключением того, что он выводит на экран таблицу статистики: число RPC-запросов, которые обслужила RPC-служба. Этот параметр доступен не на всех платформах. Linux-версии не включают этот параметр, но более новые версии Solaris (SunOS 5.6 и выше) его поддерживают. За более подробной информацией обращайтесь к man-страницам.

Пример вывода

Проанализируем некоторые примеры вывода, который мы получили, выполнив команду rpcinfo -p originix.

Program vers  proto   port
100000  2       tcp   111   portmapper
100000  2       udp   111   portmapper
100011  1       udp   749   rquotad
100011  2       udp   749   rquotad
100005  1       udp   759   mountd
100005  1       tcp   761   mountd
100005  2       udp   764   mountd
100005  2       tcp   766   mountd
100005  3       udp   769   mountd
100005  3       tcp   771   mountd
100003  2       udp  2049   nfs
100003  3       udp  2049   nfs
300019  1       tcp   830   amd
300019  1       udp   831   amd
100024  1       udp    94   status
100024  1       tcp   946   status
100021  1       udp  1042   nlockmgr
100021  3       udp  1042   nlockmgr
100021  4       udp  1042   nlockmgr
100021  1       tcp  1629   nlockmgr
100021  3       tcp  1629   nlockmgr
100021  4       tcp  1629   nlockmgr

Здесь мы видим, что на машине запущен NFS, как nfs, а также работают nlockmgr и mountd. Теперь мы можем поискать в интернете, чтобы увидеть, можем ли мы найти средство для взлома NFS, чтобы испытать его на этом хосте.

Проблемы с RPC

У NFS и NIS есть уязвимые места, которые легко обнаружить с помощью rpcinfo. Утилита portmapper небезопасна, поскольку единственный способ аутентификации основан на TCP-пакетах и может быть легко подделан. Sun сделал шаг в сторону усиления безопасности RPC введя Secure RPC, который использует разделяемый DES-ключ аутентификации, который должен быть известен обеим сторонам. Однако, в большинстве случаев, у внешних сетей не должно быть возможности доступа к нашей службе portmapper. Если такая возможность есть, неизвестно, какую информацию они могут получить - или что еще хуже, какие дыры они могут открыть. Выключайте или блокируйте службы с помощью брандмауэра, чтобы внешние пользователи не могли получить к ним доступ.