#!/usr/bin/env python3
"""collector.py — 轻量级 HTTP POST 数据接收器
用于在无回显 RCE 场景下接收目标回传的数据并保存到本地。

用法:
    python3 collector.py [端口，默认 8888] [保存目录，默认 ./loot]
"""

from http.server import BaseHTTPRequestHandler, HTTPServer
import os
import sys
import time

PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 8888
LOOT_DIR = sys.argv[2] if len(sys.argv) > 2 else "./loot"


class LootHandler(BaseHTTPRequestHandler):
    def _save(self):
        length = int(self.headers.get("Content-Length", 0))
        data = self.rfile.read(length)
        ts = int(time.time() * 1000)
        path = self.path.strip("/").replace("/", "_") or "root"
        filename = os.path.join(LOOT_DIR, f"{ts}_{path}.bin")

        with open(filename, "wb") as f:
            f.write(data)

        client_ip = self.client_address[0]
        print(f"[+] 收到来自 {client_ip} 的回传 ({len(data)} 字节) -> {filename}")

        self.send_response(200)
        self.send_header("Content-Type", "text/plain")
        self.end_headers()
        self.wfile.write(b"OK\n")

    do_POST = _save
    do_GET = _save

    def log_message(self, format, *args):
        pass


def run_server():
    os.makedirs(LOOT_DIR, exist_ok=True)
    server = HTTPServer(("0.0.0.0", PORT), LootHandler)
    print(f"[*] HTTP 回传接收器已启动，监听 0.0.0.0:{PORT}，数据保存至 {LOOT_DIR}")
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\n[*] 接收器已停止。")


if __name__ == "__main__":
    run_server()
