Open Source/Kali Linux

[Network Forensics Tools] p0f On Kali Linux

DarkSoul.Story 2013. 5. 28. 17:10
반응형



1.개요


네트워크상에 흐르는 패킷을 덤프하여, 분석하는 과정에서 해당 IP를 추적하다보면 IP에서 운영하는 서비스는 어떠한 시스템 (OS)에서 운영하고 있는지에 대한 정보를 파악해야 하는 경우가 발생한다. 이럴때 사용하는것이 Fingerprint이다. 

Fingerprint는 모의해킹이나, 해커가 공격하기 전에 정보를 수집하는 단계에서 많이 사용되며, Fingerprint를  검색해보면 본래의 뜻은 '지문'이다. 하지만 여기서의 Fingerprint는 네트워크상에 흐르는 패킷 각각의 정보들을 추출하여 특징적인 정보를 추출해 내는것을 의미하며, TCP/IP Fingerprinting에서는 아래와 같은 값들을 이용하여 정보를 추출한다.


nitial 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)


출처 : 위키디피아 (http://en.wikipedia.org/wiki/TCP/IP_stack_fingerprinting)


공격자 입장에서 살펴 보면, 호스트의 운영체제(OS)의 정보를 획득하는것은 공격자에게는 매우 귀중한 자료가 될것이다. 공격자는 특정 네트워크에서 정보를 수집하고 점차 다양한 호스트들을 정보를 획득함으로써 보안 시스템의 보호를 받지 못하는 운영체제(OS)를 매핑할 수 있다.  이때 사용하는 것이 OS Fingerprinting이다. OS Fingerprint 도구들은 여러가지 존재하며, 여기서는 p0f에 대해 알아보자. 


p0f는 Passive OS Fingerprinting의 약자로, OS Fingerprinting 도구이다. Nmap과 같은 Active Fingerprinting도구들과 대조적으로 Passive Fingerprinting도구들은 추가 또는 비정상적인 트래픽을 생성하지 않는것이 가장 큰 특징이다. p0f를 이용하면, 정상적인 통신을하면서 원격지에 존재하는 시스템의 운영체제 (OS) 정보를 파악할 수 있다. TCP/IP스택(TCP.IP Stack), 특정 시스템에서만 나타나는 매우 독특한 패턴, 때로는 특정 구현상의 결함으로 인한 미묘한 차이등으로 캡처된 패킷에서 원격지 시스템의 운영체제를 식별하는데 있어 충분한 정보를 획득 할 수 있다. 


한가지 오해할 수 있는 점이 존재하는데, Fingerprinting을 이용하여 원격지의 운영체제 정보를 획득하였다고 하여도 100%원격지 시스템의 운영체제를 확신해서는 안된다. Fingerprinting 기술은 사전에 정의된 사전 내용을 토대로 패턴을 매칭시켜 추론하기 때문이다. 


p0f는 아래와 같이 4가지 검색 모드를 지원한다.


SYN mode :연결을 시도하는 측 (SYN 패킷)의 내용을 보고 시스템의 운영체제 정보를 확인하는 모드

- SYN+ACK mode : 연결을 시도에 대한 응답 (SYN+ACK패킷)의 내용을 보고 시스템의 운영체제 정보를 확인하는 모드

- RST/RST+ACK mode : 연결 시도를 거부 (RST/RST+ACK 패킷)하는 시스템을 확인하는 모드

- stray ACK mode : 기존 세션을 검토하는 모드


OS Fingerprinting에서는 주로 아래와 같은 패킷 내 필드 정보를 이용하여, 운영체제 정보를 확인한다.


TTL

Windows size

DF(Don't Fragment)

TOS(Type Of Service) 


TTL (Time to live)값은 네트워크상에서 패킷이 라우터를 통과할 수 있는 최대 유효값으로 송신자에 의해 설정되며, 목적지까지의 전송 경로 상에 존재하는 라우터를 지날때 마다 TTL 값은 1씩 감소한다. 목적지에 도착하기전에 TTL 값이 0이되면, 해당 패킷은 폐기가되고 ICMP error 메시지를 송신자에게 보내진다.  TTL 값을 설정하는 이유는 보낸 패킷이 목적이제 도달하지 못하고 네트워크상에서 루프(loop:무한 반복)되는 현상을 방지하는데 있다. 이 TTL값은 운영체제마다 기본(Default) 설정값이 다르다. 아래는 몇가지 운영체제 및 장치들의 기본 TTL 값을 나열한 것이다. 


운영체제/장치

버전

프로토콜

TTL

AIX

 

TCP

60

AIX

3.2 / 4.1

ICMP

255

Cisco

 

ICMP

254

FreeBSD

2.1R

TCP and UDP

64

FreeBSD

3.4 / 4.0

ICMP

255

Linux

2.4 Kernel

ICMP

255

Linux

Red Hat 9

ICMP and TCP

64

MacOS/MacTCP

2.0.x

TCP and UDP

60

MacOS/MacTCP

X (10.5.6)

ICMP / TCP / UDP

64

Solaris

2.5.1 / 2.6 / 2.7 / 2.8

ICMP

255

Solaris

2.8

TCP

64

SunOS

4.1.3 / 4.1.4

TCP and UDP

60

SunOS

5.7

ICMP and UDP

255

Juniper

 

ICMP

64

Windows

Server 2003

 

128

Windows

XP

ICMP / TCP / UDP

128


Windows size는 TCP 통신에서 사용하는 흐름제어 옵션이다. 클라이언트가 연결을 시작하면 데이터를 받는 클라이언트 측에서 수신 패킷 버퍼의 크기를 송신측에 수신 패킷 버퍼의 크기를 알려준다. 이때 송신측은 수신 패킷 버퍼의 크기가 오버되지 않도록 패킷의 전송 속도를 조절한다. Windows size는 TCP Header에 존재하며, 전체 16bit로 되어있다. 즉, 2^16 = 65535이며 단위는 Byte이다. 다시말하면, Windows size의 최대 크기는64Kbyte라고 생각하면 된다. Windows size도 운영체제/시스템 마다 기본(Default)설정 값이 다르다.


DF(Don't Fragment) 필드는 데이터그램을 단편화 (Fragment)를 할것인지를 결정할 때 사용한다. DF 필드가 0으로 설정되어 있는 경우 클라이언트에서 패킷의 크기를 MTU 사이즈보다 크게 보내더라도 라우터에서 해당 패킷을 작게 조각 (Fragmentation)내어 전송한다. 만약 DF 필드가 1로 설정되어 있는 경우 클라이언트에서 패킷의 크기를 MTU 사이즈보다 크게 보내면 라우터에서는 해당 패킷에 대해 작게 조각 (Fragmentation)을 내지 못하게 되어 라우터는 패킷을 처리하지 못하고, Drop 시킨 후 송신측 클라이언트로 ICMP로 Can't Fragment 메시지를 전송하여 패킷 사이즈를 줄이도록 요청한다.


TOS (Type OS Service)는 패킷의 우선순위를 나타내며, 4가지 값으로 설정된다. 


- Minimize delay (지연최소화 : 0)

- Maximize throughput (처리량 최대화 : 8)

- Maximize reliability (신뢰성 최대화 : 4)

- Minimize monetary costs (비용 최소화 : 2)


TOS 설정값은 패킷에서 사용되는 유일한 값으로 설정되며, 응용프로그램에 따라 다르다. 예를들면 Telnet의 경우 TOS값은  Minimize delay (지연최소화 : 0)로 설정되어 있다.


OS Fingerprinting에서 이러한 값을 토대로 운영체제의 종류를 판다하게 되며, p0f에서도 동일한 방법으로 운영체제를 탐지한다.


2. 테스트 환경 

 운영 체제 (OS) : Kali Linux 1.0.3

 테스트에 사용된 도구 버전 : p0f v2.08


 

3.상세 분석


p0f를 실행 하면 아래와 같이 옵션 정보들을 확인할 수 있다.



p0f를 -i 옵션을 적용하여, 지정한 네트워크 인터페이스를 통해 흐르는 패킷들에 대해 OS Fingerprinting을 할 수 있지만 이럴 경우 너무 많은 내용이 한꺼번에 나열 되기 때문에 많이 복잡해 질수 있어,저자는 패킷 덤프파일 traffic_sample.pcap을 이용하여 p0f를 이용한 OS Fingerprinting을 진행 하였다. 저자가 준비한 traffic_sample.pcap에서 네트워크 트래픽은 아래와 같다.

(참고로 traffic_sample.pcap은 안드로이드 악성앱 분석 당시 트래픽을 덤프한것이다.)

아래는 traffic_sample.pcap를 SYN mode를 이용해서 운영체제의 정보를 확인한 결과이다. 


root@kali:~# p0f -s /root/Desktop/traffic_sample.pcap -S


 


root@kali:~# p0f -s /root/Desktop/traffic_sample.pcap -S

p0f - passive os fingerprinting utility, version 2.0.8

(C) M. Zalewski <lcamtuf@dione.cc>, W. Stearns <wstearns@pobox.com>

p0f: listening (SYN) on '/root/Desktop/traffic_sample.pcap', 262 sigs (14 generic, cksum 0F1F5CA2), rule: 'all'.

10.0.2.15:46890 - Linux 2.6, seldom 2.4 (older, 2) (up: 11930 hrs)

  Signature: [S4:64:1:60:M1460,S,T,N,W1:.]

  -> 103.30.4.37:80 (distance 0, link: ethernet/modem)

10.0.2.15:55325 - Linux 2.6, seldom 2.4 (older, 2) (up: 11930 hrs)

  Signature: [S4:64:1:60:M1460,S,T,N,W1:.]

  -> 180.178.49.90:80 (distance 0, link: ethernet/modem)

10.0.2.15:49326 - Linux 2.6, seldom 2.4 (older, 2) (up: 11930 hrs)

  Signature: [S4:64:1:60:M1460,S,T,N,W1:.]

  -> 180.178.49.90:80 (distance 0, link: ethernet/modem)

10.0.2.15:52665 - Linux 2.6, seldom 2.4 (older, 2) (up: 11930 hrs)

  Signature: [S4:64:1:60:M1460,S,T,N,W1:.]

  -> 180.178.49.90:80 (distance 0, link: ethernet/modem)


위의 결과를 살펴보면, IP 10.0.2.15의 운영체제는 Linux 2.6, seldom 2.4 (older, 2)라고 판단하였다. p0f가 10.0.2.15의 운영체제가 Linux 2.6, seldom 2.4 (older, 2)라고 판단한 이유는 IP 아래 보이는 시그니처 (Signature)를 가지고 판단한것이다. 그렇다면 시그니처 (Signature)는 어떤 의미를 가지고 있을지 생각해보자.


시그니처 (Signature)는 Kali Linux 1.0.3을 기준으로 /etc/p0f/ 에 p0f.fp, p0fa.fp, p0fr.fp 파일로 존재한다.

각 시그니처파일은 p0f 사용시 지정한 모드에 따라 다르게 사용된다. 


p0f.fp 파일 : SYN mode에서 사용하는 시그니처 파일

p0fa.fp 파일: SYN + ACK mode에서 사용하는 시그니처 파일

p0fr.fp 파일 : RST/RST+ACK mode에서 사용하는 시그니처  파일


시그니처 파일 p0f.fp를 열어보면, 시그니처 포멧을 아래와 같이 정의하고 있다.

 

wwww:ttt:D:ss:OOO...:QQ:OS:Details

 

wwww : Window size (숫자값 / Sxx / Txx : xx는 숫자로 표기)

 Snn :multiple of MSS, multiple of MTU

ttt      : TTL 

D      : Don't fragment bit (0 - not set, 1 - set)

ss      : 전체 SYN 패킷 크기 (특별한 의미가 있다)

OOO   :  옵션 값 (값에 대한 자세한 내용은 p0f.fp를 참조하기 바란다.)

QQ    : quirks list 

(값에 대한 자세한 내용은 p0f.fp를 참조하기 바란다.)

OS     : OS 종류 (Linux, Solaris, Windows) 

(값에 대한 자세한 내용은 p0f.fp를 참조하기 바란다.)

Details : OS의 자세한 버전 (2.0.27 on x86, etc)



시그니처는 아래와 같이 정의되어 있다.


시그니처 포멧을 토대로 위에서 확인한 Signature: [S4:64:1:60:M1460,S,T,N,W1:.]를 캡처된 패킷과 비교하면서 풀이해 보면 다음과 같다.



1. S4는 Windows size 값이다. p0f 구 버전에서는 S4와 같이 Window size값을 표시 하지 않았지만, window scaling 기술이 적용되면서 S4와 같은 값을 표기하기 시작했다. 이 S4와 같이 특이한 표기 법을 이용하여 Window size를 구하는 방법은 MMS*n (여기서는 S4이기 때문에 n값은 4가 된다)한 값이 Window size가 된다. 위의 와이어샤크로 패킷 내용을 살펴 보면 패킷의 MMS 값이 1460으로 설정되어 있다. 여기에 4를 곱하면, window size 값인 5840이 되는것이다.


2. 64는 TTL값을 나타내며 패킷 내용에서도 TTL 값이 64로 설정되어 있다.


3. 1은 DF(Don't fragment)의 Bit 값을 나타낸다. 패킷 내용에서도 DF 값이 1로 설정되어 있다.


4. 60은 SYN 패킷의 크기를 나타내며, 패킷 내용에서도 Total Length가 60인것을 확인할 수 이다.


5. M1460은 MMS 값을 의미한다. 앞에서도 확인 하였듯이 패킷의 MMS 값은 1460인것을 확인할 수 있다.


6. S는 Windows Scale 설정 유무를 나타낸다. 패킷 내용을 보면 Windows Scale이 설정되어 있는것을 확인 할 수있다.


7.  T는 Timestamps 설정 유무를 나타낸다. 패킷 내용을 보면 Timestamps가 설정되어 있는것을 확인 할 수 있다.


8.  NOP (NO-Operation) 설정 유무를 나타낸다. 패킷 내용을 보면 NOP (NO-Operation)가 설정되어 있는것을 확인 할 수 있다.


9. W1은 Window Scale 값을 의미한다. 패킷에서 Window Scale 값이 1로 설정되어 있는것을 확인할 수 있다.     


현재 내용을 p0f.fp에서 찾아보면, 아래와 같이 정의되어 있는것을 확인할 수 있다.      



# Endian snafu! Nelson says "ha-ha":

2:64:0:44:M*:.:Linux:2.0.3x (MkLinux) on Mac (1)

64:64:0:44:M*:.:Linux:2.0.3x (MkLinux) on Mac (2)

 

S4:64:1:60:M1360,S,T,N,W0:.:Linux:2.4 (Google crawlbot)

S4:64:1:60:M1430,S,T,N,W0:.:Linux:2.4-2.6 (Google crawlbot)

 

S2:64:1:60:M*,S,T,N,W0:.:Linux:2.4 (large MTU?)

S3:64:1:60:M*,S,T,N,W0:.:Linux:2.4 (newer)

S4:64:1:60:M*,S,T,N,W0:.:Linux:2.4-2.6

 

S3:64:1:60:M*,S,T,N,W1:.:Linux:2.6, seldom 2.4 (older, 1)

S4:64:1:60:M*,S,T,N,W1:.:Linux:2.6, seldom 2.4 (older, 2)

S3:64:1:60:M*,S,T,N,W2:.:Linux:2.6, seldom 2.4 (older, 3)

S4:64:1:60:M*,S,T,N,W2:.:Linux:2.6, seldom 2.4 (older, 4)

T4:64:1:60:M*,S,T,N,W2:.:Linux:2.6 (older, 5)

 

S4:64:1:60:M*,S,T,N,W5:.:Linux:2.6 (newer, 1)

S4:64:1:60:M*,S,T,N,W6:.:Linux:2.6 (newer, 2)

S4:64:1:60:M*,S,T,N,W7:.:Linux:2.6 (newer, 3)

T4:64:1:60:M*,S,T,N,W7:.:Linux:2.6 (newer, 4)


모든 시그니처 기반의 도구들은 시그니처를 얼마나 가지고 있느냐에 따라 획득할 수 있는 정보들이 달라진다. p0f역시 사용자가 패킷 내용을 분석하여, 운영체제에 대한 시그니처를 만들어 p0f.fp에 추가 하면 더욱 많은 내용을 탐지 할수 있다. 지금까지 간단하게 p0f에 대해서 알아보았다. 간단하게 알아보았지만, OS Fingerprinting이 어떻게 이루어 지는지 대략 이해 되었을 것이라 생각되며, 이러한 정보를 활용하면 네트워크 포렌직을 하는데 큰 도움이 될것이라 판단된다.

반응형