
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-)は10時間以上かかり、数百メガバイトの無価値なデータを生成します。実際のサービス(SSH、SMTP、FTP、HTTP)はバナーを送信し、クライアントからの入力を待つために接続を開いたままにします。説得力のあるエミュレーションとは、同じことを行うことです: 受け入れ、送信、保持。しかし、スレッド・パー・クライアントモデルはコンテキストスイッチングにメモリとCPUを消費し、大規模になると防御側は攻撃側が忍耐力を失う前にリソースを使い果たします。欺瞞ツールは自己DoSベクターになります。
アプローチ: シングルスレッドの epoll イベントループ。各ポートには起動時に配信モードが割り当てられます。即座にバナーをプッシュするもの、クライアントがデータを送信するのを待ってから応答するもの、サイレントのままのものがあります。ホールド時間は桁違いに分散され(数十ミリ秒から数分)、接続ごとにジッターが追加されるため、同じポートへの繰り返しのプローブは同一のタイミングを返しません。
これは重要です。なぜなら、これがないと、攻撃者はすべてのポートにガベージを送信し、応答タイミングを測定できるからです。実際のサービスは(間違ったプロトコルのため)速やかに閉じますが、単純なターピットは数秒間保持します。混合モードと広いタイミング分散により、何千もの偽のポートも実際のサービスと同じ範囲で閉じます。フィルタリングするための明確なしきい値はありません。
非対称性により経済性が成り立ちます:
ポートごとの配信モードはプロセスの存続期間中固定ですが、再起動ごとに予測不可能です。ホールド時間には接続ごとのランダム要素があり、繰り返しのプローブでは、実際のサービスが負荷の下で示すのと同様の自然なばらつきが示されます。
v2.0 では、接続終了バイパスに対して脆弱だった元のバナーアンドクローズ動作を置き換えました(Vicarius/Hored1971のブログ記事を参照)。ターピットエンジンは混合タイミングですべての接続を開いたままにし、接続終了フィルタリング、タイミング指紋認証、バナー分析、統計的パターンモデリングを無効にします。
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ルールを保存するか、system_filesディレクトリにある iptables-config を使用できます。
system_files/init.d/ の例を使用して、起動スクリプトにPortspoofを追加できます。
このモードは、ポートスキャナーに偽のサービスシグネチャを生成して提供します。
portspoof -c /etc/portspoof.conf -s /etc/portspoof_signatures -D
カスタムターピットタイミング(各接続を10~60秒間保持)の場合:
portspoof -s /etc/portspoof_signatures -t 10 -T 60 -D
このモードは、サービスバナーを送信せずに、すべての接続試行に OPEN 状態を返すだけです。接続は依然としてターピットされます。
portspoof -D
Portspoofは、ランダムまたはワードリストベースのペイロードを送信してスキャンツールをファズするために使用できます。
内部ジェネレーターによるファズ:
# ランダムなサイズのランダムペイロードを生成
portspoof -1 -v
ワードリストによるファズ:
portspoof -f payloads.txt -v
上記の基本的なREDIRECTルールは機能しますが、攻撃的なスキャナーは接続でPortspoofを圧倒しようとする可能性があります。以下のルールセットはレート制限を追加し、接続しきい値を超えたホストを自動的に禁止します。実際のサービスをホストするポート(この例ではSSH)はリダイレクトから除外されますが、グローバル禁止ルールによって保護されます。
# --- NAT: 実際のサービス以外をすべてリダイレクト ---
# 実際に使用するポート(SSH、HTTPなど)ごとにRETURNルールを追加
iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports 4444
# --- FILTER: 多層防御 ---
# ループバックを許可(重要: ローカルサービスを壊さないため)
iptables -A INPUT -i lo -j ACCEPT
# このIPが悪用としてフラグされた場合、すべてをドロップ(サイレント、RSTなし)
iptables -A INPUT -m recent --name PORTSCAN --rcheck --seconds 60 -j DROP
# 送信元IPあたりの新しいSYNをレート制限
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がportspoofに対して100以上の接続を保持している場合、フラグしてドロップ
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 までメールで作者に連絡してください。