Proxy leak


SUBMITTED BY: LeetUnicorn

DATE: May 5, 2016, 8:45 a.m.

FORMAT: Text only

SIZE: 5.6 kB

HITS: 899

  1. import sys
  2. import socket
  3. import threading
  4. # this is a pretty hex dumping function directly taken from
  5. # http://code.activestate.com/recipes/142812-hex-dumper/
  6. def hexdump(src, length=16):
  7. result = []
  8. digits = 4 if isinstance(src, unicode) else 2
  9. for i in xrange(0, len(src), length):
  10. s = src[i:i+length]
  11. hexa = b' '.join(["%0*X" % (digits, ord(x)) for x in s])
  12. text = b''.join([x if 0x20 <= ord(x) < 0x7F else b'.' for x in s])
  13. result.append( b"%04X %-*s %s" % (i, length*(digits + 1), hexa, text) )
  14. print b'\n'.join(result)
  15. def receive_from(connection):
  16. buffer = ""
  17. # We set a 2 second time out depending on your
  18. # target this may need to be adjusted
  19. connection.settimeout(2)
  20. try:
  21. # keep reading into the buffer until there's no more data
  22. # or we time out
  23. while True:
  24. data = connection.recv(4096)
  25. if not data:
  26. break
  27. buffer += data
  28. except:
  29. pass
  30. return buffer
  31. # modify any requests destined for the remote host
  32. def request_handler(buffer):
  33. # perform packet modifications
  34. return buffer
  35. # modify any responses destined for the local host
  36. def response_handler(buffer):
  37. # perform packet modifications
  38. return buffer
  39. def proxy_handler(client_socket, remote_host, remote_port, receive_first):
  40. # connect to the remote host
  41. remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  42. remote_socket.connect((remote_host,remote_port))
  43. # receive data from the remote end if necessary
  44. if receive_first:
  45. remote_buffer = receive_from(remote_socket)
  46. hexdump(remote_buffer)
  47. # send it to our response handler
  48. remote_buffer = response_handler(remote_buffer)
  49. # if we have data to send to our local client send it
  50. if len(remote_buffer):
  51. print "[<==] Sending %d bytes to localhost." % len(remote_buffer)
  52. client_socket.send(remote_buffer)
  53. # now let's loop and reading from local, send to remote, send to local
  54. # rinse wash repeat
  55. while True:
  56. # read from local host
  57. local_buffer = receive_from(client_socket)
  58. if len(local_buffer):
  59. print "[==>] Received %d bytes from localhost." % len(local_buffer)
  60. hexdump(local_buffer)
  61. # send it to our request handler
  62. local_buffer = request_handler(local_buffer)
  63. # send off the data to the remote host
  64. remote_socket.send(local_buffer)
  65. print "[==>] Sent to remote."
  66. # receive back the response
  67. remote_buffer = receive_from(remote_socket)
  68. if len(remote_buffer):
  69. print "[<==] Received %d bytes from remote." % len(remote_buffer)
  70. hexdump(remote_buffer)
  71. # send to our response handler
  72. remote_buffer = response_handler(remote_buffer)
  73. # send the response to the local socket
  74. client_socket.send(remote_buffer)
  75. print "[<==] Sent to localhost."
  76. # if no more data on either side close the connections
  77. if not len(local_buffer) or not len(remote_buffer):
  78. client_socket.close()
  79. remote_socket.close()
  80. print "[*] No more data. Closing connections."
  81. break
  82. def server_loop(local_host,local_port,remote_host,remote_port,receive_first):
  83. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  84. try:
  85. server.bind((local_host,local_port))
  86. except:
  87. print "[!!] Failed to listen on %s:%d" % (local_host,local_port)
  88. print "[!!] Check for other listening sockets or correct permissions."
  89. sys.exit(0)
  90. print "[*] Listening on %s:%d" % (local_host,local_port)
  91. server.listen(5)
  92. while True:
  93. client_socket, addr = server.accept()
  94. # print out the local connection information
  95. print "[==>] Received incoming connection from %s:%d" % (addr[0],addr[1])
  96. # start a thread to talk to the remote host
  97. proxy_thread = threading.Thread(target=proxy_handler,args=(client_socket,remote_host,remote_port,receive_first))
  98. proxy_thread.start()
  99. def main():
  100. # no fancy command line parsing here
  101. if len(sys.argv[1:]) != 5:
  102. print "Usage: ./proxy.py [localhost] [localport] [remotehost] [remoteport] [receive_first]"
  103. print "Example: ./proxy.py 127.0.0.1 9000 10.12.132.1 9000 True"
  104. sys.exit(0)
  105. # setup local listening parameters
  106. local_host = sys.argv[1]
  107. local_port = int(sys.argv[2])
  108. # setup remote target
  109. remote_host = sys.argv[3]
  110. remote_port = int(sys.argv[4])
  111. # this tells our proxy to connect and receive data
  112. # before sending to the remote host
  113. receive_first = sys.argv[5]
  114. if "True" in receive_first:
  115. receive_first = True
  116. else:
  117. receive_first = False
  118. # now spin up our listening socket
  119. server_loop(local_host,local_port,remote_host,remote_port,receive_first)
  120. main()

comments powered by Disqus