인터넷 패킷 모니터링/변환/전송(scapy) 리눅스

패킷을 모니터링하는 오픈소스는 많다.
그런데 패킷 structure를 쉽게 바꾸는 오픈소스는 찾기가 힘들다.
scapy는 python기반 툴로 흐르는 패킷을 특정 조건에 맞추어 확인/변환/전송이 가능한 툴이다.

1. 패시지 설치
# pip install scapy 
# yum install scapy

2. 패키지 실행
# scapy
>>> a = rdpcap("smtp2.pcap")  // smtp2.pcap파일 로딩
>>> a[1101267].show() // 1101267번째 패킷 확인
###[ Ethernet ]### 
  dst= 3d:5a:42:f5:48:48
  src= 02:18:17:7c:55:f1
  type= IPv4
###[ IP ]### 
     version= 4L
     ihl= 5L
     tos= 0x0
     len= 82
     id= 337
     flags= DF
     frag= 0L
     ttl= 64
     proto= tcp
     chksum= 0xa0b6
     src= xxx.xxx.xxx.xxx
     dst= xxx.xxx.xxx.xxx
     \options\
###[ TCP ]### 
        sport= smtp
        dport= 42265
        seq= 1701168421
        ack= 2594866655
        dataofs= 8L
        reserved= 0L
        flags= PA
        window= 114
        chksum= 0x98e3
        urgptr= 0
        options= [('NOP', None), ('NOP', None), ('Timestamp', (1891157339, 599773574))]
###[ Raw ]### 
           load= '220 2.0.0 Ready to start TLS\r\n'

개발 참고사이트
http://www.secdev.org/projects/scapy/demo.html

[ 명령어 ]
>>> conf //패키지 환경 정보
>>> conf.iface='br0' // 브릿지 포트를 관찰한다.
>>> rdpcap("/tmp/http.pcap") // pcap파일 읽기
>>> ls(DNS) // 패킷 DNS항목의 기본 key:value를 보여준다.
>>> x[0].show() // x함수에 로딩한 첫번째 데이터를 보여준다.
>>> x[0][DNS].id = '55555'  // x배열의 첫번째 DNS항목의 id값을 55555로 변경한다.(기본:34133)
>>> wrpcap('file.pcap', pkt, append=True) // pcap파일을 저장한다.
>>> lsc() // 사용가능한 함수 출력
>>> sendp(rdpcap("file.pcap")) // 저장 패킷 재전송

[ 예제 ]
DNS의 헤더 구조를 확인하는 스크립트이다.
#!/usr/bin/python

import sys
from scapy.all import *

packet = UDP(sport=53)/DNS(id=31305, rd=1, qdcount=1, aa=0)
packet.show()
receive = sr(packet, timeout=2)
if receive:
        ans,unans=receive
        ans.summary()

>>> ls(DNS)   // DNS 해더 패킷 정보
id         : ShortField                          = (0)
qr         : BitField (1 bit)                    = (0)
opcode     : BitEnumField (4 bits)               = (0)
aa         : BitField (1 bit)                    = (0)
tc         : BitField (1 bit)                    = (0)
rd         : BitField (1 bit)                    = (1)
ra         : BitField (1 bit)                    = (0)
z          : BitField (1 bit)                    = (0)
ad         : BitField (1 bit)                    = (0)
cd         : BitField (1 bit)                    = (0)
rcode      : BitEnumField (4 bits)               = (0)
qdcount    : DNSRRCountField                     = (None)
ancount    : DNSRRCountField                     = (None)
nscount    : DNSRRCountField                     = (None)
arcount    : DNSRRCountField                     = (None)
qd         : DNSQRField                          = (None)
an         : DNSRRField                          = (None)
ns         : DNSRRField                          = (None)
ar         : DNSRRField                          = (None)

덧글

댓글 입력 영역