privileged flag
Last updated
Last updated
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.
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.
Para ver as capabilities que o contêiner tem acesso podemos utilizar o seguinte comando
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
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"
Após isso vamos criar o "Makefile"
Vamos compilar:
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
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.