119 lines
3.4 KiB
Python
119 lines
3.4 KiB
Python
#!/usr/bin/env python
|
|
|
|
import re
|
|
import sys
|
|
import json
|
|
import argparse
|
|
import urllib.parse
|
|
|
|
def generate_template(listen_address, listen_port, remote_host, remote_port):
|
|
|
|
# we could all need that
|
|
imports = [
|
|
"os",
|
|
"socket",
|
|
"threading"
|
|
]
|
|
|
|
partial_imports = {
|
|
"hackingscripts.utils": ["util"],
|
|
"hackingscripts.utils.packeter": ["Packer", "Parser"]
|
|
}
|
|
|
|
imports = "\n".join(f"import {i}" for i in sorted(imports, key=len))
|
|
imports += "\n" + "\n".join(sorted(list(f"from {p} import {', '.join(i)}" for p, i in partial_imports.items()), key=len))
|
|
return f"""#!/usr/bin/env python
|
|
|
|
#
|
|
# THE BASE OF THIS FILE WAS AUTOMATICALLY GENERATED BY {' '.join(sys.argv)}
|
|
# For more information, visit: https://git.romanh.de/Roman/HackingScripts
|
|
#
|
|
|
|
{imports}
|
|
|
|
BUFFER_SIZE = 4096
|
|
|
|
class Packet:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@staticmethod
|
|
def from_data(data):
|
|
packet = Packet()
|
|
parser = Parser(data)
|
|
# TODO: auto-generated method stub
|
|
return packet
|
|
|
|
def pack(self):
|
|
buf = Packer()
|
|
# TODO: auto-generated method stub
|
|
return buf.get()
|
|
|
|
def forward(source, destination):
|
|
try:
|
|
while True:
|
|
data = source.recv(BUFFER_SIZE)
|
|
if not data:
|
|
break
|
|
|
|
# TODO: Parse / Manipulate packet
|
|
# packet = Packet.from_data(data)
|
|
# repacked = packet.pack()
|
|
|
|
destination.sendall(data)
|
|
except Exception:
|
|
pass
|
|
finally:
|
|
source.close()
|
|
destination.close()
|
|
|
|
def handle_client(client_socket, remote_host, remote_port):
|
|
try:
|
|
remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
remote_socket.connect((remote_host, remote_port))
|
|
except Exception as e:
|
|
print(f"Failed to connect to remote: {{e}}")
|
|
client_socket.close()
|
|
return
|
|
|
|
# Start bidirectional forwarding
|
|
threading.Thread(target=forward, args=(client_socket, remote_socket), daemon=True).start()
|
|
threading.Thread(target=forward, args=(remote_socket, client_socket), daemon=True).start()
|
|
|
|
def start_proxy(local_host, local_port, remote_host, remote_port):
|
|
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
server.bind((local_host, local_port))
|
|
server.listen(100)
|
|
|
|
print(f"[*] Forwarding from {{local_host}}:{{local_port}} to {{remote_host}}:{{remote_port}}")
|
|
|
|
while True:
|
|
client_socket, addr = server.accept()
|
|
print(f"[+] Connection from {{addr[0]}}:{{addr[1]}}")
|
|
threading.Thread(
|
|
target=handle_client,
|
|
args=(client_socket, remote_host, remote_port),
|
|
daemon=True
|
|
).start()
|
|
|
|
if __name__ == "__main__":
|
|
start_proxy({repr(listen_address)}, {listen_port}, {repr(remote_host)}, {remote_port})
|
|
"""
|
|
|
|
if __name__ == "__main__":
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description="Exploit Template for tcp application attacks",
|
|
formatter_class=argparse.RawTextHelpFormatter
|
|
)
|
|
|
|
parser.add_argument("la", type=str, help="Listen Address")
|
|
parser.add_argument("lp", type=int, help="Listen Port", choices=range(1,65535+1))
|
|
parser.add_argument("rh", type=str, help="Remote Host")
|
|
parser.add_argument("rp", type=int, help="Remote Port", choices=range(1,65535+1))
|
|
|
|
args = parser.parse_args()
|
|
template = generate_template(args.la, args.lp, args.rh, args.rp)
|
|
print(template)
|