패킷 분석을 하는 과정에서 IP 를 추적하다 보면, 이 IP 에서 운영하는 서비스는 어떤 시스템하에서 운영하는지 정보를 알아야 하는 경우가 있다. 분석하는 과정에서 운영체제 정보가 도움이 된다면 말이다.
이럴때 사용할 수 있는것이 Fingerprint 방식이다. 이 단어의 뜻만 보면 '지문'이라는 것이다. 즉, 네트워크 상에서 갖는 각 특성, 지문이라고 할 수 있는 이 정보들을 이용하여 정보들을 추측하는 것이다.
어떻게 이런것이 가능할까? 운영체제 마다 네트워크 통신 과정에서 사용되는 각 값들이 약간씩 차이를 가지고 있고, 바로 이런 정보를 이용하는 것이다. TCP/IP Fingerprinting 의 경우 다음의 값들이 이용된다:
- Initial packet size (16 bits)
- Initial TTL (8 bits)
- Window size (16 bits)
- Max segment size (16 bits)
- Window scaling value (8 bits)
- "don't fragment" flag (1 bit)
- "sackOK" flag (1 bit)
- "nop" flag (1 bit)
즉, 이런 정보가 사전 정의된 정보를 이용하여 추정할 수 가 있는 것이다. 여러가지 도구들이 있는데, 대표적인 것은 스캐너로 많이 이용하는 nmap 도 있다. 오늘은 p0f 라는 도구를 소개할 것이다. 다운로드는 다음의 경로에서 할 수 있다: (윈도우 환경에서도 cygwin 을 이용하면 사용 가능하다)
사용방법은 간단하다. 기본적으로 옵션없이 실행하면, 기본 인터페이스에서 흐르는 트래픽을 검증하여 보여준다. 이렇게 되면 너무나 많은 정보가 나타나므로 필터를 사용하여 제한을 할 수가 있다. 이 필터는 tcpdump 에서 사용하는 스타일의 것과 같다 ( 와이어샤크에서는 출력필터가 아닌 캡쳐 필터와 같다)
아래 옵션은 인터페이스 eth0 에서 호스트 주소가 192.168.115.5 번으로 필터를 한 것이다.
# p0f -i eth0 ip host 192.168.115.5
p0f - passive os fingerprinting utility, version 2.0.8
(C) M. Zalewski <lcamtuf@dione.cc>, W. Stearns <wstearns@pobox.com>
p0f: listening (SYN) on 'eth0', 262 sigs (14 generic, cksum 0F1F5CA2), rule: 'ip'.
192.168.115.5:3464 - Windows 2000 SP4, XP SP1+
-> 192.168.115.3:22 (distance 0, link: ethernet/modem)
해당 IP 의 운영체제가 윈도우 2000 SP4 또는 XP SP1 이상이라고 표시를 하였다. 이렇게 탐지된 정보는 아래와 같은 룰이 있기 때문이다.
65535:128:1:48:M*,N,N,S:.:Windows:2000 SP4, XP SP1+
각 의미는 무엇일까? p0f 를 설치한 파일에 이런 Fingerprint 정보가 있는데, 파일을 열어보면 아래와 같이 포맷형태를 볼 수 있다. ( /etc/p0f 에서 p0fa.fp , p0f.fp , p0fr.fp 파일을 볼 수 있다)
# Fingerprint entry format:
#
# wwww:ttt:D:ss:OOO...:QQ:OS:Details
#
# wwww - window size (can be * or %nnn or Sxx or Txx)
# "Snn" (multiple of MSS) and "Tnn" (multiple of MTU) are allowed.
# ttt - initial TTL
# D - don't fragment bit (0 - not set, 1 - set)
# ss - overall SYN packet size (* has a special meaning)
# OOO - option value and order specification (see below)
# QQ - quirks list (see below)
# OS - OS genre (Linux, Solaris, Windows)
# details - OS description (2.0.27 on x86, etc)
즉, 위 정보를 요약해 보면 윈도우 사이즈는 65535 이고, TTL 값은 128 Framgement 값이 셋팅되어 있고 SYN 패킷 사이즈는 48 바이트라는 것이다. 막상 각 포맷을 알아보면 이렇게 간단하다.
탐지된 패킷을 세부적으로 한번 살펴보자.
80 번포트로 전달된 SYN 패킷이고 패킷길이, TTL, Fragment 값등을 보면 사전에 정의된 룰 파일과 동일하다.
운영체제마다 다른 이전 정보들만 알 수 있다면 대략적으로 추정이 가능하다는 것이다. 하지만, 이 정보만으로 100% 추정할 수는 없다. 그렇기 때문에 이 정보만을 믿고 확신해서는 안된다. 그래도 큰 관점에서 윈도우나, 리눅스 등 넓은 관점에서는 대략 생각해 볼 수 있다.
다음은 윈도우 7에서 탐지된 정보이다. 하지만, p0f 에서 탐지되는 것은 Windows XP/2000 이다.
192.168.0.220:50879 - Windows XP/2000 (RFC1323+, w+, tstamp-) [GENERIC]
Signature: [8192:128:1:52:M1460,N,W8,N,N,S:.:Windows:?]
-> 192.168.0.223:23 (distance 0, link: ethernet/modem)
192.168.0.220:50879 - Windows XP/2000 (RFC1323+, w+, tstamp-) [GENERIC]
Signature: [8192:128:1:52:M1460,N,W8,N,N,S:.:Windows:?]
-> 192.168.0.223:23 (distance 0, link: ethernet/modem)
192.168.0.220:50879 - Windows 2000 SP2+, XP SP1+ (seldom 98)
-> 192.168.0.223:23 (distance 0, link: ethernet/modem)
어떤식으로 TCP/IP Fingerprinting 이 되는지 대략 이해는 되었을 것이라 믿는다. 이런 정보를 활용하면 네트워크 포렌직을 하는데 도움이 될 것이다.
[참고]
1. Remote OS detection via TCP/IP Stack FingerPrinting
2. TCP/IP Stack Fingerprinting
좋은정보 항상 잘 배우고 갑니다. 이번에 학교 project로 p0f를 사용해야 하는데 아직 포렌식 기초밖에 몰라서 어려움을 겪고 있습니다. 혹시 pcap 화일을 분석해서 packet의 os 정보를 추출해야 하는데 리눅스에서
답글삭제#p0f -s | tee > p0f_result.txt. 로 하니
이상하게 모든 패킷의 os 정보가 unknown으로 나옵니다. 혹시 어떤 옵션을 써야 하는지 궁금합니다.
질문주신걸 깜빡잊고 있었네요. 늦어서 죄송합니다. 혹시 저장된 패킷정보가 NAT 뒷 단에서 덤프된 패킷 데이터 인가요? p0f 를 설치하면 운영체제를 추정할 수 있는 패턴 정보가 담겨진 파일이 있습니다. 디폴트로 설치된 경우라면 /etc/p0f 에 들어 있습니다. 여기에 위 글에서 기술한 것과 같은 판단정보가 담겨있는데 사용하시는 네트워크 환경에 따라서 패킷 정보가 다르다면 Unknown 으로 나올 수도 있습니다. 즉, 분명 운영체제로 판단하기 위한 정보가 패킷 정보랑 매칭이 안된다는 것입니다.
삭제