📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 212편
이전 글: 211. Service Detection · 다음 글: 213. Version Detection
OS Detection(운영체제 탐지) 은 대상 호스트가 보내는 응답 패킷의 세부 값으로 운영체제 종류를 추정하는 정찰입니다. 운영체제마다 TCP/IP 스택 구현이 조금씩 달라서, 같은 요청에도 TTL 초기값, TCP Window 크기, TCP 옵션 순서, 비정상 패킷에 대한 반응이 다르게 나타납니다. 이를 TCP/IP 스택 지문(fingerprint) 이라고 합니다.
방식은 두 가지입니다. 방어자도 쓰는 수동 방식과, 흔적이 뚜렷한 능동 방식입니다.
| 구분 | 능동(Active) 탐지 | 수동(Passive) 식별 |
|---|---|---|
| 방법 | 대상에 특수한 프로브를 보내 반응 비교 | 이미 오가는 트래픽의 값만 관찰 |
| 대상에 남는 흔적 | 비정상 플래그·옵션 패킷 다수 | 없음 |
| 정확도 | 비교적 높음 | 참고 수준 |
| 방어 측 활용 | 탐지 대상 | 자산 식별, 출발지 OS 추정 |
능동 탐지는 비교 기준을 얻기 위해 열린 포트 1개와 닫힌 포트 1개가 필요합니다. 그래서 보통 포트 스캔 바로 뒤에 짧게 이어집니다.
포트 스캔으로 열린 포트·닫힌 포트 확보
↓
짧은 시간에 프로브 묶음 전송 (도구 공개 문서 기준 대략 아래 유형)
├─ 열린 포트로 옵션 조합이 다른 SYN 여러 개
├─ ECN 관련 플래그가 설정된 SYN
├─ 플래그 조합이 비정상인 TCP (플래그 없음, SYN+FIN+PSH+URG 등)
├─ 닫힌 포트로 ACK·SYN, 닫힌 UDP 포트로 UDP 1개
└─ 코드 값이 특이한 ICMP Echo
↓
응답의 TTL·Window·옵션·DF·RST 여부·ICMP 인용 내용 비교
↓
지문 DB와 대조해 OS 추정
↓
방어 측 흔적: 1~2초 안에 규격 밖 패킷 여러 종류 → IDS 시그니처, 방화벽 INVALID 차단
응답에서 쓰이는 대표 값의 일반적인 경향은 다음과 같습니다(버전·설정에 따라 다름).
| 값 | 일반적 경향 | 비고 |
|---|---|---|
| IP TTL 초기값 | Linux·macOS 64, Windows 128, 네트워크 장비 255 | 수신 TTL은 거친 홉 수만큼 감소 |
| TCP Window 크기 | OS·버전마다 기본값 다름 | 단독으로는 약한 단서 |
| TCP 옵션 순서 | MSS·SACK·Timestamp·Window Scale 배치가 다름 | 지문의 핵심 요소 |
| DF 비트 | 설정 여부가 OS마다 다름 | ICMP 응답에서도 비교 |
| 기준 | 정상 트래픽 | 능동 OS 탐지 |
|---|---|---|
| TCP 플래그 | SYN, SYN/ACK, ACK, FIN/ACK, RST 등 규격 내 | 플래그 없음, SYN+FIN 등 규격 밖 조합 |
| 같은 포트로의 SYN 옵션 | 한 클라이언트는 동일한 옵션 구성 | 연속 SYN마다 옵션 구성이 다름 |
| ICMP Echo Code | 0 | 0이 아닌 값이 섞일 수 있음 |
| 선행 트래픽 | 서비스 이용 | 직전 포트 스캔 |
실습 예시 — 본인 소유 실습망에서 OS 탐지 프로브 흔적을 찾는 방어 측 명령입니다(Rocky/Ubuntu 공통, 값은 환경마다 다름).
# SYN과 FIN이 동시에 설정되었거나 플래그가 없는 TCP 패킷
sudo tcpdump -nn -i ens33 'tcp[13] & 0x03 == 0x03 or tcp[13] == 0'
# 캡처 파일에서 코드가 0이 아닌 ICMP Echo Request 출발지
tshark -r /tmp/os.pcapng -Y 'icmp.type == 8 && icmp.code != 0' -T fields -e ip.src | sort | uniq -c
패킷 요약 형식 예시(값은 환경마다 다름, 일부 필드 생략):
10:05:01.101 203.0.113.45 > 192.168.10.20.22: Flags [S], win 1, options [wscale 10,nop,mss 1460,TS,sackOK]
10:05:01.203 203.0.113.45 > 192.168.10.20.22: Flags [S], win 63, options [mss 1400,wscale 0,sackOK,TS,eol]
10:05:01.410 203.0.113.45 > 192.168.10.20.22: Flags [none], win 128
10:05:01.412 203.0.113.45 > 192.168.10.20.22: Flags [SFPU], win 256
10:05:01.520 203.0.113.45 > 192.168.10.20: ICMP echo request, id 4411, seq 295, length 128
| 관찰 | 해석 |
|---|---|
| 같은 포트로 옵션 구성이 매번 다른 SYN | 일반 클라이언트가 아닌 프로브 묶음 |
Flags [none], Flags [SFPU] | 규격 밖 플래그 조합 → 스택 반응 비교 목적 |
| 약 0.5초 안에 TCP·ICMP 유형 혼합 | 짧고 밀집된 지문 수집 |
📷 [실습 화면 삽입 위치] Wireshark에서
tcp.flags.syn == 1 && tcp.flags.fin == 1필터 적용 결과와 같은 출발지의 직전 포트 스캔 패킷
| 흔적 위치 | 확인 내용 |
|---|---|
| IDS | OS 탐지 프로브, 비정상 플래그 관련 시그니처(룰셋마다 이름 다름) |
| 방화벽 | 세션 없는 비정상 TCP의 INVALID·차단 이벤트 |
| 패킷 캡처 | 플래그·옵션 다양성, ICMP Code |
| NDR·Zeek | 직전 포트 스캔과 같은 출발지 |
관제자가 확인할 질문
오탐 주의: 일부 네트워크 장비·보안 솔루션의 헬스체크나 경로 점검, 손상된 패킷도 규격 밖 플래그로 보일 수 있습니다. 한두 개의 이상 패킷보다 짧은 시간의 여러 유형 조합과 선행 포트 스캔을 함께 보고 판단합니다.