Translated ['', 'src/pentesting-cloud/azure-security/az-enumeration-tool

This commit is contained in:
Translator
2026-05-26 19:13:00 +00:00
parent 3c060f54a8
commit 2936c3701e
@@ -1,11 +1,11 @@
# Az - Narzędzia do enumeracji
# Az - Enumeration Tools
{{#include ../../banners/hacktricks-training.md}}
## Instalacja PowerShell w systemie linux
## Zainstaluj PowerShell w Linux
> [!TIP]
> W systemie linux będziesz musiał zainstalować PowerShell Core:
> W Linux będziesz musiał zainstalować PowerShell Core:
```bash
sudo apt-get update
sudo apt-get install -y wget apt-transport-https software-properties-common
@@ -28,11 +28,11 @@ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
Instrukcje z [**documentation**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4):
1. Zainstaluj `brew`, jeśli jeszcze nie jest zainstalowany:
1. Zainstaluj `brew`, jeśli nie jest jeszcze zainstalowany:
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
2. Zainstaluj najnowsze stabilne wydanie PowerShell:
2. Zainstaluj najnowszą stabilną wersję PowerShell:
```sh
brew install powershell/tap/powershell
```
@@ -45,23 +45,23 @@ pwsh
brew update
brew upgrade powershell
```
## Główne narzędzia do enumeracji
## Główne narzędzia enumeracji
### az cli
[**Azure Command-Line Interface (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) jest narzędziem wieloplatformowym napisanym w Pythonie do zarządzania i administrowania (większością) zasobów Azure i Entra ID. Łączy się z Azure i wykonuje polecenia administracyjne przez wiersz poleceń lub skrypty.
[**Azure Command-Line Interface (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) to wieloplatformowe narzędzie napisane w Pythonie do zarządzania i administrowania (większością) zasobów Azure i Entra ID. Łączy się z Azure i wykonuje polecenia administracyjne za pośrednictwem wiersza poleceń lub skryptów.
Follow this link for the [**installation instructions¡**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install).
Skorzystaj z tego linku, aby zobaczyć [**instrukcje instalacji¡**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install).
Polecenia w Azure CLI są zorganizowane według wzorca: `az <service> <action> <parameters>`
#### Debugowanie | MitM az cli
#### Debug | MitM az cli
Używając parametru **`--debug`**, można zobaczyć wszystkie żądania, które narzędzie **`az`** wysyła:
Używając parametru **`--debug`** można zobaczyć wszystkie requesty, które narzędzie **`az`** wysyła:
```bash
az account management-group list --output table --debug
```
Aby przeprowadzić **MitM** wobec narzędzia i ręcznie **sprawdzić wszystkie wysyłane przez nie żądania**, możesz zrobić:
Aby wykonać **MitM** na narzędziu i **ręcznie sprawdzić wszystkie wysyłane przez nie żądania**, możesz użyć:
{{#tabs }}
{{#tab name="Bash" }}
@@ -105,17 +105,17 @@ $env:HTTP_PROXY="http://127.0.0.1:8080"
{{#endtabs }}
<details>
<summary><strong>Naprawa “CA cert does not include key usage extension”</strong></summary>
<summary><strong>Naprawianie „CA cert does not include key usage extension”</strong></summary>
### Dlaczego pojawia się błąd
### Dlaczego pojawia się ten błąd
Gdy Azure CLI się uwierzytelnia, wykonuje żądania HTTPS (przez MSAL → Requests → OpenSSL). Jeśli przechwytujesz TLS za pomocą Burp, Burp generuje „w locie” certyfikaty dla serwisów takich jak `login.microsoftonline.com` i podpisuje je za pomocą CA Burp.
Gdy Azure CLI się uwierzytelnia, wysyła żądania HTTPS (przez MSAL → Requests → OpenSSL). Jeśli przechwytujesz TLS za pomocą Burp, Burp generuje certyfikaty „on the fly” dla stron takich jak `login.microsoftonline.com` i podpisuje je swoim CA.
Na nowszych stosach (Python 3.13 + OpenSSL 3) walidacja CA jest surowsza:
W nowszych stackach (Python 3.13 + OpenSSL 3) walidacja CA jest bardziej rygorystyczna:
- Certyfikat CA musi zawierać **Basic Constraints: `CA:TRUE`** oraz rozszerzenie **Key Usage** pozwalające na podpisywanie certyfikatów (**`keyCertSign`**, i zwykle **`cRLSign`**).
- Certyfikat CA musi zawierać **Basic Constraints: `CA:TRUE`** oraz rozszerzenie **Key Usage** zezwalające na podpisywanie certyfikatów (**`keyCertSign`**, a zwykle także **`cRLSign`**).
Domyślne CA Burp (PortSwigger CA) jest przestarzałe i zazwyczaj nie ma rozszerzenia Key Usage, więc OpenSSL odrzuca je nawet jeśli je „ufasz”.
Domyślny CA Burp (PortSwigger CA) jest stary i zwykle nie ma rozszerzenia Key Usage, więc OpenSSL odrzuca go nawet jeśli „mu ufasz”.
To powoduje błędy takie jak:
@@ -123,24 +123,24 @@ To powoduje błędy takie jak:
- `CERTIFICATE_VERIFY_FAILED`
- `self-signed certificate in certificate chain`
Więc musisz:
Dlatego musisz:
1. Utworzyć nowoczesne CA (z poprawnym Key Usage).
2. Sprawić, by Burp używał go do podpisywania przechwytywanych certyfikatów.
1. Utworzyć nowoczesny CA (z poprawnym Key Usage).
2. Skonfigurować Burp, aby używał go do podpisywania przechwyconych certyfikatów.
3. Zaufać temu CA w macOS.
4. Wskazać Azure CLI / Requests na ten bundel CA.
4. Skierować Azure CLI / Requests na ten bundle CA.
### Krok po kroku: działająca konfiguracja
#### 0) Wymagania wstępne
- Burp uruchomiony lokalnie (proxy na `127.0.0.1:8080`)
- Azure CLI zainstalowany (Homebrew)
- Masz dostęp do `sudo` (by zaufać CA w systemowym pęku kluczy)
- Zainstalowane Azure CLI (Homebrew)
- Możesz użyć `sudo` (żeby zaufać CA w systemowym keychain)
#### 1) Utwórz zgodne ze standardami CA dla Burp (PEM + KEY)
#### 1) Utwórz zgodny ze standardem Burp CA (PEM + KEY)
Create an OpenSSL config file that explicitly sets CA extensions:
Utwórz plik konfiguracyjny OpenSSL, który jawnie ustawia rozszerzenia CA:
```bash
mkdir -p ~/burp-ca && cd ~/burp-ca
@@ -164,7 +164,7 @@ subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
EOF
```
Wygeneruj certyfikat CA + klucz prywatny:
Wygeneruj certyfikat CA + private key:
```bash
openssl req -x509 -new -nodes \
-days 3650 \
@@ -172,18 +172,18 @@ openssl req -x509 -new -nodes \
-out burp-ca.pem \
-config burp-ca.cnf
```
Sprawdzenie poprawności (MUSISZ zobaczyć Key Usage):
Sanity check (MUSISZ zobaczyć Key Usage):
```bash
openssl x509 -in burp-ca.pem -noout -text | egrep -A3 "Basic Constraints|Key Usage"
```
Powinno zawierać coś w stylu:
Oczekiwano czegoś takiego jak:
- `CA:TRUE`
- `Key Usage: ... Certificate Sign, CRL Sign`
#### 2) Konwersja do PKCS#12 (format importu dla Burp)
#### 2) Convert to PKCS#12 (Burp import format)
Burp potrzebuje certificate + private key, najprościej jako PKCS#12:
Burp potrzebuje certificate + private key, najłatwiej jako PKCS#12:
```bash
openssl pkcs12 -export \
-out burp-ca.p12 \
@@ -191,41 +191,41 @@ openssl pkcs12 -export \
-in burp-ca.pem \
-name "Burp Custom Root CA"
```
Zostaniesz poproszony o hasło eksportu (ustaw je; Burp o nie poprosi).
Zostaniesz poproszony o hasło eksportu (ustaw je; Burp zapyta o nie).
#### 3) Zaimportuj CA do Burp i uruchom Burp ponownie
W Burp:
- Proxy → Opcje
- Znajdź Import / export certyfikatu CA
- Kliknij Importuj certyfikat CA
- Proxy → Options
- Znajdź Import / export CA certificate
- Kliknij Import CA certificate
- Wybierz PKCS#12
- Wskaż `burp-ca.p12`
- Wybierz `burp-ca.p12`
- Wprowadź hasło
- Uruchom Burp całkowicie ponownie (ważne)
Dlaczego restart? Burp może nadal używać starego CA aż do ponownego uruchomienia.
Dlaczego restart? Burp może nadal używać starego CA do czasu restartu.
#### 4) Zaufaj nowemu CA w macOS systemowym pęku kluczy
#### 4) Zaufaj nowemu CA w systemowym keychain macOS
To pozwoli aplikacjom systemowym i wielu stosom TLS zaufać CA.
To pozwala systemowym aplikacjom i wielu stosom TLS ufać CA.
```bash
sudo security add-trusted-cert \
-d -r trustRoot \
-k /Library/Keychains/System.keychain \
~/burp-ca/burp-ca.pem
```
(Jeśli wolisz GUI: Keychain Access → System → Certificates → import → set “Always Trust”.)
(Jeśli wolisz GUI: Keychain Access → System → Certificates → import → ustaw „Always Trust”.)
#### 5) Skonfiguruj zmienne środowiskowe proxy
```bash
export HTTPS_PROXY="http://127.0.0.1:8080"
export HTTP_PROXY="http://127.0.0.1:8080"
```
#### 6) Skonfiguruj Requests/Azure CLI, aby ufały twojemu Burp CA
#### 6) Skonfiguruj Requests/Azure CLI, aby ufały Twojemu Burp CA
Azure CLI używa wewnętrznie Python Requests; ustaw oba z nich:
Azure CLI używa wewnętrznie Python Requests; ustaw oba te:
```bash
export REQUESTS_CA_BUNDLE="$HOME/burp-ca/burp-ca.pem"
export SSL_CERT_FILE="$HOME/burp-ca/burp-ca.pem"
@@ -233,24 +233,24 @@ export SSL_CERT_FILE="$HOME/burp-ca/burp-ca.pem"
Notatki:
- `REQUESTS_CA_BUNDLE` jest używany przez Requests.
- `SSL_CERT_FILE` pomaga innym klientom TLS i w przypadkach brzegowych.
- Zazwyczaj nie potrzebujesz już starych `ADAL_PYTHON_SSL_NO_VERIFY` / `AZURE_CLI_DISABLE_CONNECTION_VERIFICATION`, gdy CA jest poprawny.
- `SSL_CERT_FILE` pomaga dla innych klientów TLS i przypadków brzegowych.
- Zwykle nie potrzebujesz już starych `ADAL_PYTHON_SSL_NO_VERIFY` / `AZURE_CLI_DISABLE_CONNECTION_VERIFICATION`, gdy CA jest poprawne.
#### 7) Zweryfikuj, że Burp rzeczywiście podpisuje certyfikaty twoim nowym CA (krytyczna kontrola)
#### 7) Verify Burp is actually signing with your new CA (critical check)
To potwierdza, że twój łańcuch przechwytywania jest poprawny:
To potwierdza, że łańcuch przechwytywania jest poprawny:
```bash
openssl s_client -connect login.microsoftonline.com:443 \
-proxy 127.0.0.1:8080 </dev/null 2>/dev/null \
| openssl x509 -noout -issuer
```
Oczekiwany wystawca (issuer) zawiera nazwę twojego CA, np.:
Oczekiwany issuer zawiera nazwę twojego CA, np.:
`O=Burp Custom CA, CN=Burp Custom Root CA`
Jeśli nadal widzisz PortSwigger CA, Burp nie używa zaimportowanego CA → sprawdź import i uruchom ponownie.
Jeśli nadal widzisz PortSwigger CA, Burp nie używa twojego zaimportowanego CA → sprawdź ponownie import i uruchom ponownie.
#### 8) Zweryfikuj, czy Python Requests działa przez Burp
#### 8) Verify Python Requests works through Burp
```bash
python3 - <<'EOF'
import requests
@@ -258,61 +258,61 @@ requests.get("https://login.microsoftonline.com")
print("OK")
EOF
```
Oczekiwane: `OK`
OK
#### 9) Test Azure CLI
```bash
az account get-access-token --resource=https://management.azure.com/
```
Jeśli jesteś już zalogowany, powinno zwrócić JSON z `accessToken`.
Jeśli jesteś już zalogowany, powinien zwrócić JSON z `accessToken`.
</details>
### Az PowerShell
Azure PowerShell to moduł z cmdletami do zarządzania zasobami Azure bezpośrednio z wiersza poleceń PowerShell.
Azure PowerShell to moduł z cmdletami do zarządzania zasobami Azure bezpośrednio z linii poleceń PowerShell.
Follow this link for the [**installation instructions**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell).
Przejdź pod ten link po [**instructions instalacji**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell).
Polecenia w Azure PowerShell AZ Module mają strukturę: `<Action>-Az<Service> <parameters>`
Komendy w Azure PowerShell AZ Module są zbudowane w taki sposób: `<Action>-Az<Service> <parameters>`
#### Debug | MitM Az PowerShell
Używając parametru **`-Debug`** można zobacz wszystkie żądania wysyłane przez narzędzie:
Używając parametru **`-Debug`** możliwe jest zobaczenie wszystkich requestów, które narzędzie wysyła:
```bash
Get-AzResourceGroup -Debug
```
In order to do a **MitM** to the tool and **check all the requests** it's sending manually you can set the env variables `HTTPS_PROXY` and `HTTP_PROXY` according to the [**docs**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy).
Aby wykonać **MitM** na tym narzędziu i **sprawdzić ręcznie wszystkie requests**, które wysyła, możesz ustawić zmienne env `HTTPS_PROXY` i `HTTP_PROXY` zgodnie z [**docs**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy).
### Microsoft Graph PowerShell
Microsoft Graph PowerShell to wieloplatformowe SDK, które umożliwia dostęp do wszystkich Microsoft Graph APIs, w tym usług takich jak SharePoint, Exchange i Outlook, wykorzystując pojedynczy endpoint. Wspiera PowerShell 7+, nowoczesną autentykację za pomocą MSAL, tożsamości zewnętrzne oraz zaawansowane zapytania. Skupiając się na zasadzie najmniejszych uprawnień, zapewnia bezpieczne operacje i otrzymuje regularne aktualizacje, aby być zgodnym z najnowszymi funkcjami Microsoft Graph API.
Microsoft Graph PowerShell to cross-platform SDK, które umożliwia dostęp do wszystkich Microsoft Graph APIs, w tym usług takich jak SharePoint, Exchange i Outlook, używając jednego endpoint. Obsługuje PowerShell 7+, nowoczesną authentication przez MSAL, external identities oraz advanced queries. Skupiając się na least privilege access, zapewnia secure operations i otrzymuje regularne updates, aby nadążać za najnowszymi funkcjami Microsoft Graph API.
Follow this link for the [**installation instructions**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation).
Skorzystaj z tego linku do [**installation instructions**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation).
Commands in Microsoft Graph PowerShell are structured like: `<Action>-Mg<Service> <parameters>`
Commands w Microsoft Graph PowerShell są zbudowane tak: `<Action>-Mg<Service> <parameters>`
#### Debug Microsoft Graph PowerShell
Używając parametru **`-Debug`** można zobaczyć wszystkie żądania, które narzędzie wysyła:
Używając parametru **`-Debug`** można zobaczyć wszystkie requests, które narzędzie wysyła:
```bash
Get-MgUser -Debug
```
### ~~**AzureAD Powershell**~~
Moduł Azure Active Directory (AD), obecnie **deprecated**, jest częścią Azure PowerShell służącą do zarządzania zasobami Azure AD. Udostępnia cmdlety do zadań takich jak zarządzanie użytkownikami, grupami i rejestracjami aplikacji w Entra ID.
Moduł Azure Active Directory (AD), obecnie **deprecated**, jest częścią Azure PowerShell do zarządzania zasobami Azure AD. Udostępnia cmdlets do zadań takich jak zarządzanie użytkownikami, grupami i rejestracjami aplikacji w Entra ID.
> [!TIP]
> Zostało to zastąpione przez Microsoft Graph PowerShell
Kliknij ten link, aby przejść do [**installation instructions**](https://www.powershellgallery.com/packages/AzureAD).
Przejdź pod ten link po [**instrukcje instalacji**](https://www.powershellgallery.com/packages/AzureAD).
## Zautomatyzowany rekonesans i narzędzia do zgodności
## Automated Recon & Compliance Tools
### [turbot azure plugins](https://github.com/orgs/turbot/repositories?q=mod-azure)
Turbot wraz ze steampipe i powerpipe umożliwia zbieranie informacji z Azure i Entra ID oraz przeprowadzanie kontroli zgodności i wykrywanie błędnych konfiguracji. Obecnie najbardziej zalecane moduły Azure do uruchomienia to:
Turbot z steampipe i powerpipe pozwala zbierać informacje z Azure i Entra ID oraz wykonywać kontrole compliance i znajdować misconfigurations. Obecnie najbardziej zalecane moduły Azure do uruchomienia to:
- [https://github.com/turbot/steampipe-mod-azure-compliance](https://github.com/turbot/steampipe-mod-azure-compliance)
- [https://github.com/turbot/steampipe-mod-azure-insights](https://github.com/turbot/steampipe-mod-azure-insights)
@@ -343,9 +343,9 @@ powerpipe server
```
### [Prowler](https://github.com/prowler-cloud/prowler)
Prowler to narzędzie bezpieczeństwa open source służące do przeprowadzania ocen zgodności z najlepszymi praktykami bezpieczeństwa, audytów, reagowania na incydenty, ciągłego monitoringu, hardeningu oraz przygotowania do forensics w środowiskach AWS, Azure, Google Cloud i Kubernetes.
Prowler to Open Source narzędzie bezpieczeństwa do wykonywania ocen dobrych praktyk bezpieczeństwa dla AWS, Azure, Google Cloud i Kubernetes, audytów, incident response, continuous monitoring, hardening oraz forensics readiness.
Umożliwia uruchomienie setek testów przeciwko środowisku Azure w celu wykrycia nieprawidłowych konfiguracji bezpieczeństwa oraz zebrania wyników w formacie json (i innych formatach tekstowych) albo przeglądania ich przez interfejs webowy.
W praktyce pozwala nam uruchomić setki checks przeciwko środowisku Azure, aby znaleźć błędne konfiguracje bezpieczeństwa i zebrać wyniki w json (oraz innych formatach tekstowych) albo sprawdzać je w web.
```bash
# Create a application with Reader role and set the tenant ID, client ID and secret in prowler so it access the app
@@ -367,9 +367,9 @@ docker run --rm -e "AZURE_CLIENT_ID=<client-id>" -e "AZURE_TENANT_ID=<tenant-id>
```
### [Monkey365](https://github.com/silverhack/monkey365)
Pozwala na automatyczne przeprowadzanie przeglądów konfiguracji bezpieczeństwa subskrypcji Azure i Microsoft Entra ID.
Pozwala automatycznie przeprowadzać przeglądy konfiguracji bezpieczeństwa subskrypcji Azure i Microsoft Entra ID.
Raporty HTML są przechowywane w katalogu `./monkey-reports` w folderze repozytorium github.
Raporty HTML są przechowywane w katalogu `./monkey-reports` wewnątrz folderu repozytorium github.
```bash
git clone https://github.com/silverhack/monkey365
Get-ChildItem -Recurse monkey365 | Unblock-File
@@ -390,7 +390,7 @@ Invoke-Monkey365 -TenantId <tenant-id> -ClientId <client-id> -ClientSecret $Secu
```
### [ScoutSuite](https://github.com/nccgroup/ScoutSuite)
Scout Suite zbiera dane konfiguracyjne do ręcznej inspekcji i wyróżnia obszary ryzyka. To narzędzie do audytu bezpieczeństwa dla środowisk multi-cloud, umożliwiające ocenę stanu bezpieczeństwa tych środowisk.
Scout Suite zbiera dane konfiguracyjne do manualnej inspekcji i wyróżnia obszary ryzyka. To wielochmurowe narzędzie do security-auditing, które umożliwia ocenę security posture środowisk cloud.
```bash
virtualenv -p python3 venv
source venv/bin/activate
@@ -406,18 +406,26 @@ python scout.py azure --cli
```
### [Azure-MG-Sub-Governance-Reporting](https://github.com/JulianHayward/Azure-MG-Sub-Governance-Reporting)
To skrypt powershell, który pomaga Ci **zwizualizować wszystkie zasoby i uprawnienia w ramach Management Group i tenantu Entra ID** oraz wykryć nieprawidłowe konfiguracje bezpieczeństwa.
To jest skrypt powershell, który pomaga **zwizualizować wszystkie zasoby i uprawnienia wewnątrz Management Group oraz tenanta Entra ID** i znaleźć błędne konfiguracje bezpieczeństwa.
Działa przy użyciu Az PowerShell module, więc każde uwierzytelnianie obsługiwane przez to narzędzie jest obsługiwane.
Działa przy użyciu modułu Az PowerShell, więc każde uwierzytelnianie obsługiwane przez to narzędzie jest obsługiwane przez to narzędzie.
```bash
import-module Az
.\AzGovVizParallel.ps1 -ManagementGroupId <management-group-id> [-SubscriptionIdWhitelist <subscription-id>]
```
## Zautomatyzowane narzędzia Post-Exploitation
### [**ROADRecon**](https://github.com/dirkjanm/ROADtools)
### [**ROADtools**](https://github.com/dirkjanm/ROADtools) / ROADrecon / ROADtx
Enumeration narzędzia ROADRecon oferuje informacje o konfiguracji Entra ID, takie jak użytkownicy, grupy, role, polityki warunkowego dostępu...
ROADtools to jedna z głównych open-source frameworków do offensive research w Entra ID. Najbardziej istotne komponenty to:
- **`roadrecon`**: discovery tenantu i generowanie lokalnego datasetu (users, groups, roles, devices, service principals, applications, directory settings).
- **`roadtx`**: token acquisition/exchange, ponowne użycie refresh-token, device registration oraz workflow PRT.
- **`roadlib`**: niższopoziomowa biblioteka auth/API używana przez pozostałe moduły.
Zebrane dane są przechowywane w lokalnej bazie danych SQLite i można je przeglądać w web UI ROADrecon, co jest przydatne do mapowania privileged users, role assignments, devices, service principals oraz relacji między applications przed planowaniem persistence lub lateral movement.
#### Zbieranie ROADrecon
```bash
cd ROADTools
pipenv shell
@@ -428,19 +436,52 @@ roadrecon auth --as-app --client "<client-id>" --password "<secret>" --tenant "<
roadrecon gather
roadrecon gui
```
ROADrecon pierwotnie był skierowany na Azure AD Graph. Od **22 maja 2026**, oficjalne repozytorium nadal utrzymuje wsparcie dla Microsoft Graph w gałęzi **`msgraph`**, a community forks, takie jak **Tom2Byrne/ROADtools**, nadal aktualizują zbieranie danych oparte na Graph. W buildach obsługujących Graph, ROADrecon dodaje przełącznik **`-mg`**, aby wyliczać endpointy takie jak **`/users`**, **`/groups`**, **`/devices`**, **`/servicePrincipals`** oraz **`/applications`**.
```bash
# Graph-capable ROADrecon builds
roadrecon auth -u test@corp.onmicrosoft.com -p "Welcome2022!"
roadrecon gather -mg
roadrecon gui
```
#### Wysokowartościowe use cases ROADtx
Jeśli masz już poprawne credentials, refresh token albo sesję pochodzącą z PRT, ROADtx jest często używany do:
- **Register a rogue Entra ID device** przeciwko **`urn:ms-drs:enterpriseregistration.windows.net`** w celu uzyskania device keys/certificates i utworzenia trwałego access opartego na device.
- **Exchange/reuse refresh tokens** aby uzyskać świeże Microsoft Graph lub inne resource tokens bez ponownego interaktywnego sign-in.
- **Abuse PRT workflows** aby po cichu mintować nowe access tokens w tle.
Pomocna wskazówka huntingowa jest taka, że domyślne wartości **`roadtx device`** historycznie były:
- **OS**: `Windows`
- **OS version**: `10.0.19041.928`
- **Name**: `DESKTOP-<RANDOM 8 DIGITS>`
Te wartości łatwo zmienić, więc traktuj je jako **weak indicators**. Nadal są przydatne, gdy korelujesz je z nietypowymi eventami device registration, niekorporacyjnymi wzorcami nazewnictwa, podejrzanymi source IPs/geos/ASNs lub scriptowymi user agents.
#### Uwagi opsec / hunting dotyczące ROADtools
Ponieważ ROADtools używa legalnych Microsoft identity APIs, defenderzy powinni huntować **kombinację** aktywności tokenów, wzorców enumeration i anomalii user-agent zamiast oczekiwać sygnatur podobnych do malware. Przydatne sygnały obejmują:
- Operacje audytowe **Device registration**, takie jak `Add device`, `Add registered owner to device`, `Add registered user to device` oraz `Register device`
- Requests lub sign-ins powiązane z **Device Registration Service**
- Script-like user agents, takie jak **`python-requests`**, **`urllib`** lub **`curl`**
- Burstowe odczyty Microsoft Graph do endpointów intensywnie używanych do discovery, takich jak **`/users`**, **`/groups`**, **`/devices`**, **`/servicePrincipals`** i **`/applications`**
- Silne OAuth scopes pojawiające się w danych audytowych, zwłaszcza **`Directory.ReadWrite.All`**, **`Device.ReadWrite.All`**, **`Application.ReadWrite.All`**, **`AuditLog.ReadWrite.All`** oraz **`Policy.ReadWrite.All`**
### [**AzureHound**](https://github.com/BloodHoundAD/AzureHound)
AzureHound jest kolektorem BloodHound dla Microsoft Entra ID i Azure. Jest to pojedynczy statyczny plik binarny w Go dla Windows/Linux/macOS, który łączy się bezpośrednio z:
- Microsoft Graph (katalog Entra ID, M365) oraz
- Azure Resource Manager (ARM) control plane (subskrypcje, grupy zasobów, compute, storage, Key Vault, App Services, AKS, itd.)
AzureHound jest kolektorem BloodHound dla Microsoft Entra ID i Azure. To pojedynczy statyczny binarny plik Go dla Windows/Linux/macOS, który komunikuje się bezpośrednio z:
- Microsoft Graph (Entra ID directory, M365) oraz
- Azure Resource Manager (ARM) control plane (subscriptions, resource groups, compute, storage, key vault, app services, AKS, itd.)
Główne cechy
- Działa z dowolnego miejsca w publicznym internecie wobec tenant API (nie wymaga dostępu do sieci wewnętrznej)
- Generuje JSON do importu przez BloodHound CE, umożliwiając wizualizację ścieżek ataku między tożsamościami a zasobami w chmurze
- Domyślny User-Agent zaobserwowany: azurehound/v2.x.x
Kluczowe cechy
- Działa z dowolnego miejsca w publicznym internecie przeciwko tenant APIs (nie jest wymagany dostęp do wewnętrznej sieci)
- Generuje JSON do ingestion w BloodHound CE, aby wizualizować attack paths między identities i cloud resources
- Domyślny User-Agent obserwowany: azurehound/v2.x.x
Opcje uwierzytelniania
- Nazwa użytkownika + hasło: -u <upn> -p <password>
Opcje authentication
- Username + password: -u <upn> -p <password>
- Refresh token: --refresh-token <rt>
- JSON Web Token (access token): --jwt <jwt>
- Service principal secret: -a <appId> -s <secret>
@@ -481,37 +522,37 @@ azurehound list storage-containers -t "<tenant-id>" -o containers.json
azurehound list web-apps -t "<tenant-id>" -o webapps.json
azurehound list function-apps -t "<tenant-id>" -o funcapps.json
```
Co jest zapytywane
Co jest queryowane
- Graph endpoints (przykłady):
- /v1.0/organization, /v1.0/users, /v1.0/groups, /v1.0/roleManagement/directory/roleDefinitions, directoryRoles, owners/members
- ARM endpoints (przykłady):
- management.azure.com/subscriptions/.../providers/Microsoft.Storage/storageAccounts
- .../Microsoft.KeyVault/vaults, .../Microsoft.Compute/virtualMachines, .../Microsoft.Web/sites, .../Microsoft.ContainerService/managedClusters
Preflight behavior and endpoints
- Każda komenda azurehound list <object> zazwyczaj wykonuje te wywołania testowe przed enumeracją:
1) Platforma tożsamości: login.microsoftonline.com
Zachowanie preflight i endpoints
- Każdy azurehound list <object> zazwyczaj wykonuje te testowe calls przed enumeracją:
1) Identity platform: login.microsoftonline.com
2) Graph: GET https://graph.microsoft.com/v1.0/organization
3) ARM: GET https://management.azure.com/subscriptions?api-version=...
- Podstawowe URL-e środowiska cloud różnią się dla Government/China/Germany. Zobacz constants/environments.go w repo.
- Bazowe URL-e cloud environment różnią się dla Government/China/Germany. Zobacz constants/environments.go w repo.
ARM-heavy objects (less visible in Activity/Resource logs)
- The following list targets predominantly use ARM control plane reads: automation-accounts, container-registries, function-apps, key-vaults, logic-apps, managed-clusters, management-groups, resource-groups, storage-accounts, storage-containers, virtual-machines, vm-scale-sets, web-apps.
- These GET/list operations are typically not written to Activity Logs; data-plane reads (e.g., *.blob.core.windows.net, *.vault.azure.net) are covered by Diagnostic Settings at the resource level.
ARM-heavy obiekty (mniej widoczne w Activity/Resource logs)
- Poniższa lista targets używa głównie odczytów ARM control plane: automation-accounts, container-registries, function-apps, key-vaults, logic-apps, managed-clusters, management-groups, resource-groups, storage-accounts, storage-containers, virtual-machines, vm-scale-sets, web-apps.
- Te operacje GET/list zazwyczaj nie są zapisywane w Activity Logs; odczyty data-plane (np. *.blob.core.windows.net, *.vault.azure.net) są objęte Diagnostic Settings na poziomie resource.
OPSEC and logging notes
- Microsoft Graph Activity Logs are not enabled by default; enable and export to SIEM to gain visibility of Graph calls. Expect the Graph preflight GET /v1.0/organization with UA azurehound/v2.x.x.
- Entra ID non-interactive sign-in logs record the identity platform auth (login.microsoftonline.com) used by AzureHound.
- ARM control-plane read/list operations are not recorded in Activity Logs; many azurehound list operations against resources wont appear there. Only data-plane logging (via Diagnostic Settings) will capture reads to service endpoints.
- Defender XDR GraphApiAuditEvents (preview) can expose Graph calls and token identifiers but may lack UserAgent and have limited retention.
Uwagi OPSEC i logging
- Microsoft Graph Activity Logs nie są domyślnie włączone; włącz je i eksportuj do SIEM, aby zyskać widoczność Graph calls. Spodziewaj się Graph preflight GET /v1.0/organization z UA azurehound/v2.x.x.
- Entra ID non-interactive sign-in logs rejestrują identity platform auth (login.microsoftonline.com) używane przez AzureHound.
- ARM control-plane read/list operations nie są zapisywane w Activity Logs; wiele azurehound list operations wobec resources nie pojawi się tam. Tylko data-plane logging (przez Diagnostic Settings) przechwyci reads do service endpoints.
- Defender XDR GraphApiAuditEvents (preview) może ujawniać Graph calls i token identifiers, ale może nie mieć UserAgent i mieć ograniczoną retencję.
Tip: When enumerating for privilege paths, dump users, groups, roles, and role assignments, then ingest in BloodHound and use prebuilt cypher queries to surface Global Administrator/Privileged Role Administrator and transitive escalation via nested groups and RBAC assignments.
Wskazówka: Podczas enumeracji dla privilege paths, zrzut users, groups, roles i role assignments, potem zaimportuj to do BloodHound i użyj gotowych cypher queries, aby wykryć Global Administrator/Privileged Role Administrator oraz transitive escalation przez nested groups i RBAC assignments.
Launch the BloodHound web with `curl -L https://ghst.ly/getbhce | docker compose -f - up` and import the `output.json` file. Then, in the EXPLORE tab, in the CYPHER section you can see a folder icon that contains pre-built queries.
Uruchom BloodHound web z `curl -L https://ghst.ly/getbhce | docker compose -f - up` i zaimportuj plik `output.json`. Następnie, w zakładce EXPLORE, w sekcji CYPHER możesz zobaczyć ikonę folderu, która zawiera pre-built queries.
### [**MicroBurst**](https://github.com/NetSPI/MicroBurst)
MicroBurst zawiera funkcje i skrypty wspierające Azure Services discovery, audyt słabej konfiguracji oraz post exploitation działania, takie jak credential dumping. Jest przeznaczony do użycia podczas penetration tests, w których używany jest Azure.
MicroBurst zawiera functions i scripts, które wspierają Azure Services discovery, weak configuration auditing oraz post exploitation actions takie jak credential dumping. Jest przeznaczony do użycia podczas penetration tests, gdzie używane jest Azure.
```bash
Import-Module .\MicroBurst.psm1
Import-Module .\Get-AzureDomainInfo.ps1
@@ -519,9 +560,9 @@ Get-AzureDomainInfo -folder MicroBurst -Verbose
```
### [**PowerZure**](https://github.com/hausec/PowerZure)
PowerZure powstał z potrzeby frameworka, który potrafi zarówno wykonywać reconnaissance, jak i exploitation Azure, EntraID oraz powiązanych z nimi zasobów.
PowerZure powstał z potrzeby stworzenia frameworka, który może zarówno wykonywać reconnaissance, jak i exploitation Azure, EntraID oraz powiązanych zasobów.
Używa modułu **Az PowerShell**, więc każde uwierzytelnienie obsługiwane przez ten moduł jest obsługiwane przez narzędzie.
Używa modułu **Az PowerShell**, więc każde uwierzytelnianie obsługiwane przez to narzędzie jest obsługiwane przez to narzędzie.
```bash
# Login
Import-Module Az
@@ -552,7 +593,7 @@ Invoke-AzureRunCommand -Command <command> -VMName <vmname>
```
### [**GraphRunner**](https://github.com/dafthack/GraphRunner/wiki/Invoke%E2%80%90GraphRunner)
GraphRunner jest zestawem narzędzi post-exploitation umożliwiającym interakcję z Microsoft Graph API. Zapewnia różne narzędzia do przeprowadzania reconnaissance, persistence oraz pozyskiwania danych z konta Microsoft Entra ID (Azure AD).
GraphRunner to zestaw narzędzi post-exploitation do interakcji z Microsoft Graph API. Zapewnia różne narzędzia do prowadzenia reconnaissance, persistence oraz pillaging danych z konta Microsoft Entra ID (Azure AD).
```bash
#A good place to start is to authenticate with the Get-GraphTokens module. This module will launch a device-code login, allowing you to authenticate the session from a browser session. Access and refresh tokens will be written to the global $tokens variable. To use them with other GraphRunner modules use the Tokens flag (Example. Invoke-DumpApps -Tokens $tokens)
Import-Module .\GraphRunner.ps1
@@ -596,9 +637,9 @@ Invoke-GraphRunner -Tokens $tokens
```
### [Stormspotter](https://github.com/Azure/Stormspotter)
Stormspotter tworzy „attack graph” zasobów w subskrypcji Azure. Umożliwia red teams i pentesters wizualizację attack surface oraz pivot opportunities w obrębie tenant i znacznie przyspiesza pracę obrońców, pozwalając im szybko się zorientować i priorytetyzować zadania związane z incident response.
Stormspotter tworzy „attack graph” zasobów w subskrypcji Azure. Umożliwia red teams i pentesters wizualizację attack surface oraz pivot opportunities w obrębie tenant, a także przyspiesza pracę defenderów, pomagając im szybko zorientować się w sytuacji i priorytetyzować incident response.
**Niestety wygląda na nieutrzymywane**.
**Niestety wygląda na unmaintained**.
```bash
# Start Backend
cd stormspotter\backend\
@@ -616,11 +657,15 @@ az login -u test@corp.onmicrosoft.com -p Welcome2022!
python stormspotter\stormcollector\sscollector.pyz cli
# This will generate a .zip file to upload in the frontend (127.0.0.1:9091)
```
## Referencje
- [Odkrywanie chmury za pomocą AzureHound (Unit 42)](https://unit42.paloaltonetworks.com/threat-actor-misuse-of-azurehound/)
- [Repozytorium AzureHound](https://github.com/SpecterOps/AzureHound)
- [Repozytorium BloodHound](https://github.com/SpecterOps/BloodHound)
- [Flagi AzureHound Community Edition](https://bloodhound.specterops.io/collect-data/ce-collection/azurehound-flags)
## References
- [Cloud Discovery With AzureHound (Unit 42)](https://unit42.paloaltonetworks.com/threat-actor-misuse-of-azurehound/)
- [Paved With Intent: ROADtools and Nation-State Tactics in the Cloud](https://unit42.paloaltonetworks.com/roadtools-cloud-attacks/)
- [ROADtools repository](https://github.com/dirkjanm/ROADtools)
- [ROADtools msgraph branch](https://github.com/dirkjanm/ROADtools/tree/msgraph)
- [Tom2Byrne/ROADtools](https://github.com/Tom2Byrne/ROADtools)
- [AzureHound repository](https://github.com/SpecterOps/AzureHound)
- [BloodHound repository](https://github.com/SpecterOps/BloodHound)
- [AzureHound Community Edition Flags](https://bloodhound.specterops.io/collect-data/ce-collection/azurehound-flags)
- [AzureHound constants/environments.go](https://github.com/SpecterOps/AzureHound/blob/main/constants/environments.go)
- [AzureHound client/storage_accounts.go](https://github.com/SpecterOps/AzureHound/blob/main/client/storage_accounts.go)
- [AzureHound client/roles.go](https://github.com/SpecterOps/AzureHound/blob/main/client/roles.go)