
Эмулирует открытые порты и сигнатуры сервисов на всех 65535 TCP-портах, чтобы замедлить разведку, запутать сканеры и истощить ресурсы атакующего с помощью правдоподобных поддельных сервисов и заманивания в ловушку (tarpitting).
Portspoof эмулирует открытые порты и сигнатуры сервисов на всех 65535 TCP-портах, превращая этап разведки из быстрого сканирования в долгий и ресурсоемкий процесс. Сканеры видят тысячи убедительных, но поддельных сервисов, что делает выявление реальной поверхности атаки практически невозможным.
Основная цель Portspoof — сделать разведку медленной, дорогостоящей и ненадежной для атакующих. Вместо стандартного 5-секундного сканирования Nmap, которое отображает все реальные сервисы системы, атакующий, столкнувшийся с Portspoof, видит 65535 открытых портов, каждый из которых работает как будто под разным легитимным сервисом. Быстро определить, какие из них реальны, невозможно.
SYN+ACK на каждую попытку подключения.nmap -sV -p-) выходит далеко за практические пределы.Пример сканирования Nmap:
$ nmap -p 1-20 target
Starting Nmap 7.80 ( https://nmap.org )
Nmap scan report for target
Host is up (0.00016s latency).
PORT STATE SERVICE
1/tcp open tcpmux
2/tcp open compressnet
3/tcp open compressnet
4/tcp open unknown
5/tcp open rje
6/tcp open unknown
7/tcp open echo
8/tcp open unknown
9/tcp open discard
10/tcp open unknown
11/tcp open systat
12/tcp open unknown
13/tcp open daytime
14/tcp open unknown
15/tcp open netstat
16/tcp open unknown
17/tcp open qotd
18/tcp open unknown
19/tcp open chargen
20/tcp open ftp-data
Portspoof отвечает на зонды сервисов валидными, динамически сгенерированными сигнатурами на основе огромной базы регулярных выражений. В результате атакующий не сможет определить, какие номера портов ваша система действительно использует.
Пример сканирования версий (порты 1–100):
$ nmap -sV -p 1-100 target
Nmap scan report for target
Host is up (0.00016s latency).
PORT STATE SERVICE VERSION
1/tcp open tcpmux?
2/tcp open irc ircu ircd
3/tcp open tcpwrapped
5/tcp open http Polycom CMA Global Address Book (GAB) httpd
10/tcp open http PGP Universal httpd
11/tcp open http SnapStream Media Beyond TV PVR http config
12/tcp open pop3 Novell GroupWise pop3d
13/tcp open http micro_httpd
15/tcp open ssh OpenSSH r (protocol 8; NCSA GSSAPI authentication patch)
16/tcp open ftp QMS/Minolta Magicolor 2200 DeskLaser printer ftpd
17/tcp open smtp Network Box smtpd
21/tcp open ftp?
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
23/tcp open tcpwrapped
25/tcp open smtp?
27/tcp open http BMC/Marimba Management http config
37/tcp open http Indy httpd qlRKjiF
39/tcp open pop3
41/tcp open ftp VSE ftpd WhH
43/tcp open imap Scalix imapd 6
46/tcp open telnet AXIS webcam telnetd 96747 (Linux)
49/tcp open smtp Openwave Email Mx smtpd
50/tcp open http 3Ware web interface 3v (RAID storage)
51/tcp open ftp WebStar 4dftp ...
53/tcp open tcpwrapped
55/tcp open webdav Tonido WebDAV
56/tcp open tor-control Tor control port (Authentication required)
59/tcp open irc ircu ircd
60/tcp open rtsp GStreamer rtspd
64/tcp open http BaseHTTPServer CAxoE (Mercurial hg serve; Python LDkW)
66/tcp open telnet Slirp PPP/SLIP-on-terminal emulator telnetd
70/tcp open smtp qpsmtpd
71/tcp open smtp Microsoft Exchange smtpd
73/tcp open http Avaya IP Office VoIP PBX httpd
77/tcp open smtp Zeus SMTPS smtpd
79/tcp open ftp Sambar ftpd
80/tcp open tcpwrapped
81/tcp open imap-proxy nginx imap proxy
82/tcp open ssh (protocol 811)
83/tcp open http peercast.org
88/tcp open csta Alcatel OmniPCX Enterprise
90/tcp open http WASD httpd
91/tcp open http Fortinet FortiGate 50B firewall http config
93/tcp open imap ModusMail imapd 4
98/tcp open ssh Sysax Multi Server sshd 7 (protocol 940)
99/tcp open http 2Wire HomePortal http config 5473
100/tcp open newacct?
В сочетании эти методы означают:
nmap -sV -p-) с настройками tarpit по умолчанию занимает более 10 часов и генерирует сотни мегабайт фиктивных данных.Реальные сервисы (SSH, SMTP, FTP, HTTP) отправляют баннер и удерживают соединение открытым, ожидая ввода от клиента. Убедительная эмуляция означает то же самое: принять, отправить, удержать. Но модель «один поток на клиента» тратит память и CPU на переключение контекста, и в масштабе защитник истощает ресурсы раньше, чем у атакующего заканчивается терпение. Инструмент обмана становится вектором само-DoS.
Подход: однопоточный цикл событий epoll. Каждому порту при запуске назначается режим доставки: некоторые отправляют баннер немедленно, некоторые ждут, пока клиент отправит данные, прежде чем ответить, а некоторые остаются молчаливыми. Время удержания распределено по порядкам величины (десятки миллисекунд до минут) с джиттером на каждое соединение, так что повторные зонды одного и того же порта не возвращают одинаковое время отклика.
Это важно, потому что без этого атакующий может отправить мусор на каждый порт и измерить время ответа: реальные сервисы закрываются быстро (неправильный протокол), а наивный tarpit удерживает секунды. Со смешанными режимами и широким разбросом времени тысячи поддельных портов также закрываются в том же диапазоне, что и реальные сервисы. Нет чистого порога для фильтрации.
Экономика работает благодаря асимметрии:
Режимы доставки для каждого порта фиксированы на всё время жизни процесса, но непредсказуемы при перезапусках. Время удержания имеет случайную составляющую для каждого соединения, так что повторные зонды показывают естественную вариативность, аналогично реальным сервисам под нагрузкой.
v2.0 заменяет исходное поведение «баннер и закрытие», которое было уязвимо для обхода по закрытию соединения (см. пост блога Vicarius/Hored1971). Движок tarpit удерживает все соединения открытыми со смешанным временем, что позволяет обойти фильтрацию по закрытию соединения, тайминг-фингерпринтинг, анализ баннеров и статистическое моделирование шаблонов.
Убедитесь, что у вас установлены компилятор C++ и CMake (3.10+).
mkdir build && cd build
cmake -DCMAKE_INSTALL_SYSCONFDIR=/etc ..
make
sudo make install
Portspoof работает в пользовательском пространстве, но полагается на правила системного брандмауэра для перехвата трафика, предназначенного для других портов.
Перенаправьте весь входящий TCP-трафик (порты 1-65535) на порт Portspoof (по умолчанию 4444).
Linux (iptables):
# Сначала исключите реальные сервисы, затем перенаправьте остальное на Portspoof
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j RETURN
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -j REDIRECT --to-ports 4444
Примечание: замените eth0 на ваш сетевой интерфейс. Добавьте правило RETURN для каждого порта, на котором работает реальный сервис.
Чтобы сделать это постоянным, вы можете сохранить правила iptables или использовать iptables-config, предоставленный в каталоге system_files.
Вы можете добавить Portspoof в скрипты автозапуска, используя примеры из system_files/init.d/.
Этот режим генерирует и подает сканерам портов поддельные сигнатуры сервисов.
portspoof -c /etc/portspoof.conf -s /etc/portspoof_signatures -D
С пользовательскими временами удержания tarpit (удерживать каждое соединение от 10 до 60 секунд):
portspoof -s /etc/portspoof_signatures -t 10 -T 60 -D
Этот режим просто возвращает состояние OPEN для каждой попытки подключения без отправки баннеров сервисов. Соединения по-прежнему удерживаются в tarpit.
portspoof -D
Portspoof может использоваться для фаззинга инструментов сканирования путем отправки случайных или основанных на словаре нагрузок.
Фаззинг со встроенным генератором:
# Генерирует случайные нагрузки случайного размера
portspoof -1 -v
Фаззинг со словарем:
portspoof -f payloads.txt -v
Базовое правило REDIRECT выше работает, но агрессивный сканер все еще может попытаться перегрузить Portspoof соединениями. Следующий набор правил добавляет ограничение скорости и автоматическую блокировку хостов, превышающих порог соединений. Порты, на которых работают реальные сервисы (в этом примере SSH), исключены из перенаправления, но по-прежнему защищены глобальным правилом блокировки.
# --- NAT: перенаправить всё, кроме реальных сервисов ---
# добавьте правило RETURN для каждого порта, который вы реально используете (SSH, HTTP и т.д.)
iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports 4444
# --- FILTER: эшелонированная защита ---
# разрешить loopback (критически важно: предотвращает поломку локальных сервисов)
iptables -A INPUT -i lo -j ACCEPT
# если этот IP был отмечен как злоупотребляющий, отбрасывать всё (тихо, без RST)
iptables -A INPUT -m recent --name PORTSCAN --rcheck --seconds 60 -j DROP
# ограничить скорость новых SYN на исходный IP
iptables -A INPUT -p tcp --syn -m hashlimit \
--hashlimit-above 10/sec --hashlimit-burst 30 \
--hashlimit-mode srcip --hashlimit-name syn_throttle -j DROP
# если один IP держит 100+ соединений с portspoof, отметить и отбросить
iptables -A INPUT -p tcp --syn --dport 4444 -m connlimit \
--connlimit-above 100 --connlimit-mask 32 \
-m recent --name PORTSCAN --set -j DROP
# разрешить установленный трафик и новые соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --syn -j ACCEPT
iptables -A INPUT -j DROP
Для развертываний с высоким трафиком увеличьте размер списка xt_recent:
echo "options xt_recent ip_list_tot=10000" > /etc/modprobe.d/xt_recent.conf
И настройте отслеживание соединений ядра:
sysctl -w net.netfilter.nf_conntrack_max=131072
sysctl -w net.core.somaxconn=4096
Portspoof Pro масштабирует обман с одного хоста на всю сеть. Один сенсор эмулирует целые сети /16: тысячи IP-адресов, каждый с уникальными сервисами на всех портах, поддерживающими многошаговые разговоры с сохранением состояния.
Автор: Piotr Duszyński (@drk1wi)
Лицензия: GNU General Public License v2.0 (GPLv2). Подробности см. в файле LICENSE.
Для коммерческих, легитимных применений, пожалуйста, свяжитесь с автором для получения соответствующих лицензионных договоренностей.
Если вы обнаружите какие-либо ошибки или у вас есть предложения по функционалу, сообщите о них в GitHub Issue Tracker или свяжитесь с автором по электронной почте piotr [at] duszynski.eu.