OneDay Network
Python scapy 라이브러리를 이용한 네트워크 패킷 캡처 본문
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”을 출력하고 프로그램을 종료하였다.
'Network' 카테고리의 다른 글
웹 서비스 지연 공격(Slowloris) (0) | 2020.12.21 |
---|---|
가변 길이 서브넷 마스크(Variable Length Subnet Mask) (0) | 2020.12.21 |
단일 라우팅 프로토콜(RIP) (0) | 2020.12.21 |
가상화 기술과 종류 (0) | 2019.11.08 |
DNS(Domain Name Service) 계층적 구조 (0) | 2019.04.17 |