Прокачай свой nmap! Используем популярный сканер для обхода фаерволов, дирбастинга, DoS-атак и многого другого

Прокачай свой nmap! Используем популярный сканер для обхода фаерволов, дирбастинга, DoS-атак и многого другого


Nmap — эталон среди сканеров портов и один из важнейших инструментов пентестера. Но можешь ли ты сказать, что досконально изучил все его особенности и способы применения? Из этой статьи ты узнаешь, как использовать Nmap для сканирования хостов за файрволом, повысить производительность сканирования, искать дыры в настройках HTTP-сервера, организовать DoS-атаку и даже поднять веб-сервер.

WARNING

Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.

 


Базовые возможности

Перед тем как перейти к обсуждению продвинутых возможностей Nmap, давай уделим немного внимания использованию Nmap на базовом уровне. Ты можешь возразить, что говорить тут не о чем, — достаточно всего лишь натравить Nmap на нужный хост, и спустя некоторое время он выдаст на экран информацию об открытых портах:

$ nmap 192.168.0.1

Это действительно так, но стоит иметь в виду две особенности реализации Nmap. Первая: запущенный с правами обычного пользователя Nmap крайне неэффективен. Весь процесс сканирования при этом фактически сводится к попытке установить полноценное соединение с каждым из портов. В случае протокола TCP это значит, что Nmap пошлет на удаленную сторону пакет SYN; если запрошенный порт открыт, машина ответит пакетом SYN/ACK, после чего Nmap отправит пакет ACK и только потом закроет соединение с помощью пакета FIN.

Весь этот процесс осуществляется с помощью системного вызова connect() и, по сути, целиком ложится на сетевой стек ОС. В результате страдает как производительность сканирования, так и скрытность (сервисы, висящие на сканируемых портах, будут активно логировать соединения).

Совсем по-другому Nmap ведет себя, когда запущен с правами root:

$ sudo nmap 192.168.0.1

В этом случае он полностью берет на себя формирование пакетов и управление соединением. Подключение к открытым портам будет выглядеть так: Nmap посылает SYN, машина отвечает SYN/ACK, Nmap посылает FIN, разрывая наполовину открытое соединение (это называется TCP SYN сканирование). В результате сервис, висящий на порте, не логирует попытку соединения, а Nmap способен обнаружить брандмауэр, который просто отбрасывает SYN-пакеты вместо того, чтобы отправить в ответ SYN/ACK (порт открыт) или FIN (порт закрыт), как это должна делать операционная система по умолчанию. Кроме того, этот способ сканирования намного более производительный.

Вторая особенность Nmap заключается в том, что на самом деле он сканирует не весь диапазон портов (65 536), а только 1000 портов типовых служб, определенных в файле /usr/share/nmap/nmap-services. Так что, если кто-то повесит сервис на нестандартный порт, которого просто нет в этом файле, Nmap его не увидит. Изменить подобное поведение можно при помощи такой команды:

$ sudo nmap -sS -sU -p 1-65535 192.168.0.1

Nmap будет использовать сканирование типа TCP SYN и UDP-сканирование для всего диапазона портов.

 


Определяем название и версию сервиса на порте

Одна из интересных особенностей Nmap в том, что он способен не только определить состояние порта (открыт, закрыт, фильтруется), но и идентифицировать имя демона/службы на этом порте, а в некоторых случаях даже его версию. Для этого Nmap может применять несколько разных техник, например подключиться к порту 80 и послать HTTP-запрос для идентификации имени и версии веб-сервера либо использовать информацию о том, как сервис отвечает на те или иные пакеты и запросы.

Все правила идентификации служб и их версий определены в файле <span class="nobr">/usr/share/nmap/nmap-service-probes, а заставит Nmap их применить флаг -sV:

$ sudo nmap -sV 192.168.0.1

Причем есть возможность даже усилить попытки Nmap определить службу с помощью флага --version-all:

$ sudo nmap -sV --version-all 192.168.0.1

Однако обычно это не повышает качество распознавания.

Nmap не смог определить версию HTTP-сервера, но узнал его имя

 


Определяем имя и версию ОС

