aboutsummaryrefslogtreecommitdiff
path: root/netsec-assignment1-S4498062/exercise3/sniffer.py
diff options
context:
space:
mode:
authorCamil Staps2015-09-05 13:47:35 +0200
committerCamil Staps2015-09-05 13:47:57 +0200
commitbe217b0370ecc19dd205615b739e6995c066bdd1 (patch)
tree0603788062d94a5681f43f87af66cd93e7cc1c0d /netsec-assignment1-S4498062/exercise3/sniffer.py
Assignment 1
Diffstat (limited to 'netsec-assignment1-S4498062/exercise3/sniffer.py')
-rwxr-xr-xnetsec-assignment1-S4498062/exercise3/sniffer.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/netsec-assignment1-S4498062/exercise3/sniffer.py b/netsec-assignment1-S4498062/exercise3/sniffer.py
new file mode 100755
index 0000000..55416a8
--- /dev/null
+++ b/netsec-assignment1-S4498062/exercise3/sniffer.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python3
+
+import socket
+import struct
+
+def parse_udp(packet):
+ header_length = 8
+ header = packet[:header_length]
+ data = packet[header_length:]
+ (source_port, dest_port, data_length, checksum) = struct.unpack(
+ "!HHHH", header)
+ return source_port, dest_port, data_length, data, checksum
+
+def parse_ip(packet):
+ header_length_in_bytes = (packet[0] & 0x0f) * 4
+ header = packet[:20]
+ data = packet[header_length_in_bytes:]
+ length, protocol, src, dst = struct.unpack(
+ "!xxHxxxxxBxx4s4s", header)
+ header = {'length': length,
+ 'protocol': protocol,
+ 'source': src,
+ 'destination': dst}
+ return header_length_in_bytes, header, data
+
+def format_ip(addr):
+ return '.'.join('%d'%i for i in addr)
+
+def main():
+ s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
+ while True:
+ raw, address = s.recvfrom(2 ** 16 - 1)
+ ip_header_len, ip_header, ip_payload = parse_ip(raw)
+ src_port, dst_port, udp_len, udp_data, udp_crc = parse_udp(ip_payload)
+ print("{}:{} --> {}:{}\nData length: {}\nChecksum: {}\n{}\n".format(
+ format_ip(ip_header['source']), src_port,
+ format_ip(ip_header['destination']), dst_port,
+ udp_len, udp_crc, udp_data))
+
+if __name__ == "__main__":
+ main()
+