2375, 2376 Pentesting Docker
Docker Basics
What is
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.
Basic docker architecture
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.
Basic commands
Containerd
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
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:
Informações Básicas
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
Enumeração
Manual
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/
Automático
Comprometendo
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:
Escalada de Privilégios
Se você estiver dentro de um host que está usando docker, você pode ler esta informação para tentar elevar privilégios.
Descobrindo segredos em contêineres Docker em execução
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:
Protegendo seu Docker
Protegendo a instalação e uso do Docker
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
Protegendo Imagens Docker
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
Protegendo Dockerfiles
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
Registrando Atividades Suspeitas
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.
Monitorando o Docker
Você pode usar auditd para monitorar o docker.
Referências
Last updated