Created
July 16, 2018 22:41
-
-
Save BoredHackerBlog/969e0c72dd4bf1c6544836a9eabbbae3 to your computer and use it in GitHub Desktop.
Python socket proxy thing. Maybe useful for some data modification or parsing.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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