Наверное, это одна из самых известных функций Nmap. Отправляя машине нестандартные пакеты и сопоставляя ее ответ (время ответа, значения полей TTL, MTU, ACK и многое другое) с «базой отпечатков ОС» (/usr/share/nmap/nmap-os-db), Nmap способен достаточно точно определить запущенную на машине ОС. Все, что нужно сделать, — это запустить Nmap с флагом -O:

$ sudo nmap -O 192.168.0.1

Однако далеко не всегда Nmap способен на 100% правильно угадать ОС. Если сделать это не получится, Nmap выведет на экран наиболее близкие к правильному варианты, заботливо снабдив их «процентом попадания»: 90%, 82%…

Более того, ты можешь пойти еще дальше и воспользоваться флагом -A, чтобы заставить Nmap попытаться определить версию ОС, версию служб и даже провести более детальный анализ служб с помощью скриптов NSE (о них позже):

$ sudo nmap -A 192.168.0.1
Предположения Nmap о версии ОС сканируемой машины

 


Повышаем скорость сканирования

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

Nmap поддерживает десяток флагов, позволяющих тонко контролировать такие параметры, как задержка между попытками подключения к порту или количество попыток подключения. Разобраться с ними с наскоку довольно тяжело, поэтому в Nmap есть набор преднастроенных шаблонов агрессивности сканирования. Всего их шесть (от 0 до 5), а сделать выбор можно с помощью опции -T:

$ sudo nmap -T3 192.168.0.1

В данном случае мы выбрали шаблон номер 3. Это дефолтовое значение, своеобразный компромисс между скоростью и точностью сканирования в медленных сетях. Однако в современных условиях, когда минимальная скорость проводного доступа в сеть уже перешагнула за 30 Мбит/с, лучшим выбором будет -T4 или даже -T5. Последний стоит применять только в стабильных сетях без провалов скорости.

Более низкие значения предназначены для обхода систем обнаружения вторжений. Например, -T0 отключает многопоточное сканирование и устанавливает задержку между пробами портов в пять минут; потратив весь день (ночь) на сканирование, ты можешь надеяться, что сама попытка сканирования будет не замечена (тем более что Nmap перебирает порты в случайном порядке). Шаблон -T1 — более быстрый режим с задержкой в 15 с, -T2 — 0,4 с, -T3 — 10 мс, -T4 — 5 мс.

Режим -T5 в полтора раза более производительный, чем дефолтовый


 


Скрываем следы

Увеличение задержки между пробами портов — не единственный способ скрыть, что машина сканируется. Еще один интересный метод — одновременно запустить несколько потоков сканирования, подменяя обратный IP-адрес во всех случаях, кроме одного. Смысл здесь в том, чтобы запутать IDS и администратора машины. В логах IDS окажется сразу несколько попыток сканирования с разных адресов, среди которых будет только один настоящий.

Использовать такой метод довольно просто:

$ sudo nmap -D адрес1,адрес2,адрес3 192.168.0.1

Ты можешь указать сколько угодно фиктивных адресов или позволить Nmap сгенерировать рандомные адреса за тебя (в данном случае десять адресов):

$ sudo nmap -D RND:10 192.168.0.1

Однако тут необходимо иметь в виду, что рандомные адреса часто будут указывать на несуществующие или отключенные машины. IDS и хороший админ смогут отсеять их, чтобы вычислить реальный адрес.

Более сложный способ — организовать так называемое Idle-сканирование. Это очень интересная техника, которая базируется на трех простых фактах:

  1. При выполнении SYN-сканирования удаленная сторона посылает пакет SYN/ACK в случае, если порт открыт, и пакет RST, если нет.
  2. Машина, получившая незапрошенный пакет SYN/ACK, должна отвечать пакетом RST, а при получении незапрошенного RST — игнорировать его.
  3. Каждый IP-пакет, отправленный машиной, имеет IPID, а многие ОС при отправке пакета просто увеличивают IPID.

