Бородатый обманщик. Методика TARPIT в защите и нападении

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

Добро пожаловать под кат если вас интересует:

  •   Как затруднить атакующему фазу разведки?

  •   Отчего nmap может серьезно тормозить?

  •   Откуда берутся хосты с тысячами открытых портов?

  •   Как выявлять tarpit хосты и что с ними делать если вы занимаетесь аудитом ИБ.

  •   Что это вообще такое этот ваш tarpit? )

Что такое tarpit?

Tarpit дословно — смоляная яма. Еще одно название — sticky honeypot.

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

Применяться может на разных уровнях сетевой модели, но, пожалуй, наибольшее распространение на данный момент имеет tarpit на уровне TCP.

История возникновения

Считается, что tarpit появился в начале нулевых для противодействия сетевым червям, на тот момент мешал нормально жить Code-Red.

Одна из первых и наиболее известных реализаций tarpit — программа LaBrea.

Программа следит за ARP трафиком в указанном сетевом сегменте и анализирует «who-has» ARP запросы, на которые нет ответа дольше установленного временного лимита (3 секунды по умолчанию). После чего захватывает неиспользуемые IP адреса, формируя ARP ответ. Дальше на любую попытку соединения по TCP отвечает SYN\ACK, т.е. имитирует открытый порт и не дает удаленной стороне просто так завершить это соединение.

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

Варианты реализации

Выше показан пример tarpit транспортного уровня, но реализаций множество, в том числе и на прикладном уровне модели TCP/IP. Ниже несколько примеров.

Транспортного уровня:

  • Linux Netfilter TARPIT, входит в пакет xtables-addons

  • LaBrea — использует свободные IP адреса для логирования и замедления атакующих

  • Honeyd — Инструмент обнаружения атак и несанкционированной активности. Использует свободные IP адреса, эмулирует различные ОС и сервисы

  • Mikrotik Router OS — Позволяет настроить произвольную логику защиты хостов и подсетей

  • Скорее всего, похожая функциональность есть у Cisco, Juniper, Huawei, Fortinet Fortigate, Imperva, pfSense, NG Firewall, etc.

Уровня приложений

  • Endlessh — эмуляция SSH сервиса, который заставляет клиента бесконечно держать соединение.

  • Portspoof — умеет притворяться множеством сервисов, отдает их баннеры.

  • SMTP — задержка ответа на входящие SMTP команды, применяется для борьбы с рассылкой спама, есть во множестве продуктов (например CommuniGate)

Конечно же, приведенный выше список вариантов реализации далеко не полон.

Для чего применяется?

  • Срыва попыток сетевого сканирования / замедления автоматических сканеров. Ниже я покажу как именно tarpit замедляет сетевые сканеры

  • Искажения результатов сканирования / затруднения сбора информации об узлах и сервисах. Что делать с информацией о тысячах «открытых» портов на одном хосте?

  • Фиксации подозрительной активности, выявления злоумышленников. Часто tapit не просто водит атакующего за нос, но ведет логи

  • Отвлечения внимания от настоящих систем и сервисов

  • Борьбы с brute-force атаками, спамом и т.п. Атакующего переводят на взямодействие с tarpit системой

  • Повышения затрат атакующей стороны на разведку и, в некоторых случаях, на эксплуатацию.

Вышеперечисленное, в основном, относится к tarpit транспортного уровня. На других уровнях суть не меняется — заставить атакующего тратить время, «морозя» его соединения или подсовывая неверные данные.

Как работает

Для наглядности давайте представим ситуацию, где у нас есть сервер, на котором запущена служба RDP, а межсетевого экрана нет.

4c8772e73772c9f553243119fddb7f69.png

По этой иллюстрации видно, что атакующий имеет четкий сигнал о доступности порта. Сканирование займет наименьшее количество времени.

Теперь включим межсетевой экран и применим политику DROP.

6d336bfb66aebf510db5d623659f6705.png

Сканирование займет больше времени, так как сканер будет ждать истечение таймаута на SYN, но все равно узнать какие порты открыты не проблема.

Теперь включим tarpit.

4cece8ed31316ef6197d4eff9c1d6e34.png

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

Техники TCP tarpit

Выше я уже писал что tarpit имитирует открытый порт, отвечая SYN/ACK на SYN пакет, но каким образом происходит удержание TCP соединения? Существует две техники:

TCP Flow Control Manipulation

Выставление низкого первоначального значения TCP Window size с последующим уменьшением до 0.

