Cicada
Dificultad: Easy - OS: Windows
Enumeración de puertos/servicios
┌──(root㉿kali)-[/home/kali/Documents/HTB]
└─# nmap -sCV --open -T4 -v -n 10.10.11.35Resultado:
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-05-03 12:10:46Z)
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: cicada.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=CICADA-DC.cicada.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:CICADA-DC.cicada.htb
| Issuer: commonName=CICADA-DC-CA
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-08-22T20:24:16
| Not valid after: 2025-08-22T20:24:16
| MD5: 9ec5:1a23:40ef:b5b8:3d2c:39d8:447d:db65
|_SHA-1: 2c93:6d7b:cfd8:11b9:9f71:1a5a:155d:88d3:4a52:157a
|_ssl-date: TLS randomness does not represent time
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: cicada.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=CICADA-DC.cicada.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:CICADA-DC.cicada.htb
| Issuer: commonName=CICADA-DC-CA
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-08-22T20:24:16
| Not valid after: 2025-08-22T20:24:16
| MD5: 9ec5:1a23:40ef:b5b8:3d2c:39d8:447d:db65
|_SHA-1: 2c93:6d7b:cfd8:11b9:9f71:1a5a:155d:88d3:4a52:157a
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: cicada.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=CICADA-DC.cicada.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:CICADA-DC.cicada.htb
| Issuer: commonName=CICADA-DC-CA
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-08-22T20:24:16
| Not valid after: 2025-08-22T20:24:16
| MD5: 9ec5:1a23:40ef:b5b8:3d2c:39d8:447d:db65
|_SHA-1: 2c93:6d7b:cfd8:11b9:9f71:1a5a:155d:88d3:4a52:157a
|_ssl-date: TLS randomness does not represent time
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: cicada.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=CICADA-DC.cicada.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:CICADA-DC.cicada.htb
| Issuer: commonName=CICADA-DC-CA
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-08-22T20:24:16
| Not valid after: 2025-08-22T20:24:16
| MD5: 9ec5:1a23:40ef:b5b8:3d2c:39d8:447d:db65
|_SHA-1: 2c93:6d7b:cfd8:11b9:9f71:1a5a:155d:88d3:4a52:157a
|_ssl-date: TLS randomness does not represent time
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: CICADA-DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_clock-skew: 6h51m07s
| smb2-time:
| date: 2025-05-03T12:11:33
|_ start_date: N/AEn sintesis:
Lo primero que vamos a hacer es agregar los dominios que nos arrojó nmap al archivo /etc/hosts de nuestro equipo:
Enumerando recursos del SMB con NXC
Ahora vamos a enumerar los recursos del SMB de dos formas: sin usuario guest y con usuario guest utilizando la tool nxc (NoobsecToolkit)
Reconocimiento automatizado (spidering)
Teniendo todo esto en cuenta vamos a enumerar el contenido del recurso HR nuevamente con nxc
Si leemos el mensaje de Notice from HR.txt nos vamos a encontrar con un aviso del departamento de rrh que muestra una contraseña predeterminada para los nuevos empleados
RID brute-forcing
Ya tenemos una contraseña, ahora nos faltan los usuarios y para esto lo que vamos a hacer es enumerar users del dominio cicada.htb con el parámetro --rid-brute para luego realizar un ataque tipo password spraying reutilizando la credencial Cicada$M6Corpb*@Lp#nZp!8
¿Qué hace este comando?
Utiliza una técnica llamada RID brute-forcing para enumerar usuarios del dominio en un servidor Windows, aprovechando el acceso que tiene el usuario guest.
Parámetros clave:
--rid-brute→ fuerza los identificadores relativos (RIDs) desde 500 en adelante para intentar resolverlos a nombres de usuario. Si el servidor no está bien configurado, esto permite enumerar cuentas de dominio aunque no tengas privilegios.
Ya tenemos los usuarios, ahora vamos a agregarlos en una lista que usaremos en el password spraying. Para hacer la lista/diccionario simplemente aplicamos estos parámetros a modo de oneliner y el output lo volcamos en el fichero users
grep SidTypeUser→ filtra solo las líneas que contienen usuarios reales (descarta grupos y otros objetos).cut -d'\' -f2→ corta el nombre de dominio, dejando solousuario infocut -d' ' -f1→ limpia el resto dejando sólo el nombre de usuariotee users→ guarda el listado en un archivo llamadousersy también lo muestra por pantalla.
Password Spraying
Ataque de spraying con usuarios enumerados:
¿Qué hace este comando?
Realiza un password spraying, es decir, prueba la misma contraseña contra todos los usuarios listados en el archivo users.
Parámetros:
-u users→ indica queuserses un archivo que contiene una lista de nombres de usuarios (uno por línea).-p 'Cicada$M6Corpb*@Lp#nZp!8'→ es la contraseña que se probará para cada usuario.--continue-on-success→ normalmentenxcse detiene cuando encuentra un login exitoso. Con esta opción, sigue probando el resto aunque encuentre un usuario válido.
Ya tenemos unas credenciales para autenticarnos contra el servicio LDAP (puerto 389) del controlador de dominio CICADA-DC, pero primero vamos a chequear que son válidas.
Parámetros:
netexec ldap→ le dice anetexecque use el módulo de LDAP para interactuar con el servicio de directorio activo.CICADA-DC→ es el host objetivo (puede ser nombre de máquina o IP).-u michael.wrightson→ el nombre de usuario.-p 'Cicada$M6Corpb*@Lp#nZp!8'→ la contraseña a probar.
¿Qué significa este resultado?
LDAP→ es el servicio al que se conectó.10.10.11.35→ IP del controlador de dominio.389→ puerto LDAP.CICADA-DC→ nombre del host (hostname).[+]→ significa que las credenciales son válidas.cicada.htb\michael.wrightson:Cicada$M6Corpb*@Lp#nZp!8→ usuario y contraseña correctos.
Ahora que validamos las credenciales podemos realizar una enumeración LDAP de usuarios con nxc de la siguiente forma:
Vemos que hay una cuenta con una contraseña expuesta en la descripcion del atributo LDAP
Ahora podemos intentar validar estas nuevas credenciales contra los servicios smb, LDAP y WinRM para ver por donde continuar la intrusión.
Parámetros:
netexec ldap→ indica que se usará el módulo de LDAP.CICADA-DC→ el host objetivo (puede ser IP o hostname).-uy-p→ usuario y contraseña válidos.--users→ especifica que querés listar los usuarios del dominio.
Podemos realizar el mismo comando pero sobre SMB y obtendremos los mismos resultados
Para probar en qué servicios me permite logearme estas credenciales voy a usar el siguiente script service_validation.sh
Resultados:
[+] indica autenticación exitosa por SMB (puede listar recursos compartidos, usar smbexec, etc.).
[+] indica que las credenciales funcionan para acceder al Directorio Activo (AD) por LDAP.
[-] indica fallo de autenticación o que el usuario no tiene permisos para WinRM.
Primero vamos a entrar al SMB y ver si tenemos acceso a algún directorio distinto.
Vemos que podemos entrar al directorio DEV con smbclient y en su interior se encuentra el fichero Backup_script.ps1
Conseguimos credenciales nuevas "emily.oscars" "Q!3@Lp#M6b*7t*Vt" ahora volvemos a usar el service_validation.sh para probar a que servicio podemos ingresar
Podemos conectarnos a WinRM con estas nuevas credenciales, para esto voy a usar la tool EvilWinRM
Recolectando información sobre el usuario vamos a encontrar que pertenece al grupo Backup Operators de Windows y esto es una configuración de permisos peligrosa porque significa que tiene permisos especiales que se pueden usar para escalar privilegios hasta SYSTEM, incluso si este usuario no es administrador
Si revisamos los privilegios especiales que tiene el proceso actual vamos a encontrar que el usuario tiene varios privilegios elevados habilitados, entre ellos dos que están relacionados con el grupo Backup Operators:
SeBackupPrivilegeSeRestorePrivilege
Estos privilegios solo se conceden automáticamente a ese grupo (y a Administradores).
¿Por qué importa esto?
Tener SeBackupPrivilege y SeRestorePrivilege nos permite:
Leer cualquier archivo (aunque no tengamos permisos NTFS), como si fuéramos SYSTEM.
Escribir o reemplazar archivos del sistema, incluso protegidos (por ejemplo: reemplazar un servicio que se ejecuta como SYSTEM).
Estos privilegios pueden ser explotados para escalar a SYSTEM o para extraer información crítica, como:
Hashes de usuarios locales o del Active Directory (NTDS.dit, SAM).
Credenciales almacenadas.
Configuración de servicios para secuestrar ejecución de procesos como SYSTEM.
Ahora vamos a aprovechar el permiso SeBackupPrivilege para extraer los hashes de las contraseñas locales de Windows y buscar el hash del administrador
Extracción de hashes NTLM
Ahora con secretsdump.py de Impacket podremos extraer los hashes NTLM de los usuarios locales del sistema (no del dominio):
Otra tool de impacket que podemos usar para extraer los hives del registro es de forma remota con reg.py
Y en la sesión de EvilWinRM los descargamos para luego volcarlos con secretsdump.py como hicimos anteriormente. Sin embargo tendremos el siguiente problema: Evil-WinRM no puede acceder directamente a rutas fuera del directorio actual (o algunas rutas restringidas como C:\Windows\Temp), y por eso va a fallar si solo tiramos el siguiente comando:
Para solucionar esto copiaremos los archivos de C:\Windows\Temp a un directorio accesible, como Documents y luego los descargamos normalmente.
Por último buscamos las banderas
Si quieres aprender más sobre netexec te recomiendo que visites https://www.netexec.wiki/
Last updated