레이블이 nmap인 게시물을 표시합니다. 모든 게시물 표시
레이블이 nmap인 게시물을 표시합니다. 모든 게시물 표시

2012년 11월 23일 금요일

NMAP 의 친구 NPING 으로 패킷생성을 자유롭게

스캐너로 유명한 NMAP 의 친구 Nping 을 소개한다. Nping 은 네트워크 패킷 생성 도구이자, 그 응답의 시간측정, 분석 기능을 제공한다. Nping 은 다양한 프로토콜을 지원하고 각 프로토콜의 헤더를 조정할 수 있다. Ping 과 같이 어렵지 않게 사용할 수 있다. 네트워크 성능 측정에도 이용될 수 있는데, ARP Poisong, DoS 공격 등과 같은 트래픽 생성도 가능하다. Nping 은 2009년 구글 Summer of Code 로 부터 처음 시작되었다고 한다.

주요기능은,
- TCP, UDP, ICMP, ARP 패킷 생성
- 여러개의 호스트 및 포트 지정 가능
- Non 루트 유저를 위한 모드 제공
- 고급사용을 위한 에코모드
- 이더넷 프레임 생성 지원
- IPv6 지원
- 리눅스, 맥, 윈도우 에서 동작
- 자유롭게 커스트마이징이 가능한 점

다운로드는 Nmap 페이지에서 받을 수 있으며, 링크 경로는 다음과 같다:

http://nmap.org/download.html


Nping 도움말을 보면 누구나 쉽게 사용할 수 있을만큼 어렵지 않다. 다양한 옵션이 존재하고 몇 가지 사용 예제를 살펴보자.


1. ICMP 타입이 time 인 트래픽 전송 

--icmp-type 으로 옵션을 정할 수 있고 --delay 라는 것을 사용해 약간의 지연을 사용하였다.

