<script type="text/javascript" src="http://ss.textcube.com/service/blog/script/blogger.js"></script>
네트워크 패킷을 인젝션하고 캡쳐할 수 있는 도구 Packit(Packet toolkit) 을 소개한다.
앞서 소개했던 많은 도구들과 같이 인젝션하기에 유용한 도구이다.
TCP,UDP,ICMP,IP,ARP,RARP 그리고 이더넷 헤더등 거의 모든 것을 정의할 수 있어,
방화벽, 침입탐지시스템, 트래픽 테스트와 같은 곳에 이용할 때 유용하게 사용될 수 있을 것이다.
Packit 의 버전은 현재 1.0 이며 설치를 하기 위해서는 libnet 1.1.2 이상의 라이브러리와
libpcap 라이브러리또한 필요하다.
소스파일의 다운로드는 다음의 경로에서 할 수 있다:
APT 패키지 사용자라면,
# apt-get install packit 으로 쉽게 설치도 가능하다.
사용에는 큰 어려움이 없으나, 다만 옵션이 상당히 많다. 이 뜻은 세부적으로
정의할 수 있다는 뜻이된다. 기본 사용방법은 아래와 같다:
usage: packit -m mode [-options] 'expression'
사용할 때 모드가 있다는 것을 주의해야 하는데, 모드에 따라서 옵션이 달라지기 때문이다.
옵션에는 capture, inject, trace 가 있으며 기본모드는 inject 이다.
1. 패킷 캡쳐
자주 사용할 만한 패킷 캡쳐 옵션 몇가지를 정리해 보면 아래와 같다
-c count 캡쳐할 카운트 수를 지정
-e 링크 레이어 헤더 데이터 출력
-i interface 네트워크 인터페이스 지정
-n 호스트 주소를 이름으로 변환하지 않음
-r file 패킷을 읽을 파일 지정
-s snaplen 패킷 캡쳐할 snaplen 데이터 사이즈 정의 (기본:68 바이트)
-w file 패킷 파일 저장
-X 헥사와 아스키로 데이터 출력
사용 옵션들을 보면 패킷인사이드에서 여러번 다뤘던 도구들과 큰 차이는 없다.
특히 tcpdump 에 익숙하다면 더욱 그럴것이다.
사용예제>
#packit -m capture -c 100 -i eth0 -w /data/packetinside.pcap
#packit -m cap -nX 'tcp and port 80'
2. 패킷 인젝션
기본적으로 인젝션 되는 패킷의 옵션은 아래와 같으며, 옵션만 봐도 크게 어렵지는 않다.
-t protocol 인젝트할 프로토콜 타입 지정 : TCP, UDP, ICMP, ARP (기본은 TCP)
-c count 인젝션에 몇 개의 패킷을 사용할 것인지 정의
-i interface 네트워크 인터페이스
-w interval 각 패킷을 보내는 간격 시간 (기본 : 1초)
-h 패킷을 보낸 후, 응답을 프린트 해줌 * 필요에 따라 유용한 기능
-v Verbose 모드로 세부적으로 정보를 출력함
-p payload 인젝션 할 페이로드를 지정, HEX 는 '0x' 로 시작하며 각 값의 구분은 공백으로 함
ASCII : -p 'hello world, packetinside.com'
HEX: -p '0x 40 40 40 90 90 90 0d 0a'
-Z length 인젝트할 패킷의 사이즈 정의
-t 로 프로토콜을 지정한 후 각 프로토콜 마다 사용가능한 옵션을 이용하면 되는데
IP,TCP,UDP,ICMP,ARP,이더넷 헤더 옵션을 가지고 있다.
여기서 각 옵션을 일일이 설명하기는 힘들고, packit 의 간단한 도움말을 보면 쉽게 알 수 있다.
TCP/UDP header options
-a ack Acknowledgement number
-D port Destination port (Range format: start-end)
-F flags Flags (format: -F UAPRSF)
-q seq Sequence number
-S port Source port (Default: Random)
-u urg Urgent pointer
-W size Window size (Default: 65535)
ICMPv4 header options
General:
-C code Code (Default: 0)
-K type Type (Default: 8)
Echo(0) / Echo Reply(8):
-N id ID number
-Q seq Sequence number
Unreachable(3) / Redirect(5) / Time Exceeded(11):
-g gateway Redirect gateway host (ICMP Redirect only)
-j address Original source address
-J port Original source port
-l address Original destination address
-L port Original destination port
-m ttl Original time to live
-M id Original ID number
-O tos Original type of service
-P proto Original protocol (Default: UDP)
Mask Request(17) / Mask Reply(18):
-N id ID number
-Q seq Sequence number
-G mask Address mask
Timestamp Request(13) / Timestamp Reply(14):
-N id ID number
-Q seq Sequence number
-U ts Original timestamp
-k ts Recieved timestamp
-z ts Transmit timestamp
IP header options
-d address Destination address
-f Don't fragment
-n id ID number
-o tos Type of service
-s address Source address
-T ttl Time to live (Default: 128)
-V ipproto IP protocol number (RAWIP only)
ARP header options
-A op Operation type (Default: 1 (ARP request))
-x address Source protocol address
-X hwaddr Source hardware address
-y address Destination protocol address
-Y hwaddr Destination hardware address
Ethernet header options
-e ethaddr Source ethernet address
-E ethaddr Destination ethernet address
옵션은 위와 같으며, 패킷인사이드 블로그를 열심히 보신 분들이라면 옵션을 이해하는데
어려움이 없을 것이다. 몇가지 예제를 보도록 하자.
다음은 출발지 소스는 8.8.1.1 로 하고 목적지는 192.168.0.1 로 보내는데 총 10개의 패킷을
보낸다. -h 옵션은 응답도 출력하도록 한 것이다. -h 옵션이 주어지지 않으면,
단순히 전송하는 정보만 출력할 것이다.
# packit -t icmp -s 8.8.1.1 -d 192.168.0.1 -c 10 -h
Mode: Packet Injection using device: eth1
-| SND 1 |------------------------------------------------------------------
Timestamp: 10:28:54.469954
ICMP header: Type: Echo Request(8) ID: 5854 Seqn: 56577
IP header: Src Address: 8.8.1.1 Dst Address: 192.168.0.1
TTL: 128 ID: 53261 TOS: 0x0 Len: 28
-| No Response From Peer |--------------------------------------------------
아래는 TCP 패킷을 보내는 것으로 목적지 포트 80에 TTL은 111 그리고 페이로드는 0x40 을
보낸 것이다.
# packit -t TCP -s 192.168.0.253 -d 192.168.0.200 -S 403 -D 80 -T 111 -p '0x 40'
Mode: Packet Injection using device: eth1
TCP header: Src Port: 403 Dst Port(s): 80 Flag(s): None
Window: 65535
IP header: Src Address: 192.168.0.253 Dst Address: 192.168.0.200
TTL: 111 ID: 49354 TOS: 0x0 Len: 41
Writing packet(s) (1): .
-| Packet Injection Statistics |--------------------------------------------
Injected: 1 Packets/Sec: 1.0 Bytes/Sec: 41.0 Errors: 0
그리고 다음은 ARP 패킷을 만들어 전송한 것이다. 우선 -t 로 ARP 타입을 지정해 주고
-A 1 은 ARP Request 를 뜻하고 -x 는 보내는 IP 주소 -X 보내는 이더넷 주소를 정의한 것이다.
# packit -t arp -A 1 -x 1.2.3.4 -X 5:4:3:2:1:0
Mode: Packet Injection using device: eth1
ARP header: Type: Request(1)
Sender: Protocol Address: 1.2.3.4 Hardware Address: 5:4:3:2:1:0
Target: Protocol Address: 0.0.0.0 Hardware Address: 0:0:0:0:0:0
Writing packet(s) (1): .
-| Packet Injection Statistics |--------------------------------------------
Injected: 1 Packets/Sec: 1.0 Bytes/Sec: 42.0 Errors: 0
여기서는 간단한 형태로만 만들어 패킷을 전송하지만, 사용하고자 하는 목적에 따라서
다양하게 만들어 볼 수 있다. 옵션을 여러개 사용하여 복잡해 보이지만,
막상 사용해 보면 옵션등이 사용하려는 목적을 대충 추정해 볼 수 있어 심플하게 패킷을 전송할 수 있다.
여기 블로그에서 언급한 많은 도구들 중에서 어떤것이 자기에게 더욱 적합한지는 여러분들이 판단하길 바란다
'Network' 카테고리의 다른 글
Scapy (0) | 2017.01.08 |
---|---|
스노트(Snort) 룰을 파싱하여 패킷 생성, 전송하기 (0) | 2017.01.08 |
Scapy 에서 텍스트형태의 HEX 패킷 데이터 쉽게 가져다 쓰기 (0) | 2017.01.08 |
Tcpdump 의 출력내용을 내가 원하는 형태로 바꾸어 보자. (0) | 2017.01.08 |
netflow, sflow, jflow, cflow 비교 (0) | 2017.01.08 |