Artificial HackTheBox (Easy)

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-17 03:56 EDT
Nmap scan report for 10.10.11.74
Host is up (0.032s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 7c:e4:8d:84:c5:de:91:3a:5a:2b:9d:34:ed:d6:99:17 (RSA)
|   256 83:46:2d:cf:73:6d:28:6f:11:d5:1d:b4:88:20:d6:7c (ECDSA)
|_  256 e3:18:2e:3b:40:61:b4:59:87:e8:4a:29:24:0f:6a:fc (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://artificial.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.98 seconds

Veremos varias cosas interesantes, si entramos por el puerto 80 veremos que nos redirige a un dominio llamado artificial.htb, por lo que vamos añadirlo a nuestro archivo hosts.

Lo guardamos y volvemos a entrar pero con dicho dominio de esta forma:

Entrando dentro veremos una pagina normal, nada fuera de lo normal, por lo que vamos a realizar un poco de fuzzing a ver que vemos.

Si nos vamos a Login veremos que nos podremos loguear con un usuario, pero no tenemos nada registrado, por eso le daremos al link de abajo donde podremos crear una cuenta, meteremos la informacion correspondiente para nuestra cuenta y una vez registrados iniciaremos sesion con dichas credenciales, echo esto veremos lo siguiente:

Vamos a descargarnos el requirements y el Dockerfile para ver como esta funcionando por dentro, ya que te estan dando los archivos para que sepas como funciona y eso puede ser una posible vulnerabilidad.

requirements.txt

Dockerfile

Por lo que vemos hay varias posibles vulnerabilidades, ya que la version de tensorflow es antigua y tiene vulnerabilidades, ya que podemos cargar un archivo de modelo IA con extension .h5 podremos crearnos un script en python3 y que nos genere dicho archivo con una reverse shell.

exploit.py

Antes de ejecutarlo vamos a crearnos un enviroment de python3 en un docker tal cual como lo que pone en el Dockerfile que tenemos de referencia:

Esto nos habra generado un archivo exploit.h5 el cual vamos a cargar en la pagina como si fuera un modelo de IA legitimo, pero con una backdoor que nos proporcionara una shell.

Vamos a ponernos a la escucha antes:

Ahora si subimos el archivo a la pagina, se nos generara un modelo de IA en el cual apareceran 2 botones llamados View Predictions y Delete, vamos a darla al primer boton, echo esto si volvemos a donde tenemos la escucha veremos lo siguiente:

Veremos que ha funcionado, por lo que vamos a sanitizar la shell.

Sanitización de shell (TTY)

Escalate user gael

Si investigamos bastante utilizando linpeas.sh para enumerar el sistema, veremos un archivo interesantes en la siguiente ruta llamadousers.db.

Si entramos a dicho archivo para enumerarlo con sqlite3 veremos lo siguiente:

Vamos a ver las tablas que hay:

Info:

Vamos a enumerar las 2 de esta forma:

user

Info:

model

Info:

Veremos varias cosas interesantes, entre ellas en los usuarios veremos uno que existe a nivel de sistema llamado gael, vamos a intentar crackear ese MD5 a ver si lo conseguimos.

hash

Ahora vamos a utilizar john para intentar crackearlo:

Info:

Veremos que ha funcionado, por lo que vamos a probarlo directamente por SSH a ver si conseguimos entrar con dichas credenciales.

SSH

Metemos como contraseña mattp005numbertwo...

Con esto veremos que estaremos dentro, por lo que leeremos la flag del usuario.

user.txt

Escalate Privileges

Si hacemos id veremos lo siguiente:

Vemos que pertenecemos a un grupo llamado sysadm, vamos a ver que archivos contiene dicho grupo con find.

Info:

Veremos que hay un backup con dicho archivo comprimido, por lo que vamos a descomprimirlo de esta forma:

Echo esto veremos una carpeta llamada backrest que contendra lo siguiente:

Vemos que es el mismo archivo que esta en /opt pero al haberlo descomprimido con nuestro usuario gracias al grupo podremos leer todo e investigarlo todo, por lo que vamos a investigar que contiene o que archivos son interesantes.

Investigando un poco encontraremos lo siguiente:

Info:

Veremos algo interesantes y es un archivo de configuracion en JSON el cual hay una password que esta codificada en base64 vamos a decodificarla y probar a crackear con john.

Info:

hash.bcrypt

Ahora probamos con john.

Info:

Veremos que ha funcionado, por lo que tendremos las siguientes credenciales:

Teniendo esto vamos a realizar un portforwarding del puerto 9898 que esta de forma local con SSH de esta forma:

Metiendo la contraseña del usuario gael accederemos de forma correcta, echo esto en nuestro host en la pagina web vamos acceder de la siguiente forma:

Info:

Veremos que funciona y veremos un login vamos a utilizar las credenciales encontradas anteriormente y veremos que funciona.

En el archivo del backup vemos que hay un binario llamado restic, si lo buscamos en GTFObins veremos que existe:

sudo restic (GTFOBins)

Veremos que en la pagina en la seccion de sudo esta la siguiente configuracion para abusar de ello, pero no podemos ejecutar sudo con el binario.

Si entramos en la pagina con las credenciales que ya tenemos y creamo un Add Repo:

Metiendo la informacion que queramos, cuando lo creemos si entramos dentro del mismo veremos una opcion llamada Run Command, que si le damos y hacemos help:

Veremos que esta haciendo por dentro este comando:

Vamos a probar si realiza una conexion a nuestro servidor atacante metiendo el siguiente comando de prueba.

Abriremos un servidor de python3 para ver si nos llega aunque sea:

Ahora si le damos a enviar nos dara un error claramente, pero si volvemos a donde tenemos nuestro servidor de python3 veremos lo siguiente:

Veremos que hace el intento de entrar al repo que le especificamos, pero no lo consigue por que requiere de una herramienta que vamos a instalar ahora llamada rest-server para crear nuestro repo y que realice el contacto del mismo volcando el archivo que queramos que nos mande, aprovechando que se esta ejecutando como root y como vimos en GTFOBins podemos hacer eso que vimos anteriormente.

Vamos a instalar la herramienta de esta forma:

Echo esto vamos a crear nuestro repo y establecer la escucha del servidor para que funcione de la siguiente forma:

Info:

Ahora vamos a instalar la utilidad de restic para inicializar el repositorio en dicho servidor que tenemos abierto, para que nos lleguen los backups a dicho servidor del repo.

Una vez instalada, vamos a inicializar como dije antes el repo llamado Shell en mi caso, podemos poner lo que queramos.

Metemos como contraseña la que queramos y ahora vamos a irnos a la pagina de Backrest en el que hicimos la redireccion de puertos y en el repo que habiamos creado en la opcion de Run Command vamos a poner el siguiente comando, ya que ahora si tenemos nuestro servidor a la escucha junto con nuestro repo inicializado de forma correcta.

Info:

Veremos que ha funcionado, por lo que vamos a listar las snapshots a ver si se creo de forma correcta.

Info:

Veremos que si, pero para poder leerlo tendremos que exportarlo alguna carpeta a nivel local en mi caso lo hare en /tmp de esta forma:

Metemos como contraseña la que establecimos anteriormente cuando iniciamos el repo...

Y con esto ya lo habremos exportado, para poder verlo tendremos que irnos a la estructura de carpetas con la que se ha creado, que seria la siguiente:

Info:

Vemos que funciono todo de forma correcta, por lo que podremos exportar archivos, vamos a probar a exportar el archivo de la clave PEM del usuario root a ver si funciona.

Info:

Volveremos a listar nuestras snapshots y veremos que se paso de forma correcta la ultima.

Info:

Ahora vamos a repetir lo mismo de antes para poder exportarla y leerla de forma correcta:

Info:

Ahora vamos a leerla de esta forma:

Info:

Veremos que ha funcionado, vamos a probarla por SSH pero antes, tendremos que meterno en un archivo id_rsa y establecerle los permisos adecuados de esta forma:

Ahora nos conectaremos por SSH.

Info:

Veremos que ha funcionado, por lo que leeremos la flag del usuario root.

root.txt

Last updated