
Kali上のSnort 3 IDS → IPSラボ。ICMP偵察、Nmap SYNスキャン、Hydra FTPブルートフォース、vsftpd 2.3.4バックドア(CVE-2011-2523)に対するカスタム検出ルール+iptablesによる強制。
Kali Linux 上の 3 台構成の仮想ネットワークにおいて、Snort 3 を侵入検知システム(受動的モニタリング)および侵入防御システム(iptables による能動的ブロック)としてフルサイクル導入し、4 つの攻撃ベクトルに対して検証したラボです。
本ラボは、同一の 4 ベクトル攻撃チェーンを 2 回実行することで、検知と防御の運用上の違いを実証します。最初はログを記録するだけでブロックできない IDS に対して、次に正当なトラフィックを維持しながら攻撃を選択的に破棄する IDS + iptables IPS レイヤーに対して実行します。
| コンポーネント | 詳細 |
|---|---|
| アナライザー / ルーター | Kali Linux — 3 つのアダプター: eth0 WAN (192.168.10.143, NAT)、eth1 LAN1 (10.10.10.1, ホストオンリー)、eth2 LAN2 (192.168.50.1, ホストオンリー) |
| 攻撃者 | Kali Linux — eth0 は VMnet9 上 (10.10.10.10) — デフォルトゲートウェイ 10.10.10.1 |
| ターゲット | Metasploitable 2 — eth0 は VMnet10 上 (192.168.50.10) — デフォルトゲートウェイ 192.168.50.1 |
| Snort バージョン | Snort++ 3.12.1.0-0kali1(アナライザーにインストール) |
| 攻撃ツール | Nmap 7.99、Hydra v9.6、Metasploit Framework (msfconsole) |
| 仮想化 | VMware — VMnet9 = 10.10.10.0/24、VMnet10 = 192.168.50.0/24(いずれもホストオンリー) |
攻撃者と Metasploitable の間のすべてのトラフィックはアナライザーを経由するため、モニタリングとポリシー適用の両方において自然なチョークポイントとなります。
┌─────────────────────────┐
│ Analyzer / Router │
│ Kali + Snort 3 │
│ │
Attacker Kali ──VMnet9──┤ eth1: 10.10.10.1 │
10.10.10.10 │ │
│ eth0: 192.168.10.143 ───┼──> WAN (NAT)
│ │
Metasploitable 2 ─VMnet10┤ eth2: 192.168.50.1 │
192.168.50.10 │ │
└─────────────────────────┘
図を用意できたら、この ASCII スケッチを
screenshots/01-network-topology.pngに置き換えてください:Topology
本ラボは 2 つのステージで実行され、各ステージで同一の 4 ベクトル攻撃チェーンを使用します:
pingnmap -sS(1000 ポート)ステージ 1(IDS) は、アナライザー上で Snort を 5 つのカスタムルールとともに受動的に実行します — アラートをリアルタイムで観察し、それでもエクスプロイトが進行することを確認します。
ステージ 2(IPS) は、外科的ドロップルールを使用する iptables 適用レイヤーと Snort を組み合わせます — ICMP ping と正当な FTP ログインが機能し続ける一方で、攻撃がブロックされることを確認します。
MASQUERADE + FORWARD ルールを追加します — scripts/router_config.sh を参照。scripts/ping_check.sh を使用して各 VM からのエンドツーエンド接続を確認します。Snort は Kali のパッケージマネージャー(sudo apt install snort -y)でインストールされ、/etc/snort/snort.conf で設定されます:
HOME_NET = "10.10.10.0/24,192.168.50.0/24"
EXTERNAL_NET = "any"
ips = {
enable_builtin_rules = true,
include = "/etc/snort/rules/local.rules",
variables = default_variables
}
alert_fast = { file = true, packet = false }
HOME_NET は両方の内部サブネットをカバーするため、Snort はアナライザー上のすべてのサブネット間トラフィックを検査に値するものとして扱います。alert_fast はコンパクトな 1 行アラートを生成します(パケット単位のログ記録は過剰な量を生成するため)。
設定の検証:
sudo snort -T -c /etc/snort/snort.conf
# Result: 652 rules loaded (5 custom text + 647 built-in), 0 warnings
/etc/snort/rules/local.rules 内の 5 つのルール(完全なファイルは scripts/local.rules):
| SID | 名前 | トリガー |
|---|---|---|
| 1000001 | ICMP Ping 検知 | いずれかの方向のすべての ICMP トラフィック — 偵察 ping を捕捉 |
| 1000002 | FTP 接続試行 | ポート 21 へのすべての TCP 接続 — 正当なトラフィックとブルートフォーストラフィックの両方を捕捉 |
| 1000003 | 可能性のある Nmap SYN スキャン | SYN フラグのみが設定された TCP パケット(flags:S)— ハーフオープンスキャンのシグネチャ |
| 1000004 | VSFTPD 2.3.4 バックドア試行 | FTP ポート 21 上の content:":)" — CVE-2011-2523 の正確なトリガー文字列 |
| 1000005 | 可能性のある Metasploit シェルコード | `content:" |
Snort は両方の内部インターフェースでパッシブモードで実行されます:
sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 \
-A alert_fast -l /var/log/snort/
# Watch alerts in a second terminal:
sudo tail -f /var/log/snort/alert_fast.txt
起動出力で pcap DAQ configured to passive が確認できます — Snort はすべてのパケットを監視できますが、いずれもドロップまたは変更できません。
攻撃者マシンから scripts/attack_simulator.sh を実行した後:
| 攻撃 | 検知 | 結果 |
|---|---|---|
| ICMP 偵察 | ✅ SID 1000001 — 双方向アラート | Ping 完了 |
| Nmap SYN スキャン | ✅ SID 1000003 — 1 秒未満で数千のアラート | 23 個のオープンポートが列挙された |
| Hydra FTP ブルートフォース | ✅ SID 1000002 — 繰り返しの FTP 接続アラート | msfadmin:msfadmin の認証情報がクラックされた |
| vsftpd 2.3.4 バックドア | ✅ SID 1000004 — :) コンテンツマッチが発火 | root Meterpreter シェルが取得された |
IDS はすべてを検知したが、何も止めなかった。 これがステージ 1 の中心的な教訓です: 適用機能のない IDS は警報システムであり、鍵ではありません。人間のアナリストがアラートを読む頃には、攻撃者はすでに root を取得しています。
副次的な観察: Snort の組み込みルール(116:408、116:414)は DHCP ブロードキャストトラフィックで発火します — 悪意はありませんが、本番環境ではアラートログを実用的に保つために抑制ルールが必要です。
IPS レイヤーは scripts/ips_setup.sh でデプロイされます。このスクリプトは次のことを行います:
-D)で起動する| ルール | 動作 |
|---|---|
ACCEPT icmp | すべての ICMP を明示的に許可 — 接続確認を維持 |
DROP tcp dpt:21 STRING ":)" | ポート 21 で vsftpd 2.3.4 バックドアのトリガーを含むパケットをドロップ |
ACCEPT tcp --syn -m limit --limit 10/s --limit-burst 20 | レート制限内の通常の TCP ハンドシェイクを許可 |
DROP tcp --syn(リミット超過後) | 10/s を超える SYN フラッドをドロップ — Nmap SYN スキャンを無効化 |
DROP tcp dpt:21 -m connlimit --connlimit-above 5 --connlimit-mask 32 | 送信元ごとに 5 を超える同時 FTP 接続をブロック — Hydra の並列処理を無効化 |
ACCEPT eth1→eth0、ACCEPT eth2→eth0 | 通常の外向きルーティング |
ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED | ステートフル — 確立されたセッションを維持 |
同じ攻撃スクリプトが攻撃者マシンから再実行されました:
| 攻撃 | ステージ 2 の結果 |
|---|---|
| ICMP 偵察 | ✅ 許可(意図的) |
| Nmap SYN スキャン | ❌ ブロック — 1000 filtered tcp ports (no-response)、スキャンは 1 秒未満ではなく 21.71 秒かかった |
| Hydra FTP ブルートフォース | ❌ ブロック — all children were disabled due too many connection errors — 0 valid password found |
| vsftpd バックドア | ❌ ブロック — Rex::ConnectionTimeout — Exploit completed, but no session was created |
2 つの手動チェックにより、選択的な適用が確認されました:
ping -c 4 192.168.50.10 → 4 パケット送信、4 パケット受信、0% ロスmsfadmin:msfadmin を使用した ftp 192.168.50.10 → 220 (vsFTPd 2.3.4) … 230 Login successful実行中の iptables パケットカウンターによる定量的な証拠: 2051 パケット受理、12 パケットが FTP connlimit ルールでドロップ、808 個の ICMP パケットが受理 — 数値で見る選択的な適用です。
IPS モードでも、Snort は、iptables が後続のパケットをドロップする前に受動的検査ポイントに到達したパケットに対して SID 1000002 / 1000003 のアラートを発火し続けました — つまり、iptables がポリシー適用を、Snort が監査ログ記録を提供し、連携して動作します。
| 攻撃 / トラフィック | ステージ 1(IDS のみ) | ステージ 2(IDS + iptables IPS) |
|---|---|---|
| ICMP ping | 検知 ✅ | 許可 ✅(意図的) |
| Nmap SYN スキャン | 検知 — 23 個のオープンポートを検出 | ブロック — 1000 フィルタード |
| Hydra FTP ブルートフォース | 検知 — msfadmin:msfadmin をクラック | ブロック — 0 パスワード検出 |
| vsftpd 2.3.4 エクスプロイト | 検知 — root Meterpreter シェル | ブロック — 接続タイムアウト |
| 正当な FTP ログイン | n/a | 維持(230 Login successful) |
はい — SID 1000001 ~ 1000004 のすべてが攻撃シミュレーション中に正しく発火しました:
:) コンテンツマッチが正確なエクスプロイトバイト列を捕捉。