Skip to content

Instantly share code, notes, and snippets.

@BoredHackerBlog
Created July 16, 2018 22:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BoredHackerBlog/969e0c72dd4bf1c6544836a9eabbbae3 to your computer and use it in GitHub Desktop.
Save BoredHackerBlog/969e0c72dd4bf1c6544836a9eabbbae3 to your computer and use it in GitHub Desktop.
Python socket proxy thing. Maybe useful for some data modification or parsing.
#Python 3
#Args: LISTEN_PORT CONNECT_HOST CONNECT_PORT
#Example: python3 proxy.py 8000 192.168.1.100 9000
import socket
import binascii
import sys
import signal
from threading import Thread
#https://stackoverflow.com/a/1112350
def signal_handler(sig,frame):
conn.close()
s_listen.close()
s_connect.close()
print("Bye!")
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
#https://stackoverflow.com/a/17697651
def recvall(sock):
size = 1024
data = b''
while True:
part = sock.recv(size)
data += part
if len(part) < size:
break
return data
#modify data here
#maybe use pyZZUF or radamsa for fuzzing?
#https://github.com/nezlooy/pyZZUF
#https://gitlab.com/akihe/radamsa
#make sure to return as bytes
#Useful: https://www.mkyong.com/python/python-3-convert-string-to-bytes/
def process_data(sender_name, data):
if sender_name == "c":
print("Client: " + str(data)) #Should probably replace non-printable chars
print("Client: " + str(binascii.hexlify(data)))
return data
if sender_name == "s":
print("Server: " + str(data)) #Should probably replace non-printable chars
print("Server: " + str(binascii.hexlify(data)))
return data
def socket_read_write(sender_name, s_read, s_write):
while True:
data = recvall(s_read)
if data == b'': #This may cause issues. idk. Need to handle disconnects better...
break
data = process_data(sender_name, data)
s_write.sendall(data)
listen_port = int(sys.argv[1])
connect_host = sys.argv[2]
connect_port = int(sys.argv[3])
print("Starting up!")
s_listen = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #for listening to incoming traffic
s_connect = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #for connecting to target IP and port
s_listen.bind(('0.0.0.0',listen_port))
s_listen.listen(1)
conn, addr = s_listen.accept() #accept a connection
s_connect.connect((connect_host,connect_port)) #connect to the target IP and port
#start threads for exchanging information.
listen_to_connect = Thread(target=socket_read_write, args=("c",conn,s_connect))
connect_to_listen = Thread(target=socket_read_write, args=("s",s_connect,conn))
listen_to_connect.start()
connect_to_listen.start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment