레이블이 패킷생성인 게시물을 표시합니다. 모든 게시물 표시
레이블이 패킷생성인 게시물을 표시합니다. 모든 게시물 표시

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 을 찾을 수 있다.

2011년 8월 30일 화요일

크로스플랫폼 패킷/트래픽 생성기 Ostinato 를 아시나요?

크로스플랫폼 기반의 네트워크 패킷생성 도구인 Ostinato 를 소개한다. 물론 오픈소스이며, 윈도우, 리눅스등 환경에서도 동작한다. 다양한 패킷을 생성할 수 있으며, 전송할 패킷에 대한 전송속도 및 프로토콜을 세부적으로 수정할 수 있다. 사용해보면, 처음에는 어떻게 해야 패킷을 전송할 수 있지 하고 의문을 가졌는데 잠깐만 사용해 보면 금방 익숙해 질 수 있다. 주요 기능은 아래와 같다:

- 윈도우, 리눅스, BSD, 맥 OS X 등에서 동작하는 크로스플랫폼 기반
- 다양한 표준 프로토콜 지원 및 세부적 수정 가능
- 패킷 전송방법 정의 가능
- 패킷 캡쳐 및 캡쳐 내용 뷰어 (단, 캡쳐된 패킷 보기 위해서는 와이어샤크 필요)
- 실시간 패킷 전송 비율 출력등

좀더 세부적인 내용 및 다운로드는 아래 사이트에서 가능하다.
http://code.google.com/p/ostinato/

이 도구를 이용한 패킷생성 도구 제품도 볼 수 있는데, 앞으로 계속 발전이 기대된다. 처음 0.1 버전은 2010년 4월에 공개되었으며, 개발기간은 길지가 않다. (하지만 이에 대한 기획은 2007년 부터 시작되었던것 같다) 일단 다운로드 받아 실행해 보면 크게 레이아웃은 4개 정도로 구분된다.


- 사용할 포트 인터페이스
- 생성할 패킷등을 정의하는 스트림
- 제어 아이콘
- 상태 정보

본인 컴퓨터에서 사용가능한 포트 인터페이스를 지정하고 스트림에서 오른쪽 마우스를 클릭하여 새로운 스트림을 생성한다. 여기서는 'test' 라는 이름으로 생성하였고, 아이콘을 더블 클릭하면 아래와 같은 화면을 볼 수 있다. 처음에는 패킷을 어디서 어떻게 정의해야 할지가 아리송했는데, 바로 이 부분이 정답이었다. 아직은 GUI 화면 구성등에 대한 아쉬움이 있다.



스트림 수정은 4가지 큰 탭으로 나뉘어져 있고, 클릭해 보면 알겠지만 세부적으로 수정이 가능하다.
생성할 패킷 정의가 끝났으면 메인 윈도우에서 Apply 를 하고 Statistics 화면에서 캡쳐를 시작하고, 전송 버튼을 누른다. 그리고, 생성한 패킷이 제대로 되었는지 보고 싶다면 돋보기 모양의 아이콘을 누르면 와이어샤크가 실행된다. 물론, 와이어샤크는 이미 설치되어 있어야 한다.

Ostinato 소개는 여기서 일단 끝내고, 사용방법이 더 궁금하다면 아래 참고 부분을 보기 바란다. 동영상도 있으니 한번 살펴보는 것만으로도 대충 사용방법을 익힐 수 있으리라 생각된다. 

지금까지 패킷인사이드에서 소개한 패킷생성 도구만으로도 여러분들이 하고 싶어하는 기능은 대부분 구현이 되어 있을것으로 생각한다. :-)

[참고]
1. QuickStart Guide

2011년 8월 16일 화요일

리눅스 GUI 기반에 뿌리를 둔 패킷생성기 packETH, 하지만 윈도우도 OK

패킷생성기 하나를 소개한다. 이번에는 리눅스 GUI 기반의 생성기로 이름은 packETH 이다. 이더넷 패킷을 생성하고 전송할 수 있는 기본적인 기능과 몇가지 유용한 기능들이 포함되어 있다. 참고로, 윈도우에서도 사용가능하도록 포팅되어 있다.


다운로드는 다음의 경로에서 할 수 있다.

[리눅스]
http://packeth.sourceforge.net/
[윈도우]
http://eth.cyberine.com/

일단 기본적인 기능을 좀더 알아보면 아래와 같다:

- 다양한 프로토콜을 지원해 이더넷 패킷을 생성, 편집, 전송 할 수 있다.
- Ethernet II, Ethernet 802.3, 802.1q
- ARP, IPv4, IPv6, 사용자 정의 페이로드
- UDP, TCP,ICMP,IGMP, 사용자 정의 레이어 페이로드 등이다.
- 패킷 연속 전송 기능 (최대 속도, 패킷간 Delay, 전송할 패킷 수 등)

현재 2010년10월 업데이트가 최신이며 버전은 1.7 이다. 설명서는 충분치 않은데, 한번 사용해 보면 어느정도 감을 잡을 수 있다. 메인 화면은 아래와 같다.



메뉴 아이콘을 보면 Builder 가 보인다. 기본 생성 도구로서 여기는 각 레이어별 생성을 할 수 있도록 지원한다.
- 링크레이어
- 네트워크 레이어 (IPv4 or IPv6 데이터)
- 트랜스포트 레이어 (TCP, UDP or )

원하는 값을 지정하고, Send 버튼을 누르면 전송이 쉽게 된다. 그 다음 Gen-b 아이콘은 전송할 패킷 수, 패킷간 딜레이 등을 지정하여 대량으로 전송할 때 사용할 수 있다. Gen-s 는 다른데서는 못 보던 기능인데, 유용할 수도 있다고 본다. 패킷 파일을 여러개 지정하여 연속적으로 전송할 수 있는 기능이다. 각 패킷에 대해서 전송 개수, 딜레이, 전송속도를 조정할 수가 있다. Pcap 을 로드한 PCAP 데이터 리스트를 보고 선택할 수 있도록 해준다. Load 아이콘을 통해 읽어들일 PCAP 을 지정하면 Pcap 리스트에 나타난다. 여기서 더블클릭하여 선택하고, Builder 를 보면 해당 데이터를 볼 수 있다. 즉, 특정 패킷파일의 데이터를 Builder 에서 다시 재조정하여 보낼 수 있는 것이다.



리눅스 기반에서 패킷생성이 많은 사용자라면 이 도구가 도움이 될 것이다. 참고로 윈도우로 포팅된 것도 리눅스와 같은 형태의 UI 를 가지고 있다.

2010년 12월 24일 금요일

스노트(Snort) 룰을 파싱하여 패킷 생성, 전송하기

IDS 로 많이 사용중인 오픈소스 스노트가 있다. 스노트로 제작된 관련 탐지 룰도 많이 찾아 볼 수 있고, 실제 무료/상업용 침입차단 패턴이 이 스노트 형태의 기반이 많다. 여기서 스노트를 다룰 것은 아니다. 다만, 패킷 분석이 많이 사용되는 영역중에 하나로 어떤 위협을 차단/탐지 하기 위한 패턴 작성을 빼 놓을 수 없다.

네트워크 상에서 흘러다니는 트래픽을 정확히 분석 판단하고 어떤 부분을 패턴으로 뽑아내어 사용할 것인가는 단순한 것부터 복잡한 것까지 다양하다.

시그너처 패턴 작성 후 올바로 탐지하는 것을 테스트 하기 위해 트래픽을 재 전송해 보고 한다. 이미 여기서 언급한 tcpreplay 나 기타 도구를 이용해 재전송해보는 것으로 내가 만든 패턴이 올바른지 확인할 수 있다.

앞서 소개한 PackIt 도구에서 유용한 유틸리티가 하나 있다. 그것은 스노트 룰을 PackIt 명령어로 만들어, 패킷을 전송할 수 있도록 도와주는 것이다. 스노트 룰의 QA 등과 같은 업무에는 나름 유용하게 사용할 수 있을 것이다.

다운로드는 다음의 경로에서 가능하다.

http://packetfactory.openwall.net/projects/packit/s2pgen.pl

이 파일은 펄(Perl) 스크립트로 간단히 만들어져 있는 것으로 룰 파일을 지정하면, packit 으로 검증해 볼 수 있게 명령어를 만들어 준다. 파일을 열어 첫 시작부분을 보면 주소 설정을 정의하는 부분이 있다. 시그너처 파일에서 룰을 읽어들여 파싱할때 필요한 기본 정보이다. 이 정보들만 여러분들의 네트워크 상황에 맞게끔만 조절하여 사용하면 된다.


# Defaults
$DEFAULT_PACKIT     = "packit";
$DEFAULT_ADDR       = "10.0.0.1";
$DEFAULT_DATA       = "R";

# Host/Port definitions
$EXTERNAL_NET_ADDR  = "10.0.0.1";
$HOME_NET_ADDR      = "192.168.0.4";
$HTTP_SERVER_ADDR   = "192.168.0.2";
$SQL_SERVER_ADDR    = "192.168.0.3";
$SMTP_SERVER_ADDR   = "192.168.0.4";
$TELNET_SERVER_ADDR = "192.168.0.5";
$AIM_SERVER_ADDR    = "192.168.0.6";
$ORACLE_PORT        = "1521";
$HTTP_PORT          = "80";
$SHELLCODE_PORT     = "81";

우선 스노트에서 제공하는 기본 룰 파일중 하나인 ddos.rules 파일을 가지고 만들어 보면 아래와 같다 :


# ./s2pgen.pl ddos.rules
echo

echo DDOS TFN Probe
packit -t icmp -s10.0.0.1 -d192.168.0.4 -p "0x 31 32 33 34" -SR -DR    -K 8  -N 678

echo DDOS tfn2k icmp possible communication
packit -t icmp -s10.0.0.1 -d192.168.0.4 -p "0x 41 41 41 41 41 41 41 41 41 41" -SR -DR    -K 0  -N 0

echo DDOS Trin00 Daemon to Master PONG message detected
packit -t udp -s10.0.0.1 -d192.168.0.4 -p "0x 50 4f 4e 47" -SR -D31335

echo DDOS TFN client command BE
packit -t icmp -s10.0.0.1 -d192.168.0.4  -SR -DR    -K 0  -N 456 -Q 0


packit 을 통해 보내기 전 echo 로 어떤 패킷인지 출력해 주고 packit 명령어로 전송할 패킷 정보를 만들어 준다. 그리고, 스노트에서 탐지가 되는지 확인해 보면 된다.

시그너처 제작 업무를 하는 이들에겐 나름 도움이 될 것이다. 또는 이를 변형하여 원하는 형태의 도구를 이용하여 만들어보는 것은 어떨까?

2010년 10월 1일 금요일

윈도우 기반의 네트워크 패킷 생성 도구 - NPG

오랜만에 윈도우 환경에서 사용할 수 있는 네트워크 패킷 생성 도구 하나를 소개하고자 한다.
이름은 Network Packet Generator 이며 약자로 NPG 이다. GNU GPL 라이센스로
자유롭게 사용가능하다. NPG 는 WinPcap 을 이용하여 패킷을 생성하며, 주요한 것을 요약해 보면 다음과 같다

- 오픈소스
- 윈도우 환경에서 동작
- Libpcap 기반의 패킷 생성기
- PCAP 호환 패킷 파일 또는 NPG 포맷의 파일을 이용하여 패킷 생성
- 패킷 바이트 스트림 전송

기능은 아주 다양하지는 않지만, 기존에 보아오던 것과 좀 다른 특징은 NPG 라 정의되어 있는
포맷 형태이다. 이 포맷 형태에 맞춰서 생성될 패킷의 HEX 값을 나열해 주면 된다.
이런 기능이 유용한 경우가 있기 때문에 특정 작업에서는 요긴할 것이다.

NPG 는 다음의 경로에서 받을 수 있다.


일단 아무 옵션없이 실행하면, 인터렉티브 모드로 동작하여 사용자가 선택하여 작업을 결정할 수 있는데,
처음 접하는 분들에겐 유용할 수도 있다.

C:\Npg1.3.0\bin>npg
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/

No arguments detected, using interactive mode. Use npg -h for arugments.

Output information level:

[1] None
[2] Verbose
[3] Very Verbose
[4] Very Very Verbose

Selection [3]:


이외 몇 가지 옵션을 알아보면 다음과 같다.

-h 도움말
-d 패킷을 인젝트할 네트워크 디바이스를 선택
-f NPG 패킷파일의 이름 지정
-F Libpcap 호환 패킷파일 이름 지정
-l 사용가능한 네트워크 디바이스 나열
-p <packet byte stream>
인젝트할 패킷 바이트를 HEX 값으로 나열해주면 됨
-r <repeat count>  
패킷을 몇번 반복할지 카운트를 지정
-t <interval>
패킷을 인젝트 하기 전 시간 간격을 지정 (시간 기준은 밀리세컨드)
-v, -vv, -vvv
동작 상태를 표시 v 가 많을 수록 세부정보를 표시함

옵션을 대충 봐도 무슨 기능인지 추측이 가능할 정도로 복잡하지는 않다. 예를 들어,
다음과 같이 -F 를 통해 pcap 파일을 지정해 본다면

C:\Npg1.3.0\bin>npg -vvv -F packets.cap
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/


Successfully opened file packets.cap as read only

Successfully processed 7 packets in packets.cap
599 bytes allocated in packet queue to be sent
Elapsed time : 0.000

시간 간격을 둘것인지 물어본다.

Use time intervals defined in packets.cap:

[1] Yes
[2] No

Selection [2]:
An output device must be selected for injecting the packets

기본설정은 No 이며 엔터를 치면 다음 사용가능한 디바이스를 나열해 준다.
여기서 패킷을 전송할 인터페이스 번호를 골라주면 된다.

Available devices:

[1] Network adapter 'Sun' on local host
[2] Network adapter 'NVIDIA nForce MCP Networking Adapter Driver' on local host

Select default device (1-2):2

인터페이스를 선택하면 아래와 같이 패킷을 인젝트 하여 전송한다.

Elapsed time : 0.001
7 packets successfully injected
599 bytes sent
Releasing 599 bytes used for LibpcapQueue

인터페이스를 지정하지 않으면 알아서 인터페이스를 나열해 주고, 시간간격을 지정해 주지 않아도
물어봐 준다. 그만큼 쉽게 사용 가능하다.

앞서 말한것과 같이 NPG 는 자체의 포맷 형태를 이용해 패킷을 만들어 전송할 수 있다. 이 형태를
알아보면 다음과 같다:

NPG 패킷파일은 {    } 로 둘러 쌓인 블럭으로 이뤄진다. 물론 값은 00-FF 사이의 HEX 값으로 표현되며
공백이나, 탭, 주석은 무시된다. 전송할 패킷 구성은 아래와 같은 형태 블럭으로 이뤄진다.

예제>
1. { 01 02 03 04 05 06 06 05 04 03 02 01 08 00 }
2. { 01 02 03 04 05 06
  06 05 04 03 02 01
  08 00 }
3. {0102030405060605040302010800}
4. {
0
1
0
2
0
3
}

그리고, 각 패킷 블럭이 시작되기 전 [  ] 로 묶어 표현해 주는 부분은 반복할 카운트와 시간간격을 지정하게 된다. 예를 들면 아래와 같다

[0,1000]
[3,0]

자, 그럼 NPG 파일안에 들어있는 예제파일을 한번 들여다 보자. 패킷 블럭 시작전에 [3,1000] 으로
3번 반복하고 1000 밀리세컨드 간격이 있다는 것을 뜻한다.
그리고 < > 로 묶인 부분은 이것이 어떤 형태인지 말해주는 태그이다.  그 다음 시작되는 {  } 는
실제 발송될 패킷이 기술되는 것으로 보기좋게 라인별로 기술되어 있다.
앞서 말했듯이 주석과, 공백등은 무시되므로 아래 예제와 같이 사람이 보기 좋게 나열하여
사용하는 것이 좋다.

# TCP/IP ICMP Echo Request
[3,1000]
<ICMP Echo Request>
{
# Ethernet HEADER -----

  01 02 03 04 05 06  # Destination MAC
  06 05 04 03 02 01  # Source MAC
  08 00              # Protocol

# IP HEADER -----------

  45                 # Version / Header Length
  00                 # Type of service
  00 3c              # Total length
  00 a5              # Identification
  00 00              # Flags / Fragment offset
  80                 # Time to live
  01                 # Protocol
  b8 c8              # Checksum
  c0 a8 00 02        # Source address
  c0 a8 00 01        # Destination address

# ICMP HEADER ---------

  08                 # Type
  00                 # Code
  4a 5c              # Checksum
  02 00              # Identification
  01 00              # Sequence number
  61 62 63 64 65 66  # Data (Windows ping)
  67 68 69 6a 6b 6c
  6d 6e 6f 70 71 72
  73 74 75 76 77 61
  62 63 64 65 66 67
  68 69
}

만들어진 포맷 파일을 이용하여 -f 옵션으로 전송할 수 있다.

C:\Npg1.3.0\bin>npg -vv -f packets.txt -d rpcap://\Device\NPF_{E849DA
84-A444-4334-BD12-157CFC55BD8B}
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/


Successfully processed 3 packets in packets.txt
Elapsed time : 0.000
Injecting packet queue obeying time intervals

Waiting approximately 1000 milliseconds
Injecting Packet #1
Device: rpcap://\Device\NPF_{E849DA84-A444-4334-BD12-15XXX55BD8B}
Packet ID: ICMP Echo Request
Repeat count: 0

그리고 아래와 같이 -p 옵션을 통해 전송할 데이터를 바로 지정할 수도 있다.

C:\Npg1.3.0\bin>npg -vv -p 0001020304 -d rpcap://\Device\NPF_{E849DA8
4-A444-4334-BD12-15XXX55BD8B}

하지만 위에서 사용한 예에서는 임의로 지정한 것이기 때문에 패킷이 알 수없는 형태로 전송된다.
어떤 프로토콜 형태에 맞춰서 작성된 것이 아니기 때문이다. -p 옵션등은 명령어 옵션을 통해
바로 패킷을 전달하고자 할때 사용하면 된다.

[참고]
1. NPG
http://www.wikistc.org/wiki/Network_packet_generator
2. NPG 파일 다운로드 (요청에 의해 해당 소스 파일을 첨부해 놓습니다)

2010년 9월 10일 금요일

Bit-Twist 로 패킷파일의 편집과 생성까지 자유자재로..

지금까지 패킷 편집 도구를 몇 가지 소개하였다. 패킷생성기능, 편집 기능등. 패킷인사이드를 검색해 보면 몇 가지를 찾아볼 수 있을 것이다. 이번 도구의 이름은 Bit-Twist 로 패킷을 생성하고, 편집할 수 있는 기능까지 갖추고 있다. 사용방법도 너무 쉬워서 한번 사용예제를 보는 것만으로도 쉽게 이해가 될 것이다.

- bittwist  : PCAP 기반의 패킷 생성기
- bittwistb : PCAP 기반의 이더넷 브릿지
- bittwiste : PCAP 파일 에디터

일단, 다음의 경로를 통해 파일을 다운로드 받을 수 있다.


아차, 여기 예는 리눅스 기반에서 소개한 것이지만. 윈도우에서도 사용가능하다는 점!

도움말은 -h 를 통해서 볼 수 있고, 몇 가지 옵션을 살펴보도록 하자.  우선, 패킷 생성기인 bittwist 로 시작해 보자.  -d 옵션은 현재 사용가능한 네트워크 인터페이스를 보여준다.

# bittwist -d
1. eth0
2. any (Pseudo-device that captures on all interfaces)
3. lo

-i 를 통해 인터페이스를 정할 수 있고, 인자로 패킷파일을 주면 해당 인터페이스로 패킷을 발송한다.

# bittwist -i eth0 test.pcap
sending packets through eth0
trace file: test.pcap
^C
1235 packets (1041023 bytes) sent
Elapsed time = 36.533449 seconds

위 예를 보면 1235 개의 패킷을 전송하였고, Ctrl+C 를 눌러 중단했다. 바로 전송이 빠르게 이뤄지지 않았기
때문에 수동으로 중지한 것이다. 이럴때 -m 옵션을 사용하면 즉시 전송하게 된다.

# bittwist -i eth1 test.pcap -m 0
sending packets through eth1
trace file: test.pcap

2040 packets (1578854 bytes) sent
Elapsed time = 0.037914 seconds

-m 옵션을 사용하였더니 즉시 패킷이 전송되었고, 2040개의 패킷이 다 전달되었다.
-c 옵션은 전송할 패킷 갯수를 지정할 수 있다. 만약 test.pcap 에서 10 개의 패킷만을 전달하고 싶다면 -c 10 을 사용하면 된다.

# bittwist -i lo test.pcap -m 0 -c 10
sending packets through lo
trace file: test.pcap

10 packets (4247 bytes) sent
Elapsed time = 0.000414 seconds

간단한 옵션 몇가지를 통해 금방 패킷을 전송할 수 있는 것을 보았다. 이와 비슷한 기능을 가진 도구로는 tcpreplay 가 기억이 날 것이다.  자, 이번에는 편집 기능을 사용 예를 통해 한번 알아보도록 한다.

1) 패킷에서 1-2 까지만의 패킷을 뽑아내 저장해 보자.

# bittwiste -I test.pcap -O rigel.pcap -R 1-2
input file: test.pcap
output file: rigel.pcap

2 packets (128 bytes) written

2) 패킷 덤프 할 시간을 지정해 저장하기

일단 PCAP 파일의 첫 시간을 살펴보았더니 2010년7월21일 10시26분이다.

# tcpdump -r test.pcap -tttt | more
reading from file test.pcap, link-type EN10MB (Ethernet)
2010-07-21 10:26:39.659705 IP 179.222.51.219.3645 > 147.245.206.234.www: S 592977294:59297
7294(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>

그리고, -S 옵션을 통해 시작시간과 끝 시간을 지정한다. 참고로 -I 옵션은 Input 파일 -O 옵션은 Output 파일을
뜻한다.

# bittwiste -I test.pcap -O rigel.pcap -S 21/07/2010,10:20:00-21/07/2010,10:26:40
input file: test.pcap
output file: rigel.pcap

944 packets (866907 bytes) written

3) IP 를 변경해 보자.

# tcpdump -r rigel.pcap
reading from file rigel.pcap, link-type EN10MB (Ethernet)
10:26:39.659705 IP 179.222.51.219.3645 > 147.245.206.234.www: S 592977294:592977294(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>

위 172.222.51.219 출발지 주소를 -> 192.168.0.0 으로 변경해 보자.

# bittwiste -I test.pcap -O rigel.pcap -R 1 -T ip -s 179.222.51.219,192.168.0.0
input file: test.pcap
output file: rigel.pcap

1 packets (66 bytes) written

# tcpdump -r rigel.pcap
reading from file rigel.pcap, link-type EN10MB (Ethernet)
10:26:39.659705 IP 192.168.0.0.3645 > 147.245.206.234.www: S 592977294:592977294(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>

확인해 보면 출발지 주소가 설정한대로 변경되었다.

4) -R 옵션을 사용하지 않으면 모든 범위에 적용된다.

# bittwiste -I test.pcap -O rigel.pcap  -T ip -s 179.222.51.219,192.168.0.0
input file: test.pcap
output file: rigel.pcap

2040 packets (1578854 bytes) written

3번과 같은 예제인데, 편집된 패킷 개수를 보면 2040 개이다. -R 을 사용하지 않아 전체에 적용이 된 것이다.

5) 포트 번호 변경

# bittwiste -I test.pcap -O rigel.pcap -R 1 -T tcp -d 80,8080
input file: test.pcap
output file: rigel.pcap

1 packets (66 bytes) written

6) Payload 삽입하기

# echo "hahaha" | xxd
0000000: 6861 6861 6861 0a                        hahaha.

-X 옵션을 통해 위 HEX 값을 삽입.

# bittwiste -I test.pcap -O rigel.pcap -R 1 -L 4 -X 686168616861 -T tcp
input file: test.pcap
output file: rigel.pcap

1 packets (72 bytes) written

편집된 rigel.pcap 을 아래와 같이 확인해 보면 Payload 가 삽입된 걸 볼 수 있다.

# tcpdump -r rigel.pcap -XX
reading from file rigel.pcap, link-type EN10MB (Ethernet)
10:26:39.659705 IP 179.222.51.219.3645 > 147.245.206.234.www: S 592977294:592977300(6) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
        0x0000:  001e 4a48 3900 0024 2119 7756 0800 4500  ..JH9..$!.wV..E.
        0x0010:  003a 7ee5 4000 3006 813f b3de 33db 93f5  .:~.@.0..?..3...
        0x0020:  ceea 0e3d 0050 2358 1d8e 0000 0000 8002  ...=.P#X........
        0x0030:  2000 7bdf 0000 0204 05b4 0103 0302 0101  ..{.............
        0x0040:  0402 6861 6861 6861                      ..hahaha
    
이외 옵션을 잘못사용하면 아래와 같은 에러메시지를 얻게 된다.

bittwiste: invalid header specification

이 도구를 소개하면서 느낀것은 다른 도구들보다 사용이 쉬웠다. 도움말만 참고해서도 쉽게 사용할 수 있을
만큼 간단하고 기능또한 필요한 것으로 잘 모아져 있다.

패킷을 편집하고 생성하는 기능을 원한다면 이 도구가 큰 도움이 될 것이다.

2010년 4월 30일 금요일

패킷(Packet) 편집/생성을 윈도우에서 쉽게 해보자!

리눅스 환경에서의 도구를 많이 소개했는데, 이번에는 윈도우 기반의 도구 하나를 소개한다. 패킷 편집을 쉽게 할 수 있는 도구이다. 가끔 작업을 하다보면 패킷을 내가 원하는 대로 수정하여 전송하거나 그럴 필요성이 있다. 제품의 테스트라든지, 탐지 패턴 규칙 테스트 형태들이 이에 속할 것이다.

아래 도구는 패킷의 각 필드를 세부적으로 쉽게 수정할 수 있는 기능을 제공해 주고, 바로 전송할 수 있도록 해 준다. 물론, 교육적, 개인적으로 사용하는 것은 무료이다. Colasoft Packet Builder 로 다음 사이트에서 다운로드 받을 수 있다.


사용하기도 워낙 쉬어서 실행하고 Add 나 insert 를 선택하여 패킷 형태를 선택해 주고 각 세부 정보를 수정하면 된다. 또는 기존에 만들어진 PCAP 파일등을 Import 할 수 있다. 헤더 정보를 수정하면 Checksum 값이 달라지는데 기본적으로 Checksum 을 자동으로 계산하여 반영해 준다.

원하는 대로 수정하고 나서 전송할 패킷을 선택하고 Send 를 선택하면 다음 화면을 볼 수 있다.
몇번을 전송할지 정할 수 있으며 ( 0 은 무한 루프이다) 기본 설정을 하고, Start 를 누르면 전송이 된다.

자 그럼 위에서 설정한 것과 같이 전송이 된다. TCP 전송을 하면서 1.1.1.1 을 찾는 ARP 도 같이 발생하였다.

패킷을 생성하는 이 프로그램은 워낙에 인터페이스가 쉬우면서도 직관적이어서 패킷에 대한 기본 지식이 있으면 어렵지 않게 사용할 수 있다. 패킷 편집이 필요하다면 한번 사용해 보세요!.


2010년 4월 29일 목요일

윈도우 기반의 QoS 트래픽 생성기

QoS(Quality of Service) 트래픽을 생성하는 커맨드 도구를 하나 소개한다. 트래픽을 대량으로 생산하는 그런 도구와 달리 QoS 기능을 테스트하기 위한 용도로 만들어 진 것이다. 이 도구는 윈도우 7 개발 과정과 QoS 기술을 테스트 하기 위해서 만들어진 것이라고 한다.  윈속을 통해 트래픽을 전달하는 기능과, TCP와 UDP 듀얼 모드 소켓을 지원한다. 32비트와 64비트 또한 둘다 지원한다.

간단하게만 우선 테스트 해 보았는데 아래 그림과 같이 실행하면 10초 동안 5메가 수준으로 트래픽을 생성한다.


윈도우 비스타와 7 환경에서 관련 프로그램을 개발하는 분들은 참고하길 바란다.

[다운로드]
[참고정보]

2010년 3월 31일 수요일

트래픽 패킷 생성도구 Mausezahn 을 소개합니다.

장비의 성능을 테스트 해 보거나, 방화벽이 제대로 패킷을 차단하는지, 프로토콜이 올바른지 등을
확인해 보고자 할때 의도적으로 패킷을 생성할 필요가 있다. 또는 조작된 패킷으로.
다양한 도구들이 많이 나와있는데, 앞으로 차차 소개하기로 하고 오늘은 리눅스기반의 패킷생성도구인
Mausezahn 을 소개한다.

패킷을 의도적으로 생성하여 이용할 수 있는 곳은 서두에서 잠깐 언급한 것과 같이
사용처가 아주 다양하다. 악의적으로 조작되어 공격에 이용될 수도 있는 문제점도 있지만,
패킷인사이드를 방문하시는 분들은 업무의 활용, 스터디 목적이므로.

mztitle.png

이미지출처 : www.perihel.at





공식 사이트는 다음과 같으며, 명령어는 mz 로 불린다.


자, 우선 소스파일을 다운받고 컴파일을 한다. 단, 컴파일 전에 다음의 요구조건이 충족되는지 확인하자.

[필요한것]
* cmake
* libpcap0.8-dev  (version >= 0.8 will definitely work)
* libnet1-dev     (version >= 1.1 will definitely work)
* libcli-dev      (version >= 1.9.1 will work)

데비안 사용자라면 apt-get install cmake 와 같이 간단히 패키지를 설치할 수 있다. 각 운영체제에 맞는
방법으로 설치하자.

다운로드 받은 소스파일을 적절한 위치에 풀고 진행한다. (참고로, 소스파일을 풀면 해당 위치가
루트 이므로 디렉토리를 하나 만들고 그 안에 풀어주는 것이 좋을것이다)

1. cmake 를 실행해 주자.

$ cmake .
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kwanjin/workout/mz

2. 컴파일을 하기 위해 make 를 실행한다.

[CODE bash]$ make
.
.
[ 98%] Building C object src/CMakeFiles/mz.dir/cli_igmp.o
[100%] Building C object src/CMakeFiles/mz.dir/cli_lldp.o
Linking C executable mz
[100%] Built target mz[/CODE]

3. 컴파일한 mz 를 설치하려면 'make install' 을 한다.

사용방법은 mz -h 를 해보면 볼 수 있고, 많은 내용이 있으므로 직접 한번 살펴보기를 바란다.
간단한 예를 들어보면 아래와 같다.

# ./mz eth4 -c 1000 "ff:ff:ff:ff:ff:ff ff:ff:ff:ff:ff:ff cc:dd 00:00:00:ca:fe:ba:be"

mz 다음에는 이더넷 인퍼페이스를 지정하고 -c 옵션은 카운트를 뜻한다. 그리고 임의의 연속적인 바이트를
지정하였다. tcpdump 로 해당 인터페이스를 덤프하면 다음과 같은 패킷을 볼 수 있다.

23:47:12.169827 Broadcast > Broadcast, ethertype Unknown (0xccdd), length 21:
        0x0000:  0000 00ca feba be                        .......
23:47:12.169831 Broadcast > Broadcast, ethertype Unknown (0xccdd), length 21:
        0x0000:  0000 00ca feba be                        .......
23:47:12.169834 Broadcast > Broadcast, ethertype Unknown (0xccdd), length 21:
        0x0000:  0000 00ca feba be                        .......
23:47:12.169838 Broadcast > Broadcast, ethertype Unknown (0xccdd), length 21:
        0x0000:  0000 00ca feba be                        .......
23:47:12.169841 Broadcast > Broadcast, ethertype Unknown (0xccdd), length 21:
        0x0000:  0000 00ca feba be                        .......

TCP Flooding 형태의 트래픽도 전송할 수 있다. -c 다음에 0 이 오면 루프를 도는 것이다. 즉, 사용자가
멈출때까지 계속 동작하므로 주의한다. -A 는 출발지 IP 를 랜덤으로 설정하고 -t 는 프로토콜 타입으로
tcp 를 선택하고 -B 는 목적지 IP 를 정의한 것으로 예제에서는 C 클래스 대역으로 설정하였다. 그 이후
flags 에는 SYN 타입을 정의했고 목적지 포트로 5555 번을 설정했다.

# ./mz eth4 -c 0 -A rand  -t tcp -B 10.29.2.0/24  "flags=syn, dp=5555"
Mausezahn will send frames infinitly...

다음은 프로토콜 타입만 ARP 로 보낸 것이다.
# ./mz eth4 -c 0 -A rand  -t arp -B 10.29.2.0/24

한쪽에서는 전송하고 다른 한쪽에서 트래픽을 덤프하면 생성되는 것을 볼 수 있을 것이다.

한가지 이 프로그램이 독특한 부분이 있는데, 위에서 라이브러리 사용된 것을 보고 감을 잡으신 분들도
있을 것이다. libcli 는 시스코스타일의 대화형 화면을 제공해 준다. 시스코 라우터나 스위치를
접해 보신분들은 아마 익숙할 것이다.

-x 후에 사용할 포트를 지정하고 실행하면 지정된 포트로 리스닝을 하며 동작한다.

# ./mz eth4 -x 1234

자 그리고 해당 포트 번호로 접속을 해본다. 지정된 인터페이스에 할당된 IP 로 접속을 시도해 보자.

# telnet 192.168.0.6 1234
Trying 192.168.0.6...
Connected to 192.168.0.6.
Escape character is '^]'.

------------------------------------------
Mausezahn, version 0.39
Copyright (C) 2007-2009 by Herbert Haas.
------------------------------------------

Mausezahn comes with ABSOLUTELY NO WARRANTY; for details
type 'warranty'.  This is free software, and you are welcome
to redistribute it under certain conditions; see COPYING
(included in the Mausezahn source package) for details.

For Mausezahn NEWS visit http://www.perihel.at/sec/mz/

위와 같은 화면이 뜨고 사용자 이름과 패스워드로 mz 를 넣어본다.

Username: mz
Password:

그리고 enable 을 넣고 'mops' 라는 패스워드를 입력하면 준비된 것이다.

mz-0.39> enable
Password:
mz-0.39#

시스코 스타일의 형태로 나오므로 어렵지 않게 사용이 가능하다. 도움이 필요하면 ? 를 눌러보자.
아래 그림은 패킷을 만드는 예로 TCP-Flooding 이라는 것을 만들고 목적지 IP 는 192.168.1.1 로 설정하며
목적지 주소는 랜덤하게 한다. 1000번을 수행하며 타입은 TCP 이다. 플래그는 syn 으로 셋팅하고
end 로 종료하였다.

자 다음 sh packet 으로 보면 앞에서 만들었던 내용이 있다. 실행하길 원하면 start 와 함께 ID 를 지정하면
된다. 패킷의 자세한 내용을 보기 위해 sh packet 2 해서 세부 정보를 보는 화면도 보인다.

다른 패킷 생성기와는 달리 이런 대화형 형태를 제공해 주어, 지속적으로 저장해 놓고 임의의 값을 변경하여
수행하고자 하는 경우에는 유용하게 사용할 수 있을 것이다. 예를 들면, 모의해킹등.
물론, 편안한 방법은 각자 다르겠지만, 일단 이러한 것도 있다는 것을 알아두면 좋을 것이다.

Mausezahn은 C 로 제작된 만큼 빠른 속도를 제공하고 자유롭게 사용할 수 있다. 다만, 아직 윈도우 기반은
지원하지 않고 리눅스(기타 유닉스 플랫폼) 에서만 가능하다.

2010년 2월 2일 화요일

ASCII 형태의 HEX 값을 패킷 파일(PCAP)로 변환해 보자

HEX 덤프파일에서 패킷파일로 변환해야 하는 경우가 발생한다.  HEX 값의 ASCII 내용을 PCAP 파일로 변환할 수 있는 방법은 없는 것일까?

와이어샤크에서 제공하는 유틸리티 중 text2pcap 이라는 것이 있다. 이름만 들어도 텍스트 파일에서 pcap 으로 변환한다는 의미임을 짐작할 수 있다. text2pcap 은 od -Ax -tx1 로 생성된 형태의 HEX 값을 이해할 수 있다. 여기서 od 명령어는 바이너리를 덤프하는 경우 많이 사용하는데, Octal (8진수) 로 덤프해서 보여주는 것이다. 앞서 사용한 -Ax 옵션은 오프셋 표현을 16진수로 하고 -tx1 은 -t 는 출력될 타입 형태를 지정하는데 아래 표와 같이 타입을 16진수로 하고 그 크기는 1로 한다는 의미이다.

 타입 의미
 a 문자의 이름(7비트 ASCII)
 c ASCII 문자 또는 escape 문자
 d 부호가 있는 10진수
 f 부동소수점 수
 o 8진수
 u 부호가 없는 10진수
 x 16진수

ls 명령어를 od 로 살펴보면 아래와 같은 형태로 출력이 된다.

[code]pcap:/tmp# od -Ax -tx1 ls | more
000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
000010 02 00 03 00 01 00 00 00 40 9a 04 08 34 00 00 00
000020 60 64 01 00 00 00 00 00 34 00 20 00 08 00 28 00
000030 1b 00 1a 00 06 00 00 00 34 00 00 00 34 80 04 08
000040 34 80 04 08 00 01 00 00 00 01 00 00 05 00 00 00
000050 04 00 00 00 03 00 00 00 34 01 00 00 34 81 04 08
000060 34 81 04 08 13 00 00 00 13 00 00 00 04 00 00 00
000070 01 00 00 00 01 00 00 00 00 00 00 00 00 80 04 08
000080 00 80 04 08 14 5a 01 00 14 5a 01 00 05 00 00 00
000090 00 10 00 00 01 00 00 00 00 60 01 00 00 e0 05 08
[/code]

자, 그럼 text2pcap 의 몇가지 옵션을 살펴보면 다음과 같다.

-l Link 레이어 타입 지정 (기본은 이더넷이다)
-e <l3pid> -e 옵션 뒤에 이더넷 헤더를 지정할 수 있다. -e 0x806 이면 ARP 패킷을 뜻한다.
-i <proto> 프로토콜을 지정
-m 최대 패킷 길이
-u <srcport>,<destport> UDP 출발지,목적지 포트를 지정
-T <srcport>,<destport> TCP 출발지,목적지 포트를 지정

일단 텍스트 파일인 in.txt 를 보면 아래와 같이 HEX 덤프 파일이 ASCII 형태로 저장되어 있다.

pcap:/tmp# more in.txt
000000 00 e0 1e a7 05 6f 00 10 ........
000008 5a a0 b9 12 08 00 46 00 ........
000010 03 68 00 00 00 00 0a 2e ........
000018 ee 33 0f 19 08 7f 0f 19 ........
000020 03 80 94 04 00 00 10 01 ........
000028 16 a2 0a 00 03 50 00 0c ........
000030 01 01 0f 19 03 80 11 01 ........

text2pcap 을 이용해 in.txt 를 out.pcap 으로 변환하는 것이다. 이때 출발지와 목적지 포트를 8888과 9999로 함께 변경한다.

[code bash]pcap:/tmp# text2pcap -T8888,9999 in.txt out.pcap
Input from: in.txt
Output to: out.pcap
Generate dummy Ethernet header: Protocol: 0x800
Generate dummy IP header: Protocol: 6
Generate dummy TCP header: Source port: 8888. Dest port: 9999
Wrote packet of 56 bytes at 0
Read 1 potential packet, wrote 1 packet
[/code]

tcpdump 로 out.pcap 을 확인해 보면 포트가 변경된 것을 알 수 있다.

pcap:/tmp# tcpdump -r out.pcap
reading from file out.pcap, link-type EN10MB (Ethernet)
09:18:18.000000 IP 1.1.1.1.8888 > 2.2.2.2.9999: . 0:56(56) win 8192

또 다른 예로, -e 를 통해 ARP 이더넷 더미 헤더를 생성한다..

[code bash]pcap:/tmp# text2pcap  -e 0x806 in.txt out.pcap
Input from: in.txt
Output to: out.pcap
Generate dummy Ethernet header: Protocol: 0x806
Wrote packet of 56 bytes at 0
Read 1 potential packet, wrote 1 packet
pcap:/tmp# tcpdump -r out.pcap
reading from file out.pcap, link-type EN10MB (Ethernet)
09:19:59.000000 truncated-arp
        0x0000:  00e0 1ea7 056f 0010 5aa0 b912 0800 4600  .....o..Z.....F.
        0x0010:  0368 0000 0000 0a2e ee33 0f19 087f 0f19  .h.......3......
        0x0020:  0380 9404 0000 1001 16a2 0a00 0350 000c  .............P..
        0x0030:  0101 0f19 0380 1101                      ........
[/code]

파일을 변환해 보았는데, 파일 뿐만 아니라 아래와 같은 형태로 od 로 출력된 정보를 리다이렉션 하여 바로 text2pcap 으로 출력 생성도 할 수 있다. stream 파일을 읽어 들여 stream.pcap 으로 저장하는 것이다.

# od -Ax -tx1 stream | text2pcap -m1460 -T1234,1234 - stream.pcap

그럼 이것을 조금 더 응용하여 다음과 같이 사용해 보자.

[code bash]pcap:/tmp# echo "Hello, PacketInside.com" | od -Ax -tx1 | text2pcap -T1234,1234 - stream.pcap
Input from: Standard input
Output to: stream.pcap
Generate dummy Ethernet header: Protocol: 0x800
Generate dummy IP header: Protocol: 6
Generate dummy TCP header: Source port: 1234. Dest port: 1234
Wrote packet of 24 bytes at 0
Read 1 potential packet, wrote 1 packet[/code]

출발지 목적지 포트를 1234 로 설정하고 저장된 파일을 HEX 로 보니 echo 로 입력된 값을 볼 수 있다.
pcap:/tmp# xxd stream.pcap
0000000: d4c3 b2a1 0200 0400 0000 0000 0000 0000  ................
0000010: 0090 0100 0100 0000 794e 564b 0000 0000  ........yNVK....
0000020: 4e00 0000 4e00 0000 0202 0202 0202 0101  N...N...........
0000030: 0101 0101 0800 4500 0040 1234 0000 ff06  ......E..@.4....
0000040: a37e 0101 0101 0202 0202 04d2 04d2 0000  .~..............
0000050: 0000 0000 0000 5000 2000 ed42 0000 4865  ......P. ..B..He
0000060: 6c6c 6f2c 2050 6163 6b65 7449 6e73 6964  llo, PacketInsid
0000070: 652e 636f 6d0a                           e.com.

와이어샤크에서 살펴보면 echo 값이 Payload 로 들어간 것을 알 수 있다.
0000  48 65 6c 6c 6f 2c 20 50 61 63 6b 65 74 49 6e 73   Hello, PacketIns
0010  69 64 65 2e 63 6f 6d 0a                           ide.com.
    Data: 48656C6C6F2C205061636B6574496E736964652E636F6D0A

stream.pcap 은 목적지가 2.2.2.2 로 되어 있었다. 그런데 이걸 다른 IP 로 바꾸고 싶다면. 바이너리 에디터를 통해 직접 해당 IP 를 변경할 수 있다. 2.2.2.2 HEX 값을 찾아 변경하기만 하면 된다.

변경 후 , tcpdump 로 읽어 보니 192.168.0.1 로 변경되었다. 그런데 IP 주소 부분만을 변경하여서 헤더 체크섬 값이 바뀌어 버렸다. 올바르게 라면 체크섬 값은 0xe6d8 로 되어야 한다.

[code bash]pcap:/tmp# tcpdump -r stream.pcap
reading from file stream.pcap, link-type EN10MB (Ethernet)
09:29:45.000000 IP 1.1.1.1.1234 > 192.168.0.1.1234: . 0:24(24) win 8192
[/code]

Header checksum: 0xa37e [incorrect, should be 0xe6d8]

그렇다면 또 체크섬 값도 변경하면 된다.
pcap:/tmp# bvi stream.pcap

지금까지 이 예는 HEX 값 데이터를 직접 수정하는 것을 보여주었지만, 사실은 불편한 방법이긴 하다. 필요에 따라 테스트 하는 과정에서 급하게 필요한 경우 이런 형태로도 사용할 수 있으며, 패킷 생성 도구 등을 이용하면 좀더 쉽게 만들어낼 수 있다.  여기서는 ASCII 형태의 HEX 값을 이용해 패킷 데이터로 만드는 과정을 설명하면서 몇 가지 다루어 본 것이다. 앞으로 몇 가지 패킷 생성 도구에 대해서 언급해 볼 것이다.