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.

dummy_p0f.py 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #!/usr/bin/env python3
  2. PID = "/tmp/dummy_p0f.pid"
  3. import os
  4. import sys
  5. import struct
  6. import socket
  7. import socketserver
  8. import dummy_killer
  9. class MyStreamHandler(socketserver.BaseRequestHandler):
  10. def handle(self):
  11. S = {
  12. 'bad_query' : 0x0,
  13. 'ok' : 0x10,
  14. 'no_match' : 0x20
  15. }
  16. OS = {
  17. 'windows' : (b'Windows', b'7 or 8'),
  18. 'linux' : (b'Linux', b'3.11 and newer')
  19. }
  20. self.data = self.request.recv(21).strip()
  21. if self.server.p0f_status == 'bad_response':
  22. response = 0
  23. else:
  24. response = struct.pack(
  25. "IbIIIIIIIhbb32s32s32s32s32s32s",
  26. 0x50304602, # magic
  27. S[self.server.p0f_status], # status
  28. 1568493408, # first_seen
  29. 1568493408, # last_seen
  30. 1, # total_conn
  31. 1, # uptime_min
  32. 4, # up_mod_days
  33. 1568493408, # last_nat
  34. 1568493408, # last_chg
  35. 10, # distance
  36. 0, # bad_sw
  37. 0, # os_match_q
  38. OS[self.server.p0f_os][0], # os_name
  39. OS[self.server.p0f_os][1], # os_flavor
  40. b'', # http_name
  41. b'', # http_flavor
  42. b'Ethernet or modem', # link_type
  43. b'' # language
  44. )
  45. self.request.sendall(response)
  46. self.request.close()
  47. def cleanup(SOCK):
  48. if os.path.exists(SOCK):
  49. try:
  50. os.unlink(SOCK)
  51. except OSError:
  52. print("Could not unlink socket: " + SOCK)
  53. if __name__ == "__main__":
  54. SOCK = '/tmp/p0f.sock'
  55. p0f_status = 'ok'
  56. p0f_os = 'linux'
  57. alen = len(sys.argv)
  58. if alen > 1:
  59. SOCK = sys.argv[1]
  60. if alen >= 4:
  61. p0f_os = sys.argv[2]
  62. p0f_status = sys.argv[3]
  63. elif alen >= 3:
  64. p0f_os = sys.argv[2]
  65. cleanup(SOCK)
  66. server = socketserver.UnixStreamServer(SOCK, MyStreamHandler, bind_and_activate=False)
  67. server.allow_reuse_address = True
  68. server.p0f_status = p0f_status
  69. server.p0f_os = p0f_os
  70. server.server_bind()
  71. server.server_activate()
  72. dummy_killer.setup_killer(server)
  73. dummy_killer.write_pid(PID)
  74. try:
  75. server.handle_request()
  76. except socket.error:
  77. print("Socket closed")
  78. server.server_close()
  79. cleanup(SOCK)