В заголовке TCP пакета поле Window size содержит количество байт, которые отправитель может передать получателю, прежде чем ожидать подтверждения (ACK) от получателя.

При размере  окна  0 отправитель будет ждать возможность начать передачу данных, периодически  проверяя не увеличилось ли окно. После исчерпания лимита на проверку окна (зависит от ОС) отправитель решит завершить соединение и отправит FIN пакет, но tarpit хост это проигнорирует, заставляя ожидать истечения таймаута FIN-WAIT.

9f1022dc8009bb6515135319246aa3a9.png

В реальной жизни удаленный хост может вернуть размер окна 0 если перегружен, то-есть смог на уровне TCP принять соединение, но не может выделить ресурсы (RAM, как вариант) для обработки данных по этому соединению.

TCP Retransmission Manipulation

Дублирование ACK (может быть расценено отправителем как потеря сегментов). Механизм используется для имитации потери пакетов или приема пакетов в неправильном порядке с целью принудить отправителя к повторной передаче. Практические реализации такого механизма я не встречал, только теоретическое обоснование.

Еще варианты tarpit?

Разумеется TCP протоколом дело не ограничивается,   какая разница как именно водить атакующего за нос?

Вот еще несколько примеров:

ICMP. Ответы на echo запросы к несуществующим по факту хостам.

DNS. DNS сервер отдает записи на все или определенные фиктивные доменные имена, IP адрес может относится к tarpit сетевого уровня, honeypot и так далее.

HTTP. Я встречал упоминание двух реализаций:

  • Очень медленные ответы. Есть как специализированные web серверы, так и функциональность в популярных продуктах (см. haproxy)

  • Генерация фейковых страниц со ссылками и фальшивыми данными, для запутывания crawler.

Недостатки и ограничения

Техника на первый взгляд может показаться очень уж крутой и возникнет желание немедленно бежать её включать. Не торопитесь, у всего есть оборотная сторона. Не случайно по настоящему массового применения tarpit так и не получил.

Вот некоторые недостатки:

  • Лишние записи в connection tracker (если он используется в конкретной реализации)

  • Расходование сокетов на tarpit соединения

  • Некоторое количество исходящего трафика, в отличие от DROP

  • Чуть больший расход CPU и RAM по сравнению с DROP

  • При некорректной настройке появляется возможность провести DoS атаку

Перед внедрением нужно оценить все плюсы, минусы и возможные нюансы.

А как можно посмотреть на tarpit хосты вживую?

Shodan в помощь. Поищите хосты, на которых открыт какой-нибудь непопулярный порт, а далее обратите внимание на хосты с no data returned.

https://www.shodan.io/search? query=port:20547

8e8f62d3fe9bda93542fcf37523bda96.png0576270b3c53874384c9bbbcfcbd5279.png

Кликните на такой хост и посмотрите сколько на нем портов.

Использование tarpit в защите.

Для начала в общих словах попробую сформулировать стратегии использования:

  • Развернуть на неиспользуемых IP адресах. Подсеть с такими адресами будет дороже сканировать, опционально регистрировать сетевую активность. Сделать можно на сетевом оборудовании или используя LaBrea.

  • Включать tarpit на хосте при сканировании портов. Реализовать включение защиты при достижении определенного порога. Пример логики будет ниже.

  • Включить tarpit для нескольких популярных сервисов, которых по факту на хосте нет. Для ввода в заблуждение.

  • Маскировка сервисов. Размещение настоящих сервисов на непопулярных портах в верхнем диапазоне, при том что остальные порты — tarpit. Привел этот вариант скорее до кучи, так как для маскировки есть более надержные решения: port knocking, VPN, SSH туннели, etc.

  • Борьба с DoS и DDoS прикладного уровня. Включение tarpit для определенных IP после обнаружения подозрительной активности. Атакующий будет взаимодействовать с tarpit вместо того, чтобы грузить приложение. Возможно атакующий будет даже введен в заблуждение на какое-то время, так как сервис как бы «приляжет».

  • Увеличение стоимости сбора данных о вашем сетевом периметре, создание ложных целей. Пример — добавить фиктивные DNS A записи, которые ведут на TARPIT узлы. Обычно злоумышленники начинают атаку с разведки — получения информации о сетевом периметре, доменных именах, IP адреса и сервисах. DNS записи обычно перебирают по словарю для поиска существующих. Можно создать множество фиктивных A записей с IP адресами tarpit узлов.

  • Повышение стоимости сбора данных для атакующих и всевозможных ботов. Вспомнилась одна цитата: «В детстве, в ранней юности я думала, что стоит всем людям прочесть Льва Николаевича Толстого, и все-все все поймут, и все станут добрыми и умными!». А если серьезно, то в случае распространения подобных техник защиты атакующим потребуется больше мощностей, а также модернизация своих инструментов. Вангую что в будущем так и будет)

Пример логики защиты от сканирования портов

5a093dd1bf604f27424111b28fe5ffe6.png

Теперь рассмотрим процесс сканирования портов защищенного узла, чтобы понять почему nmap (или любой другой сканер) увязнут:

  1. Запуск сканера портов nmap

  2. Межсетевой экран фиксирует множество соединений на разные TCP порты. Если эта активность превышает заданный порог, то IP добавляется черный список.

  3. К новым TCP соединениям от IP из черного списка применяется TCP tarpit.

  4. Nmap начинает фиксировать открытые порты.

  5. Если при сканировании используются дополнительные опции и NSE плагины,   определение версий сервисов (флаг -sV), определение ОС (флаг -O), etc, то nmap будет отправлять множество дополнительных пакетов на «открытые» порты и безрезультатно ждать ответа. В зависимости, таймаутов и RTT такое сканирование может растянуться на часы или даже дни.

  6. После длительного ожидания сканирующий получит очень странные и бесполезные результаты.

Несколько примеров настройки защиты

Пример для Mikrotik RouterOS.

Фрагмент настройки firewall, описывающий только пример включения защиты от сканирования портов.

/ip firewall filter add action=add-src-to-address-list address-list=PortScanDetected \
 address-list-timeout=1h chain=input comment="Anti PortScan Basic" \
 in-interface-list=WAN protocol=tcp psd=21,3s,3,1 src-address-list=!Whitelist

/ip firewall filter add action=add-src-to-address-list address-list=PortScanDetected \
 address-list-timeout=1h chain=input comment="Anti PortScan UDP" \
 in-interface-list=WAN protocol=udp psd=21,3s,3,1 src-address-list=!Whitelist

/ip firewall filter add action=tarpit chain=input comment=TarpitPortScan in-interface-list=WAN 
 protocol=tcp src-address-list=PortScanDetected

Первое и второе правила служат для выявления IP адресов, с которых происходит сканирование — адреса добавляются src-address-list. Третье применяет tarpit ко всем TCP соединениям от адресов из этого address-list.

При настройке такого рода защит важно предусмотреть белые списки. В противном случае ваши собственные ресурсы могут попасть в черный список в результате случайности, либо в спуфинга IP злоумышленником.

Пример для netfilter

Чтобы добавить поддержку tarpit в netfilter придется ставить xtables-addons.

https://inai.de/projects/xtables-addons/

Пример для deb систем:

apt install xtables-addons-common

# Сделать tarpit для src IP
iptables -A INPUT -p tcp -s $SOURCE_IP -j TARPIT

# tarpit для порта
iptables -A INPUT -p tcp -m tcp --dport 80 -j TARPIT

# tarpit для всех явно не открытых портов
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -j TARPIT

В xtables-addons есть не только tarpit, но и другие интересные фишки, например PSD (portscan detection)

См. man xtables-addons

Учет фактора tarpit при сканировании.

Пришло время смены команды.)

c2d45c8307c4780027d309e1e3f8cec6.png

Допустим вы занимаетесь аудитом ИБ и методом черного ящика собираете информацию о периметре заказчика… Или вы разработчик сканера, который также будет помогать держать периметр под контролем. Как сократить время сканирования и сделать результаты более точными? Как избежать залипания сканера на tarpit хостах?

Первое что может придти на ум (я видел, некоторые так и делают)

  • Уменьшить таймауты на соединение

  • Поставить общий таймаут на сканирование хоста

  • Увеличить количество потоков сканирования

Надо ли говорить что это проблему не решит?

Можно пойти чуть дальше и попробовать:

  • Использовать стратегию горизонтального сканирования при сканировании подсетей. Сканировать подсеть на один определенный порт, потом на следующий и так далее.

  • Уметь обнаруживать факт tarpit и сканировать такие хосты особым образом. Интересный вариант, попробуем с ним разобраться.

Сигнатуры TCP tarpit

Как отличить trapit от обычного хоста? Вот несколько сигнатур / признаков, что перед нами ловушка:

TCP Window = 0 (или другие слишком маленькие значения)

В протоколе TCP поле окна содержит количество байт, которые отправитель может передать получателю, прежде чем ожидать подтверждения (ACK) от получателя. Задается TCP Window в заголовке пакета. При размере окна 0 отправитель будет ждать и периодически  проверять, не увеличилось ли окно.

Когда удаленный хост все же решит завершить соединение (надоело видеть window size 0, сколько можно?)), то отправит пакет с FIN. Tarpit этот пакет игнорирует, заставляя операционную систему удаленного хоста сохранять ресурсы соединения до истечения таймаута FIN-WAIT.

LaBrea в начале устанавливает окно в 10 байт, а iptables в 5.

Отсутствие TCP options

Обычно для оптимизации передачи данных стороны используют опции

Полное отсутствие опций может служить дополнительным фактором обнаружения tarpit.

Изменения поведения после определенных действий.

Изменение статуса портов, появление множества новых портов в ответ на сканирование или другие активные действия.

Слишком большое количество открытых портов.

Включая явно не популярные, например, из эфемерного (динамического) диапазона.

Готовые решения

Выше описана теория по обнаружению tarpit, а есть ли готовые реализации?

Я посмотрел возможности Nmap, Naabu, RustScan, Masscan — из коробки нужной функциональности нет, дополнительных модулей тоже не нашел.

Но темой занимались…

Попытка доработки nmap

В 2014 в рассылках nmap поднимался вопрос по хотам с tarpit. Jay Bosamiya предлагал патч, который добавляет флаг --ignore-after. Хосты с количеством отрытых потов больше указанного значения пропускаются.

https://seclists.org/nmap-dev/2014/q2/545

https://seclists.org/nmap-dev/2014/q3/164

Но увы, тема заглохла, патч так и не был принят.

При желании можно собрать nmap с этим патчем https://svn.nmap.org/nmap-exp/jay/ignore-after/

Пример Dockerfile

