
Schritt-für-Schritt-Laborbericht, der CVE-2019-20933 InfluxDB-Authentifizierungsumgehung mittels gefälschter JWT-Tokens demonstriert, einschließlich Ausnutzung, Post-Exploitation und Abhilfemaßnahmen.
Beginnend mit dem, was in der Umgebung läuft. Ich liste alle aktiven Container auf:
docker ps

Das Opfer gibt einen einzelnen Port frei: 8086.
Derzeit habe ich keine detaillierten Informationen über das Ziel. Aus der docker ps-Ausgabe geht hervor, dass das System nur einen bemerkenswerten Dienst extern an Port 8086 freigibt, der auf den Dienst im Container abgebildet ist. Dies ist die primäre Angriffsfläche, die es zu analysieren gilt.
Anstatt sofort über den Browser darauf zuzugreifen, fahren wir fort, den Dienst mit Nmap zu identifizieren, um herauszufinden, welcher Dienst auf Port 8086 läuft:
nmap -sV -sC -p 8086 192.168.3.137

Die Scan-Ergebnisse zeigen, dass Port 8086 der HTTP-Dienst von InfluxDB OSS 1.6.6 ist. Es handelt sich um eine Zeitreihendatenbank, die über eine HTTP-API verfügbar gemacht wird, nicht um eine typische Webanwendung.
InfluxDB ist eine quelloffene Zeitreihendatenbank (TSDB), die in Go geschrieben ist. Im Gegensatz zu RDBMS (optimiert für präzise Transaktionen) oder Elasticsearch (optimiert für Textsuche) wurde InfluxDB mit einem einzigen Zweck entwickelt: Bewältigung massiver Schreibvolumina (hoher Schreibdurchsatz) und Abfragen von Daten entlang der Zeitachse mit geringer Latenz.

Da der Dienst als InfluxDB identifiziert wurde, besteht der nächste Schritt darin, nachzulesen, wie InfluxDB mit Clients kommuniziert. Gemäß der InfluxDB v1 HTTP-API-Dokumentation ist Port 8086 der Standard-HTTP-API-Port. Wichtige Endpunkte sind:
/ping: prüft den Betriebsstatus des Servers./query: sendet InfluxQL-Abfragen zum Lesen von Metadaten oder Daten./write: schreibt Zeitreihendaten in die Datenbank.⇒ Überlegung: Nachdem Nmap den Dienst als InfluxDB http admin 1.6.6 identifiziert hat, testen wir ihn nicht weiter wie eine Standard-Website. Bei Webanwendungen suchen wir typischerweise nach Routen, Anmeldeformularen oder Verzeichnissen. Bei InfluxDB liegt die Angriffsfläche innerhalb der HTTP-API. Daher müssen wir zum Testen auf die standardmäßigen InfluxDB-API-Endpunkte umschalten, um festzustellen, ob die API eine Authentifizierung erfordert. Folglich besteht die nächste Testrichtung nicht darin, auf / zuzugreifen, sondern direkte Anfragen an die API-Endpunkte von InfluxDB zu senden.
/ping-EndpunktsNachdem Port 8086 als InfluxDB-HTTP-API identifiziert wurde, überprüfen Sie den /ping-Endpunkt, um zu bestätigen, dass der Dienst betriebsbereit ist:
curl -i <http://192.168.3.137:8086/ping>

Response 204 No Content bestätigt, dass InfluxDB normal arbeitet. Die Header bestätigen weiterhin die Dienstversion als InfluxDB OSS 1.6.6
/query-Endpunktcurl -i -s "http://192.168.3.137:8086/query?q=SHOW+DATABASES"

Der /query-Endpunkt erlaubt keine direkten Abfragen ohne Authentifizierungsnachweise. Dies bestätigt, dass InfluxDB die Authentifizierung aktiviert hat und alle anonymen Abfragen an das System blockiert.
Ich wechsle zur Überlegung: Hat InfluxDB Version 1.6.6 eine Schwachstelle, die das Umgehen des Authentifizierungsmechanismus erlaubt?

Durch Bezugnahme auf öffentliche Schwachstellendatenbanken sind InfluxDB-Versionen vor 1.7.6 von CVE-2019-20933 betroffen. Dies ist eine Schwachstelle zur Umgehung der Authentifizierung innerhalb der Authentifizierungsfunktion von InfluxDB, die mit der Verarbeitung von JWT-Tokens mit einem leeren gemeinsamen Geheimnis zusammenhängt.
Da das Ziel InfluxDB 1.6.6 ausführt, was niedriger als die gepatchte Version 1.7.6 ist, fällt der Dienst in den betroffenen Versionsbereich.
Es kann gefolgert werden:
Dienst: InfluxDB OSS
Version: 1.6.6
Authentifizierung: Aktiviert
CVE-Zuordnung: CVE-2019-20933
Auswirkung: Umgehung der Authentifizierung
Status: Version angreifbar
⇒ Überlegung: Anfangs gibt der /query-Endpunkt 401 Unauthorized zurück, was anzeigt, dass der Authentifizierungsmechanismus aktiv ist. Das Vorhandensein einer Authentifizierung bedeutet jedoch nicht absolute Sicherheit. Wenn die Version als 1.6.6 identifiziert wurde, müssen wir sie mit bekannten CVEs korrelieren. Die Ergebnisse zeigen, dass diese Version in den von CVE-2019-20933 betroffenen Bereich fällt, was bedeutet, dass es möglich ist, den Authentifizierungsmechanismus zu umgehen, der den /query-Endpunkt schützt. Basierend auf diesen Identifikationsergebnissen wird sich die Ausbeutungsphase darauf konzentrieren, CVE-2019-20933 zu verifizieren, indem ein geeignetes JWT-Token generiert wird, um die Authentifizierung zu umgehen und Abfragen gegen den /query-Endpunkt auszuführen.
Die Schwachstelle CVE-2019-20933 tritt in der authenticate-Funktion innerhalb der Datei services/httpd/handler.go von InfluxDB vor Version 1.7.6 auf.
InfluxDB unterstützt die Authentifizierung mittels JSON Web Tokens (JWT) für HTTP-API-Anfragen. Beim Empfang einer Anfrage mit dem Header:
Authorization: Bearer <token>
InfluxDB führt die folgenden Schritte aus:
shared-secret aus der Konfigurationsdatei influxdb.conf, um als geheimer Schlüssel für die Signaturprüfung des Tokens zu dienen.username aus den Claims abrufen, um den Benutzer zu bestimmen, der die Abfrage ausführt.In den betroffenen Versionen kann der geheime Wert als leerer String ("") verarbeitet werden, wenn die JWT-Authentifizierung aktiviert, der Parameter shared-secret jedoch nicht konfiguriert ist.
Das System validiert die Sicherheitsstärke des Geheimnisses nicht ausreichend, bevor es die JWT-Signatur überprüft. Dies ermöglicht einem Angreifer, ein benutzerdefiniertes JWT zu erstellen, es mit einem leeren Geheimnis zu signieren und dann den username-Claim auf ein gültiges Konto im System zu setzen, wie z.B. admin, falls dieses Konto im Labor existiert.
Wenn dieses Token über den Authorization: Bearer <token>-Header übermittelt wird, verwendet InfluxDB dasselbe leere Geheimnis, um die Signatur zu überprüfen. Wenn die Signatur übereinstimmt und der Benutzername existiert, wird die Anfrage autorisiert, ohne dass das tatsächliche Passwort des Benutzers erforderlich ist.
Der Verarbeitungsablauf kann wie folgt zusammengefasst werden: