📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 237편
이전 글: 236. IPS에서 Scan 차단 이벤트 확인 · 다음 글: 238. Suricata Scan 탐지
Snort는 스캔을 두 경로로 알립니다. 하나는 스캔 전용 모듈(Snort 2의 sfPortscan 전처리기, Snort 3의 port_scan inspector)이고, 다른 하나는 일반 규칙(임계치·시그니처 규칙)입니다. Snort 자체와 규칙 문법은 287. Snort란 무엇인가, 288. Snort Rule 기초에서 다뤘습니다. 이 글은 관제자가 Snort 스캔 Alert를 받았을 때 어떤 정보를 읽어야 하는가에 집중합니다.
| 경로 | Alert 식별 | 판단 근거 |
|---|---|---|
| 스캔 전용 모듈 | GID 122 계열, 메시지 앞 (portscan) | 고유 포트·호스트 수, 실패 응답 |
| 임계치 규칙 | GID 1(일반 규칙), 로컬 sid | 일정 시간 안 일치 횟수 |
| 시그니처 규칙 | GID 1, 룰셋의 스캔 범주 | 스캔 도구 특유의 패킷 모양 |
GID(Generator ID)는 "어느 구성 요소가 Alert를 만들었는가"를 뜻합니다. 규칙 Alert는 보통 GID 1이고, 전처리기·inspector가 만든 이벤트는 고유 GID를 가집니다.
스캔 전용 모듈은 규칙처럼 패킷 한 개를 보고 판단하지 않고, 출발지별로 시간 창 안의 행동을 모아서 판단합니다.
패킷 관찰
↓
[집계] 출발지 → 목적지별 연결 시도, 고유 포트 수, 고유 호스트 수
↓
[응답 확인] 대상의 거절 응답(RST, ICMP Unreachable) 비율
↓
[유형 판정]
├─ 한 대상 × 多 포트 → Portscan
├─ 多 대상 × 적은 포트 → Portsweep
├─ 多 출발지 → 한 대상 → Distributed / Decoy Portscan
└─ 응답 없이 필터링된 경우 → Filtered 계열
↓
Alert (GID 122) + 부가 정보(개수·범위)
Snort 2 문서 기준으로 민감도(sense_level) 는 low·medium·high가 있으며, low는 대상의 거절 응답(오류 패킷) 을 근거로 판단해 오탐이 적은 대신 필터링된 환경의 스캔을 놓칠 수 있고, 높을수록 더 넓게 잡지만 오탐이 늘어납니다. Snort 3의 설정 이름과 기본값은 버전 문서로 확인합니다.
스캔 모듈 Alert의 메시지는 스캔의 모양을 그대로 알려 줍니다(대표 예, 전체 목록과 SID 번호는 버전 문서 확인).
| 메시지(예) | 모양 | 관제 해석 |
|---|---|---|
(portscan) TCP Portscan | 한 출발지 → 한 대상 多 포트 | 특정 서버 표적 정찰 |
(portscan) TCP Portsweep | 한 출발지 → 多 대상 | 열린 서비스 가진 호스트 찾기 |
(portscan) TCP Distributed Portscan | 多 출발지 → 한 대상 | 분산 정찰, 출발지 목록 확보 |
(portscan) TCP Decoy Portscan | 위조 출발지 섞임 | 실제 출발지 식별 필요 |
(portscan) ... Filtered ... | 응답 없음(필터링) | 방화벽이 대부분 막음 |
| UDP·ICMP 계열 | 프로토콜별 동일 개념 | 해당 프로토콜 노출 확인 |
Snort fast alert 형식의 스캔 Alert 형식 예시입니다(값은 환경마다 다름, SID 번호는 예시).
09/30-02:05:07.412345 [**] [122:1:1] (portscan) TCP Portscan [**] [Priority: 3] {PROTO:255} 203.0.113.60 -> 192.168.20.10
09/30-02:07:30.118200 [**] [1:1001501:1] LOCAL possible TCP SYN scan from external [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 203.0.113.60:40112 -> 192.168.20.10:3389
분석 방법 — 첫 줄은 모듈 Alert(GID 122)이며 포트 정보 없이 출발지·목적지만 있습니다. 모듈 이벤트는 실제 트래픽이 아니라 요약을 위한 가상의 패킷에 붙는 경우가 있어 프로토콜 표기가 일반 패킷과 다를 수 있습니다. 둘째 줄은 로컬 임계치 규칙(GID 1)입니다.
실습 예시 — 본인 소유 실습 환경의 alert 파일에서 GID별·출발지별 스캔 Alert를 집계하는 방어 측 명령입니다(파일 위치는 설치 방식에 따라 다름, 예: /var/log/snort/alert).
# GID 122(스캔 모듈) Alert의 출발지 집계
grep "\[122:" /var/log/snort/alert | grep -oE "\} [0-9.]+" | sort | uniq -c | sort -rn
# 같은 출발지의 다른 범주 Alert (후속 활동 확인)
grep "203.0.113.60" /var/log/snort/alert | grep -v "\[122:" | cut -d']' -f3 | sort | uniq -c
| 확인 결과 | 해석 |
|---|---|
| 122 Alert만 있고 후속 없음 | 정찰 단계에서 멈춤 |
| 122 Portscan 후 같은 대상에 웹 공격 규칙 Alert | 표적 정찰 → 공격 시도 연계 |
| Portsweep의 대상이 내부 대역 전체, 출발지 내부 | 내부 정찰, 우선순위 상향 |
관제자가 확인할 질문
Snort 스캔 Alert
↓ GID로 경로 구분 (122 모듈 / 1 규칙)
↓ 유형·부가 정보로 규모 판단
↓ 방화벽·흐름 기록으로 성립 연결 확인
↓ 같은 출발지 후속 Alert 검색
판정 → 기록 / 억제 검토 / 사건 전환
오탐 주의: 네트워크 관리 시스템의 자산 탐색, NAT 뒤 다수 사용자가 한 IP로 보이는 경우, DNS·NTP 서버처럼 많은 호스트와 통신하는 서버는 Portsweep·Distributed 유형과 일치할 수 있습니다. 이런 출발지는 모듈의 무시 목록(ignore 설정)으로 좁혀 관리합니다. 탐지 기준 설계는 291. Port Scan 탐지를 참고합니다.