Random IRC quote :      <madalenasbuenas> te la voy a kemar

Acerca del BSOD de srv2.sys

Hola qué tal.
Bueno hoy nos hemos levantado con la noticia del BSOD que Laurent Gaffié ha publicado.

Tras analizar el código vulnerable y probarlo, tengo que avisaros que al contrario de lo que dice el autor y se está reproduciendo en otras páginas, esta vulnerabilidad SÍ PERMITE la ejecución de código remótamente, al igual que abre la posibilidad para escalar privilegios en local. Hay que aclarar que por el momento la ejecución de código dista mucho de ser reliable al igual que la escalada de privilegios. Pero no hay que considerar como un mero DoS esta vulnerabilidad porque tiene el potencial de convertirse en ejecución de código controlado.

Y ahora os explicaré el porqué basándonos en razones técnicas, en esto de las vulnerabilidades el publicar un advisory méramente empírico no es de recibo, teniendo en cuenta que es un 0day

Veamos dónde se produce el fallo.
módulo: srv2.sys

; int __stdcall Smb2ValidateProviderCallback(PVOID DestinationBuffer)
_Smb2ValidateProviderCallback@4 proc near


.text:000156B3 loc_156B3:                              ; CODE XREF: Smb2ValidateProviderCallback(x)+4D5j
.text:000156B3                                         ; Smb2ValidateProviderCallback(x)+4DEj
.text:000156B3                 movzx   eax, word ptr [esi+0Ch]; packet->SBM_Header->Process_ID_High
.text:000156B7                 mov     eax, _ValidateRoutines[eax*4]; FALLO – out-of-bounds dereference.
.text:000156BE                 test    eax, eax
.text:000156C0                 jnz     short loc_156C9
.text:000156C2                 mov     eax, 0C0000002h
.text:000156C7                 jmp     short loc_156CC
.text:000156C9 ; —————————————————————————
.text:000156C9
.text:000156C9 loc_156C9:  ; CODE XREF: Smb2ValidateProviderCallback(x)+4F3j
.text:000156C9                 push    ebx
.text:000156CA                 call    eax ; Smb2ValidateNegotiate(x) ; Smb2ValidateNegotiate(x) – KABOOOM!!
 

Como véis lo que está haciendo es usar el campo de 16 bits de la cabecera SMB 2.0 ProcessIDHigh como indice en una tabla de funciones sin comprobar previamente el tamaño de la tabla. Cagada de libro. De esta manera podemos dereferenciar un puntero arbitrario que si no es nulo nos dará la direccion a la que saltará la ejecución.

Empíricamente el exploit que ha liberado el fulano puede funcionar o no, ya que lo que produce el BSOD es que el indice es demasiado alto y apunta una página no paginada. Pero en algunos sistemas podría darse el caso que sí estuviera paginada y no fallara o fallara en otro punto, de hecho lo he comprobado en varios sistemas Vista x86.

Por lo tanto, la ejecución de codigo remoto es posible ya que ESI apunta a nuestro paquete de datos. [ESI+C] que es el indice es un campo que nosotros controlamos de 16 bits. Lo que hace falta es encontrar un puntero adecuado que nos permita controlar la ejecución en base a estos datos. Dado que la sección PAGE del driver esta en direcciones más altas que la sección .DATA donde está la tabla de funciones, esto mejora la situación.

La ejecución de código a nivel local para elevar privilegios, vendría dada por el mismo tipo de explotación, lo único es que todas las rutinas del srv2.sys en este tipo de peticiones se manejan en el contexto del SYSTEM no del proceso que envía el socket, si no la elevación de privilegios sería trivial ( ver valores fixed al final de la table de funciones , a partir del indice 0x13 tendríamos user-mode addresses ).

Los sistemas vulnerables son Vista, Windows 7 RC y Server 2008.

Pues eso, a filtrar paquetes en el 445 y 139 etc… ojito ahí fuera.