# nping --icmp --icmp-type time --delay 500ms 192.168.163.131

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-12 08:13 KST
SENT (0.0476s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (0.0545s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6091 iplen=40
SENT (0.5477s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (0.5503s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6092 iplen=40
SENT (1.0479s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (1.0504s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6093 iplen=40
SENT (1.5490s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (1.5494s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6094 iplen=40
SENT (2.0491s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (2.0503s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6095 iplen=40

Max rtt: 6.901ms | Min rtt: 0.326ms | Avg rtt: 2.694ms
Raw packets sent: 5 (200B) | Rcvd: 5 (200B) | Lost: 0 (0.00%)
Tx time: 2.00268s | Tx bytes/s: 99.87 | Tx pkts/s: 2.50
Rx time: 3.00379s | Rx bytes/s: 66.58 | Rx pkts/s: 1.66
Nping done: 1 IP address pinged in 3.12 seconds

2. 포트 8001 번에 TCP 데이터를 포함해 한번 전송하기 


# nping --tcp --data "0xAAAAAAAA" -p 8001 -c 1 192.168.163.131

HEX 문자열을 이용하는 경우는 --data  를 사용하고 문자열을 나열하는 경우는 --data-string 을 이용한다.

# nping --tcp --data-string "PacketInside.com" -p 8001 -c 1 -v4 192.168.163.131

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-12 08:27 KST
SENT (0.0549s) TCP [192.168.163.1:32834 > 192.168.163.131:8001 S seq=3357278597 ack=0 off=5 res=0 win=1480 csum=0xA0C0 urp=0] IP [ver=4 ihl=5 tos=0x00 iplen=56 id=3146 foff=0 ttl=64 proto=6 csum=0xa6a0]
0000   45 00 00 38 0c 4a 00 00  40 06 a6 a0 c0 a8 a3 01  E..8.J..@.......
0010   c0 a8 a3 83 80 42 1f 41  c8 1c 01 85 00 00 00 00  .....B.A........
0020   50 02 05 c8 a0 c0 00 00  50 61 63 6b 65 74 49 6e  P.......PacketIn
0030   73 69 64 65 2e 63 6f 6d                           side.com    

만약 data 크기를 지정하는 경우 --data-length 옵션도 같이 사용한다.

3. 목적지 호스트 포트 80, 443 에 TCP 패킷 전송

# nping -c 1 --tcp -p 80,433 packetinside.com

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-12 08:35 KST
SENT (0.1624s) TCP 192.168.10.40:18421 > 216.239.34.21:80 S ttl=64 id=37098 iplen=40  seq=3387806461 win=1480
SENT (1.1626s) TCP 192.168.10.40:18421 > 216.239.34.21:433 S ttl=64 id=37098 iplen=40  seq=3387806461 win=1480

Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 2 (80B) | Rcvd: 0 (0B) | Lost: 2 (100.00%)
Tx time: 1.00146s | Tx bytes/s: 79.88 | Tx pkts/s: 2.00
Rx time: 2.00254s | Rx bytes/s: 0.00 | Rx pkts/s: 0.00
Nping done: 1 IP address pinged in 2.20 seconds


4. 포트 범위를 지정하여 TCP 패킷 전송 

# nping 192.168.163.135 -c 1 --tcp -p 133-135

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-23 08:06 KST
SENT (0.0915s) TCP 192.168.163.1:19166 > 192.168.163.135:133 S ttl=64 id=20239 iplen=40  seq=1059400174 win=1480 
RCVD (0.0919s) TCP 192.168.163.135:133 > 192.168.163.1:19166 RA ttl=128 id=4388 iplen=40  seq=0 win=0 
SENT (1.0921s) TCP 192.168.163.1:19166 > 192.168.163.135:134 S ttl=64 id=20239 iplen=40  seq=1059400174 win=1480 
RCVD (1.0925s) TCP 192.168.163.135:134 > 192.168.163.1:19166 RA ttl=128 id=4390 iplen=40  seq=0 win=0 
SENT (2.0937s) TCP 192.168.163.1:19166 > 192.168.163.135:135 S ttl=64 id=20239 iplen=40  seq=1059400174 win=1480 
RCVD (2.0942s) TCP 192.168.163.135:135 > 192.168.163.1:19166 SA ttl=128 id=4391 iplen=44  seq=705789072 win=8192 <mss 1460>

5. TCP 패킷 생성시 좀더 다양하게 옵션 조절하기 


출발지 IP 는 -S 로 지정하고 ID 값을 9999 그리고 TTL 은 225 로 설정하였다. --badump-ip 를 사용해 의도적으로 잘못된 체크섬 값을 사용하게 했다. 거기다 MTU 도 점보 프레임 크기인 9000 을 사용했다.

# nping -S 1.1.1.1 --id 9999 -ttl 225 --badsum-ip --mtu 9000 --tcp -p 135 192.168.163.133

No.     Time           Source                Destination           Protocol Length Info
   1027 1817.197206000 1.1.1.1               192.168.163.133       TCP      60     24613 > epmap [SYN] Seq=0 Win=1480 Len=0

세부적인 데이터를 tshark 를 통해 다음과 같이 살펴보자. 의도한 대로 데이터가 잘 만들어져 전송되었는지 말이다.

Frame 1027: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) on interface 0
Internet Protocol Version 4, Src: 1.1.1.1 (1.1.1.1), Dst: 192.168.163.133 (192.168.163.133)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
        0000 00.. = Differentiated Services Codepoint: Default (0x00)
        .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
    Total Length: 40
    Identification: 0x270f (9999)
    Flags: 0x00
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    Fragment offset: 0
    Time to live: 225
    Protocol: TCP (6)
    Header checksum: 0x4c91 [correct]
    Source: 1.1.1.1 (1.1.1.1)
    Destination: 192.168.163.133 (192.168.163.133)
Transmission Control Protocol, Src Port: 24613 (24613), Dst Port: epmap (135), Seq: 0, Len: 0
    Source port: 24613 (24613)
    Destination port: epmap (135)
    [Stream index: 57]
    Sequence number: 0    (relative sequence number)
    Header length: 20 bytes
    Flags: 0x002 (SYN)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Nonce: Not set
        .... 0... .... = Congestion Window Reduced (CWR): Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...0 .... = Acknowledgment: Not set
        .... .... 0... = Push: Not set
        .... .... .0.. = Reset: Not set
        .... .... ..1. = Syn: Set
            [Expert Info (Chat/Sequence): Connection establish request (SYN): server port epmap]
                [Message: Connection establish request (SYN): server port epmap]
                [Severity level: Chat]
                [Group: Sequence]
        .... .... ...0 = Fin: Not set
    Window size value: 1480
    [Calculated window size: 1480]
    Checksum: 0x8604 [validation disabled]

0000  00 0c 29 8b 6f f8 00 50 56 c0 00 08 08 00 45 00   ..).o..PV.....E.
0010  00 28 27 0f 00 00 e1 06 4c 91 01 01 01 01 c0 a8   .('.....L.......
0020  a3 85 60 25 00 87 20 7c 3c be 00 00 00 00 50 02   ..`%.. |<.....P.
0030  05 c8 86 04 00 00 00 00 00 00 00 00               ............

6. ARP 패킷 전송 


# nping 192.168.163.135 -c 2 --arp

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-23 08:13 KST
SENT (0.0630s) ARP who has 192.168.163.135? Tell 192.168.163.1
RCVD (0.0634s) ARP reply 192.168.163.135 is at 00:0C:29:8B:XX:XX
SENT (1.0636s) ARP who has 192.168.163.135? Tell 192.168.163.1
RCVD (1.0640s) ARP reply 192.168.163.135 is at 00:0C:29:8B:XX:XX

7. ECHO 클라이언트/서버

1) --echo-server 로 동작시킨다. passphrase 로 public 을 사용하였다.

# nping --echo-server "public" -vvv

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-23 08:16 KST
Packet capture will be performed using network interface eth0.
Waiting for connections...
Server bound to 0.0.0.0:9929
[1353626220] Connection received from 192.168.163.135:49275
[1353626220] Good packet specification received from client #0 (Specs=9,IP=4,Proto=6,Cnt=5)
[1353626220] NEP handshake with client #0 (192.168.163.135:49275) was performed successfully
[1353626225] Client #0 (192.168.163.135:49275) disconnected

2) 이후 클라이언트에서 --echo-client 로 TCP RST 패킷을 전달하였다. 위 에코서버 로그에서 접속상태를 확인할 수 있다.

C:\play>nping --echo-client "public" 192.168.163.1 --tcp --flags rst

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-23 08:16 대한민국 표
준시
SENT (0.6870s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480
SENT (1.7030s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480
SENT (2.7190s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480
SENT (3.7340s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480
SENT (4.7500s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480

참고로 윈도우 사용자는 NMAP 을 설치하면 해당 프로그램 경로안에 NPING 을 찾을 수 있다.

2012년 5월 24일 목요일

네트워크 스캐닝의 강자 Nmap 6.0 버전 릴리즈


네트워크 스캔 도구로 유명한 Nmap (Network Mapper) 이 최근 새로운 6.0 버전을 릴리즈 하였다. 2009년 7월 Nmap 5 버전 이후로 3년 여만에 새롭게 선보인 것으로 3,924 개의 코드가 새롭게 반영되었고 더욱 파워풀 해진 NSE(Nmap Scripting Engine) 과 289 개의 새로운 스크립트등 이전 보다 더욱 기능이 풍성해 졌다.

주요 기능은
- NSE 기능 향상과 많아진 스크립트 (Nmap 5 버전에서 59 개였던것에 비해 6 버전에서는 348 개로 증가)
- 더 나아진 웹 스캐닝
- IPv6 완벽지원
- 새로운 Nping 도구
- 더욱 나아진 Zenmap GUI 와 결과 뷰
- 더욱 빨라진 스캔  ( traceroute 시스템 코드 재 작성)

세부적인 기능 및 설명은 다음 경로를 참고하면 된다.

http://nmap.org/6/

5 버전을 사용하였던 사용자들은 6 버전으로 점프업 해보자!

[참고]
1. 이미지출처
http://nmap.org

2010년 9월 2일 목요일

NMAP 스캐너를 통해 만든 웹 아이콘 지도

NMAP 에서 재미있는 리서치 결과를 내 놓았다. NMAP 시큐리티 스캐너와 스크립트 엔진을 이용해 뉴욕타임즈, 구글, 엔가젯 같은 수 많은 사이트를 스캐닝 하였다.
스캐닝은 HTML 링크의 아이콘 태그의 파일과 /favicon.ico 를 하였는데, Unique 하게 수집된 아이콘 파일이
328,427 개 였다고 한다. 이중 288,945 개가 적합한 형태의 이미지였는데, 이걸 종합적으로 합쳐 아이콘을
이용한 맵을 만들었다. 아이콘이 클수록 규모도 크다고 볼 수 있는 것이다.  아이콘을 보게되면 역시나
구글이 가장 큰 크기를 차지하고 있고, 그 다음으로는 페이스북, 유투브, 야후, MSN 등이 크다.

[이미지 출처 : NMAP 사이트 ]

우선 Favicon 을 이용해 지도를 만들었다는 사실이 참 재미있다. 그럼 여기서 사용한 스크립트는 무엇일까?
웹 페이지에서 Favicon 아이콘을 얻는 이 스크립트는 HTTP-Favicon.nse 이다. 이 스크립트는 다음 두가지
방법을 통해 아이콘을 확인한다.

- HTML 파일의 <link rel="icon"> 태그를 파싱
- /favicon.ico 확인

NMAP 에서의 스크립트 사용은 아래와 같다 :

nmap --script=http-favicon.nse --script-args favicon.root=<root>,favicon.uri=<uri>

스크립트를 만드는데 이용된 언어는 Lua 이다. 와이어샤크에서도 바로 이 Lua 가 이용된다.
시간이 주어지는대로 와이어샤크와 NMAP 에서의 스크립트 사용에 대해서 한번 소개할 예정이다.

아참, 그리고 Favicon 아이콘을 모르시는 분들을 위해:
이 아이콘은 브라우저 주소창에서 앞쪽에 표시는 작은 아이콘이다. 패킷인사이드에도 보면
주소창앞에 패킷인사이드 로고가 나오는데 바로 이것이다.

[1] WWW 아이콘 지도
[2] HTTP-Favicon NMAP 스크립트
[3] Favicon 이란?

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