글 작성자: astrocosmos

.pcap 파일안에 UDP 패킷이 몇개 있는지 어떻게 알 수 있을까?


다음 예제 파일은 test.pcapng 파일을 읽어서 Ethernet/IP/ICMP/TCP/UDP packet이 각각 몇개씩 있는지 확인하고 출력해준다. 핵심인 haslayer() 함수는 각각의 패킷에 어떤 protocol layer가 있는지 확인해준다. Return은 boolean으로 True/False로 확인하면 된다.


# Imports
import scapy.all as sc

pkts = sc.rdpcap('test.pcapng')
print('Total packets :', len(pkts))

# init counts
count_ether = 0
count_ip    = 0
count_icmp  = 0
count_tcp   = 0
count_udp   = 0

# loop for all packets in pcap file
for p in pkts:    
    if p.haslayer('Ether') == True:
        count_ether += 1
    if p.haslayer('IP') == True:
        count_ip += 1
    if p.haslayer('ICMP') == True:
        count_icmp += 1
    if p.haslayer('TCP') == True:
        count_tcp += 1
    if p.haslayer('UDP') == True:
        count_udp += 1
    
# print counts
print('Ether packets :', count_ether)
print('IP packets    :', count_ip)
print('ICMP packets  :', count_icmp)
print('TCP packets   :', count_tcp)
print('UDP packets   :', count_udp)

Result>

Total packets : 7910
Ether packets : 7909
IP packets    : 0
ICMP packets  : 0
TCP packets   : 0
UDP packets   : 0


이전과 같은 파일(test.pcapng)로 돌려보면 아래와 같이 Total packet 갯수는 7910이고 Ethernet packet은 7909개 이다. 그럼 나머지 하나는 무슨 패킷인지 궁금하니 한번 알아보자. haslayer('Ether')가 False일때 어떤 패킷인지 출력해봤다. p.summary()는 하나의 패킷을 한줄로 요약한 내용을 보여준다. 아래 결과를 보니 Dot3 packet이었네...

for p in pkts:    
    if p.haslayer('Ether'):
        count_ether += 1
    else:
        print(p.summary())

Result>

Total packets : 7910
802.3 84:80:2d:fe:61:8b > 01:80:c2:00:00:00 / LLC / STP / Raw / Padding
Ether packets : 7909
IP packets    : 0
ICMP packets  : 0
TCP packets   : 0
UDP packets   : 0


그냥 단순히 pcap 파일에 있는 TCP / UDP / ICMP 패킷들 갯수만 알고 싶다면 다음과 같이 한줄로 알아낼 수 있다 (다양한 패킷이 들어있는 파일로 test.pcapng을 변경해보았음).


# print counts
print('Ether packets :', count_ether)
print('IP packets    :', count_ip)
print('ICMP packets  :', count_icmp)
print('TCP packets   :', count_tcp)
print('UDP packets   :', count_udp)

print(pkts)

Result>

Total packets : 10001
Ether packets : 10001
IP packets    : 9964
ICMP packets  : 387
TCP packets   : 0
UDP packets   : 9577
<test.pcapng: TCP:0 UDP:9577 ICMP:387 Other:37>


우리가 counting한 값과 동일한 값을 마지막줄에 표시해주는데 문제는 TCP/UDP/ICMP에 한정된다는 것!

다음으로는 haslayer() 함수 대신 사용할 수 있는 방법이다. 이 방법이 더 직관적일 수도 있고, 어차피 동일한 역할을 하므로 편한 방법으로 사용하면 된다. 결과는 당연히 동일함.


# loop for all packets in pcap file
for p in pkts:    
    if 'Ether' in p:
        count_ether += 1
    if 'IP' in p:
        count_ip += 1
    if 'ICMP' in p:
        count_icmp += 1
    if 'TCP' in p:
        count_tcp += 1
    if 'UDP' in p:
        count_udp += 1


728x90