
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):
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 を実行した後:
IDS はすべてを検知したが、何も止めなかった。 これがステージ 1 の中心的な教訓です: 適用機能のない IDS は警報システムであり、鍵ではありません。人間のアナリストがアラートを読む頃には、攻撃者はすでに root を取得しています。
副次的な観察: Snort の組み込みルール(116:408、116:414)は DHCP ブロードキャストトラフィックで発火します — 悪意はありませんが、本番環境ではアラートログを実用的に保つために抑制ルールが必要です。
IPS レイヤーは scripts/ips_setup.sh でデプロイされます。このスクリプトは次のことを行います:
-D)で起動する同じ攻撃スクリプトが攻撃者マシンから再実行されました:
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 が監査ログ記録を提供し、連携して動作します。
はい — SID 1000001 ~ 1000004 のすべてが攻撃シミュレーション中に正しく発火しました:
:) コンテンツマッチが正確なエクスプロイトバイト列を捕捉。しかし、検知 ≠ 防御です。 vsftpd エクスプロイトは、すべてのアラートが発火している間に root Meterpreter シェルを開きました。IDS をリアルタイムで監視している SOC アナリストは侵害を目撃していたでしょう — しかし、攻撃者は数秒で root を取得しており、アラートだけでは十分ではありません。これこそが IPS が存在する運用上の核心です。
この実装は、正当なトラフィックに対する観測可能な影響ゼロで完全な攻撃緩和を達成しました。その効果は外科的なルール設計に由来します — 各 iptables ルールは広範なプロトコルではなく行動シグネチャを対象としています:
connlimit は、単一セッションの FTP を妨げずにブルートフォースツールの並列性をブロックします。STRING マッチは、正当な FTP ログイントラフィックをフィルタリングせずに正確なエクスプロイトペイロードをドロップします。認識されている 1 つの制限: ICMP が完全に許可されているため、攻撃者は ping で Metasploitable が稼働していることを依然として確認できます。よりセキュリティレベルの高い環境では、これはレート制限されるか、信頼できる送信元に制限されるでしょう。このラボでは、ICMP が主要な接続確認メカニズムであるため、開放されたままです。
このラボでは専用の Snort マシンを使用しています。pfSense や OPNsense などのファイアウォールアプライアンス内で Snort をプラグインとして実行する場合と比較すると:
専用アプローチの利点:
トレードオフ:
専用 Snort は、パフォーマンス、配置、カスタマイズを必要とするエンタープライズ環境にとって正しい選択です。pfSense/OPNsense プラグイン方式は、使いやすさを優先する中小企業やホームラボ環境でより理にかなっています。
ステージ 2 は技術的には 受動的 Snort + iptables による適用であり、Snort が真のインラインモードで実行されているわけではありません — Snort 自体はログを記録し(pcap DAQ configured to passive)、iptables がレート制限、文字列マッチ、接続数に基づいてドロップを実行します。
これは正当で一般的なデプロイパターンです(多くの実世界の Linux ベース IDS/IPS スタックがこのように動作します)。自然な次のステップは、ステージ 2 を snort --daq nfq(またはインラインモードの afpacket)と Snort の reject / drop ルールアクションを使用した真のインライン構成に移行し、iptables に委任するのではなく、Snort 自体が完全なシグネチャマッチングに基づいてドロップを実行することです。
snort-ids-ips-lab/
├── README.md ← this file
├── report/
│ ├── Snort-IDS-IPS-Report.pdf ← full lab report
│ └── Snort-IDS-IPS-Report.docx ← editable source
├── scripts/
│ ├── router_config.sh ← IP forwarding + iptables routing
│ ├── ping_check.sh ← connectivity verification
│ ├── attack_simulator.sh ← 4-vector attack chain
│ ├── ips_setup.sh ← IPS iptables rules + Snort daemon
│ └── local.rules ← 5 custom Snort rules (SID 1000001-1000005)
├── screenshots/ ← report figures
├── .gitignore
└── LICENSE
⚠️ ラボ専用です。 これらのスクリプトは、意図的に脆弱なターゲットに対して実際のエクスプロイトとブルートフォースツールを実行します。所有しておらず、テストする明示的な書面による許可を得ていないシステムに対して実行しないでください。
scripts/router_config.sh を実行し、その後 scripts/ping_check.sh を実行して完全な接続を確認します。sudo apt update && sudo apt install snort -y
scripts/local.rules を /etc/snort/rules/local.rules に配置し、/etc/snort/snort.conf で HOME_NET = "10.10.10.0/24,192.168.50.0/24" を設定します。sudo snort -T -c /etc/snort/snort.conf — 652 ルールが読み込まれ、警告 0 になることを期待。sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 -A alert_fast -l /var/log/snort/
# In another terminal:
sudo tail -f /var/log/snort/alert_fast.txt
sudo ./scripts/attack_simulator.sh — アラートの発火と Meterpreter シェルを観察します。このリポジトリに記録されているすべての活動は、監督付きの学術学習を目的として、自己完結型の VMware 仮想ラボ環境内でのみ実施されました。外部、本番、または実世界のシステムは、いかなる形でも標的にされたり、スキャンされたり、影響を受けたりしていません。Metasploitable 2 は、セキュリティトレーニング専用に設計された意図的に脆弱な仮想マシンです。
この資料は、システム所有者からの明示的な書面による許可なしに、実際のシステムに対してこれらの活動を再現するために使用してはなりません。 許可のないポートスキャン、認証情報攻撃、またはネットワークサービスの悪用は、ほとんどの法域で違法です。
MIT — LICENSE を参照。ラボレポート自体は教育用の参考資料として提供されています。
| 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:" |
| 攻撃 | 検知 | 結果 |
|---|
| 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 シェルが取得された |
| ルール | 動作 |
|---|
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 |
| 攻撃 / トラフィック | ステージ 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) |
sudo ./scripts/ips_setup.sh を実行し、その後攻撃者マシンで攻撃チェーンを再実行します。ブロックを確認したら、手動でテストします:
ping -c 4 192.168.50.10 # should succeed
ftp 192.168.50.10 # msfadmin / msfadmin — should succeed