
Kali에서의 Snort 3 IDS → IPS 실습. 사용자 정의 탐지 규칙 + iptables 적용: ICMP 정찰, Nmap SYN 스캔, Hydra FTP 무차별 대입 공격, vsftpd 2.3.4 백도어(CVE-2011-2523) 대응.
Snort 3을 침입 탐지 시스템(수동 모니터링)과 침입 방지 시스템(iptables를 통한 능동 차단)으로 모두 사용하는 전체 사이클 배포로, Kali Linux상의 세 대의 가상 머신 네트워크에서 네 가지 공격 벡터에 대해 검증했습니다.
이 실습은 탐지와 방지의 운영적 차이를 증명합니다. 동일한 네 가지 벡터 공격 체인을 두 번 실행합니다. 처음에는 로그만 기록하고 차단할 수 없는 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 — VMnet9의 eth0 (10.10.10.10) — 기본 게이트웨이 10.10.10.1 |
| 대상 | Metasploitable 2 — VMnet10의 eth0 (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 간의 모든 트래픽은 분석기를 통해 강제로 전달되어, 모니터링과 시행 모두에 자연스러운 병목 지점이 됩니다.
┌─────────────────────────┐
│ 분석기 / 라우터 │
│ Kali + Snort 3 │
│ │
공격자 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로 교체하세요:토폴로지
실습은 동일한 네 가지 공격 벡터 체인을 사용하여 두 단계로 실행됩니다:
pingnmap -sS (1000개 포트)1단계 (IDS) 는 분석기에서 5개의 사용자 정의 규칙을 사용하여 Snort를 수동으로 실행합니다. 실시간으로 경보를 관찰하고, 공격이 계속 진행됨을 확인합니다.
2단계 (IPS) 는 Snort를 정밀 드롭 규칙을 사용하는 iptables 시행 계층과 결합합니다. ICMP 핑과 정상 FTP 로그인은 정상 작동하는 동안 공격이 차단됨을 확인합니다.
MASQUERADE + FORWARD 규칙을 추가하여 분석기가 서브넷 간 및 WAN으로 라우팅할 수 있도록 합니다. 자세한 내용은 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는 간결한 한 줄 경보를 생성합니다(패킷당 로깅은 과도한 양을 생성함).
구성 검증:
sudo snort -T -c /etc/snort/snort.conf
# 결과: 652개 규칙 로드됨 (사용자 정의 5개 텍스트 + 내장 647개), 경고 0개
/etc/snort/rules/local.rules에 있는 5개 규칙(전체 파일은 scripts/local.rules 참조):
| SID | 이름 | 트리거 |
|---|---|---|
| 1000001 | ICMP 핑 탐지됨 | 양방향의 모든 ICMP 트래픽 — 정찰 핑을 포착함 |
| 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/
# 두 번째 터미널에서 경보를 실시간 확인:
sudo tail -f /var/log/snort/alert_fast.txt
시작 출력은 pcap DAQ configured to passive를 확인합니다. Snort는 모든 패킷을 보지만 그 중 어느 것도 드롭하거나 수정할 수 없습니다.
공격자에서 scripts/attack_simulator.sh 실행 후:
| 공격 | 탐지 | 결과 |
|---|---|---|
| ICMP 정찰 | ✅ SID 1000001 — 양방향 경보 | 핑 완료 |
| Nmap SYN 스캔 | ✅ SID 1000003 — 1초 미만에 수천 개의 경보 | 23개의 열린 포트가 열거됨 |
| Hydra FTP 무차별 대입 | ✅ SID 1000002 — 반복적인 FTP 연결 경보 | msfadmin:msfadmin 자격 증명이 해독됨 |
| vsftpd 2.3.4 백도어 | ✅ SID 1000004 — :) 내용 일치 발생 | 루트 Meterpreter 셸 획득 |
IDS는 모든 것을 탐지했지만 아무것도 막지 못했습니다. 이것이 1단계의 핵심 교훈입니다: 시행 없는 작동하는 IDS는 경보 시스템일 뿐, 잠금 장치가 아닙니다. 인간 분석가가 경보를 읽을 때쯤이면 공격자는 이미 루트 권한을 획득한 상태입니다.
부차적 관찰: 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/초를 초과하는 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 (무응답), 스캔에 21.71초 소요 (1초 미만 대신) |
| Hydra FTP 무차별 대입 | ❌ 차단됨 — too many connection errors로 인해 모든 하위 프로세스가 비활성화됨 — 유효한 비밀번호 0개 발견 |
| vsftpd 백도어 | ❌ 차단됨 — Rex::ConnectionTimeout — 익스플로잇이 완료되었지만 세션이 생성되지 않음 |
두 가지 수동 확인으로 선택적 시행이 확인됨:
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 핑 | 탐지됨 ✅ | 허용됨 ✅ (의도적) |
| Nmap SYN 스캔 | 탐지됨 — 23개 열린 포트 발견 | 차단됨 — 1000개 필터링됨 |
| Hydra FTP 무차별 대입 | 탐지됨 — msfadmin:msfadmin 해독됨 | 차단됨 — 비밀번호 0개 발견 |
| vsftpd 2.3.4 익스플로잇 | 탐지됨 — 루트 Meterpreter 셸 | 차단됨 — 연결 시간 초과 |
| 정상 FTP 로그인 | 해당 없음 | 유지됨 (230 Login successful) |
네 — SID 1000001–1000004 각각이 공격 시뮬레이션 중에 올바르게 발동되었습니다:
:) 내용 일치가 정확한 익스플로잇 바이트 시퀀스를 포착했습니다.하지만 탐지 ≠ 예방입니다. vsftpd 익스플로잇은 모든 경보가 발동되는 동안 루트 Meterpreter 셸을 열었습니다. IDS를 실시간으로 모니터링하는 SOC 분석가는 침해를 보았을 것입니다. 그러나 공격자가 몇 초 만에 루트가 된 상황에서 경보만으로는 충분하지 않습니다. 이것이 IPS가 존재하는 운영적 핵심입니다.
구현은 정상 트래픽에 관찰 가능한 영향 없이 완전한 공격 완화를 달성했습니다. 효과성은 정밀 규칙 설계에서 비롯됩니다. 각 iptables 규칙은 광범위한 프로토콜이 아닌 행동 시그니처를 대상으로 합니다: