
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 참조):
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 실행 후:
IDS는 모든 것을 탐지했지만 아무것도 막지 못했습니다. 이것이 1단계의 핵심 교훈입니다: 시행 없는 작동하는 IDS는 경보 시스템일 뿐, 잠금 장치가 아닙니다. 인간 분석가가 경보를 읽을 때쯤이면 공격자는 이미 루트 권한을 획득한 상태입니다.
부차적 관찰: Snort의 내장 규칙(116:408, 116:414)이 DHCP 브로드캐스트 트래픽에서 발동됩니다. 악의적이지는 않지만, 프로덕션 환경에서는 경보 로그를 실행 가능하게 유지하기 위해 억제 규칙이 필요합니다.
IPS 계층은 scripts/ips_setup.sh로 배포되며, 다음을 수행합니다:
-D)로 실행합니다.공격자에서 동일한 공격 스크립트를 재실행:
두 가지 수동 확인으로 선택적 시행이 확인됨:
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 익스플로잇은 모든 경보가 발동되는 동안 루트 Meterpreter 셸을 열었습니다. IDS를 실시간으로 모니터링하는 SOC 분석가는 침해를 보았을 것입니다. 그러나 공격자가 몇 초 만에 루트가 된 상황에서 경보만으로는 충분하지 않습니다. 이것이 IPS가 존재하는 운영적 핵심입니다.
구현은 정상 트래픽에 관찰 가능한 영향 없이 완전한 공격 완화를 달성했습니다. 효과성은 정밀 규칙 설계에서 비롯됩니다. 각 iptables 규칙은 광범위한 프로토콜이 아닌 행동 시그니처를 대상으로 합니다:
connlimit 은 단일 세션 FTP를 방해하지 않으면서 무차별 대입 도구의 병렬 처리를 차단합니다.STRING 일치는 정상 FTP 로그인 트래픽을 필터링하지 않으면서 정확한 익스플로잇 페이로드를 드롭합니다.인정된 한계: ICMP는 완전히 허용되므로 공격자는 여전히 핑을 통해 Metasploitable이 살아 있음을 확인할 수 있습니다. 보안 수준이 더 높은 환경에서는 속도 제한을 두거나 신뢰할 수 있는 소스로 제한할 것입니다. 이 실습에서 ICMP는 기본 연결 확인 메커니즘이므로 열어 둡니다.
이 실습은 전용 Snort 머신을 사용합니다. pfSense 또는 OPNsense와 같은 방화벽 어플라이언스 내에서 Snort를 플러그인으로 실행하는 것과 비교하여:
전용 접근 방식의 장점:
트레이드오프:
전용 Snort는 성능, 배치 및 사용자 정의가 필요한 엔터프라이즈 환경에 올바른 선택입니다. pfSense/OPNsense 플러그인 접근 방식은 사용 편의성을 우선시하는 소규모 비즈니스 또는 홈 랩 환경에 더 적합합니다.
2단계는 기술적으로 수동 Snort + iptables 시행이며, Snort가 진정한 인라인 모드로 실행되는 것은 아닙니다. Snort 자체는 로깅(pcap DAQ configured to passive)하고 iptables가 속도 제한, 문자열 일치 및 연결 수를 기반으로 드롭을 수행합니다.
이는 합법적이고 일반적인 배포 패턴입니다(많은 실제 Linux 기반 IDS/IPS 스택이 이렇게 작동합니다). 자연스러운 후속 작업은 Snort의 reject / drop 규칙 작업을 사용하여 snort --daq nfq(또는 인라인 모드의 afpacket)를 사용한 진정한 인라인 구성으로 2단계를 마이그레이션하여 Snort 자체가 iptables에 위임하는 대신 전체 시그니처 일치를 기반으로 드롭을 수행하도록 하는 것입니다.
snort-ids-ips-lab/
├── README.md ← 이 파일
├── report/
│ ├── Snort-IDS-IPS-Report.pdf ← 전체 실습 보고서
│ └── Snort-IDS-IPS-Report.docx ← 편집 가능한 소스
├── scripts/
│ ├── router_config.sh ← IP 전달 + iptables 라우팅
│ ├── ping_check.sh ← 연결 확인
│ ├── attack_simulator.sh ← 4-벡터 공격 체인
│ ├── ips_setup.sh ← IPS iptables 규칙 + Snort 데몬
│ └── local.rules ← 5개 사용자 지정 Snort 규칙 (SID 1000001-1000005)
├── screenshots/ ← 보고서 그림
├── .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/
# 다른 터미널에서:
sudo tail -f /var/log/snort/alert_fast.txt
sudo ./scripts/attack_simulator.sh — 경보 발동 및 Meterpreter 셸 관찰.이 저장소에 문서화된 모든 활동은 감독된 학술 학습 목적으로 완전히 자체 포함된 VMware 가상 실습 환경 내에서만 수행되었습니다. 외부, 프로덕션 또는 실제 시스템은 대상으로 지정되거나 스캔되거나 어떤 방식으로든 영향을 받지 않았습니다. Metasploitable 2는 보안 교육을 위해 특별히 설계된 의도적으로 취약한 가상 머신입니다.
이 자료는 시스템 소유자의 명시적인 서면 승인 없이 실제 시스템에 대해 이러한 활동을 복제하는 데 사용되어서는 안 됩니다. 무단 포트 스캔, 자격 증명 공격 또는 네트워크 서비스 악용은 대부분의 관할권에서 불법입니다.
MIT — LICENSE를 참조하세요. 실습 보고서 자체는 교육적 참고 자료로 제공됩니다.
| 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:" |
| 공격 | 탐지 | 결과 |
|---|
| ICMP 정찰 | ✅ SID 1000001 — 양방향 경보 | 핑 완료 |
| Nmap SYN 스캔 | ✅ SID 1000003 — 1초 미만에 수천 개의 경보 | 23개의 열린 포트가 열거됨 |
| Hydra FTP 무차별 대입 | ✅ SID 1000002 — 반복적인 FTP 연결 경보 | msfadmin:msfadmin 자격 증명이 해독됨 |
| vsftpd 2.3.4 백도어 | ✅ SID 1000004 — :) 내용 일치 발생 | 루트 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/초를 초과하는 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 — 익스플로잇이 완료되었지만 세션이 생성되지 않음 |
| 공격 / 트래픽 | 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) |
sudo ./scripts/ips_setup.shping -c 4 192.168.50.10 # 성공해야 함
ftp 192.168.50.10 # msfadmin / msfadmin — 성공해야 함