Сама техника заключается в том, чтобы найти неактивную сетевую машину, которая просто ничего не делает (Idle), но при этом находится в рабочем состоянии и способна отвечать на сетевые запросы. Более того, машина должна работать на древней ОС, которая увеличивает IPID пакетов вместо рандомизации, как современные ОС. Сделать это можно с помощью все тех же флагов -O -v Nmap (строка IP ID Sequence Generation в выводе) либо с помощью Metasploit Framework (это удобнее и быстрее):

> use auxiliary/scanner/ip/ipidseq
> set RHOSTS 192.168.0.1-192.168.0.255
> run

Далее ты запускаешь сканирование портов:

$ sudo nmap -sI IP-Idle-машины 192.168.0.1

На каждую пробу порта Nmap сначала будет посылать запрос Idle-машине, записывать IPID пакета, затем посылать SYN-пакет жертве, подменяя обратный адрес на IP Idle-машины, затем снова посылать запрос Idle-машине и сверять IPID с ранее сохраненным. Если IPID увеличился со времени прошлой проверки, значит, машина посылала пакеты, а, как мы знаем из второго пункта выше, это означает, что она ответила пакетом RST. Это, в свою очередь, говорит, что проверяемый порт жертвы открыт. Если IPID не увеличился, значит, порт закрыт.

В современном мире, где уже не осталось Windows 95, это действительно сложно реализуемая техника, но она позволяет полностью отвести от себя подозрения о сканировании. IDS обвинит в сканировании Idle-машину.

 


Обходим IDS и брандмауэры

Сразу оговорюсь: сегодняшние IDS и брандмауэры намного умнее тех, что существовали во времена, когда в Nmap появились средства борьбы с ними. Поэтому многие приведенные здесь техники могут уже не работать, но это не повод ими не пользоваться, в Сети полно доисторического оборудования.

Начнем с того, что даже без дополнительных опций Nmap уже способен хоть и не обойти, но обнаружить брандмауэр. Происходит так потому, что при SYN-сканировании состояние открыт/закрыт определяется путем анализа ответа машины: SYN/ACK — открыт, FIN — закрыт. Однако брандмауэры, чтобы минимизировать процессорные ресурсы, зачастую просто дропают пакеты, адресуемые фильтруемым портам (даже при настройке iptables в Linux стандартная практика — это дропнуть пакет с помощью -j DROP). Nmap отслеживает, при пробе каких портов не было получено ответа, и помечает эти порты filtered.

Еще одна техника обнаружения брандмауэра заключается в том, чтобы заставить Nmap генерировать «невероятные пакеты», такие как пакеты без единого флага (-sN), FIN-пакеты (-sF) и Xmas-пакеты, содержащие флаги FIN, PSH и URG (-sX). RFC описывает все эти ситуации, поэтому любое расхождение с RFC Nmap интерпретирует как наличие брандмауэра.

Многие брандмауэры можно обойти и точно определить, фильтруется порт или нет. Для этого можно использовать ACK-сканирование:

$ sudo nmap -sA 192.168.0.1

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

Но есть одна тонкость. Дело в том, что есть так называемые stateful-брандмауэры. Они умеют отслеживать состояние соединения и проверяют такие поля пакетов, как IP-адрес и номер последовательности TCP, чтобы отслеживать, какие пакеты действительно пришли в рамках открытого ранее соединения, а какие были отправлены Nmap в рамках ACK-сканирования (iptables в Linux может работать в обоих режимах, но по умолчанию он не stateful, это более производительный вариант).

Выяснить, какой тип брандмауэра используется, можно, выполнив SYN-сканирование и сразу за ним — ACK-сканирование:

$ sudo nmap -sS 192.168.0.1
$ sudo nmap -sA 192.168.0.1

Если во втором случае порты, отмеченные во время SYN-сканирования как filtered, стали unfiltered, значит, перед тобой не stateful-брандмауэр.

Кроме того, можно попробовать обойти брандмауэр с помощью изменения номера исходящего порта:

$ sudo nmap --source-port 53 192.168.0.1

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

Кроме всего прочего, в Nmap есть средства для скрытия факта сканирования от глаз брандмауэров и IDS:

$ sudo nmap -f 192.168.0.1

В этом случае Nmap будет разбивать пакеты на крохотные фрагменты размером 8 байт. Делает он это в надежде на то, что брандмауэр или IDS не сможет собрать пакет из фрагментов и проанализировать его заголовок (по причине плохой реализации или в угоду производительности) и просто пропустит пакет или отбросит.

$ sudo nmap --mtu 16 192.168.0.1

Та же история, только с возможностью контролировать размер пакета (в данном случае 16). Можно использовать против брандмауэров и IDS, которые умеют ловить факты сканирования с помощью Nmap, анализируя размер фрагмента.

$ sudo nmap --data-length 25 192.168.0.1

Добавляет в конец пакета указанное количество рандомных байтов. Цель та же, что и в предыдущем случае: обмануть IDS, которая может быть способна обнаружить сканирование, анализируя размер пакета (Nmap всегда посылает пакеты длиной 40 байт при использовании протокола TCP).

 


Используем Nmap для обнаружения машин в сети

Хотя Nmap известен именно как сканер портов, это также отличный инструмент для обнаружения машин в сети. Его можно натравить на любое количество хостов и буквально за несколько секунд получить результат пинга тысяч хостов. Вот только пингует хосты он совсем не так, как всем известная утилита ping. По умолчанию перед началом сканирования портов Nmap посылает несколько пакетов, чтобы удостовериться в доступности хоста:

  • ICMP Echo request — аналог того, как работает ping;
  • SYN-пакет на порт 443;
  • ACK-пакет на порт 80;
  • ICMP timestamp request.

Так много способов проверки необходимы для обхода брандмауэров и ситуаций, когда, например, в ОС или сетевом оборудовании включен запрет отвечать на запросы ICMP Echo (сегодня это частая практика).

Проверку доступности легко отключить, используя опцию -PN, о чем сам Nmap сообщит, если не сможет удостовериться в доступности порта:

$ sudo nmap -PN 192.168.0.1

Обычно в этом мало смысла, а вот обратная операция, то есть отключение сканера портов, очень даже полезна для проверки доступности множества хостов:

$ sudo nmap -sn 192.168.0.1-255

Эта команда заставит Nmap просканировать адреса с 192.168.0.1 по 192.168.0.255. Ее более удобный аналог:

$ sudo nmap -sn 192.168.0.*

А так можно попросить Nmap просканировать всю подсеть:

$ sudo nmap -sn 192.168.0.0/24

Ну или записать необходимые адреса в файл и попросить просканировать их:

$ sudo nmap -sn -iL /путь/до/файла

Если опустить флаг -sn, Nmap будет не просто проверять доступность хостов, но еще и сканировать порты.

Самих техник пингования также довольно много. Nmap поддерживает определение доступности хоста с помощью посылки SYN-пакета на указанный порт:

$ sudo nmap -sn -PS80 192.168.0.1

ACK-пакета:

$ sudo nmap -sn -PA80 192.168.0.1

UDP-пакета:

$ sudo nmap -sn -PU53 192.168.0.1

ICMP Echo request:

$ sudo nmap -sn -PE 192.168.0.1

ICMP timestamp:

$ sudo nmap -sn -PP 192.168.0.1

Все их можно комбинировать:

$ sudo nmap -sn -PE -PS443 -PA80 -PP 192.168.0.1
Nmap обнаружил только один хост в локальной сети

 


Выполняем брутфорс, дирбастинг (перебор директорий), DoS и другие атаки

