2010년 8월 1일 일요일

패킷정보로 원격지 시스템의 운영체제를 추정한다 - p0f

패킷 분석을 하는 과정에서 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

댓글 2개:

  1. 좋은정보 항상 잘 배우고 갑니다. 이번에 학교 project로 p0f를 사용해야 하는데 아직 포렌식 기초밖에 몰라서 어려움을 겪고 있습니다. 혹시 pcap 화일을 분석해서 packet의 os 정보를 추출해야 하는데 리눅스에서
    #p0f -s | tee > p0f_result.txt. 로 하니
    이상하게 모든 패킷의 os 정보가 unknown으로 나옵니다. 혹시 어떤 옵션을 써야 하는지 궁금합니다.

    답글삭제
    답글
    1. 질문주신걸 깜빡잊고 있었네요. 늦어서 죄송합니다. 혹시 저장된 패킷정보가 NAT 뒷 단에서 덤프된 패킷 데이터 인가요? p0f 를 설치하면 운영체제를 추정할 수 있는 패턴 정보가 담겨진 파일이 있습니다. 디폴트로 설치된 경우라면 /etc/p0f 에 들어 있습니다. 여기에 위 글에서 기술한 것과 같은 판단정보가 담겨있는데 사용하시는 네트워크 환경에 따라서 패킷 정보가 다르다면 Unknown 으로 나올 수도 있습니다. 즉, 분명 운영체제로 판단하기 위한 정보가 패킷 정보랑 매칭이 안된다는 것입니다.

      삭제