ポートエミュレーションとは、特定のポートが開放されており、接続可能であるが、実際のサービスではなく、主要な機能を提供しないもので、接続時に類似または同一の挨拶でサービスを模倣するものです。
ポートエミュレーションは、大企業がネットワークインフラをサービスや脆弱性のスキャンから保護するためにしばしば使用されます。簡単に言えば、ポートスキャナーを誤解させ、スキャン試行中にしばしばフリーズさせます。
このガイドでは、PortSpoofサービスをインストールし、実際にサービスで使用されているポート(22、80、443)を除くすべてのポートに対してエミュレーションを設定します。
3つのポートのみが開放され、残りが閉じている場合、全範囲のポートスキャンは数秒で完了し、誰でもサーバーのIPアドレスを使用してポートをスキャンすることで利用可能なサービスを特定できます。
しかし、すべてのポートの状態をエミュレートし、1から65535までの全範囲でポートが開いているように見せかけた場合、スキャンには約65,535秒、つまり約18時間かかります。得られる情報はほとんど価値がなく、脆弱性の発見を大幅に困難にします。
1. PortSpoofのインストール
apt install git cmake build-essential autoconf automake libtool nano
git clone https://github.com/drk1wi/portspoof.git
cd portspoof
chmod +x configure
./configure --sysconfdir=/etc/
make -j$(nproc)
make install
1.1 ログファイルの作成
mkdir -p /var/log/portspoof
touch /var/log/portspoof/alerts.log
chmod 644 /var/log/portspoof/alerts.log
1.2 サービスファイルの作成
nano /etc/systemd/system/portspoof.service
以下の内容を記述します:
[Unit]
Description=Portspoof Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/portspoof \
-c /etc/portspoof.conf \
-p 4444 \
-s /etc/portspoof_signatures \
-d \
-l /var/log/portspoof/alerts.log
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
1.3 PortSpoofバイナリのパスの確認
which portspoof
サービスファイル内のパスと一致していることを確認してください。
1.4 サービスの開始
systemctl daemon-reexec
systemctl daemon-reload
systemctl enable portspoof
systemctl start portspoof
状態を確認するには:
systemctl status portspoof
1.5 設定のテスト
telnet <IPアドレス> 4444
Trying 89.xx.187.xx...
Connected to 89.xx.187.xx.
Escape character is '^]'.
これで接続が成功したことを示します。次に、残りのポートをリダイレクトするようにファイアウォールを設定します。
2. iptablesのインストールと永続ルールの設定
apt install iptables iptables-persistent
IPv4およびIPv6の対話型ウィンドウで「はい」を押します。
2.1 ルールの設定
サービス(22、80、443)を除外するためにいくつかのルールを作成しました。自分のサービスに合わせて調整してください。
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 1:21 -j REDIRECT --to-ports 4444
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 23:79 -j REDIRECT --to-ports 4444
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 81:442 -j REDIRECT --to-ports 4444
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 444:65535 -j REDIRECT --to-ports 4444
サービスを許可するルールを追加します:
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
サーバー再起動後にルールが適用されるように保存します:
netfilter-persistent save
または:
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
完了!これで範囲内の任意のポートに接続を試み、その出力を確認できます。私たちはWindows用の無料ポートスキャンツール、Advanced Port Scannerを使用しました。
ご覧の通り、ポートは2つの設定ファイルに基づいて挨拶を返します:
- portspoof.conf - 特定のポートとその応答をリストします。ポートと応答を追加したり、空の応答の場合はポート番号と""を指定できます。
- portspoof_signatures - 設定ファイルにリストされていないすべてのポートの署名情報を含みます。
応答(バナー)はこれら2つの設定ファイルから取得されます。
ファイルを編集した後、サービスを再起動するだけです:
systemctl restart portspoof
各ポートは独自の応答を持ちます。スキャンを時間内に停止しないと、ポートの数が多すぎるためにプログラムがハングアップする可能性があります。
特定のポートからの応答はオペレーティングシステムを隠し、スキャナーがサーバーをルーターやプリンターと誤認させる可能性があります。
3. 追加の手順
ポートの挨拶を無効にするには、署名ファイルを空のファイルに置き換えます:
mv /etc/portspoof_signatures /etc/portspoof_signatures_orig
touch /etc/portspoof_signatures
EOFの前に新しい行を追加しないと、サービスが起動しません:
printf "\n" > /etc/portspoof_signatures
サービスを再起動します:
systemctl restart portspoof
これで、portspoof.confに明示的に指定されていないポートは空の応答を返します。すべてのポートにこれを適用するには、portspoof.confの関連行をコメントアウトし、サービスを再起動します。
多数のポートに対する空の応答は、どのサービスが応答したかを明らかにしないため、より良い解決策です。
ただし、デバイスの偽装が目的の場合、ポートの応答は重要ですが、すべてのポートに適用するのはあまりにも明らかです。
接続が成功すると、接続は切断されます。広範囲のポートをスキャンする場合は、nmapユーティリティを使用する方が良いです。
4. nmapを使用したポートスキャン
apt install nmap
4.1 基本スキャン
nmap -p 1-65535 <IPアドレス>
4.2 より高速なスキャン
nmap -p 1-65535 -T4 <IPアドレス>
4.3 サービス情報の出力付き
nmap -p 1-65535 -sV <IPアドレス>
4.4 結果をファイルに保存
nmap -p 1-65535 -oN result.txt <IPアドレス>