Hook requests. Reel logs.
by @Gromak123 (and LLM <3)
SSRFisher is a lightweight HTTP/HTTPS lure server built for SSRF testing (CTF & pentest).
Spin up a server in seconds, control status codes, redirects, response bodies, file downloads, and get beautiful request logs in your terminal — plus clean JSONL logs for automation/SIEM.
- ✅ Any HTTP status code (200, 302, 404, 500… you name it)
- 🔁 Redirects (any 3xx code) with optional
Location - 🧾 Response body from:
--body(inline text)--body-file(loads a file into memory)--download-file(streams a local file)
- 📦 Download mode with automatic
Content-Disposition(or custom) - 🧷 Add arbitrary response headers with
--add-header - 🕵️ Stealth mode / mimicry:
- remove SSRFisher fingerprints (
--no-ssrfisher-headers) - override the
Serverheader (--server) - apply presets (
--mimic nginx|apache|iis)
- remove SSRFisher fingerprints (
- 🌍 Open / permissive CORS (credentials, reflect Origin, etc.)
- 🧵 Pretty Rich console logs (headers, params, body preview)
- 🧾 JSONL file logging (great for
jq, Splunk, ELK, SIEM ingestion) - 🔐 HTTPS:
--sslauto-signed (self-signed) certificate- or provide real PEM cert/key
This tool is meant for authorized security testing (labs, CTFs, pentests with permission).
You are responsible for how you use it.
- Python 3.10+ recommended
rich(mandatory)
pip install richIf installed, SSRFisher uses it to generate self-signed certificates cleanly:
pip install cryptographyWithout
cryptography, SSRFisher will try to fallback toopenssl(if available on your system).
python ssrfisher.py --port 8000 --code 200 --body "OK"python ssrfisher.py --bind 0.0.0.0 --port 80 --code 302 --location "http://127.0.0.1/admin"python ssrfisher.py --port 8000 --download-file "C:\tmp\poc.png"python ssrfisher.py --port 8000 --add-header "X-Test: 1" --add-header "X-Env: staging"Generates a self-signed certificate automatically:
python ssrfisher.py --bind 0.0.0.0 --port 443 --sslpython ssrfisher.py --bind 0.0.0.0 --port 443 --ssl "C:\certs\fullchain.pem" --ssl-key "C:\certs\privkey.pem"python ssrfisher.py --bind 10.0.0.12 --port 443 --ssl --ssl-cn "demo.local" --ssl-san "demo.local,10.0.0.12"By default SSRFisher sends:
X-SSRFisher: 1X-SSRFisher-ReqID: <id>
Disable them:
python ssrfisher.py --port 8000 --no-ssrfisher-headerspython ssrfisher.py --port 8000 --server "nginx"Applies:
- disables SSRFisher fingerprint headers
- sets a realistic
Serverheader - adds common headers typical of that stack
python ssrfisher.py --port 8000 --mimic iisAvailable presets:
nginxapacheiis
Enables permissive settings designed to be useful in browser-based scenarios:
- reflects
Originwhen present - sets
Access-Control-Allow-Credentials: true - allows common methods & headers
- (optional) exposes
*
python ssrfisher.py --port 8000 --cors-openpython ssrfisher.py --port 8000 \
--cors-origin "https://example.com" \
--cors-credentials \
--cors-allow-methods "GET,POST,OPTIONS" \
--cors-allow-headers "Authorization,Content-Type,X-Requested-With" \
--cors-expose-headers "X-Token,X-Trace" \
--cors-max-age 1200If a request includes Access-Control-Request-Private-Network: true, SSRFisher can reply with:
Access-Control-Allow-Private-Network: true
python ssrfisher.py --port 8000 --cors-open --cors-private-networkBy default, SSRFisher shows:
- request summary (client, method, path, HTTP version, timing)
- query params
- headers (unless disabled)
- request body preview (unless disabled)
Disable parts:
python ssrfisher.py --port 8000 --no-headers
python ssrfisher.py --port 8000 --no-body
python ssrfisher.py --port 8000 --quietWrite one JSON document per request:
python ssrfisher.py --port 8000 --log-file .\ssrfisher.jsonl --file-log-headers --file-log-bodyBody preview includes:
preview_utf8preview_b64lengthandtruncated
Example jq usage:
jq '.request.method, .request.raw_path, .client.ip, .response.status' ssrfisher.jsonlShow help (Rich help by default):
python ssrfisher.py --helpDisable colors & use plain argparse help:
python ssrfisher.py --no-color --help- Multiple routes / per-path behaviors (rules engine)
- Response templates
- Built-in DNS rebinding helper mode
- Optional HTML error pages for realistic stacks
PRs welcome 😉
Built by @Gromak123 and LLM If you use SSRFisher in a writeup, talk, or CTF challenge: a mention is always appreciated.