FROM alpine:3.17
# Install dependencies
RUN apk add --update --no-cache \
ca-certificates \
libpcap \
libgcc libstdc++ \
subversion \
libssl3 \
&& update-ca-certificates \
&& rm -rf /var/cache/apk/*
# Compile and install Nmap from sources
RUN apk add --update --no-cache --virtual .build-deps \
libpcap-dev lua-dev linux-headers openssl-dev \
autoconf g++ libtool make \
\
&& svn co https://svn.nmap.org/nmap-exp/jay/ignore-after/ \
&& cd ignore-after \
&& ./configure \
--prefix=/usr \
--sysconfdir=/etc \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--without-zenmap \
--without-nping \
--without-nmap-update \
--without-openssl \
--with-liblua=/usr/include \
&& make \
&& make install \
\
&& apk del .build-deps \
&& rm -rf /var/cache/apk/*
ENTRYPOINT ["/usr/bin/nmap"]
docker build . -t 'nmap-ignore-after'
docker run --rm -it nmap_ignore_after --ignore-after 40 _TARGET_

Пример работы

docker run --rm -it nmap_ignore_after --ignore-after 40 _TARGET_ -d
Initiating SYN Stealth Scan at 05:30
Discovered open port 25/tcp on _TARGET_
Discovered open port 22/tcp on _TARGET_
Discovered open port 21/tcp on _TARGET_
...
Discovered open port 10003/tcp on _TARGET_
Discovered open port 981/tcp on _TARGET_
Completed SYN Stealth Scan at 05:33, 1.61s elapsed (1000 total ports)
Overall sending rates: 621.66 packets / s, 27352.91 bytes / s.
Nmap scan report for _TARGET_ [host ignored, too-many-open-ports]
Host is ignored, too-many-open-ports TTL 46 (0.053s latency).

Вышеописанный патч хоть и работает, но актуален для достаточно старой версии Nmap — 6.46. В бою такое использовать едва ли стоит, подойдет скорее для ознакомления.

Degreaser

Инструмент для обнаружения TCP tarpit, использует сигнатуры TCP window.

https://github.com/lancealt/degreaser

Подход грамотный, но degreaser имеет ряд ограничений:

  • Пытается установить соединение только на один заданный порт (по умолчанию 80).

  • Если порт закрыт, то хост будет отмечен как No response

  • Если хост делает tarpit не сразу, а после нескольких попыток установить соединение на разные порты, то degreaser не поможет.

  • Не развивается, последний commit от 2015 г.

Пример сборки под Centos 7

yum install make gcc-c++ autoconf libtool libpcap libpcap-devel libncurses-dev yum install
ncurses-libs ncurses-devel git net-tools
git clone https://github.com/lancealt/libcperm.git
cd libcperm; ./autogen.sh; ./configure; make; make install; cd ..
git clone https://github.com/pellegre/libcrafter.git
cd libcrafter/libcrafter; ./autogen.sh; ./configure; make; make install; cd ../..
git clone https://github.com/cmand/degreaser.git
cd degreaser; ./autogen.sh; ./configure; make; make install
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig -v

запуск

sudo ./degreaser -d eth0 X.X.X.X/Y X.X.X.X/Y X.X.X.X/Y X.X.X.X/Y

d0fc42ed1f65b3972646803d0ec28d29.png

Можно конечно попытаться встроить эту штуку в процесс сканирования, передавать подозрительные IP: PORT в Degreaser и парсить вывод… Но не то пальто.

Жаль что не развивается инструмент.

Degreaser-iptables

https://github.com/lancealt/degreaser-iptables

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

Поставляется модулем к xtables-addons, но для современных ОС я собрать эту штуку не смог.

Идея отличная, жаль что проект не обновляется и покрылся мхом (. Последний commit от 2014.

Плагин для nmap.

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

https://wmx-public.gitlab.yandexcloud.net/wmx-public/nmap-tarpit

Логика работы:

Выбирает заданное количество случайных портов из верхнего диапазона + несколько захардкоженных портов из нижнего и пытается установить соединение.

Если все эти порты окажутся открытыми или процент открытых портов превысит установленное значение (70% по-умолчанию), то хост помечается как tarpit.

Предполагается запуск nmap с этим плагином для интересующих подсетей\хостов перед прогоном основного сканирования портов, т.е. на этапе обнаружения живых хостов (https://nmap.org/book/man-host-discovery.html).

То есть сначала определяем живые узлы и проверяем их на tarpit, но при этом сканирование портов, определение версии OS, сервисов на этом этапе не производим.

Пример запуска

# nmap \
-T4 \
-sn \
-PE \
-PY \
-PO \
-PS21,22,25,80,443,8080 \
-PA21,22,25,80,443,8080 \
--script tarpit.nse \
-oX output.xml \
_TARGET_

Пояснение по ключам запуска:

-T4 — настройки таймингов (см. https://nmap.org/book/performance-timing-templates.html) не влияют на работу NSE плагина, только на процесс host-discovery

-sn — не производить сканирование портов. На этом этапе сканирование противопоказано

-PE — обнаружение хоста отправкой ICMP type 8 (echo request), т.е. обычный ping

-PY — обнаружение при помощи протокола SCTP

-PO — IP Protocol Ping

-PS21,22,25,80,443,8080 — TCP SYN Ping. Заодно провоцируем сканируемый хост на TARPIT

-PA21,22,25,80,443,8080 — TCP ACK Ping.

--script tarpit.nse — подключаем плагин

-oX output.xml — запись результатов в xml файл

Разумеется это лишь пример и вы можете запускать nmap с ключами по своему вкусу.

Аргументы tarpit.nse

--script tarpit.nse --script-args "ports_count=25, scan1_timeout=300, scan2_timeout=1000, open_ports_percent=75"

ports_count — количество случайных портов в диапазоне 1025–49151, на которые будут отправляться запросы на соединение.

scan1_timeout — таймаут на первый цикл сканирования портов. Цикл нужен для провоцирования хоста на срабатывание tarpit. По умолчанию 500 мс.

scan2_timeout — таймаут на второй цикл сканирования портов, на этом этапе происходит основная проверка. По умолчанию 2500 мс.

open_ports_percent — процент открытых портов при достижении которого хост будет отмечен как tarpit.

Плагин пока на стадии разработки и обкатки. 

Более элегантным бы выглядело решение с интеграцией tarpit сигнатур в nmap, но тут мои полномочия все (. Плагином, насколько я понимаю, такое не решить, так как из lua нет доступа к заголовкам TCP пакетов.

В этом примере результаты сохраняются в XML отчет, вот несколько примеров работы с этим отчетом.

Парсинг будет производится утилитой xmlstarlet (https://xmlstar.sourceforge.net/docs.php ).

Получение информации о структуре xml документа.

xmlstarlet el -u output.xml

nmaprun
nmaprun/debugging
nmaprun/host
nmaprun/host/address
nmaprun/host/hostnames
nmaprun/host/hostnames/hostname
nmaprun/host/hostscript
nmaprun/host/hostscript/script
nmaprun/host/status
nmaprun/host/times
nmaprun/runstats
nmaprun/runstats/finished
nmaprun/runstats/hosts

Отображение атрибутов

xmlstarlet el -a output.xml

nmaprun
nmaprun/@scanner
nmaprun/@args
nmaprun/@start
nmaprun/@startstr
nmaprun/@version
nmaprun/@xmloutputversion
nmaprun/host
nmaprun/host/status
nmaprun/host/address
nmaprun/host/address/@addr
nmaprun/host/hostnames
nmaprun/host/hostnames/hostname
nmaprun/host/hostnames/hostname/@name

Показать IP адреса всех активных хостов и методы их обнаружения

xmlstarlet sel -t -m "/nmaprun/host/status[@state='up']" -v "concat(ancestor::host/address/@addr,' ', ancestor::host/status/@reason)" -n output.xml

9bc517fea82d434f0afeaeca519571e1.png

Показать IP адреса всех активных хостов, на которых НЕ обнаружен TARPIT

xmlstarlet sel -t -m "/nmaprun/host[not(hostscript/script[@id='tarpit'])]" -v "address/@addr" -n output.xml
или
xmlstarlet sel -t -m "/nmaprun/host[not(hostscript/script[@id='tarpit'])]" -v "concat(address/@addr,' ', hostnames/hostname/@name)" -n output.xml

Вывести информацию только по хостам, на которых обнаружен TARPIT

xmlstarlet sel -t -m "/nmaprun/host/hostscript/script[@id='tarpit']" -v "ancestor::host/address/@addr" -n output.xml
xmlstarlet sel -t -m "/nmaprun/host/hostscript/script[@id='tarpit']" -v "ancestor::host/address[@addrtype='ipv4']/@addr" -n output.xml

xmlstarlet sel -t -m "/nmaprun/host/hostscript/script[@id='tarpit']" -v "concat(ancestor::host/address/@addr,' ', ancestor::host/hostnames/hostname/@name)" -n output.xml

Попытка обхода защиты от сканирования портов

Чудес не бывает, в большинстве случаев сканировать в обход tarpit не получится, но мне попадались ошибки конфигурации, при которых помогало что-то из ниже перечисленных техник:

# nmap -Pn -sA _TARGET_ #TCP ACK
# nmap -Pn -sW _TARGET_ #TCP Window
# nmap -Pn -sN _TARGET_ #Null
# nmap -Pn -sF _TARGET_ #FIN
# nmap -Pn -sX _TARGET_ #Xmas
# nmap -Pn --scanflags URGACKPSHRSTSYNFIN __TARGET__

Подробнее про эти техники смотри https://nmap.org/book/scan-methods.html

Пруф. Хост нашел через shodan.

5d3b7ff7b96af43ff54bb88e8dd9765d.png8fb2524e1158270c6487cc3a64adae09.png

Так везет далеко не всегда.

Заключение

Tarpit — не экзотика, встречается довольно часто, присутствует у различных вендоров. Периодически попадается при проведении аудитов. Результаты поиска в shodan так же говорят в поддержку данного тезиса.

Защита от сканирования портов методом tarpit существенно замедляет сканирующего, заставляет его тратить время и ресурсы, искажает результаты. Не идеальна, нужно помнить об обратной стороне.

При сканировании узлов и подсетей нужно иметь в виду возможное наличие такой защиты,   выявлять защищенные хосты и применять к ним индивидуальные настройки сканирования.

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

Динамически включаемую защиту также можно обойти:

  • Найти критерии срабатывания защиты, подстроиться под них

  • Сканировать медленно, по несколько портов за раз

  • Использовать множество IP

Полагаю, что будущее за техниками защиты, основанными на замедлении и дезинформации…

Дополнительные материалы:

https://apps.dtic.mil/sti/pdfs/AD1027607.pdf

https://www.caida.org/catalog/papers/2014_uncovering_network_tarpits_degreaser/uncovering_network_tarpits_degreaser.pdf

https://labrea.sourceforge.io/labrea-info.html

Подписывайтесь на канал. Здесь мы делимся информацией по продукту, нашими находками и наработками, пока они не оформляются в большой статический материал.

© Habrahabr.ru