BenKrueger

receive_secret.py

Dec 3rd, 2025
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.90 KB | Cybersecurity | 0 0
  1. #!/usr/bin/env python3
  2. from http.server import HTTPServer, BaseHTTPRequestHandler
  3. from urllib.parse import unquote_to_bytes
  4. import datetime
  5.  
  6. LISTEN_HOST = "0.0.0.0"
  7. LISTEN_PORT = 6667
  8. OUT_BASENAME = "received_secret.png"
  9.  
  10.  
  11. def parse_form_bytes(body: bytes):
  12.     """
  13.    Minimal x-www-form-urlencoded parser that works on bytes.
  14.    Returns: dict[bytes, bytes]
  15.    """
  16.     params = {}
  17.     for pair in body.split(b"&"):
  18.         if b"=" not in pair:
  19.             continue
  20.         k, v = pair.split(b"=", 1)
  21.  
  22.         # + is space, %XX is hex-encoded
  23.         k = unquote_to_bytes(k.replace(b"+", b" "))
  24.         v = unquote_to_bytes(v.replace(b"+", b" "))
  25.  
  26.         params[k] = v
  27.     return params
  28.  
  29.  
  30. class Handler(BaseHTTPRequestHandler):
  31.     def do_POST(self):
  32.         length = int(self.headers.get("Content-Length", 0))
  33.         body = self.rfile.read(length)
  34.  
  35.         params = parse_form_bytes(body)
  36.  
  37.         if b"secret_file" in params:
  38.             data = params[b"secret_file"]
  39.  
  40.             ts = datetime.datetime.utcnow().strftime("%Y%m%d-%H%M%S")
  41.             filename = f"{ts}-{OUT_BASENAME}"
  42.  
  43.             with open(filename, "wb") as f:
  44.                 f.write(data)
  45.  
  46.             print(f"[+] Received {len(data)} bytes -> {filename}")
  47.  
  48.             self.send_response(200)
  49.             self.end_headers()
  50.             self.wfile.write(b"OK\n")
  51.         else:
  52.             print("[-] POST without 'secret_file' field")
  53.             self.send_response(400)
  54.             self.end_headers()
  55.             self.wfile.write(b"Missing secret_file\n")
  56.  
  57.     # optional: silence default logging
  58.     def log_message(self, format, *args):
  59.         return
  60.  
  61.  
  62. def main():
  63.     server_address = (LISTEN_HOST, LISTEN_PORT)
  64.     httpd = HTTPServer(server_address, Handler)
  65.     print(f"[+] Listening on http://{LISTEN_HOST}:{LISTEN_PORT}/post")
  66.     httpd.serve_forever()
  67.  
  68.  
  69. if __name__ == "__main__":
  70.     main()
  71.  
Advertisement
Add Comment
Please, Sign In to add comment