2375, 2376 Pentesting Docker
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Docker é a plataforma de ponta na indústria de containerização, liderando a inovação contínua. Facilita a criação e distribuição de aplicações de forma simples, abrangendo desde tradicionais até futuristas, e assegura seu desdobramento seguro em diversos ambientes.
containerd: Este é um runtime central para containers, encarregado da gestão abrangente do ciclo de vida de um container. Isso envolve o manuseio de transferência e armazenamento de imagens, além de supervisionar a execução, monitoramento e rede de containers. Informações mais detalhadas sobre containerd são exploradas mais a fundo.
O container-shim desempenha um papel crítico como um intermediário no manuseio de containers sem cabeça, assumindo perfeitamente o controle a partir do runc após a inicialização dos containers.
runc: Reconhecido por suas capacidades de runtime de container leve e universal, runc está alinhado com o padrão OCI. É utilizado pelo containerd para iniciar e gerenciar containers de acordo com as diretrizes OCI, tendo evoluído a partir do original libcontainer.
grpc é essencial para facilitar a comunicação entre containerd e o docker-engine, garantindo uma interação eficiente.
O OCI é fundamental na manutenção das especificações OCI para runtime e imagens, com as versões mais recentes do Docker sendo compatíveis com os padrões de imagem e runtime OCI.
Containerd foi desenvolvido especificamente para atender às necessidades de plataformas de contêiner como Docker e Kubernetes, entre outras. Seu objetivo é simplificar a execução de contêineres em vários sistemas operacionais, incluindo Linux, Windows, Solaris e mais, abstraindo a funcionalidade específica do sistema operacional e chamadas de sistema. O objetivo do Containerd é incluir apenas os recursos essenciais exigidos por seus usuários, esforçando-se para omitir componentes desnecessários. No entanto, alcançar esse objetivo completamente é reconhecido como desafiador.
Uma decisão de design chave é que Containerd não lida com redes. A rede é considerada um elemento crítico em sistemas distribuídos, com complexidades como Redes Definidas por Software (SDN) e descoberta de serviços que variam significativamente de uma plataforma para outra. Portanto, o Containerd deixa os aspectos de rede para serem gerenciados pelas plataformas que suporta.
Enquanto Docker utiliza Containerd para executar contêineres, é importante notar que o Containerd suporta apenas um subconjunto das funcionalidades do Docker. Especificamente, o Containerd não possui as capacidades de gerenciamento de rede presentes no Docker e não suporta a criação de swarms do Docker diretamente. Essa distinção destaca o papel focado do Containerd como um ambiente de execução de contêiner, delegando funcionalidades mais especializadas para as plataformas com as quais se integra.
Podman é um mecanismo de contêiner de código aberto que adere aos padrões da Open Container Initiative (OCI), desenvolvido e mantido pela Red Hat. Ele se destaca do Docker com várias características distintas, notavelmente sua arquitetura sem daemon e suporte para contêineres sem root, permitindo que os usuários executem contêineres sem privilégios de root.
Podman é projetado para ser compatível com a API do Docker, permitindo o uso de comandos da CLI do Docker. Essa compatibilidade se estende ao seu ecossistema, que inclui ferramentas como Buildah para construir imagens de contêiner e Skopeo para operações de imagem, como push, pull e inspect. Mais detalhes sobre essas ferramentas podem ser encontrados em sua página do GitHub.
Principais Diferenças
Arquitetura: Ao contrário do modelo cliente-servidor do Docker com um daemon em segundo plano, o Podman opera sem um daemon. Esse design significa que os contêineres são executados com os privilégios do usuário que os inicia, aumentando a segurança ao eliminar a necessidade de acesso root.
Integração com Systemd: O Podman se integra ao systemd para gerenciar contêineres, permitindo a gestão de contêineres através de unidades do systemd. Isso contrasta com o uso do systemd pelo Docker, principalmente para gerenciar o processo do daemon do Docker.
Contêineres Sem Root: Uma característica fundamental do Podman é sua capacidade de executar contêineres sob os privilégios do usuário que os inicia. Essa abordagem minimiza os riscos associados a brechas em contêineres, garantindo que os atacantes obtenham apenas os privilégios do usuário comprometido, e não acesso root.
A abordagem do Podman oferece uma alternativa segura e flexível ao Docker, enfatizando a gestão de privilégios do usuário e a compatibilidade com fluxos de trabalho existentes do Docker.
Note que, como o podman visa suportar a mesma API que o docker, você pode usar os mesmos comandos com podman que com docker, como:
A API Remota é executada por padrão na porta 2375 quando ativada. O serviço, por padrão, não exigirá autenticação, permitindo que um atacante inicie um contêiner docker privilegiado. Usando a API Remota, é possível anexar hosts / (diretório raiz) ao contêiner e ler/gravar arquivos do ambiente do host.
Porta padrão: 2375
Observe que, para enumerar a API do docker, você pode usar o comando docker
ou curl
, como no seguinte exemplo:
Se você pode contatar a API remota do docker com o comando docker
, você pode executar qualquer um dos comandos docker comentados anteriormente para interagir com o serviço.
Você pode export DOCKER_HOST="tcp://localhost:2375"
e evitar usar o parâmetro -H
com o comando docker
Escalação de privilégios rápida
Curl
Às vezes, você verá 2376 ativo para o endpoint TLS. Eu não consegui me conectar a ele com o cliente docker, mas é possível fazer isso com curl.
Se você quiser mais informações sobre isso, mais informações estão disponíveis de onde copiei os comandos: https://securityboulevard.com/2019/02/abusing-docker-api-socket/
Na página seguinte, você pode encontrar maneiras de escapar de um contêiner docker:
Docker SecurityAbusando disso, é possível escapar de um contêiner, você poderia executar um contêiner fraco na máquina remota, escapar dele e comprometer a máquina:
Se você estiver dentro de um host que está usando docker, você pode ler esta informação para tentar elevar privilégios.
Verifique env (seção de variáveis de ambiente) em busca de segredos e você pode encontrar:
Senhas.
IPs.
Portas.
Caminhos.
Outros… .
Se você quiser extrair um arquivo:
Você pode usar a ferramenta https://github.com/docker/docker-bench-security para inspecionar sua instalação atual do docker.
./docker-bench-security.sh
Você pode usar a ferramenta https://github.com/kost/dockscan para inspecionar sua instalação atual do docker.
dockscan -v unix:///var/run/docker.sock
Você pode usar a ferramenta https://github.com/genuinetools/amicontained para verificar os privilégios que um contêiner terá quando executado com diferentes opções de segurança. Isso é útil para conhecer as implicações de usar algumas opções de segurança para executar um contêiner:
docker run --rm -it r.j3ss.co/amicontained
docker run --rm -it --pid host r.j3ss.co/amicontained
docker run --rm -it --security-opt "apparmor=unconfined" r.j3ss.co/amicontained
Você pode usar uma imagem docker de https://github.com/quay/clair para escanear suas outras imagens docker e encontrar vulnerabilidades.
docker run --rm -v /root/clair_config/:/config -p 6060-6061:6060-6061 -d clair -config="/config/config.yaml"
clair-scanner -c http://172.17.0.3:6060 --ip 172.17.0.1 ubuntu-image
Você pode usar a ferramenta https://github.com/buddy-works/dockerfile-linter para inspecionar seu Dockerfile e encontrar todos os tipos de configurações incorretas. Cada configuração incorreta receberá um ID, você pode encontrar aqui https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md como corrigir cada uma delas.
dockerfilelinter -f Dockerfile
Você pode usar a ferramenta https://github.com/replicatedhq/dockerfilelint para inspecionar seu Dockerfile e encontrar todos os tipos de configurações incorretas.
dockerfilelint Dockerfile
Você pode usar a ferramenta https://github.com/RedCoolBeans/dockerlint para inspecionar seu Dockerfile e encontrar todos os tipos de configurações incorretas.
dockerlint Dockerfile
Você pode usar a ferramenta https://github.com/hadolint/hadolint para inspecionar seu Dockerfile e encontrar todos os tipos de configurações incorretas.
hadolint Dockerfile
Você pode usar a ferramenta https://github.com/falcosecurity/falco para detectar comportamento suspeito em contêineres em execução.
Note no seguinte trecho como Falco compila um módulo do kernel e o insere. Depois disso, ele carrega as regras e começa a registrar atividades suspeitas. Neste caso, ele detectou 2 contêineres privilegiados iniciados, 1 deles com um ponto de montagem sensível, e após alguns segundos, detectou como um shell foi aberto dentro de um dos contêineres.
Você pode usar auditd para monitorar o docker.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)