
Un script qui vérifie les systèmes vulnérables Log4j (CVE-2021-44228) en utilisant l'injection du payload dans les en-têtes HTTP courants.
Le vendredi 10 décembre 2021, une nouvelle preuve de concept 1 traitant d'une vulnérabilité d'exécution de code à distance (RCE) dans la bibliothèque Java 'log4j' 2 a été publiée. Cette vulnérabilité n'a pas été divulguée aux développeurs du logiciel au préalable. La vulnérabilité est suivie sous la référence CVE-2021-44228 3. Plus d'informations sur la vulnérabilité sont disponibles dans la réponse de menace Northwave 4.
Northwave a créé un script de test qui vérifie les systèmes vulnérables en injectant la charge utile dans les en-têtes HTTP courants et dans le cadre d'une requête HTTP GET. Les systèmes vulnérables sont détectés en écoutant les requêtes DNS entrantes contenant un UUID spécifiquement créé pour la cible. En écoutant le DNS entrant au lieu de déployer (par exemple) un serveur LDAP, nous augmentons la probabilité de détection des systèmes vulnérables qui ont un filtrage du trafic sortant en place. En pratique, le DNS sortant est souvent autorisé. Un taux élevé de faux négatifs est attendu, veuillez lire l'avertissement.
Les en-têtes HTTP suivants sont couverts :
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptPour chaque injection, les préfixes JNDI suivants sont vérifiés :
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}apNotez que le script n'effectue que deux vérifications spécifiques : les en-têtes HTTP et la requête HTTP GET. Cela entraînera des faux négatifs dans les cas où d'autres en-têtes, des champs de saisie spécifiques, etc. doivent être ciblés pour déclencher la vulnérabilité. Cela est très probable.
IMPORTANT : Dans les cas où le vérificateur retourne 'aucune vulnérabilité détectée', procédez aux vérifications du système de fichiers comme décrit dans la réponse de menace Northwave 4. Exécuter uniquement ce vérificateur ne suffit pas pour déterminer si un système est vulnérable ou non.
Tout d'abord, nous avons besoin d'un sous-domaine que nous pouvons utiliser pour recevoir les requêtes DNS entrantes. Dans ce cas, nous utilisons la zone log4jdnsreq.northwave.nl et nous déployons notre script sur log4jchecker.northwave.nl. Configurez une entrée DNS comme suit :
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
Nous configurons maintenant un serveur DNS BIND sur un système Debian en utilisant apt install bind9 et ajoutons ce qui suit au fichier /etc/bind/named.conf.options :
recursion no;
allow-transfer { none; };
Cela désactive la récursivité car nous ne voulons pas exécuter un serveur DNS ouvert. Configurez la journalisation dans /etc/bind/named.conf.local en ajoutant la configuration suivante :
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
N'oubliez pas de redémarrer BIND avec systemctl restart bind9. Vérifiez que la journalisation fonctionne en effectuant une requête DNS pour xyz.log4jdnsreq.northwave.nl. Une ou plusieurs requêtes devraient apparaître dans /var/log/named/query.log.
Il est important de vérifier que les recherches de noms de serveur sont réellement enregistrées. Ce script ne peut pas détecter les sites vulnérables à moins que votre configuration de serveur de noms n'enregistre les requêtes
Testez votre serveur en effectuant une recherche de test (idéalement depuis une machine différente) :
dig test.log4jchecker.northwave.nl
Vous ne devez pas vous attendre à une réponse, mais vous devez vous attendre à une entrée dans le fichier journal (cat /var/log/named/query.log). Cette entrée pourrait ressembler à :
14-Dec-2021 13:36:01.402 client @0x7f8b180a9b30 requester-ip#58755 (test.log4jchecker.northwave.nl): query: test.log4jchecker.northwave.nl IN A -E(0)DC (your-ip)
Ne continuez pas à moins qu'une réponse ne soit visible dans les journaux. Le script ne détectera pas les vulnérabilités sans cela.
Installez les dépendances Python avec pip install -r requirements.txt. Modifiez le script pour changer la ligne suivante en la zone DNS que vous avez configurée :
HOSTNAME = "log4jdnsreq.northwave.nl"
Vous pouvez maintenant exécuter le script en fournissant une seule URL avec le paramètre -u ou une liste d'URL avec le paramètre -l :
usage: nw_log4jcheck.py [-h] [-l LIST] [-u URL] [-w WAIT] [-t TIMEOUT]
optional arguments:
-h, --help show this help message and exit
-l LIST, --list LIST A text file with a list of URLs to check (one url per line)
-u URL, --url URL URL to check (for example: http://yoururl.com)
-w WAIT, --wait WAIT Number of seconds to wait before checking DNS logs (default: 15)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
La dernière ligne de la sortie indique si le système a été trouvé vulnérable :
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
Dans le cas où aucune vulnérabilité n'a été détectée, procédez aux vérifications du système de fichiers comme décrit dans la réponse de menace Northwave 4. Encore une fois, exécuter uniquement ce vérificateur ne suffit pas pour déterminer si un système est vulnérable ou non.
Log4jcheck est un logiciel open-source sous licence MIT.