From be217b0370ecc19dd205615b739e6995c066bdd1 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Sat, 5 Sep 2015 13:47:35 +0200 Subject: Assignment 1 --- netsec-assignment1-S4498062/exercise3/sniffer.py | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 netsec-assignment1-S4498062/exercise3/sniffer.py (limited to 'netsec-assignment1-S4498062/exercise3/sniffer.py') 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() + -- cgit v1.2.3