diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index 0b85fd091..4717f4420 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -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 ` -#### 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 }}
-Naprawa “CA cert does not include key usage extension” +Naprawianie „CA cert does not include key usage extension” -### 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 \ | 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`.
### 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ę: `-Az ` +Komendy w Azure PowerShell AZ Module są zbudowane w taki sposób: `-Az ` #### Debug | MitM Az PowerShell -Używając parametru **`-Debug`** można zobaczyć 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: `-Mg ` +Commands w Microsoft Graph PowerShell są zbudowane tak: `-Mg ` #### 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=" -e "AZURE_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 -ClientId -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 [-SubscriptionIdWhitelist ] ``` ## 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 "" --password "" --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-` + +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 -p +Opcje authentication +- Username + password: -u -p - Refresh token: --refresh-token - JSON Web Token (access token): --jwt - Service principal secret: -a -s @@ -481,37 +522,37 @@ azurehound list storage-containers -t "" -o containers.json azurehound list web-apps -t "" -o webapps.json azurehound list function-apps -t "" -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 zazwyczaj wykonuje te wywołania testowe przed enumeracją: -1) Platforma tożsamości: login.microsoftonline.com +Zachowanie preflight i endpoints +- Każdy azurehound list 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 won’t 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 -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)