Study/Network
[Python] Scapy를 이용해서 custom packet header 정의하기 2 [receive.py 편]
혜돌이
2020. 4. 25. 01:35
패킷을 예쁘게 만들어서 보냈으면 당연히 받을 때도 예쁘게 받아줘야 한다.
물론 그냥 scapy에서 제공하는 hexdump(pkt) 또는 pkt.show()로 볼 수도 있지만, 그러면 필드값 추출하기가 너무 너무 너무 너무 까다로워진다.
send.py 짜는 법은 여기에서 확인
1. send.py에서 정의한 그대로 커스텀 헤더를 작성해 준다
class custom_header(Packet):
"""Custom Header"""
name = "custom header"
fields_desc = [
BitField("field1", 0, 16), # BitField("field_name", initial value, byte_length)
BitField("field2", 0, 8),
BitField("field3", 0, 8)
]
2. 프로토콜 스택 중 커스텀 헤더가 오는 자리에 바인딩을 해 준다
bind_layers(UDP, custom_header)
나는 UDP 뒤에 붙이려고 위와 같이 바인딩을 해 줬다.
처음에 이걸 모르는 바람에 hex값 읽어와서 변환하고... 아주... 난리도 아니었음
3. 패킷을 받는다
def handle_pkt(pkt):
pkt.show()
너무 쉽다.
+) 원하는 헤더 필드에 접근할 때는 기존에 정의되어있는 프로토콜이랑 같은 형식으로 접근할 수 있다
custom_hdr = pkt[custom_header]
f1 = custom_hdr.field1 # == pkt[custom_header].field1
-----------------------------------------------------------
예제 코드
#!/usr/bin/env python
import sys
import struct
import os
from scapy.all import sniff, sendp, hexdump, get_if_list, get_if_hwaddr, bind_layers
from scapy.all import Packet, IPOption
from scapy.all import ShortField, IntField, LongField, BitField, FieldListField, FieldLenField
from scapy.all import IP, TCP, UDP, Raw, Ether, Padding
from scapy.layers.inet import _IPOption_HDR
class custom_header(Packet):
"""Custom Header"""
name = "custom header"
fields_desc = [
BitField("field1", 0, 16), # BitField("field_name", initial value, byte_length)
BitField("field2", 0, 8),
BitField("field3", 0, 8)
]
bind_layers(UDP, custom_header)
def handle_pkt(pkt):
pkt.show()
hexdump(pkt)
custom_hdr = pkt[custom_header]
custom_hdr.show()
f1 = custom_hdr.field1 # == pkt[custom_header].field1
print('field1: ', f1)
def main():
ifaces = filter(lambda i: '' in i, os.listdir('/sys/class/net/')) # 원하는 interface 지정
iface = ifaces[0]
print "sniffing on %s" % iface
sys.stdout.flush()
sniff(iface = iface,
prn = lambda x: handle_pkt(x))
if __name__ == '__main__':
main()
-- 참고 자료 --
scapy document, https://scapy.readthedocs.io/en/latest/build_dissect.html