PageRenderTime 51ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/sockets/sniffer.py

https://gitlab.com/george.a.liaw/sample_code
Python | 58 lines | 36 code | 10 blank | 12 comment | 3 complexity | 959f120cb734cc91b9977c196347f5e1 MD5 | raw file
  1. # Sample incoming packet sniffer
  2. import socket, sys, struct
  3. #reload(sys)
  4. #sys.setdefaultencoding('utf8')
  5. # INET, streaming socket
  6. try:
  7. #s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
  8. #s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
  9. s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
  10. #s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
  11. except socket.error, msg:
  12. print('Error: %s, Message: %s'%(str(msg[0]),msg[1]))
  13. sys.exit()
  14. # Capture packets
  15. while True:
  16. # packet string from tuple
  17. packet = s.recvfrom(65565)[0]
  18. # unpack ip header
  19. ip_header = struct.unpack('!BBHHHBBH4s4s', packet[0:20])
  20. version = ip_header[0] >> 4
  21. iph_length = (ip_header[0] & 0xF) * 4
  22. ttl = ip_header[5]
  23. protocol = ip_header[6]
  24. src_addr = socket.inet_ntoa(ip_header[8]);
  25. dest_addr = socket.inet_ntoa(ip_header[9]);
  26. print('Version: %s'%str(version))
  27. print('IP Header Length: %s'%str(iph_length))
  28. print('TTL: %s'%str(ttl))
  29. print('Protocol: %s'%str(protocol))
  30. print('Source Address: %s'%str(src_addr))
  31. print('Destination Address: %s'%str(dest_addr))
  32. # unpack tcp header
  33. tcp_header = struct.unpack('!HHLLBBHHH', packet[iph_length:iph_length+20])
  34. src_port = tcp_header[0]
  35. dest_port = tcp_header[1]
  36. seq = tcp_header[2]
  37. ack = tcp_header[3]
  38. tcph_length = tcp_header[4] >> 4
  39. print('Source Port: %s'%str(src_port))
  40. print('Destination Port: %s'%str(dest_port))
  41. print('Sequence Number: %s'%str(seq))
  42. print('Acknowledgement: %s'%str(ack))
  43. print('TCP Header Length: %s'%str(tcph_length))
  44. # get data
  45. header_size = iph_length + tcph_length * 4
  46. data_size = len(packet) - header_size
  47. data = packet[header_size:]
  48. print('Data: %s'%data.decode())