Making magic with the network stack
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
2.9 KiB

  1. #!/usr/bin/env python3
  2. from scapy.all import *
  3. import ipaddress
  4. from threading import Thread, Event
  5. from time import sleep
  6. import os
  7. recv_count = 0
  8. server_port = 50508
  9. class Sniffer(Thread):
  10. def __init__(self, iface="ens18"):
  11. super().__init__()
  12. self.daemon = True
  13. self.recv_count = 0
  14. self.socket = None
  15. self.iface = iface
  16. self.stop_sniffer = Event()
  17. self.debug_src = ""
  18. self.debug_sport = 0
  19. def run(self):
  20. self.socket = conf.L2listen(
  21. type=ETH_P_ALL,
  22. iface=self.iface,
  23. filter="ip"
  24. )
  25. sniff(
  26. opened_socket=self.socket,
  27. prn=self.handle_packet,
  28. )
  29. def join(self, timeout=None):
  30. self.stop_sniffer.set()
  31. super().join(timeout)
  32. def handle_debug_packet(self, payload):
  33. some_packet = IP(bytes(payload))
  34. print("genie debug packet..")
  35. some_packet.show()
  36. def handle_packet(self, packet):
  37. #ip_layer = packet.getlayer(IP)
  38. #print("[!] New Packet: {src} -> {dst}".format(src=ip_layer.src, dst=ip_layer.dst))
  39. if TCP in packet:
  40. tcp_sport = packet[TCP].sport
  41. tcp_dport = packet[TCP].dport
  42. if tcp_dport == server_port:
  43. print("sniffed a debug packet..")
  44. #packet.show()
  45. if self.recv_count > 3:
  46. some_payload = packet[TCP].payload
  47. self.handle_debug_packet(some_payload)
  48. self.debug_src = packet[IP].src
  49. self.debug_sport = tcp_sport
  50. self.recv_count += 1
  51. def send_debug_packet(sniffer):
  52. debug_port = sniffer.debug_sport
  53. debug_ip = sniffer.debug_src
  54. if debug_port == 0 or debug_ip == '':
  55. print("There was no debug source connection to send to")
  56. return
  57. print("sending debug packet to " + str(debug_ip) + ":" + str(debug_port))
  58. packet = IP(dst=debug_ip) / TCP(dport=debug_port, sport=server_port, flags='R')
  59. send(packet, iface="ens18")
  60. print("sent debug packet: ")
  61. packet.show()
  62. def main():
  63. sniffer = Sniffer(iface='ens18')
  64. print('starting sniffer..')
  65. sniffer.start()
  66. time.sleep(3)
  67. done = False
  68. while not(done):
  69. print("Enter action to take..")
  70. print("1. Keep sniffing")
  71. print("2. Send packet back")
  72. print("3. Quit")
  73. answer = input("Enter answer: ")
  74. if answer == "1":
  75. print("sleeping for sniffer..")
  76. time.sleep(5)
  77. elif answer == "2":
  78. send_debug_packet(sniffer)
  79. elif answer == "3":
  80. print("ending the sniffer")
  81. done = True
  82. print("user answer was: " + str(answer))
  83. print("\n")
  84. time.sleep(1)
  85. print("\n\nFinished sniffing for debug packets")
  86. if __name__ == '__main__':
  87. main()