Сканеры портов
Сканирование UDP-портов
Естественно, nmap это тоже делает. Используя флаг -sU, можно посылать пустые UDP-пакеты и ожидать в ответ ICMP-сообщения "port unreachable". Если не получено никаких сообщений в ответ, порт считается открытым, как это показано в следующей таблице. Здесь вы можете видеть несколько возможных ошибок. Если возвращаемые ICMP-сообщения блокируются брандмауэром, это может означать, что все UDP-порты хоста открыты. Также, если UDP-трафик непосредственно блокируется брандмауэром, это по-прежнему означает, что все UDP-порты открыты. Эта та же ловушка, в которую мы попадали, используя Netcat в процессе сканирования UDP-портов. Вдобавок, многие хосты могут посылать наружу только ограниченное число ICMP-сообщений об ошибках в секунду для предотвращения перегрузки сети. Nmap может автоматически корректировать эту ситуацию, если она определяется, но это может очень сильно замедлить сканирование. Поскольку UDP-протокол работает без установления соединения и не ограничен необходимостью подтверждения получения входящих пакетов, нет полного решения этой проблемы.
Nmap посылает на порт хоста | Nmap получает от порта хоста | Nmap принимает решение |
---|---|---|
Пустой UDP пакет | Nothing | Возможно, порт открыт, если хост отвечает на Ping (хост работает); возможно, порт закрыт, если брандмауэр блокирует ICMP. |
Пустой UDP пакет | ICMP порт недоступен | Порт закрыт. |
Сканирование протоколов
Если вы предприняли неудачную попытку соединения с UDP-портом, хост вернет ICMP-сообщение "port unreachable". То же самое можно сказать и про IP-протоколы. Каждый IP-протокол транспортного уровня имеет соответствующий номер. Наиболее распространены ICMP (1), TCP (6) и UDP (17). У всех IP-пакетов есть поле "protocol", которое показывает тип заголовков пакетов и номер протокола транспортного уровня. Если мы посылаем серию пакетов без заголовка протокола транспортного уровня и с номером протокола 130, который означает протокол семейства IPSEC, называемый SPS (Secure Packet Shield), мы можем определить, какой из протоколов реализован на данном хосте. Если мы получаем ICMP-сообщение "protocol unreachable", то этот протокол недоступен. В противном случае - доступен. Этот метод сканирования, называемый сканированием протоколов ( -sO ), страдает теми же самыми проблемами, что и UDP-сканирование в том случае, если брандмауэр блокирует ICMP-сообщения или непосредственно сам протокол дает ложные ответы.
Маскировка сканирования
У nmap есть несколько опций сканирования. Некоторые из них могут помочь скрыть сканирование портов от определения по системным журналам с помощью брандмауэров и IDSs-систем. Вдобавок, nmap предоставляет вам некоторые возможности рандомизации и маскировки, которые предоставляются такими программами, как Netcat и hping.
FTP Bounce. У FTP есть ошибка, которая может дать преимущество при использовании nmap. Когда вы соединяетесь с FTP-сервером при помощи FTP-клиента, ваш клиент взаимодействует с FTP-сервером по 21 порту. Это TCP-соединение называется контрольным соединением ( control ). FTP-сервер требует установления отдельного соединения с клиентом, называемого соединением по данным ( data ), через которое будут передаваться данные. Клиент ожидает от сервера установления соединения по данным на отдельном TCP-порте. Он передает серверу команду PORT, чтобы сообщить ему о необходимости инициировать соединение с клиентским IP-адресом и вновь открытым портом. Этот метод взаимодействия называется активной передачей. Поскольку многие клиентские машины используют трансляцию адресов (NAT) или находятся за брандмауэром во внутренней сети, активное FTP-соединение обычно не работает, поскольку инициированное сервером соединение с клиентом не может проникнуть внутрь защищенной зоны.
Сосредоточимся на команде PORT. Ее законное использование сообщает FTP-серверу о необходимости установить обратное соединение по данным с только что открытым портом. Но поскольку мы определили для использования не только порт, но и IP-адрес, наш клиент, передавший команду PORT на сервер, может попытаться установить соединение с кем-то, находящимся где-либо. Nmap может использовать такое поведение для сканирования порта с целью определения уязвимого FTP-сервера и интерпретации полученных результатов. Такой прием называется FTP-сканированием. nmap создает активное FTP-соединение с сервером и передает команды PORT, содержащие IP-адрес и порт сканируемого хоста. Затем Nmap может интерпретировать полученные результаты и выводить их в том же самом формате, что и нормальные результаты сканирования порта.
Как найти FTP-сервер, который можно так использовать? Это самая интересная часть. Это ошибка проектирования, а не только недостатки реализации. FTP-серверы, разработанные в соответствии с документом RFC 959 для протокола FTP, должны реализовывать эту возможность. Многие пакеты FTP-серверов, такие как wu-ftpd, модифицированы для передачи команды PORT только оригинальному хосту, и многие поставщики операционных систем со встроенными FTP-серверами скорректированы в соответствии с этим. Но некоторые по-прежнему запускают устаревшие или не скорректированные FTP-серверы. Не следует запускать анонимный FTP-сервер, если в этом нет очень серьезной необходимости.
Пойдем дальше. Выберем анонимный FTP-сервер и попытаемся выполнить:
nmap -b anonymous@ftp.lame_host.com -p 6000 192.168.1.200
Предыдущая команда пытается использовать ftp.lame_host.com для сканирования порта с номером 6000 на машине 192.168.1.200, чтобы сообщить, используется ли там X Window-сервер. А вот пример взаимодействия nmap с этим сервером.
Server: 220 LAME_HOST FTP server version 4 ready Client: USER anonymous Server: 331 Guest login OK, send e-mail as password Client: PASS -wwwuser@ Server: 230 Login successful Client: PORT 192,168,1,200,23,112 Server: 200 PORT command successful Client: LIST Server: 150 Opening ASCII connection for "/bin/ls" Server: 226 Transfer complete
Nmap сообщает о необходимости открыть соединение по порту 6000 на машине 192.168.1.200, используя команду PORT. Последние две цифры в конце команды PORT, 23 и 112, представляют собой порт с номером 6000. ( FTP определяет это, умножая первое число на 256 и складывая со вторым числом 23*256+112=6000). Если команда успешно выполнена, появляется возможность выполнить команду LIST. Поскольку это позволяет открыть соединение, порт 6000 открыт на машине 192.168.1.200. Если сервер вместо этого сообщает "425 Can't build data connection", мы можем определить, что порт 6000 закрыт.
Если команда PORT работает, вы можете не только сканировать кого-либо еще, но и порты любой машины, к которой имеет доступ FTP-сервер. Это великолепный способ обойти фильтры портов и брандмауэры, которые обычно не пропускают ваши попытки сканирования. Однако всегда будьте осмотрительны, используя маскировку, подобную этой. Помните, что FTP-серверы могут зафиксировать ваши соединения в журнале. Если кто-либо заподозрит LameHost в сканировании его сети в 13:45 6 января, и у него есть анонимное FTP-соединение с вашей домашней машиной в это же самое время, вы попались.
Даже если вы нашли сервер, уязвимый с точки зрения FTP, это не дает вам возможности сканировать привилегированные порты (с номером ниже 1024), поскольку FTP-клиент обычно не должен прослушивать привилегированные порты в ожидании соединения по данным.
Фрагментация. Опция -f nmap, указывает на необходимость выполнения скрытого сканирования ( -sS, -sF, -sX или -sN ) с использованием фрагментированных IP-пакетов, у которых разорваны TCP-заголовки. Идея состоит в предохранении таких "искаженных" TCP-пакетов с необычными флагами от блокировки брандмауэрами. Эта опция может привести к нарушению в работе некоторых систем и не может корректно работать на всех разновидностях Unix, поэтому применяйте ее осторожно.
Заманивание. Мы беседовали о том, как можно замаскировать сканирование портов, сохранив при этом возможность получения результатов сканирования (вместо того чтобы передавать их на наш неизвестный адрес). Мы также обсуждали, как это сложно сделать (в лекциях "NETCAT и CRYPTCAT" и "Системные средства с открытым программным кодом: основы" и на протяжении всей этой лекции). Nmap дает возможность определить хост "ловушку", используя опцию -D. Идея состоит в определении нескольких "мистических жертв" - хостов в интернете - и задания их в разделенном запятыми списке после флага -D. Nmap будет, как обычно, выполнять роль сканера порта, но при этом определяться среди замаскированных сканеров портов с IP-адресами - ловушками. Системный администратор увидит несколько различных сканеров портов, но только один из них будет настоящим.
Рандомизация портов и хостов. Nmap по умолчанию перебирает заданные вами порты случайным образом. Вы можете выключить эту возможность, воспользовавшись флагом -r. Если вы задали список хостов для сканирования, то можете задать случайный порядок сканирования, используя флаг -randomize_hosts.
Расписание сканирования
Nmap использует опции планирования по времени, чтобы попытаться скрыть сканирование портов от брандмауэров и систем IDSs, которые используют основанные на временных параметрах алгоритмы обнаружения сканирования. Вдобавок, вы можете определить свою собственную политику планирования по времени, используя специальные флаги командной строки. В таблице 6.2 подробно описаны встроенные расписания и показано, как можно определить собственную политику сканирования. Вы можете использовать именованные политики маскировки с использованием флага -T. Команда nmap -T Sneaky -sS 192.168.1.100 -p 1-100 позволяет сделать попытку избежать определения сканирования с использованием именованной политики Sneaky и метода сканирования SYN при сканировании первых ста портов на компьютере 192.168.1.100.
Для полной ясности, флаг -scan_delay определяет минимальный временной промежуток в миллисекундах, который следует выдерживать между попытками сканирования. Параметр -host_timeout определяет максимальную задержку по времени в миллисекундах при сканировании одного хоста таким образом, что вы можете прерваться через 5 минут, если сканирование порта занимает слишком много времени. Параметр rtt_timeout определяет, время ожидания ответа в миллисекундах.
Наименование | Время между зондированиями | Время, потраченное на один хост | Тайм-аут на ответ о зондировании | Использование параллельных зондирований |
---|---|---|---|---|
Paranoid | 5 минут | Без ограничений | 5 минут | нет |
Sneaky | 15 секунд | Без ограничений | 15 секунд | нет |
Polite | 0.4 секунд | Без ограничений | 6 секунд (10 макс) | нет |
Normal | нет | Без ограничений | 6 секунд (10 макс) | нет |
Aggressive | нет | 5 минут | 1 секунда (1.5 макс) | да |
Insane | нет | 75 секунд | 0.3 секунд макс | да |
scan_delay | host_timeout | initial_rtt_timeout min_rtt_timeout max_rtt_timeout | max_parallelism |
Nmap по умолчанию всегда ожидает ответа около 0.3 секунды (300 миллисекунд). Он запускается с начальным значением rtt_timeout (по умолчанию 6 секунд) и затем последовательно уменьшает или увеличивает значение в зависимости от предыдущих значений. Это позволяет оптимизировать производительность сканирования. Если хост отзывается быстро, то параметр rtt_timeout уменьшается. Если задержка слишком велика, nmap увеличивает параметр rtt_timeout. Но величина задержки по времени всегда остается в пределах между максимальным и минимальным значением. Малое значение параметра rtt_timeout увеличивает шансы ошибочного диагноза о состоянии порта для системы, которая реагирует не слишком быстро.
Параметр -max_parallelism определяет количество одновременно производимых попыток сканирования. Задание в качестве значения параметра 1 отключает параллельное выполнение сканирования. По умолчанию, nmap параллельно выполняет 36 попыток сканирования, если не задано иное значение. Вы можете задать для nmap существенно большее количество соединений для сканирования, используя параметр -M. В исходных кодах программы nmap задано предельное значение числа соединений 1025.
TCP Reverse Ident Scanning
Если на удаленном хосте, который вы сканируете, выполняется программа identd, которая по умолчанию прослушивает 113 порт, nmap попытается найти информацию о пользователях, выполняющих определенные процессы. Identd может сообщить вам такую информацию, позволив тем самым найти серверы, запущенные с полномочиями пользователя root. Переполнение буфера на уязвимой службе - достойная плата за запуск программы с такими полномочиями. Воспользуйтесь флагом -I, чтобы задействовать такой тип сканирования.
bash-2.04$ nmap -I 192.168.1.210 Starting nmap V. 2.54BETA30 ( www.insecure.org/nmap/ ) Interesting ports on (192.168.1.210): (The 1535 ports scanned but not shown below are in state: closed) Port State Service Owner 21/tcp open ftp root 22/tcp open ssh root 23/tcp open telnet root 80/tcp open http nobody 111/tcp open sunrpc bin 113/tcp open auth nobody 512/tcp open exec root 513/tcp open login root 514/tcp open shell root 884/tcp open unknown root 889/tcp open unknown root 1024/tcp open kdm bjohnson 1032/tcp open iad3 bjohnson 6000/tcp open X11 root Nmap run completed - 1 IP address (1 host up) scanned in 3 seconds
Мы обнаружили несколько сервисов, выполняющихся с полномочиями пользователя root, включая ftp и telnet. Далее мы можем соединиться напрямую с этими портами, чтобы определить версии соответствующего программного обеспечения и вновь проверить их с точки зрения известных прорех в безопасности. Уязвимые службы FTP и Telnet на этой машине дают взломщику возможность получить доступ к системе с полномочиями суперпользователя.