loading
loading
Discovery
Check whether a URL redirects to a masked 404 page.
overview
404checker reads a list of URLs and separates the ones that resolve to a real page from the ones that only pretend to. A masked 404 answers with HTTP 200 but renders a not-found page, and those false positives quietly poison content-discovery and crawling output. The script drives headless browser processes to render each URL so a soft failure cannot hide behind a 200 status.
It is built for speed on large URL sets. You hand it a sorted input file, set a thread count, and cap how many URLs each pass handles so the overflow spills to the next run instead of stalling. Sorting the input first groups similar responses so the browsers move through them faster.
On Trickest, 404checker is a Discovery node that takes a file of URLs and writes a file and a folder of the ones that survive. Drop it after a content-discovery or crawling stage to clean the list before you probe or scan, so downstream tools never spend time on pages that do not exist.
use cases
Run 404checker on the output of a fuzzer or crawler to drop URLs that return 200 but render a not-found page, so only real endpoints reach the next stage.
ffuf and gobuster drop hard 404s by status code, but a soft 404 answers 200 and slips through. Run 404checker on the survivors to remove the masked pages those filters leave behind.
Filter masked 404s out of a candidate list so a vulnerability scanner spends its time on pages that exist instead of decoy responses.
Push a large sorted URL list through multiple browser processes to flag soft-404 redirects across a whole estate in one pass.
reference
| Name | Type | Flag | Description |
|---|---|---|---|
| input-file | FILE | --input_file | Input file with URLs, one per line. |
| threads | STRING | --threads | Number of threads (default 50). |
| processes | STRING | --processes | Number of browser processes (default number of CPUs). |
| max-urls | STRING | --max-urls | Max URLs per pass; the rest spill over (default 50000). |
| user-agent | STRING | --user-agent | User-Agent string to send with each request. |
| verbose | BOOLEAN | --verbose | Print verbose output. |
Showing key inputs. 404checker exposes 6 inputs in total.
example
# keep only URLs that resolve to a real page, dropping masked 404spython3 404checker.py --input_file urls.txt --output_file real-urls.txt --threads 50 --processes 4https://example.com/admin/loginhttps://example.com/api/v1/statushttps://example.com/dashboardhttps://example.com/uploads/https://example.com/.git/confighttps://example.com/backup/db.sqlhttps://203.0.113.24/portal/… (4,812 URLs in, 2,190 real, 2,622 masked 404s dropped)guidance
Use 404checker as a filtering stage between content discovery and probing, when a tool has produced a URL list and you want to remove pages that answer 200 but are really not-found. It does not discover or crawl, so feed it the output of ffuf, feroxbuster, or a crawler.
Probes hosts for status, title, and size. Use it for liveness and classification, not specifically soft-404 detection.
Discovers content and filters responses by size or words. 404checker is purpose-built for the masked-404 case.
faq
related
Append lines to a file only if they are not already there.
Extract URLs and endpoints from Android APK files.
Visual inspection of websites across a large number of hosts.
Find suspicious files across a large set of AWS S3 buckets.
An automated tool that checks for backup artifacts that may disclose a web application's source code.
Crawl a list of domains and scan for endpoints, secrets, API keys, file extensions, tokens, and more.
A URL list feeds 404checker, which renders each one and writes the URLs that resolve to real pages as a queryable output.
Facts on this page come from the live Trickest tool library.