
Un scanner intelligent Log4Shell/Log4j/CVE-2021-44228
Bien que d'excellents outils aient été publiés pour aider les organisations à analyser leurs environnements à la recherche d'applications vulnérables à la faille critique Log4J / CVE-2021-44228, j'ai constaté que :
C'est ainsi qu'est né Log4Shell Sentinel. Log4Shell Sentinel est un scanner basé sur les fichiers doté de fonctionnalités uniques. Il n'a pas vocation à remplacer tous les autres outils disponibles mais peut les compléter.
Log4Shell Sentinel est un scanner basé sur les fichiers. Il recherche les applications basées sur Java en analysant un système cible à la recherche d'artefacts des formats de fichiers suivants :
| Type de fichier | Détails |
|---|---|
| Jar simple | C'est le cas où le fichier log4j-core n'est pas intégré. |
| Fat / Uber jar | Un uber jar est un jar qui contient à la fois vos classes / packages et toutes les dépendances de votre application (bibliothèques, ressources et fichiers de métadonnées) dans un seul fichier jar. C'est l'option de déploiement la plus couramment utilisée. |
| WAR | Un fichier war (Web Application Archive) est un fichier qui contient votre code JSP, HTML et JavaScript en plus de vos bibliothèques et autres ressources. Ce format est moins couramment utilisé. |
| EAR | Un ear (Enterprise Application Archive) est un autre format qui était plus couramment utilisé avec Jakarta EE pour les déploiements. |
et recherche les instances de jars log4j-core vulnérables. Ensuite, il :
calcule une empreinte MD5 de l'artefact. Cela permet à un analyste d'identifier la même application exécutée sur différentes machines / conteneurs et de la traiter comme une seule découverte
pour les fichiers identifiés comme appartenant à un conteneur, tels que : /var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar, il fait le gros du travail en mappant le fichier vers l'image correspondante. Par exemple, il traduirait le chemin ci-dessus en l'image suivante : ghcr.io/christophetd/log4shell-vulnerable-app:latest. Étant donné que les différents runtimes de conteneurs stockent ce mappage de différentes manières, cela peut éviter des heures de frustration à un analyste. Cela permet également à un analyste de traiter un certain nombre de conteneurs exécutant une seule application comme une seule découverte
il supprime les correspondances inutiles, telles que les correspondances relatives à des conteneurs actuellement non exécutés, y compris les images en cache. Cela permet à un analyste de se concentrer sur l'essentiel et lui évite encore des heures de travail inutile
il permet à un analyste d'ignorer des correspondances en fonction de :
Cela permet à l'analyste de supprimer les applications dont il sait qu'elles ne sont pas vulnérables ou qui correspondent à des applications basées sur une interface en ligne de commande (CLI) ne présentant pas de menace. Par exemple, si une instance de Logstash est détectée, un analyste peut choisir de l'ignorer s'il n'exécute pas l'outil ou s'il l'exécute simplement occasionnellement en ligne de commande.
il est optimisé pour fonctionner avec vos outils de gestion de configuration tels qu'Ansible, vous donnant la possibilité d'analyser rapidement votre environnement en quelques minutes
Pour plus de détails sur l'enrichissement des métadonnées ajouté par Log4Shell Sentinel, consultez mon article de blog post.
Le moyen le plus simple est de télécharger le binaire pré-compilé.
Là encore, c'est simple. Cependant, vous voudrez probablement compiler une version statique pour contourner les éventuelles variations liées à GLIBC dans votre environnement. L'outil utilise les modules suivants qui utilisent CGO par défaut :
os/usernetPour compiler une version statique qui utilise les versions Go de ces bibliothèques, clonez simplement le dépôt puis exécutez :
$ CGO_ENABLED=0 go build -ldflags="-s -w"
$ ldd log4shell_sentinel
not a dynamic executable
$ ./log4shell_sentinel -h
NAME:
Log4Shell Sentinel - by Osama Elnaggar
USAGE:
log4shell_sentinel [global options] command [command options] [arguments...]
VERSION:
v1.0.0
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--path value, -p value Path to search (default: ".")
--no-banner, --nb Suppress banner (default: false)
--no-messages, --nm Suppress messages except for CSV output (default: false)
--no-header, --nh Suppress header in CSV output (default: false)
--imd5 value, --im value Ignore MD5 hashes. Refer to the GitHub page for expected format
--ipath value, --ip value Ignore file path matches. Refer to the GitHub page for expected format
--icimage value, --ic value Ignore container image matches. Refer to the GitHub page for expected format
--print-headers, --ph Print CSV Headers only (default: false)
--help, -h show help (default: false)
--version, -v print the version (default: false)
Par défaut, une analyse se contente d'analyser le répertoire courant. Par exemple :
$ ./log4shell_sentinel
░█░░░█▀█░█▀▀░█░█░█▀▀░█░█░█▀▀░█░░░█░░░░░█▀▀░█▀▀░█▀█░▀█▀░▀█▀░█▀█░█▀▀░█░░
░█░░░█░█░█░█░░▀█░▀▀█░█▀█░█▀▀░█░░░█░░░░░▀▀█░█▀▀░█░█░░█░░░█░░█░█░█▀▀░█░░
░▀▀▀░▀▀▀░▀▀▀░░░▀░▀▀▀░▀░▀░▀▀▀░▀▀▀░▀▀▀░░░▀▀▀░▀▀▀░▀░▀░░▀░░▀▀▀░▀░▀░▀▀▀░▀▀▀
- A CVE-2021-44228/CVE-2021-45046/CVE-2021-45105 Scanner
- v1.0.0
- by Osama Elnaggar
[*] WARNING: Running as non-root user.
Non-readable files / dirs will be skipped
Container mapping will fail
[*] Starting shallow scan ............ [DONE]
[*] Starting deep scan ............... [DONE]
[*] Calculating MD5 hashes ........... [DONE]
[*] Performing container image lookups [DONE]
[*] Processing ignore list(s) ........ [DONE]
[*] Generating output ................ [DONE]
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
Vous obtiendrez immédiatement un AVERTISSEMENT si vous l'exécutez en tant qu'utilisateur non-root, car il nécessite les permissions root :
Il fonctionnera toujours sans privilèges root mais pourrait ne pas vous donner les meilleurs résultats.
Un exemple de découverte ressemble à ceci :