32 Comentarios para “Acerca del BSOD de srv2.sys”

  1. Comment por Mario Ballano | 09/08/09 at 6:47 am

    Metedura de pata bien gorda… a ver que pasa en las proximas horas/dias …

  2. Comment por antonio | 09/08/09 at 7:00 am

    Por favor Ruben, de me a donde ce dice que no ejecución de código es possible en la advisoria

  3. Comment por ruben | 09/08/09 at 7:05 am

    Antonio
    —————————
    V. BUSINESS IMPACT
    ————————-
    An attacker can remotly crash any Vista/Windows 7 machine with SMB enable.
    Windows Xp, 2k, are NOT affected as they dont have this driver.

    III. DESCRIPTION
    ————————-
    SRV2.SYS fails to handle malformed SMB headers for the NEGOTIATE PROTOCOL REQUEST functionnality.
    The NEGOTIATE PROTOCOL REQUEST is the first SMB query a client send to a SMB server, and it’s used to identify the SMB dialect that will be used for futher communication.

    I. VULNERABILITY
    ————————-
    Windows Vista/7 : SMB2.0 NEGOTIATE PROTOCOL REQUEST Remote B.S.O.D.
    ———

    ¿Dónde dice que es posible? Que yo sepa el business impact es lo que se usa para caracterizar una vulnerabilidad…

  4. Comment por Mario Ballano | 09/08/09 at 7:48 am

    El advisory no refleja en ningún lado la posibilidad de ejecución de código, con lo cual se da a pensar que solamente es un remote BSOD, que de hecho es de lo que se habla en el advisory. Lo más seguro es que el autor no fuera consciente de esto.

  5. Comment por Miguel | 09/08/09 at 7:55 am

    Un tabla overflow, que clasico :o)
    Buen post, Ruben.

  6. Comment por Amian | 09/08/09 at 9:51 am

    al pinche le quemo el bug en las manoplas sin darse cuenta de que valia su buena plata!

  7. Comment por sha0 | 09/08/09 at 1:06 pm

    Ahora podeis lanzar el exploit desde vuestro android 🙂

    http://www.badchecksum.net/code/exploits/VistaDoS.apk

    Si alguien quiere el code que lo pida.

    salu2

  8. Comment por anomino | 09/08/09 at 3:35 pm

    Perdona, Ruben, tu lo ves muy claro pero te agradeceria una pequeña explicacion.

    Gracias de antemano.

    Mi duda es:

    movzx eax, word ptr [esi+0Ch]; packet->SBM_Header->Process_ID_High
    mov eax, _ValidateRoutines[eax*4]; FALLO -u

    Ok puedo meter un valor en esi que tenga un valor que luego use como indice en esa tabla, entonces que deberia pisar? controlo el indice, pero como llego a controlar EIP ???

    Perdona, a lo mejr es muy trivial pero no lo veo ..

    Gracias por todo.

  9. Comment por Shaddy | 09/08/09 at 4:21 pm

    Desde luego que es una cagada, aunque no es muy común encontrarte con los archivos compartidos en un Home PC, si se encuentran en la gran mayoría de las empresas y lo peor es que muchos tardarán en darse cuenta de ésto. Menudos días nos esperan..

    Gracias Rubén!

  10. Comment por ruben | 09/08/09 at 4:21 pm

    No es trivial no, tranquilo. A ver si te lo consigo aclarar un poco.

    Digamos que tenemos que buscar una porcion de código que nos permita controlar la ejecución a través de ESI. Y a su vez tenemos que encontrar una dirección que apunte ese código. Y que este este alineado además…

    Supongamos que en cierta partel de .PAGE en srv2.sys tenemos

    loquesea_alineado_a_4, offset pirubirubi

    pirubirubi
    call dword ptr [ esi + 0x10 ]

    tenemos que

    movzx eax, word ptr [esi + 0xc]
    mov eax, _ValidateFuntions[eax*4] = >> siendo eax == lo que tenga que ser para pillar offset pirubirubi

    entonces cuando se haga el

    call eax

    iriamos a pirubirubi y como [esi+0x10] apunta a nuestro paquete y lo controlamos tendría la ejecución bajo nuestro control. Saltaríamos a la dirección que nosotros quisieramos… Espero que haya quedado más claro.

  11. Comment por anomino | 09/08/09 at 5:23 pm

    Ruben, perfecta explicaion, lo que me pasaba es que no veia el call eax no hice scroll down, XDD

    De todas formas totalmente aclarado.

    Gracias.

  12. Comment por Juan Quijano | 09/08/09 at 6:15 pm

    Interesante, pero… alguno lo ha probado?

    Porque hoy mi administrador de sistemas, un auténtico taliban de linux, lo intentó un par de decenas de veces y mi windows7 siguió funcionando sin problema alguno y sin ningún pantallazo azul…

    Si alguien lo ha conseguido, que hable de primera mano y no de oidas, que me suena que todo esto es un cuento más contra los malos malísimos de redmon. 🙁

  13. Comment por matalaz | 09/09/09 at 2:26 am

    Pues por ejemplo Rubén, y yo, y otros tantos que andamos por aquí lo hemos probado también. Además, si no petara, ¿Cómo iba a saber Rubén cuál es el código vulnerable?

  14. Comment por Zohiartze Herce | 09/09/09 at 3:30 am

    matalaz, todos sabemos que ruben trabaja para la sección rusa de microsoft, por eso sabía lo del fallo aún sin haberlo mirado 😛

  15. Comment por ruben | 09/09/09 at 4:30 am

    que puto jefe! Juan Quijano for president!! Como diria patricia conde, Juan Quijano…ME LA AGARRAS CON LA MANO!

  16. IaM
    Comment por IaM | 09/09/09 at 5:35 am

    Hola a todos,

    Sha0 y yo hemos estado haciendo pruebas ayer, y mi maquina hizo de conejillo de indias. El caso es que cambiando cualquier otro byte de los de arriba y dejando el process ID a 0, que es como debía ser tb produce un DoS.

    Si teneis tiempo y ganas podeis probarlo.

    “\x00\x00\x00\x90” # Begin SMB header: Session message
    “\xff\x53\x4d\x42” # Server Component: SMB
    “\x72\x00\x00\x00” # Negociate Protocol
    “\x00\x18\x53\xc8” # Operation 0x18 & sub 0xc853

    Cambiad cualquier byte de estos. Es más podeis hacer un fuzzer simple, recorriendo byte a byte la shellcode y poniendo todas las combinaciones posibles de cada byte de 1 a 256. Total hace solo una conexión y envia el churro no es dificil programar un fuzzer para obtener nuevas vulnerabilidades a partir de esta.

    Bueno.. si teneis tiempo y ganas probadlo.

    Saludos,

  17. Comment por Jose M. | 09/09/09 at 5:41 am

    Tela, verificado con un colega en el trabajo.

    Y veo que Sha0 la está liando parda ya con el Android.

    Buen post, gracias.

    P.D.: anti-spam word “ratatui”

  18. IaM
    Comment por IaM | 09/09/09 at 5:48 am

    Y bueno.. ya que estamos hablando del tema, alguien sabe algo acerca del nuevo DoS que se ha publicado hoy? http://securityvulns.com/news/TCP/DoS.html

    Fyodor saco hace tiempo una herramienta que se llamaba ndos. http://insecure.org/stf/tcp-dos-attack-explained.html pero la pagina ha sido eliminada. Alguien sabe algo de dicha herramienta?. Aqui es donde se habla de ella:

    http://lists.immunitysec.com/pipermail/dailydave/2008-October/005360.html

    Saludos,

  19. Comment por Mario Ballano | 09/09/09 at 6:37 am

    Bueno, menos verificar, y a ver quien consigue programar un exploit que permita ejecucion de codigo 🙂

  20. Comment por n13z | 09/09/09 at 11:23 am

    La gente de Metasploit ya han metido el DoS en el snapshot del SVN. Ayer estaba cuando leí este post hdmoore estaba comentando cosas del mismo estilo en twitter.

    # $Id: smb2_negotiate_pidhigh.rb 7017 2009-09-09 13:41:14Z hdm $

    Os dejo un “efugio” sobre como deshabilitar SMB2:

    http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm

  21. Comment por Jose Selvi | 09/10/09 at 2:33 am

    Quizá no lo declaran como “posible ejecución de código” por las protecciones internas de Windows como el DEP. Aunque mirando el código sea posible efectivamente hacerlo, igual al querer saltar a ejecutar código en una zona de datos salta la protección y se cierra el proceso, con el consiguiente DoS de nuevo.

    Muy buen análisis!

  22. Comment por Ruben | 09/10/09 at 4:22 am

    preparaos porque el exploit está al caer…liada.

  23. Comment por Juhan Quijano | 09/10/09 at 11:11 am

    Pues yo no me lo creo. Lo has probado o hablas solo de oídas?

  24. Comment por ruben | 09/10/09 at 12:13 pm

    HOYGA LLO SOLO HAVLO DE HOYDAS.

  25. Comment por Mario | 09/11/09 at 6:44 am

    HOYGA HA NOSOTROS DE LO QE NOS GUSTA ABLAR HES DE LO QE NO SAVEMOS, QUE SINO SE ASE MUY HAVURRIDO, NO LE PARESE???

    POR FAVOR SI RESIVE MAS HINFORMASION HASERCA DEL HEXPLOIS HENBIENOSLA AL VLOG,

    GRASIAS DE HANTEMUSLO

  26. Comment por svch0st | 09/14/09 at 4:06 am

    Juhan, me han copiao todo a mi.
    Esta gente no tiene ni idea como tu y como yo…

  27. Comment por Juan A Naranjo | 09/21/09 at 8:22 am

    El pasado Jueves 17 de Septiembre Immunity anunció que ya tenia un exploit funcional para Windows Vista y 2008. Podeis ver un video del exploit en accion aqui: https://www.immunityinc.com/documentation/smbv2.html por supuesto que no han hecho publico el exploit y solo esta disponible para los clientes de Canvas. Por otro lado, hay rumores de que los del Metasploit lo tienen a punto.

    El exploit funciona en 2008 SP0 que tiene SafeSEH chain validation habilitado por defecto. No creo que hayan usado SEH para explotarlo, habran tenido que pasar GS o DEP? Estoy deseando ver el exploit…

    Referencias:

    http://www.immunitysec.com/news-latest.shtml
    http://www.theregister.co.uk/2009/09/16/windows_vista_exploit_released/

  28. Comment por Ruben | 09/23/09 at 4:59 am

    Lo que se tenía que evitar es NX pero eso no ha sido un problema.

  29. Comment por Juan A Naranjo | 09/28/09 at 5:54 pm

    Esta mañana Stephen Fewer ha hecho publico un módulo para el Metasploit de ejecución de codigo remota para la vulnerabilidad smb2. Podéis ver el módulo en esta dirección:

    http://trac.metasploit.com/browser/framework3/trunk/modules/exploits/windows/smb/smb2_negotiate_func_index.rb

    Referencia:

    http://blog.metasploit.com/2009/09/metasploit-33-development-updates.html

    En dos palabras: Impre-zionante!!!

  30. Comment por mybook | 03/16/10 at 4:36 am

    Amulet of the Darkmoon:
    +10 Strength
    +19 Agility
    +10 wow power leveling Stamina
    The second is Caster based (Maga, Priest, Paladins…)
    Orb of the Darkmoon:
    +11 Stamina
    +8 Spirit
    Equip: Increases wow power leveling damage and healing done by magical spells and effects by up to 22.
    I counted best wow gold a little, and it comet out, That it can be “gathered” from 1 Gold 20 Silver – To ~190 Gold PLUS”How To”
    When Darkmoon Fiery event is wow gold uk active, you can complete Q-ts to obtain tickets. And that is what we need. The Q-ts are repeatable, and that’s our luck! down till cheapest wow gold you have the 1200 ticket is Thorium Widget! Is an Engineering “component”.
    1200 tickets = Epic Neck (one from above)
    The Q-ts are Profession gold for wow based, but this can be tricked out!
    You will need a “Schematic: Thorium Widget” (Limited supply: 1G 20S by Vendors, 3G-10G+ at AH) If he knows it, world of warcraft power leveling even better for us
    First: You need to find someone who has Engineering around lvl 260 (needed to create Thorium Widget-s) world of warcraft power leveling
    and tell him that you “pay” his Engineering skill to 300 if he helps you.

  31. Comment por Internet Hosting | 05/13/10 at 1:40 pm

    Digamos que tenemos que buscar una porcion de código que nos permita controlar la ejecución a través de ESI. Y a su vez tenemos que encontrar una dirección que apunte ese código. Y que este este alineado además…

  32. Comment por Büyü | 08/10/10 at 7:24 am

    Digamos que tenemos que buscar una porcion de código que nos permita controlar la ejecución a través de ESI. Y a su vez tenemos que encontrar una dirección que apunte ese código. Y que este este alineado además…

Se han cerrado los comentarios