Сразу оговорюсь: сегодняшние IDS и брандмауэры намного умнее тех, что существовали во времена, когда в Nmap появились средства борьбы с ними. Поэтому многие приведенные здесь техники могут уже не работать, но это не повод ими не пользоваться, в сети полно доисторического оборудования.
Шесть состояний порта по версии Nmap
- open — порт открыт;
- closed — порт закрыт;
- filtered — порт фильтруется, неизвестно, закрыт или открыт;
- unfiltered — порт не фильтруется, неизвестно, закрыт или открыт (такой результат может дать только ACK-сканирование);
- open|filtered — порт либо открыт, либо фильтруется;
- closed|filtered — порт либо закрыт, либо фильтруется (такой результат может дать только Idle-сканирование).
Вас также может заинтересовать статья «Скрытое сканирование Nmap»
Обход фаервола и IDS в Nmap
Начнем с того, что даже без дополнительных опций Nmap уже способен хоть и не обойти, но обнаружить брандмауэр. Происходит так потому, что при SYN-сканиpовании состояние открыт/закрыт определяется путем анализа ответа машины: SYN/ACK — открыт, FIN — закрыт.
Однако брандмауэры, чтобы минимизировать процессорные ресурсы, зачастую просто дропают пакеты, адресуемые фильтруемым портам (даже при настройке iptables в Linux стандартная практика — это дропнуть пакет с помощью -j DROP). Nmap отслеживает, при пробе каких портов не было получено ответа, и помечает эти порты filtered.
Еще одна техника обнаружения брандмауэра заключается в том, чтобы заставить Nmap генерировать «невероятные пакеты», такие как пакеты без единого флага (-sN), FIN-пакеты (-sF) и Xmas-пакеты, содержащие флаги FIN, PSH и URG (-sX). RFC описывает все эти ситуации, поэтому любое расхождение с RFC Nmap интерпретирует как наличие брандмауэра.
Многие брандмауэры можно обойти и точно определить, фильтруется порт или нет. Для этого можно использовать ACK-сканирование:
1 |
$ sudo nmap -sA 192.168.0.1 |
Теория здесь следующая: брандмауэр должен отбивать все новые TCP-подключения к порту, но также обязан не препятствовать прохождению пакетов в рамках уже установленных соединений. Простой способ сделать это — отбивать все SYN-пакеты (используется для установки соединения), но не мешать ACK-пакетам (используется для отправки пакетов в рамках уже открытого соединения).
Но есть одна тонкость. Дело в том, что есть так называемые stateful-брандмауэры. Они умеют отслеживать состояние соединения и проверяют такие поля пакетов, как IP-адрес и номер последовательности TCP, чтобы отслеживать, какие пакеты действительно пришли в рамках открытого ранее соединения, а какие были отправлены Nmap в рамках ACK-сканирования (iptables в Linux может работать в обоих режимах, но по умолчанию он не stateful, это более производительный вариант).
Выяснить, какой тип брандмауэра используется, можно, выполнив SYN-сканирование и сразу за ним — ACK-сканирование:
1 2 |
$ sudo nmap -sS 192.168.0.1 $ sudo nmap -sA 192.168.0.1 |
Если во втором случае порты, отмеченные во время SYN-сканирования как filtered, стали unfiltered, значит, перед тобой не stateful-брандмауэр.
Кроме того, можно попробовать обойти фаервол с помощью изменения номера исходящего порта:
1 |
$ sudo nmap --source-port 53 192.168.0.1 |
Это эксплуатация старой как мир ошибки настройки брандмауэра, которая заключается в том, что админ открывает доступ всему входящему трафику (включая протокол TCP) с порта 53, чтобы позволить приложениям беспрепятственно выполнять DNS-запросы. Сегодня такое встречается редко, но, как показывает практика, некомпетентность со временем не исчезает.
Кроме всего прочего, в Nmap есть средства для скрытия факта сканирования от глаз фаерволов и IDS:
1 |
$ sudo nmap -f 192.168.0.1 |
В этом случае Nmap будет разбивать пакеты на крохотные фрагменты размером 8 байт. Делает он это в надежде на то, что брандмауэр или IDS не сможет собрать пакет из фрагментов и проанализировать его заголовок (по причине плохой реализации или в угоду производительности) и просто пропустит пакет или отбросит.
1 |
$ sudo nmap --mtu 16 192.168.0.1 |
Та же история, только с возможностью контролировать размер пакета (в данном случае 16). Можно использовать против брандмауэров и IDS, которые умеют ловить факты сканирования с помощью Nmap, анализируя размер фрагмента.
1 |
$ sudo nmap --data-length 25 192.168.0.1 |
Добавляет в конец пакета указанное количество случайных байтов. Цель та же, что и в предыдущем случае: обмануть IDS, которая может быть способна обнаружить сканирование портов, анализируя размер пакета (Nmap всегда посылает пакеты длиной 40 байт при использовании протокола TCP).