
Uno Scanner intelligente per Log4Shell/Log4j/CVE-2021-44228
Sebbene siano stati rilasciati alcuni strumenti eccellenti per aiutare le organizzazioni a scansionare i propri ambienti alla ricerca di applicazioni vulnerabili alla critica vulnerabilità Log4J / CVE-2021-44228, ho ritenuto che:
Così è nato Log4Shell Sentinel. Log4Shell Sentinel è uno scanner basato su file con alcune caratteristiche uniche. Non intende sostituire tutti gli altri strumenti disponibili, ma può integrarli.
Log4Shell Sentinel è uno scanner basato su file. Cerca applicazioni Java-based scandagliando un sistema target alla ricerca di artefatti nei seguenti formati di file:
| Tipo di file | Dettagli |
|---|---|
| Simple jar | Caso in cui il file log4j-core non è incorporato. |
| Fat / Uber jar | Un uber jar è un jar che contiene sia le tue classi/pacchetto che tutte le dipendenze dell'applicazione (librerie, risorse e file metadati) all'interno di un unico file jar. Questa è l'opzione di deployment più comune. |
| WAR | Un file war (Web Application Archive) contiene codice JSP, HTML e JavaScript oltre alle librerie e altre risorse. Questo formato è meno comune. |
| EAR | Un file ear (Enterprise Application Archive) è un altro formato che era più comune con Jakarta EE per i deployment. |
e cerca istanze di jar log4j-core vulnerabili. Quindi:
calcola un hash MD5 dell'artefatto. Ciò consente a un analista di identificare la stessa applicazione in esecuzione su macchine/container diversi e trattarla come un unico risultato
per i file determinati come appartenenti a un container, ad esempio: /var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar, esegue il lavoro pesante di mappare il file all'immagine corrispondente. Ad esempio, tradurrebbe quanto sopra nell'immagine: ghcr.io/christophetd/log4shell-vulnerable-app:latest. Poiché i vari runtime dei container memorizzano questa mappatura in modi diversi, ciò può far risparmiare ore di frustrazione a un analista. Inoltre consente a un analista di trattare un certo numero di container che eseguono una singola applicazione come un unico risultato.
rimuove corrispondenze inutili come quelle relative a container attualmente non in esecuzione, incluse immagini in cache. Ciò consente all'analista di concentrarsi su ciò che è importante e risparmia ore di lavoro inutili
consente a un analista di ignorare corrispondenze in base a:
Ciò permette all'analista di rimuovere applicazioni che sa non essere vulnerabili o che corrispondono ad applicazioni da riga di comando che non rappresentano una minaccia. Ad esempio, se viene rilevata un'istanza di Logstash, un analista può scegliere di ignorarla se non utilizza lo strumento o lo esegue occasionalmente da riga di comando.
è ottimizzato per funzionare con i tuoi strumenti di configuration management come Ansible, dandoti la possibilità di scansionare rapidamente il tuo ambiente in pochi minuti
Per i dettagli sull'arricchimento dei metadati aggiunto da Log4Shell Sentinel, consulta il mio post sul blog.
Il modo più semplice è scaricare direttamente il binario precompilato.
Anche questo è semplice. Tuttavia, probabilmente vorrai compilare una versione staticamente collegata per evitare variazioni legate a GLIBC nel tuo ambiente. Lo strumento utilizza i seguenti moduli che usano CGO per default:
os/usernetPer compilare una versione staticamente collegata che utilizzi le versioni Go di queste librerie, basta clonare il repository e poi eseguire:
$ 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)
Di default, una scansione analizzerà semplicemente la directory corrente. Ad esempio:
$ ./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
Riceverai immediatamente un WARNING se lo esegui come utente non-root poiché richiede permessi di root:
Funzionerà comunque senza privilegi di root ma potrebbe non darti i migliori risultati.
Un esempio di risultato è:
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
Alcuni campi sono intenzionalmente lasciati vuoti perché l'analista li compili in Excel, ecc. Una breve descrizione di ciascun campo è riportata di seguito: