proxy.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import sys
  2. import socket
  3. import threading
  4. # HEX_FILTER = ''.join([(len(repr(chr(i))) == 3) and chr(i) or '.' for i in range(256)])
  5. HEX_FILTER = ''.join([chr(i) if len(repr(chr(i))) == 3 else '.' for i in range(256)])
  6. def hexdump(src, length=16, show=True):
  7. if isinstance(src, bytes):
  8. src = src.decode()
  9. results = list()
  10. for i in range(0, len(src), length):
  11. word = str(src[i:i+length])
  12. printable = word.translate(HEX_FILTER)
  13. hexa = ' '.join([f'{ord(c):02X}' for c in word])
  14. hexwidth = length*3
  15. results.append(f'{i:04x} {hexa:<{hexwidth}} {printable}')
  16. if show:
  17. for line in results:
  18. print(line)
  19. else:
  20. return results
  21. def receive_from(connection):
  22. buffer = b''
  23. connection.settimeout(5)
  24. try:
  25. while True:
  26. data = connection.recv(4096)
  27. if not data:
  28. break
  29. buffer += data
  30. except Exception as e:
  31. pass
  32. return buffer
  33. def request_handler(buffer):
  34. return buffer
  35. def response_handler(buffer):
  36. return buffer
  37. def proxy_handler(client_socket, remote_host, remote_port, receive_first):
  38. remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  39. remote_socket.connect((remote_host, remote_port))
  40. if receive_first:
  41. remote_buffer = receive_from(remote_socket)
  42. hexdump(remote_buffer)
  43. remote_buffer = response_handler(remote_buffer)
  44. if len(remote_buffer):
  45. print("[<==] Sending %d bytes to localhost." % len(remote_buffer))
  46. client_socket.send(remote_buffer)
  47. while True:
  48. local_buffer = receive_from(client_socket)
  49. if len(local_buffer):
  50. line = "[==>] Received %d bytes from localhost." % len(local_buffer)
  51. print(line)
  52. hexdump(local_buffer)
  53. local_buffer = request_handler(local_buffer)
  54. remote_socket.send(local_buffer)
  55. print("[==>] Send to remote.")
  56. remote_buffer = receive_from(remote_socket)
  57. if len(remote_buffer):
  58. print("[<==] Received %d bytes from remote." % len(remote_buffer))
  59. hexdump(remote_buffer)
  60. remote_buffer = response_handler(remote_buffer)
  61. client_socket.send(remote_buffer)
  62. print("[<==] Sent to localhost")
  63. if not len(local_buffer) or not len(remote_buffer):
  64. client_socket.close()
  65. remote_socket.close()
  66. print("[*] No more data. Closing connections")
  67. break
  68. def server_loop(local_host, local_port, remote_host, remote_port, receive_first):
  69. '''Настройка и управление соединением'''
  70. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  71. try:
  72. server.bind((local_host, local_port))
  73. except Exception as e:
  74. print('problem on bind: %r' % e)
  75. print("[!!] Failed to listen on %s:%d" % (local_host, local_port))
  76. print("[!!] Check for other listening sockets or connect permissions.")
  77. sys.exit(0)
  78. print("[*] Listening on %s:%d" % (local_host, local_port))
  79. server.listen(5)
  80. while True:
  81. client_socket, addr = server.accept()
  82. # выводим информацию о локальном соединении
  83. line = "> Received incoming connection from %s:%d" % (addr[0], addr[1])
  84. print(line)
  85. # создаем поток для взаимодействия с удаленным сервером
  86. proxy_thread = threading.Thread(
  87. target=proxy_handler,
  88. args=(client_socket, remote_host, remote_port, receive_first))
  89. proxy_thread.start()
  90. def main():
  91. if len(sys.argv[1:]) != 5:
  92. print("Usage: ./proxy.py [localhost] [localport]", end='')
  93. print("[remotehost] [remoteport] [receive_first]")
  94. print("Example: ./proxy.py 127.0.0.1 9000 8.8.8.8 9000 True")
  95. sys.exit(0)
  96. local_host = sys.argv[1]
  97. local_port = int(sys.argv[2])
  98. remote_host = sys.argv[3]
  99. remote_port = int(sys.argv[4])
  100. receive_first = sys.argv[5]
  101. if "True" in receive_first:
  102. receive_first = True
  103. else:
  104. receive_first = False
  105. server_loop(local_host, local_port, remote_host, remote_port, receive_first)
  106. if __name__ == '__main__':
  107. main()