Ghost AcademySecLearn// Seguridad Informática
🔐 Linux · Seguridad · Privilege Escalation
Escalada de Privilegios

Concepto, vectores de ataque y estrategias de prevención en sistemas Linux. Desde SUID hasta hardening avanzado.

SUID/SGID sudo kernel exploits bash_history SELinux AppArmor hardening

¿Qué es la Escalada de Privilegios?

La escalada de privilegios (Privilege Escalation) es un tipo de ataque informático en el que un usuario o proceso con bajos permisos de seguridad obtiene acceso a recursos o funciones que normalmente están restringidas a usuarios con mayores privilegios, como el usuario root — el administrador absoluto del sistema.

⚠️ Objetivo del atacante: Obtener acceso de root para controlar totalmente el sistema: instalar malware, modificar archivos críticos, acceder a datos de otros usuarios, o usar el servidor como plataforma de ataque a otras redes.

Visión general de los principales vectores y mecanismos de defensa cubiertos en esta guía:

Tipos de Escalada

Existen dos categorías principales de escalada de privilegios:

Tipo 1
Escalada Horizontal

Un atacante accede a los recursos o cuenta de otro usuario regular (el usuario A obtiene acceso al usuario B). Los privilegios no aumentan en nivel, sino en alcance.

Tipo 2 — Más peligroso
Escalada Vertical

Un usuario o proceso con pocos privilegios eleva su estatus al nivel de root. Es el foco de la mayoría de los ataques y el tipo más crítico.

ℹ️ Contexto: La escalada rara vez es el primer paso de un ataque; ocurre después de que el atacante ya tiene una shell de bajo nivel en el sistema.

Vector A — SUID / SGID Mal Configurado

El vector de escalada más clásico. Cuando el bit SUID está activado en un binario, este se ejecuta con los permisos del dueño del archivo, no con los del usuario que lo lanza.

¿Cómo funciona?

  • SUID (Set User ID): Si el archivo pertenece a root y tiene el bit SUID, cualquier usuario que lo ejecute lo hace con permisos de root.
  • SGID (Set Group ID): Similar al SUID pero aplicado al grupo propietario del archivo.
  • Problema: Si un comando peligroso (find, vim, less, nmap) tiene el bit SUID y pertenece a root, un usuario regular puede abusar de él para abrir una shell de root.

Detección

bash
find / -type f -perm /4000 2>/dev/null
Ejemplo de salida
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/find        ← ¡Peligroso!
/usr/bin/pkexec
/usr/lib/openssh/ssh-keysign

Explotación con find (si tiene SUID)

bash
# Abrir una shell de root aprovechando find con SUID
find / -maxdepth 1 -exec /bin/sh \; -quit
Resultado
# whoami
root                ← ¡Escalada exitosa!
⚠️ GTFOBins: El sitio gtfobins.github.io cataloga cientos de binarios Unix explotables cuando tienen bits SUID mal configurados. Es la referencia principal para este vector.

Vector B — Fallas en el Kernel y Controladores

Las vulnerabilidades más críticas y a menudo las más difíciles de mitigar. Un atacante explota un bug en el código fuente del Núcleo de Linux o en sus módulos/controladores, logrando ejecutar código con privilegios de kernel equivalentes a root.

Ejemplos históricos destacados

CVENombreDescripción
CVE-2016-5195Dirty COWRace condition en copy-on-write. Permitía escritura en archivos de solo lectura.
CVE-2022-0847Dirty PipeSobrescritura de datos en caché de página. Afectó kernel 5.8+.
CVE-2021-4034PwnKitFalla en pkexec (Polkit). Presente en la mayoría de distros durante años.

Identificar la versión del kernel

bash
uname -r          # Versión corta
uname -a          # Información completa del sistema
Salida de uname -a
Linux hostname 5.15.0-76-generic #83-Ubuntu SMP Thu Jun 15 19:16:32 UTC 2023 x86_64 GNU/Linux
💡 Solución principal: Mantener el kernel y los paquetes del sistema siempre actualizados. Suscribirse a boletines como oss-security o linux-distros permite conocer vulnerabilidades críticas antes de que sean explotadas.

Vector C — Mala Configuración de sudo

El archivo /etc/sudoers define qué usuarios pueden ejecutar comandos como root. Una configuración incorrecta permite escalar privilegios fácilmente desde cualquier comando que pueda invocar una shell.

Ver permisos sudo del usuario actual

bash
sudo -l
Salida peligrosa
User jose may run the following commands on host:
    (ALL) NOPASSWD: /usr/bin/find   ← ¡Riesgo de escalada!

Explotación — find como sudo

bash
sudo find / -exec /bin/sh \;
Resultado
# whoami
root

Comandos peligrosos como sudo

Comando permitidoMétodo de explotación
vim / viDesde el editor: :!/bin/sh → shell de root
less / moreDesde el visor escribir: !/bin/sh
awksudo awk 'BEGIN {system("/bin/sh")}'
nmapsudo nmap --interactive → !sh
python / perlsudo python3 -c 'import pty; pty.spawn("/bin/sh")'
⚠️ Regla de oro: Nunca permitas ejecutar ALL a un usuario no administrador, y nunca otorgues sudo a comandos que puedan abrir una shell interactiva.

Vector D — Credenciales Almacenadas en Archivos

Un atacante con acceso de bajo privilegio busca contraseñas o claves de API hardcoded en el sistema de archivos. Ocurre frecuentemente en entornos de desarrollo o scripts mal escritos.

Archivos típicos de búsqueda

Archivo / RutaQué puede contener
~/.bash_historyContraseñas pasadas como argumentos, tokens, IPs privadas
~/.ssh/Claves privadas SSH sin passphrase
/var/www/Credenciales de bases de datos en archivos de configuración web
/etc/*.confArchivos de configuración de servicios con credenciales
scripts *.shContraseñas codificadas directamente en scripts de automatización
bash
# Buscar la palabra "password" en archivos de configuración
grep -ri "password" /etc/ 2>/dev/null
grep -ri "passwd"   /var/www/ 2>/dev/null

# Revisar el historial de comandos
cat ~/.bash_history
💡 Buena práctica: Nunca pasar contraseñas directamente en la línea de comandos. Usar variables de entorno, gestores de secretos, o archivos de configuración con permisos 600.

Prevención A — Parcheo y Actualizaciones

La defensa más crítica. Instalar siempre los parches de seguridad y mantener el kernel al día mitiga directamente las vulnerabilidades de tipo B.

Debian / Ubuntu

bash
# Actualizar lista de paquetes y aplicar upgrades
apt update && apt upgrade -y

# Activar actualizaciones de seguridad automáticas
apt install unattended-upgrades
dpkg-reconfigure unattended-upgrades

RHEL / Fedora / CentOS

bash
# Actualizar todos los paquetes
dnf upgrade -y

# Solo actualizaciones de seguridad
dnf upgrade --security -y

Prevención B — Gestión Estricta de Permisos

Minimizar SUID / SGID

Inspecciona el sistema regularmente y elimina el bit SUID/SGID de cualquier binario que no lo requiera absolutamente.

PASO 1 — Identificar binarios con SUID
bash
find / -type f -perm /4000 2>/dev/null | sort
PASO 2 — Eliminar el bit SUID
bash
sudo chmod u-s /usr/bin/find
PASO 3 — Verificar el cambio
bash
ls -la /usr/bin/find
Antes → Después
-rwsr-xr-x 1 root root /usr/bin/find   ← Con SUID (peligroso)
-rwxr-xr-x 1 root root /usr/bin/find   ← Sin SUID (correcto)

Principio del Mínimo Privilegio (PoLP)

  • Los usuarios y aplicaciones deben tener solo los permisos estrictamente necesarios para su trabajo.
  • Ejemplo: Un servidor web nunca debería ejecutarse como root. Usar usuarios dedicados como www-data o nginx.
  • Revisar permisos de archivos críticos regularmente.

Prevención C — Configuración Segura de sudo

En /etc/sudoers, configura el acceso de sudo para que sea lo más específico posible. Edita siempre con visudo, que valida la sintaxis antes de guardar.

ReglaInseguroSeguro
Especificidadjose ALL=(ALL) ALLjose ALL=(ALL) /usr/bin/systemctl restart nginx
Sin contraseñajose ALL=(ALL) NOPASSWD: ALLjose ALL=(ALL) NOPASSWD: /usr/bin/apt update
Evitar shellsjose ALL=(ALL) /usr/bin/vimNo otorgar sudo a vim, less, find, awk…
bash
# SIEMPRE editar sudoers con visudo (valida la sintaxis)
sudo visudo
⚠️ Nunca edites /etc/sudoers directamente. Un error de sintaxis puede dejar el sistema sin acceso a sudo. visudo valida antes de guardar.

Prevención D — Hardening del Sistema

SELinux / AppArmor

Aplican control de acceso obligatorio (MAC) y restringen lo que incluso un proceso de root puede hacer, limitando el daño si se produce una escalada.

bash
# Estado de SELinux (RHEL/Fedora)
sestatus
getenforce       # Enforcing | Permissive | Disabled

# Estado de AppArmor (Ubuntu/Debian)
sudo aa-status

Permisos de archivos críticos

bash
# Verificar permisos
ls -la /etc/passwd    # Debe ser 644
ls -la /etc/shadow    # Debe ser 640 o 000
ls -la /etc/sudoers   # Debe ser 440

# Corregir si es necesario
sudo chmod 640 /etc/shadow
sudo chmod 440 /etc/sudoers
  • Contraseñas fuertes: Aplica políticas complejas y nunca almacenes credenciales en texto plano.
  • Deshabilitar servicios innecesarios: Menos servicios activos = menor superficie de ataque.
  • SSH seguro: Deshabilitar login de root por SSH (PermitRootLogin no en /etc/ssh/sshd_config).

Prevención E — Monitorización y Detección

Auditoría de logs

bash
# Intentos fallidos de autenticación (Debian/Ubuntu)
grep "FAILED" /var/log/auth.log | tail -20

# Con journalctl
journalctl -u sudo --since "1 hour ago"

# Últimos accesos al sistema
last -a | head -20

Herramientas de integridad de archivos

HerramientaFunciónInstalación
TripwireMonitoriza cambios en archivos críticos del sistema. Alerta si binarios SUID son modificados.apt install tripwire
AIDEAdvanced Intrusion Detection. Crea una base de datos de hashes y detecta modificaciones.apt install aide
auditdFramework de auditoría del kernel de Linux. Registra llamadas al sistema en detalle.apt install auditd

bash_history — Importancia de la Restricción

El archivo ~/.bash_history (o ~/.zsh_history) almacena cronológicamente todos los comandos ejecutados por el usuario. Su restricción es crucial para la seguridad y la prevención de escalada de privilegios.

¿Por qué es un vector de riesgo?

  • Exposición de credenciales: Un atacante con acceso de bajo privilegio puede revisar el historial y encontrar contraseñas pasadas como argumentos, claves de API, tokens, o URLs con credenciales incrustadas.
  • Mapeo del sistema: El historial revela comandos de diagnóstico ejecutados por el usuario (ip a, route, ls -la /etc/), facilitando el mapeo de la red y la búsqueda de puntos débiles.
  • Facilita pasos posteriores: Si un atacante ve cómo se realizaron tareas administrativas, puede replicarlas o revertir medidas de seguridad.
bash
# Ver el historial completo del usuario actual
cat ~/.bash_history

# Ver las últimas 30 entradas
history 30

bash_history — HISTSIZE y HISTFILESIZE

Para reducir la cantidad de comandos almacenados (el valor por defecto suele ser 1000):

VariableValor sugeridoPropósito
HISTSIZE 2000 Número máximo de comandos en memoria durante la sesión actual.
HISTFILESIZE 4000 Número máximo de líneas en el archivo ~/.bash_history en disco.

Añadir en ~/.bashrc

bash
# Limita la memoria del historial de la sesión a 2000 comandos
export HISTSIZE=2000

# Limita el archivo en disco a 4000 líneas
export HISTFILESIZE=4000

Aplicar los cambios sin cerrar sesión

bash
source ~/.bashrc

bash_history — HISTCONTROL

Permite configurar qué tipos de comandos no se guardan en el historial según su formato.

VariableValorPropósito
HISTCONTROLignorespaceEvita guardar comandos que comienzan con un espacio.
HISTCONTROLignoredupsEvita guardar un comando si es idéntico al anterior en el historial.
HISTCONTROLignorebothCombina ignorespace e ignoredups.

Añadir en ~/.bashrc

bash
# Comandos precedidos de un espacio no se registran en el historial
export HISTCONTROL=ignorespace

Uso práctico de ignorespace

bash — SÍ queda registrado
ssh user@192.168.1.1
bash — NO queda registrado (espacio al inicio)
 ssh user@192.168.1.1
⚠️ Doble filo: ignorespace protege al usuario legítimo, pero también puede ser usado por un atacante para ejecutar comandos sin dejar rastro en los logs locales.
💡 Recuerda: Tras modificar ~/.bashrc, ejecuta source ~/.bashrc o abre una nueva sesión para que los cambios surtan efecto.

Ejercicio Práctico Final

Flujo completo que cubre detección de vectores, configuración del historial y verificación de permisos.

🏋️ Ejercicio — Auditoría y Hardening Básico
PASO 1 — Identificar binarios SUID en el sistema
bash
find / -type f -perm /4000 2>/dev/null | sort
PASO 2 — Comprobar permisos sudo del usuario
bash
sudo -l
PASO 3 — Ver el historial actual
bash
cat ~/.bash_history | wc -l   # Número de entradas
history 20                    # Últimas 20 entradas
PASO 4 — Configurar restricciones del historial
bash
echo 'export HISTSIZE=2000'           >> ~/.bashrc
echo 'export HISTFILESIZE=4000'       >> ~/.bashrc
echo 'export HISTCONTROL=ignoreboth'  >> ~/.bashrc
source ~/.bashrc
PASO 5 — Verificar permisos de archivos críticos
bash
ls -la /etc/passwd /etc/shadow /etc/sudoers
Permisos esperados (correctos)
-rw-r--r-- 1 root root   /etc/passwd    ← 644
-rw-r----- 1 root shadow /etc/shadow    ← 640
-r--r----- 1 root root   /etc/sudoers   ← 440
PASO 6 — Revisar logs de autenticación recientes
bash
grep "FAILED\|sudo" /var/log/auth.log 2>/dev/null | tail -15
# En sistemas con journald:
journalctl -u ssh --since "today" | tail -15