Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

OneDay Network

Python scapy 라이브러리를 이용한 네트워크 패킷 캡처 본문

Network

Python scapy 라이브러리를 이용한 네트워크 패킷 캡처

programming 2020. 12. 21. 17:02
import sys
from scapy.all import*
  
count = 1
protocols = {1:'icmp', 6:'tcp', 17:'udp'}
protocol_type = input("Protocol Type: ")
sniffing_time = input("Sniffing Time: ")

def sniffing():
    print("Sniffing Start")
    pcap_file = sniff(prn=showPacket, timeout=int(sniffing_time), filter=str(protocol_type))
    print("Finish Capture Packet")
    if count == 1:
            print("No Packet")
            sys.exit()
    else:
        print("Total Packet: %s" %(count-1))
        file_name = input("Enter File Name: ")
        wrpcap(str(file_name), pcap_file)
  

def showPacket(packet):
    global count
    # IP
    src_ip = packet[IP].src  
    dst_ip = packet[IP].dst  
    proto = packet[IP].proto
    ttl = packet[IP].ttl
    length = packet[IP].len    
        
    if proto in protocols:  
        # ICMP 
        if proto == 1:
            message_type = packet[ICMP].type
            code = packet[ICMP].code
            
            print("packet number: %s protocol: %s" %(count, protocols[proto].upper()))
            print("src: %s -> dst: %s TTL: %s" %(src_ip, dst_ip, ttl))
            print("type: %s code: %s" %(message_type, code))
            print("\n")

        # TCP
        if proto == 6:
            sport = packet[TCP].sport
            dport = packet[TCP].dport
            seq = packet[TCP].dport
            ack = packet[TCP].ack
            flag = packet[TCP].flags
            
            print("packet number: %s protocol: %s" %(count, protocols[proto].upper()))
            print("src: %s -> dst: %s" %(src_ip, dst_ip))
            print("TTL: %s Length: %s" %(ttl, length))
            print("sport: %s dport: %s" %(sport, dport))
            print("seq: %s ack: %s flag: %s" %(seq, ack, flag))
            print("\n")
        
        # UDP
        if proto == 17:
            sport = packet[UDP].sport
            dport = packet[UDP].dport
            udp_length = packet[UDP].len
            print("packet number: %s protocol: %s" %(count, protocols[proto].upper()))
            print("src: %s -> dst: %s TTL: %s" %(src_ip, dst_ip, ttl))
            print("sport: %s dport: %s Packet Length: %s" %(sport, dport, udp_length))
            print("\n")
        count += 1

if protocol_type in protocols.values():
    sniffing() 
else: 
    print("Unsupported Format")

 

 

먼저 PacketCapture.py를 실행하면 [그림 1]과 같이 Protocol Type와 Sniffing Time을 입력할 수 있게 된다. Protocol Type은 자신이 캡처할 프로토콜을 선택 하여 입력하면 된다. 그리고 Sniffing Time은 자신이 패킷을 캡처할 시간을 입력 하면 된다. 단위는 초(Second)이다. [그림 1]을 보면 Protocol Type은 TCP, Sniffing Time은 60초를 입력하였다.

 

현재 지원하는 프로토콜은 [그림 2]와 같이 ICMP, TCP, UDP 패킷의 캡처를 지원한다.

 

[그림 3]과 같이 실시간으로 패킷이 캡처 되는 것을 확인할 수 있다. 이 프로그램에서는 출발지 IP를 나타내는 src 필드와 도착지 IP를 나타내는 dst 필드와 TTL(Time To Live) 필드와 패킷의 전체의 길이를 나타내는 Length 필드가 존재한다. 그리고 출발지의 포트 번호를 나타내는 sport와 도착지의 포트 번호를 나타내는 dport 필드도 존재한다. 마지막으로 TCP가 통신하기 위해 필요 한 Sequence Number와 Acknowledgement Number 필드와 TCP의 Flag를 나타 내는 flag 필드가 존재하여 패킷이 캡처 될 때마다 위와 같은 필드들을 출력 한다.

 

[그림 4]를 보면 캡처가 끝난 뒤에는 “Finish Capture Packet” 와 Total Packet 수를 출력하고, 파일 이름을 입력하면 캡처 되었던 패킷들이 pcap 파일로 저장 되고 프로그램이 종료된다.

 

 

 

[그림 5]를 보면 패킷 캡처 프로그램을 실행시켰던 폴더에 Packet.pcap 파일이 저장된 것을 확인할 수 있다.

 

 

Packet.pcap 파일을 열면 [그림 6]와 같은 화면이 보이게 된다. [그림 6]에 보이는 패킷들은 패킷 캡처 프로그램을 실행시켰을 때 캡처 된 패킷들이 pcap 파일로 저장된 것이다. 위에 [그림 4]와 Total Packet 수를 비교하면 2,265개로 똑같은 것을 확인할 수 있다.

 

 

[그림 7]을 보면 패킷의 캡처를 시작했을 때, 패킷이 아무것도 캡처 되지 않는 예외가 발생할 수 있다. 따라서 저장할 파일이 없다면 “No Packet”을 출력하고 프로그램을 종료하도록 수정하였다.

 

[그림 8]을 보면 ICMP 패킷을 10초 동안 캡처했지만, 아무 패킷도 캡처 되지 않았다. 따라서 “No Packet”을 출력하고 프로그램을 종료하였다.

 

 

Comments