Относительно новая фишка Nmap — поддержка скриптов, расширяющих функциональность сканера. Nmap поставляется с более чем 500 скриптами, которые могут относиться к одной или нескольким из четырнадцати категорий:

  • auth — проверка возможности логина. Например, скрипт ftp-anon пробует выполнить анонимный логин на FTP-сервер и выводит список файлов, помечая доступные для записи файлы;
  • broadcast — различные виды обнаружения хостов в сети. Пример: broadcast-upnp-info — скрипт для поиска UPnP-сервисов;
  • brute — реализация техник брутфорса паролей. Пример: http-brute — брутфорс паролей от веб-сервера;
  • default — скрипты, запускаемые автоматически при указании опции -A или -sC. Обычно это простые быстрые скрипты, собирающие дополнительную информацию о машине, вроде уже приведенного выше ftp-anon;
  • discovery — практически аналог broadcast. Пример: smb-enum-shares — поиск расшаренных с помощью протокола SMB дисков;
  • dos — скрипты для организации DoS-атак. Пример: smb-vuln-regsvc-dos — выводит из строя Windows 2000 путем эксплуатации уязвимости MSRC8742;
  • exploit — эксплуатация или проверка на уязвимость. Пример: smb-vuln-ms06-025 — проверка машин Windows на уязвимость MS06-025;
  • external — скрипты, использующие внешние ресурсы для получения дополнительной информации о машине. Пример: whois;
  • fuzzer — скрипты, посылающие удаленной стороне неожиданные и неправильно сформированные данные с целью поиска уязвимостей или попытки выполнить DoS. Пример: dns-fuzz;
  • intrusive — скрипты, выполняющие активные действия в отношении машины. Пример: snmp-brute — брутфорс SNMP-сервера;
  • malware — проверка на зараженность машины вирусами и бэкдорами. Пример: smtp-strangeport — поиск SMTP-сервера на нестандартном порте, что может быть свидетельством заражения машины трояном, рассылающим спам;
  • safe — «безопасные» скрипты, которые не совершают активных действий в отношении машины, не забивают канал пакетами и не эксплуатируют уязвимости. Пример: ssh-hostkey — получает публичные ключи SSH-сервера;
  • version — получение версий работающих служб. Пример: pptp-version — выводит на экран дополнительную информацию о PPTP-сервере;
  • vuln — проверка служб на уязвимости.

Если указать опции -A или -sC, скрипты категории default будут запускаться автоматически. Для запуска скриптов других категорий можно использовать опцию --script:

$ sudo nmap --script "default and safe" 192.168.0.1

Выбор можно обратить, заставив Nmap запустить все скрипты, кроме тех, что относятся к указанной категории:

$ sudo nmap --script "not intrusive" 192.168.0.1

А можно указать имя нужного скрипта (http-enum выполняет дирбастинг HTTP-сервера):

$ sudo nmap -p80 --script "http-enum" 192.168.0.1

Или попросить Nmap запустить все скрипты, относящиеся к протоколу HTTP:

$ sudo nmap -p80 --script "http-*" 192.168.0.1

Сами скрипты вместе с описанием и примерами использования можно найти в каталоге /usr/share/nmap/scripts.

Дирбастинг с помощью Nmap


WWW

Если ты серьезно заинтересовался возможностями, которые дает NSE-скриптинг, — обязательно прочитай нашу предыдущую статью на эту тему.

 


Поднимаем веб-сервер (внезапно)

Немногие знают, но в комплекте с Nmap идет утилита ncat. Это аналог известнейшего netcat — универсального сетевого инструмента, с помощью которого можно тестировать сетевые службы, выполнять удаленные команды, передавать файлы, прокидывать через сеть аудио, слушать порты и делать множество других интересных вещей.

С его же помощью можно запустить простейший веб-сервер:

$ ncat -lk -p 8080 --sh-exec "echo -e 'HTTP/1.1 200 OK'; cat index.html"

 

Шесть состояний порта по версии Nmap

  • open — порт открыт;
  • closed — порт закрыт;
  • filtered — порт фильтруется, неизвестно, закрыт или открыт;
  • unfiltered — порт не фильтруется, неизвестно, закрыт или открыт (такой результат может дать только ACK-сканирование);
  • open|filtered — порт либо открыт, либо фильтруется;
  • closed|filtered — порт либо закрыт, либо фильтруется (такой результат может дать только Idle-сканирование).

 


Вместо выводов

Эта статья описывает лишь часть функций Nmap, хоть и наиболее полезных. Как ты смог убедиться, функциональность Nmap выходит далеко за границы сканирования портов. Это мощный и сложный инструмент, код которого вылизывался десятилетиями. Он быстрый, надежный и невероятно <span class="nowrap">функциональный. А главное — полностью бесплатный и работает практически везде.



Report Page