Updated Jul 14, 2026

Vulnerabilities

Confirm Log4Shell exposure with DNS callbacks

log4j-scan is a fully automated, accurate, and extensive scanner for finding hosts vulnerable to the Log4Shell log4j remote code execution flaw, fuzzing more than sixty HTTP request headers, HTTP POST data, and early HTTP response parameters across URL lists.

installgit clone https://github.com/fullhunt/log4j-scan.gitpip3 install -r requirements.txt

Python · MIT license

Agent

overview

What log4j-scan does

log4j-scan tests targets for CVE-2021-44228 (Log4Shell). It injects JNDI payloads into headers and parameters, then watches a DNS callback. A callback means a vulnerable Log4j instance resolved the payload.

Point -u at one URL or -l at a file of URLs. --run-all-tests fuzzes the full header set per host. --waf-bypass adds evasion payloads. Choose interact.sh or dnslog.cn with --dns-callback-provider, or set --custom-dns-callback-host.

Feed live hosts from a prober such as httpx, not raw discovery. Prefer log4j-scan when you need deep header fuzzing and WAF bypass for this one CVE; use nuclei when you want broader template coverage. Trickest runs it as a managed Vulnerabilities node.

source github.com/fullhunt/log4j-scan

use cases

Where log4j-scan fits

Confirm Log4Shell across an estate

Feed a file of live URLs and let log4j-scan inject JNDI payloads into each, confirming exposure only when a host calls back to the DNS provider.

Test through a WAF

Enable WAF-bypass payloads so the scan reaches Log4j instances sitting behind a filter that drops the standard JNDI strings.

Run every check per URL

Turn on run-all-tests to fuzz the full set of headers and request paths, catching vulnerable hosts that only parse the payload in one specific field.

Use a private callback host

Point the scan at a custom DNS callback host you control so confirmation signals land in your own infrastructure rather than a public service.

reference

log4j-scan inputs and flags

10 inputs
NameTypeFlagDescription
urlSTRING-uCheck a single URL.
url-listFILE-lCheck a list of URLs, the usual pipeline input.
waf-bypassBOOLEAN--waf-bypassExtend scans with WAF bypass payloads.
run-all-testsBOOLEAN--run-all-testsRun every available test on each URL.
headers-fileFILE--headers-fileCustom header list to fuzz with payloads.
dns-callback-providerSTRING--dns-callback-providerDNS callback provider: dnslog.cn or interact.sh (default interact.sh).
custom-dns-callback-hostSTRING--custom-dns-callback-hostCustom DNS callback host you control.
request-methodSTRING--request-typeRequest type, get or post (default get).

Showing key inputs. log4j-scan exposes 10 inputs in total.

Full flag reference (10 inputs)
NameTypeFlagDescription
urlSTRING-uCheck a single URL.
url-listFILE-lCheck a list of URLs.
wait-timeSTRING--wait-timeSeconds to wait after all URLs are processed (default 5).
waf-bypassBOOLEAN--waf-bypassExtend scans with WAF bypass payloads.
headers-fileFILE--headers-fileHeader fuzzing list.
run-all-testsBOOLEAN--run-all-testsRun all available tests on each URL.
request-methodSTRING--request-typeRequest type: get or post (default get).
dns-callback-providerSTRING--dns-callback-providerDNS callback provider: dnslog.cn or interact.sh (default interact.sh).
custom-dns-callback-hostSTRING--custom-dns-callback-hostCustom DNS callback host.
exclude-user-agent-fuzzingBOOLEAN--exclude-user-agent-fuzzingExclude the User-Agent header from fuzzing, useful to bypass weak User-Agent checks.

example

Run log4j-scan

log4j-scan · command
# scan a list of live URLs, fuzz every header, and add WAF-bypass payloads
python3 log4j-scan.py -l live-urls.txt --run-all-tests --waf-bypass
sample output
[•] CVE-2021-44228 - Log4j RCE Scanner
[•] DNS callback: interact.sh
[•] Loaded 3 URLs from live-urls.txt
[•] URL: https://example.com | injecting JNDI payload into 15 headers
[•] URL: https://app.example.com | injecting JNDI payload into 15 headers
[•] Payloads sent to all URLs. Waiting for DNS OOB callbacks.
[!!!] Target Affected: https://app.example.com  (X-Api-Version header)
[•] Scan complete: 1/3 targets vulnerable to Log4Shell.

guidance

Choosing log4j-scan

Use log4j-scan when you need to confirm Log4Shell exposure on a known set of URLs. It tests one CVE, so feed it live hosts from a prober like httpx rather than raw discovery output, and enable --waf-bypass when a filter sits in front of the target.

react2shell-scanner

Same out-of-band style for the RSC/Next.js RCE. log4j-scan is the Log4j-specific equivalent.

cve-2023-3519-inspector

Fingerprints one CVE on Citrix ADC. log4j-scan is the single-CVE scanner for Log4Shell.

nuclei

Broad template library including Log4Shell. log4j-scan goes deeper on header fuzzing and WAF bypass for this one flaw.

faq

log4j-scan questions

Point it at one URL with -u or a file of URLs with -l. It injects JNDI payloads into headers and parameters, then confirms exposure when the target calls back to a DNS provider. On Trickest, set url or url-list on the node.

It watches a DNS callback provider such as interact.sh. A host that resolves the injected JNDI payload triggers an out-of-band callback, which confirms vulnerable Log4j parsed it.

Yes. Set --waf-bypass to send extended payloads that slip past filters dropping standard JNDI strings. Supply your own header list with --headers-file to widen the fuzzing surface.

No. It is a remote HTTP scanner for running web apps, not a local file check. To find the library on disk, inspect JAR files and manifests on the host itself.

Yes. Use --custom-dns-callback-host for a host you control, or switch providers with --dns-callback-provider between interact.sh and dnslog.cn.

After a prober narrows scope to live URLs. Wire -l style input into the node, then route confirmed hits into triage. Enable --run-all-tests when one header path might be the only vulnerable field.

Run log4j-scan yourself

A target list is probed by httpx, then log4j-scan injects JNDI payloads into the live hosts and writes the confirmed Log4Shell hits as a queryable output.

Facts on this page come from the live Trickest tool library.