flagCodePartTwo 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-19 10:04 EDT
Nmap scan report for 10.10.11.82
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 a0:47:b4:0c:69:67:93:3a:f9:b4:5d:b3:2f:bc:9e:23 (RSA)
|   256 7d:44:3f:f1:b1:e2:bb:3d:91:d5:da:58:0f:51:e5:ad (ECDSA)
|_  256 f1:6b:1d:36:18:06:7a:05:3f:07:57:e1:ef:86:b4:85 (ED25519)
8000/tcp open  http    Gunicorn 20.0.4
|_http-title: Welcome to CodePartTwo
|_http-server-header: gunicorn/20.0.4
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 varios puertos interesantes, entre ellos el puerto 8000 que contiene una pagina web por lo que podemos ver, por lo que vamos a entrar dentro del mismo.

Dentro veremos una pagina web normal y corriente, no veremos nada interesante, pero si le damos a Download App veremos que nos descarga un zip llamado app.zip, si lo descomprimimos veremos la siguiente arquitectura de carpetas:

Veremos que la pagina es un servidor de python3 con Flask u otro tipo de libreria, por lo que vemos tambien es un dump de la propia pagina, vamos a investigar mas a fondo a ver que encontramos ya que podremos ver el codigo fuente de la pagina y con ello ver alguna vulnerabilidad.

app.py

Vemos que hay una vulnerabilidad en la version de una libreria llamada js2py en el requirements.txt:

Si empezamos a buscar informacion de dicha vulnerabilidad, veremos el siguiente CVE:

URL = js2py 0.74 CVE-2024-28397arrow-up-right

Por lo que vemos se puede realizar un RCE mediante codigo de JS, por lo que vamos a registrarnos en la pagina ya que podemos, y despues una vez autenticados veremos lo siguiente:

Vemos que podemos ejecutar codigo de JS y todo lo que ejecutemos se muestra en un output mas abajo, tambien podemos guardar el codigo, por lo que vamos aprovechar dicha vulnerabilidad para pegar el siguiente codigo:

Con esto en la pagina vamos a probar que realmente se estan ejecutando comandos, por lo que vamos abrir un servidor de python3:

Y ahora si le damos a Run Command veremos esto en la pagina:

Pero si volvemos a donde tenemos el servidor de python3:

Veremos que ha funcionado realmente por detras, por lo que vamos a crear un exploit para ejecutarlo y que nos proporcione una reverse shell de esta forma:

exploit.py

Vamos a ponernos a la escucha antes de ejecutarlo:

Ahora vamos a ejecutarlo de esta forma:

Info:

Si volvemos a donde tenemos la escucha:

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

Sanitización de shell (TTY)

Escalate user marco

Si recordamos anteriormente en el codigo de app.py vimos esta linea:

Por lo que vamos a realizar una busqueda de users.db a ver que vemos:

Info:

Vamos a intentar leerlo con sqlite3 de esta forma:

Dentro de la herramienta con dicho archivo listamos las tablas que pueda tener:

Info:

Vamos a ver la informacion de user que es la mas interesante:

Info:

Veremos cosas interesantes entre ellas el usuario marco con su contraseña hasheada, como vemos que existe a nivel de sistema, vamos a probar a crackear dicha contraseña de marco.

hash

Ahora con john haremos lo siguiente:

Info:

Veremos que ha funcionado, por lo que vamos a probar dichas credenciales por SSH a ver si funcionaran:

SSH

Metemos como contraseña sweetangelbabylove...

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

user.txt

Escalate Privileges

Si vemos con el id de que grupo somos, veremos lo siguiente:

Veremos que pertenecemos al grupo llamado backups, si listamos el /opt veremos esta carpeta que pertenece a dicho grupo:

No veremos nada interesante, si hacemos sudo -l veremos lo siguiente:

Vemos que podemos ejecutar el binario npbackup-cli como el usuario root, por lo que vamos a investigar que hacer dicho binario.

Vemos que hay un archivo de configuracion bastante interesante en esta ruta:

Si nosotros cargamos dicho archivo de configuracion con el binario con el que podemos ejecutar como sudo para probar a ejecutar comandos, veremos lo siguiente:

Info:

Vemos que por detras esta utilizando el binario restic, y como se esta ejecutando como sudo, si buscamos en GTFOBins veremos lo siguiente:

URL = GTFOBins resticarrow-up-right

Vemos que se puede ejecutar como sudo sin que pierda los privilegios del mismo, por lo que podremos realizar un backup de cualquier archivo gracias a restic y que se esta ejecutando como root, pero para ello tendremos que establecer un repo como servidor donde queremos mandarnos dicho backup, esto es parecido a la maquina artificial de HTB.

Vamos a inicializar un repositorio y un servidor de restic en nuestra maquina atacante de esta forma:

Info:

Con esto ya vamos a tener nuestro servidor a la escucha, ahora vamos a inicializar un repo en dicho servidor de dicha ruta establecida:

Metemos como contraseña lo que queramos, en mi caso puse diseo y con esto se nos creara nuestro repo llamado Pwn3d, ahora desde la maquina victima nos vamos a pasar el archivo /etc/shadow.

Primero como el repo va con contraseña, vamos a crear un archivo con la contraseña en texto plano para posteriormente pasarsela a la herramienta:

Ahora habiendo creado este archivo, vamos a utilizarlo como contraseña para realizar la conexion a nuestro servidor del atacante y que nos realice un backup del archivo shadow de esta forma:

Info:

Ahora vamos a comprobar las snapshots a ver si nos llego bien, en la maquina atacante haremos lo siguiente:

Metemos la contraseña establecida del repo....

Info:

Con esto vemos que ha funcionado, por lo que vamos a exportarlo para verlo en texto plano y ver que realmente es el archivo de la maquina victima.

Info:

Ahora vamos a leerlo de esta forma:

Info:

Vemos que efectivamente ha funcionado, por lo que vamos a probar a obtener la clave PEM del usuario root a ver si existiera, haciendo el mismo proceso anterior.

Info:

Veremos que aparentemente si ha funcionado, por lo que vamos a ver las snapshots y exportarlo para ver dicho archivo.

Info:

Veremos que nos llego bien, ahora vamos a exportarlo:

Info:

Ahora vamos a leer dicho archivo a ver si todo fue bien:

Info:

Veremos que ha funcionado, vamos a utilizar dicha clave para conectarnos con el usuario root, por SSH de esta forma:

SSH

Info:

Veremos que ya seremos el usuario root, por lo que leeremos la flag de root.

root.txt

Last updated