mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-04 11:07:37 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -34,3 +34,4 @@ Temporary Items
|
||||
book
|
||||
book/*
|
||||
hacktricks-preprocessor.log
|
||||
hacktricks-preprocessor-error.log
|
||||
|
||||
@@ -7,7 +7,14 @@ from os import path
|
||||
from urllib.request import urlopen, Request
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logging.basicConfig(filename='hacktricks-preprocessor.log', filemode='w', encoding='utf-8', level=logging.DEBUG)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
handler = logging.FileHandler(filename='hacktricks-preprocessor.log', mode='w', encoding='utf-8')
|
||||
handler.setLevel(logging.DEBUG)
|
||||
logger.addHandler(handler)
|
||||
|
||||
handler2 = logging.FileHandler(filename='hacktricks-preprocessor-error.log', mode='w', encoding='utf-8')
|
||||
handler2.setLevel(logging.ERROR)
|
||||
logger.addHandler(handler2)
|
||||
|
||||
|
||||
def findtitle(search ,obj, key, path=(),):
|
||||
@@ -45,19 +52,29 @@ def ref(matchobj):
|
||||
try:
|
||||
if href.endswith("/"):
|
||||
href = href+"README.md" # Fix if ref points to a folder
|
||||
chapter, _path = findtitle(href, book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
chapter, _path = findtitle(href, book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
except Exception as e:
|
||||
try:
|
||||
dir = path.dirname(current_chapter['source_path'])
|
||||
logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}')
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = chapter["name"]
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
except Exception as e:
|
||||
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
print(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
logger.debug(e)
|
||||
logger.error(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
@@ -85,13 +102,11 @@ def files(matchobj):
|
||||
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
logger.debug(f'Error searching file: {href}')
|
||||
print(f'Error searching file: {href}')
|
||||
logger.error(f'Error searching file: {href}')
|
||||
sys.exit(1)
|
||||
|
||||
if title=="":
|
||||
logger.debug(f'Error searching file: {href}')
|
||||
print(f'Error searching file: {href}')
|
||||
logger.error(f'Error searching file: {href}')
|
||||
sys.exit(1)
|
||||
|
||||
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
|
||||
@@ -134,10 +149,11 @@ if __name__ == '__main__':
|
||||
for chapter in iterate_chapters(book['sections']):
|
||||
logger.debug(f"Chapter: {chapter['path']}")
|
||||
current_chapter = chapter
|
||||
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
# regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n#]*(?:#(.*))?)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
new_content = re.sub(regex, ref, chapter['content'])
|
||||
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
|
||||
new_content = re.sub(regex, files, chapter['content'])
|
||||
new_content = re.sub(regex, files, new_content)
|
||||
new_content = add_read_time(new_content)
|
||||
chapter['content'] = new_content
|
||||
|
||||
|
||||
@@ -59,12 +59,12 @@ Dakle, ako imate dozvole navedene za ove fajlove, postoji vektorski napad koji v
|
||||
Pratite opis u sekciji *Zloupotreba Terraform State Fajlova* na stranici *Terraform Security* za direktno upotrebljiv kod za eksploataciju:
|
||||
|
||||
{{#ref}}
|
||||
terraform-security.md#abusing-terraform-state-files
|
||||
pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
|
||||
{{#endref}}
|
||||
|
||||
### `s3:PutBucketPolicy`
|
||||
|
||||
Napadač, koji treba da bude **iz istog naloga**, inače će se aktivirati greška `The specified method is not allowed`, sa ovom dozvolom će moći da sebi dodeli više dozvola nad bucket-ima omogućavajući mu da čita, piše, modifikuje, briše i izlaže buckete.
|
||||
Napadač, koji mora biti **iz istog naloga**, inače će se aktivirati greška `The specified method is not allowed`, sa ovom dozvolom će moći da sebi dodeli više dozvola nad bucket-ima omogućavajući mu da čita, piše, modifikuje, briše i izlaže buckete.
|
||||
```bash
|
||||
# Update Bucket policy
|
||||
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
|
||||
@@ -123,7 +123,7 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-n
|
||||
### `s3:GetBucketAcl`, `s3:PutBucketAcl`
|
||||
|
||||
Napadač bi mogao da zloupotrebi ove dozvole da **dodeli sebi veći pristup** određenim kanticama.\
|
||||
Imajte na umu da napadač ne mora biti iz istog naloga. Pored toga, pristup za pisanje
|
||||
Napomena: napadač ne mora biti iz istog naloga. Pored toga, pristup za pisanje
|
||||
```bash
|
||||
# Update bucket ACL
|
||||
aws s3api get-bucket-acl --bucket <bucket-name>
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
Za više informacija o Azure App uslugama, proverite:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-app-service.md
|
||||
../az-services/az-app-services.md
|
||||
{{#endref}}
|
||||
|
||||
### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read
|
||||
|
||||
Ove dozvole omogućavaju pristup **SSH shell-u** unutar web aplikacije. Takođe omogućavaju **debug** aplikacije.
|
||||
Ove dozvole omogućavaju pristup **SSH shell** unutar web aplikacije. Takođe omogućavaju **debug** aplikacije.
|
||||
|
||||
- **SSH u jednoj komandi**:
|
||||
```bash
|
||||
@@ -32,16 +32,16 @@ az webapp create-remote-connection --name <name> --resource-group <res-group>
|
||||
## So from that machine ssh into that port (you might need generate a new ssh session to the jump host)
|
||||
ssh root@127.0.0.1 -p 39895
|
||||
```
|
||||
- **Debug the application**:
|
||||
- **Debugujte aplikaciju**:
|
||||
1. Instalirajte Azure ekstenziju u VScode.
|
||||
2. Prijavite se u ekstenziju sa Azure nalogom.
|
||||
3. Prikazujte sve App usluge unutar pretplate.
|
||||
4. Izaberite App uslugu koju želite da debagujete, kliknite desnim tasterom i izaberite "Start Debugging".
|
||||
5. Ako aplikacija nema omogućeno debagovanje, ekstenzija će pokušati da ga omogući, ali vaš nalog treba da ima dozvolu `Microsoft.Web/sites/config/write` da bi to uradio.
|
||||
4. Izaberite App uslugu koju želite da debugujete, desni klik i izaberite "Start Debugging".
|
||||
5. Ako aplikacija nema omogućeno debugovanje, ekstenzija će pokušati da ga omogući, ali vaš nalog treba da ima dozvolu `Microsoft.Web/sites/config/write` da bi to uradio.
|
||||
|
||||
### Obtaining SCM Credentials & Enabling Basic Authentication
|
||||
### Dobijanje SCM kredencijala i omogućavanje osnovne autentifikacije
|
||||
|
||||
Da biste dobili SCM akreditive, možete koristiti sledeće **komande i dozvole**:
|
||||
Da biste dobili SCM kredencijale, možete koristiti sledeće **komande i dozvole**:
|
||||
|
||||
- Dozvola **`Microsoft.Web/sites/publishxml/action`** omogućava pozivanje:
|
||||
```bash
|
||||
@@ -124,14 +124,14 @@ az webapp deployment user set \
|
||||
--user-name hacktricks \
|
||||
--password 'W34kP@ssw0rd123!'
|
||||
```
|
||||
Zatim, možete koristiti ove kredencijale da **pristupite SCM i FTP platformama**. Ovo je takođe odličan način da održite postojanost.
|
||||
Zatim, možete koristiti ove kredencijale da **pristupite SCM i FTP platformama**. Ovo je takođe odličan način za održavanje postojanosti.
|
||||
|
||||
Zapamtite da za pristup SCM platformi sa **veb-a morate pristupiti `<SCM-URL>/BasicAuth`**.
|
||||
|
||||
> [!WARNING]
|
||||
> Imajte na umu da svaki korisnik može konfigurisati svoje kredencijale pozivajući prethodnu komandu, ali ako korisnik nema dovoljno dozvola za pristup SCM-u ili FTP-u, kredencijali neće raditi.
|
||||
> Imajte na umu da svaki korisnik može konfigurisati svoje kredencijale pozivajući prethodnu komandu, ali ako korisnik nema dovoljno dozvola za pristup SCM ili FTP, kredencijali neće raditi.
|
||||
|
||||
- Ako vidite da su ti kredencijali **REDAKTOVANI**, to je zato što **morate omogućiti opciju osnovne autentifikacije SCM** i za to vam je potrebna druga dozvola (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`):
|
||||
- Ako vidite da su ti kredencijali **REDAKTOVANI**, to je zato što **morate omogućiti opciju osnovne autentifikacije za SCM** i za to vam je potrebna druga dozvola (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`):
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
@@ -216,7 +216,7 @@ Ova dozvola omogućava listanje **connection strings** i **appsettings** usluge
|
||||
az webapp config connection-string list --name <name> --resource-group <res-group>
|
||||
az webapp config appsettings list --name <name> --resource-group <res-group>
|
||||
```
|
||||
### Pročitajte Konfigurisane Akreditive Treće Strane
|
||||
### Pročitajte Konfigurisane Treće Strane Akreditive
|
||||
|
||||
Pokretanjem sledeće komande moguće je **pročitati akreditive treće strane** konfigurisane u trenutnom nalogu. Imajte na umu da, na primer, ako su neki Github akreditive konfigurisani za drugog korisnika, nećete moći da pristupite tokenu iz drugog.
|
||||
```bash
|
||||
@@ -250,13 +250,13 @@ https://graph.microsoft.com/v1.0/me/drive/root/children
|
||||
```
|
||||
### Ažurirajte kod aplikacije iz izvora
|
||||
|
||||
- Ako je konfigurisani izvor treća strana kao što su Github, BitBucket ili Azure Repository, možete **ažurirati kod** usluge aplikacije kompromitovanjem izvornog koda u repozitorijumu.
|
||||
- Ako je aplikacija konfigurisana koristeći **daljinski git repozitorijum** (sa korisničkim imenom i lozinkom), moguće je dobiti **URL i osnovne autentifikacione podatke** za kloniranje i slanje izmena sa:
|
||||
- Ako je konfigurisan izvor treće strane kao što su Github, BitBucket ili Azure Repository, možete **ažurirati kod** usluge aplikacije kompromitovanjem izvornog koda u repozitorijumu.
|
||||
- Ako je aplikacija konfigurisana koristeći **daljinski git repozitorij** (sa korisničkim imenom i lozinkom), moguće je dobiti **URL i osnovne autentifikacione podatke** za kloniranje i slanje izmena sa:
|
||||
- Koristeći dozvolu **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name <app-name> --resource-group <res-group>`
|
||||
- Koristeći dozvolu **`Microsoft.Web/sites/config/list/action`**:
|
||||
- `az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>`
|
||||
- `az rest --method POST --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"`
|
||||
- Ako je aplikacija konfigurisana da koristi **lokalni git repozitorijum**, moguće je **klonirati repozitorijum** i **slati izmene** u njega:
|
||||
- Ako je aplikacija konfigurisana da koristi **lokalni git repozitorij**, moguće je **klonirati repozitorij** i **slati izmene** u njega:
|
||||
- Koristeći dozvolu **`Microsoft.Web/sites/sourcecontrols/read`**: Možete dobiti URL git repozitorijuma sa `az webapp deployment source show --name <app-name> --resource-group <res-group>`, ali će to biti isto kao SCM URL aplikacije sa putanjom `/<app-name>.git` (npr. `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`).
|
||||
- Da biste dobili SCM akreditive, potrebna vam je dozvola:
|
||||
- **`Microsoft.Web/sites/publishxml/action`**: Zatim pokrenite `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>`.
|
||||
@@ -270,7 +270,7 @@ https://graph.microsoft.com/v1.0/me/drive/root/children
|
||||
|
||||
### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read`
|
||||
|
||||
Ovo je skup dozvola koje omogućavaju **modifikaciju kontejnera koji se koristi** od strane webapp-a. Napadač bi mogao da zloupotrebi to da natera webapp da izvrši zlonamerni kontejner.
|
||||
Ovo je skup dozvola koji omogućava **modifikaciju kontejnera koji se koristi** od strane webapp-a. Napadač bi mogao da zloupotrebi to da natera webapp da izvrši zlonamerni kontejner.
|
||||
```bash
|
||||
az webapp config container set \
|
||||
--name <app-name> \
|
||||
|
||||
@@ -2,51 +2,51 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnovne Informacije
|
||||
## Osnovne informacije
|
||||
|
||||
**Azure Function Apps** su **serverless compute service** koje vam omogućavaju da pokrećete male delove koda, nazvane **functions**, bez upravljanja osnovnom infrastrukturom. Dizajnirane su da izvršavaju kod kao odgovor na različite okidače, kao što su **HTTP zahtevi, tajmeri ili događaji iz drugih Azure servisa** poput Blob Storage ili Event Hubs. Function Apps podržavaju više programskih jezika, uključujući C#, Python, JavaScript i Java, što ih čini svestranim za izgradnju **event-driven applications**, automatizaciju radnih tokova ili integraciju servisa. Ekonomične su, jer obično plaćate samo za vreme obrade kada se vaš kod izvršava.
|
||||
**Azure Function Apps** su **serverless compute service** koje vam omogućavaju da pokrećete male delove koda, nazvane **functions**, bez upravljanja osnovnom infrastrukturom. Dizajnirane su da izvršavaju kod kao odgovor na različite okidače, kao što su **HTTP zahtevi, tajmeri ili događaji iz drugih Azure servisa** poput Blob Storage ili Event Hubs. Function Apps podržavaju više programskih jezika, uključujući C#, Python, JavaScript i Java, što ih čini svestranim za izgradnju **aplikacija vođenih događajima**, automatizaciju radnih tokova ili integraciju servisa. Troškovi su efikasni, jer obično plaćate samo vreme obrade kada se vaš kod izvršava.
|
||||
|
||||
> [!NOTE]
|
||||
> Imajte na umu da su **Functions podskup App Services**, stoga će mnoge funkcije o kojima se ovde govori koristiti i aplikacije kreirane kao Azure Apps (`webapp` u cli).
|
||||
|
||||
### Različiti Planovi
|
||||
### Različiti planovi
|
||||
|
||||
- **Flex Consumption Plan**: Nudi **dinamičko, event-driven skaliranje** sa plaćanjem po korišćenju, dodajući ili uklanjajući instance funkcija na osnovu potražnje. Podržava **virtual networking** i **pre-provisioned instances** kako bi se smanjili hladni startovi, što ga čini pogodnim za **varijabilne radne opterećenja** koja ne zahtevaju podršku kontejnera.
|
||||
- **Traditional Consumption Plan**: Podrazumevani serverless izbor, gde **plaćate samo za resurse obrade kada funkcije rade**. Automatski se skalira na osnovu dolaznih događaja i uključuje **optimizacije hladnog starta**, ali ne podržava implementacije kontejnera. Idealno za **intermittent workloads** koje zahtevaju automatsko skaliranje.
|
||||
- **Premium Plan**: Dizajniran za **dosledne performanse**, sa **prewarmed workers** kako bi se eliminisali hladni startovi. Nudi **produžene vreme izvršenja, virtual networking**, i podržava **custom Linux images**, što ga čini savršenim za **mission-critical applications** koje zahtevaju visoke performanse i napredne funkcije.
|
||||
- **Dedicated Plan**: Radi na posvećenim virtuelnim mašinama sa **predvidljivim naplatama** i podržava ručno ili automatsko skaliranje. Omogućava pokretanje više aplikacija na istom planu, pruža **compute isolation**, i osigurava **siguran pristup mreži** putem App Service Environments, što ga čini idealnim za **long-running applications** koje zahtevaju doslednu alokaciju resursa.
|
||||
- **Container Apps**: Omogućava implementaciju **containerized function apps** u upravljanom okruženju, zajedno sa mikroservisima i API-ima. Podržava prilagođene biblioteke, migraciju nasleđenih aplikacija, i **GPU processing**, eliminišući upravljanje Kubernetes klasterima. Idealno za **event-driven, scalable containerized applications**.
|
||||
- **Flex Consumption Plan**: Nudi **dinamičko, događajima vođeno skaliranje** sa plaćanjem po korišćenju, dodajući ili uklanjajući instance funkcija na osnovu potražnje. Podržava **virtuelno umrežavanje** i **pre-provisioned instances** kako bi se smanjili hladni startovi, što ga čini pogodnim za **varijabilne radne opterećenja** koja ne zahtevaju podršku kontejnera.
|
||||
- **Traditional Consumption Plan**: Podrazumevani serverless izbor, gde **plaćate samo za resurse obrade kada funkcije rade**. Automatski se skalira na osnovu dolaznih događaja i uključuje **optimizacije hladnog starta**, ali ne podržava implementacije kontejnera. Idealno za **povremena radna opterećenja** koja zahtevaju automatsko skaliranje.
|
||||
- **Premium Plan**: Dizajniran za **dosledne performanse**, sa **prewarmed workers** kako bi se eliminisali hladni startovi. Nudi **produžene vreme izvršenja, virtuelno umrežavanje**, i podržava **prilagođene Linux slike**, što ga čini savršenim za **aplikacije od kritične važnosti** koje zahtevaju visoke performanse i napredne funkcije.
|
||||
- **Dedicated Plan**: Radi na posvećenim virtuelnim mašinama sa **predvidljivim naplatama** i podržava ručno ili automatsko skaliranje. Omogućava pokretanje više aplikacija na istom planu, pruža **izolaciju obrade**, i osigurava **siguran pristup mreži** putem App Service Environments, što ga čini idealnim za **dugotrajne aplikacije** koje zahtevaju doslednu alokaciju resursa.
|
||||
- **Container Apps**: Omogućava implementaciju **kontejnerizovanih funkcija** u upravljanom okruženju, zajedno sa mikroservisima i API-ima. Podržava prilagođene biblioteke, migraciju nasleđenih aplikacija, i **GPU obradu**, eliminišući upravljanje Kubernetes klasterima. Idealno za **događajima vođene, skalabilne kontejnerizovane aplikacije**.
|
||||
|
||||
### **Storage Buckets**
|
||||
|
||||
Kada kreirate novu Function App koja nije kontejnerizovana (ali daje kod za izvršavanje), **kod i drugi podaci vezani za funkciju biće pohranjeni u Storage nalogu**. Podrazumevano, web konzola će kreirati novi nalog po funkciji za pohranu koda.
|
||||
|
||||
Štaviše, modifikovanjem koda unutar bucket-a (u različitim formatima u kojima može biti pohranjen), **kod aplikacije će biti modifikovan na novi i izvršen** sledeći put kada se funkcija pozove.
|
||||
Štaviše, modifikovanjem koda unutar kante (u različitim formatima u kojima može biti pohranjen), **kod aplikacije će biti modifikovan na novi i izvršen** sledeći put kada se funkcija pozove.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ovo je veoma zanimljivo iz perspektive napadača jer **pristup za pisanje preko ovog bucket-a** omogućava napadaču da **kompromituje kod i eskalira privilegije** na upravljane identitete unutar Function App-a.
|
||||
> Ovo je veoma zanimljivo iz perspektive napadača jer **pristup za pisanje preko ove kante** omogućava napadaču da **kompromituje kod i eskalira privilegije** na upravljane identitete unutar Function App-a.
|
||||
>
|
||||
> Više o ovome u **odeljku o eskalaciji privilegija**.
|
||||
|
||||
Takođe je moguće pronaći **master i functions ključeve** pohranjene u storage nalogu u kontejneru **`azure-webjobs-secrets`** unutar foldera **`<app-name>`** u JSON datotekama koje možete pronaći unutra.
|
||||
Takođe je moguće pronaći **master i funkcijske ključeve** pohranjene u storage nalogu u kontejneru **`azure-webjobs-secrets`** unutar foldera **`<app-name>`** u JSON datotekama koje možete pronaći unutra.
|
||||
|
||||
Imajte na umu da Functions takođe omogućavaju pohranu koda na udaljenoj lokaciji jednostavno označavajući URL do nje.
|
||||
Imajte na umu da Functions takođe omogućavaju pohranu koda na udaljenoj lokaciji jednostavno ukazujući na URL.
|
||||
|
||||
### Mrežno Povezivanje
|
||||
### Mrežno umrežavanje
|
||||
|
||||
Korišćenjem HTTP okidača:
|
||||
|
||||
- Moguće je dati **pristup funkciji sa celog Interneta** bez potrebe za bilo kakvom autentifikacijom ili dati pristup na osnovu IAM-a. Iako je takođe moguće ograničiti ovaj pristup.
|
||||
- Takođe je moguće **dati ili ograničiti pristup** Function App-u iz **internetske mreže (VPC)**.
|
||||
- Takođe je moguće **dati ili ograničiti pristup** Function App-u iz **internih mreža (VPC)**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ovo je veoma zanimljivo iz perspektive napadača jer bi moglo biti moguće **pivotirati na interne mreže** iz ranjive funkcije izložene Internetu.
|
||||
> Ovo je veoma zanimljivo iz perspektive napadača jer bi moglo biti moguće **pivotsati na interne mreže** iz ranjive funkcije izložene Internetu.
|
||||
|
||||
### **Podešavanja Function App-a & Varijable Okruženja**
|
||||
### **Podešavanja Function App-a i promenljive okruženja**
|
||||
|
||||
Moguće je konfigurisati varijable okruženja unutar aplikacije, koje mogu sadržati osetljive informacije. Štaviše, podrazumevano se kreiraju varijable okruženja **`AzureWebJobsStorage`** i **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (među ostalima). Ove su posebno zanimljive jer **sadrže ključ naloga za kontrolu sa POTPUNIM dozvolama nad storage nalogom koji sadrži podatke aplikacije**. Ova podešavanja su takođe potrebna za izvršavanje koda iz Storage naloga.
|
||||
Moguće je konfigurisati promenljive okruženja unutar aplikacije, koje mogu sadržati osetljive informacije. Štaviše, podrazumevano se kreiraju promenljive okruženja **`AzureWebJobsStorage`** i **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (među ostalima). Ove su posebno zanimljive jer **sadrže ključ naloga za kontrolu sa POTPUNIM dozvolama nad storage nalogom koji sadrži podatke aplikacije**. Ova podešavanja su takođe potrebna za izvršavanje koda iz Storage naloga.
|
||||
|
||||
Ove varijable okruženja ili parametri konfiguracije takođe kontrolišu kako funkcija izvršava kod, na primer, ako **`WEBSITE_RUN_FROM_PACKAGE`** postoji, to će označiti URL gde se kod aplikacije nalazi.
|
||||
Ove promenljive okruženja ili parametri konfiguracije takođe kontrolišu kako funkcija izvršava kod, na primer, ako **`WEBSITE_RUN_FROM_PACKAGE`** postoji, to će ukazivati na URL gde se kod aplikacije nalazi.
|
||||
|
||||
### **Function Sandbox**
|
||||
|
||||
@@ -54,14 +54,14 @@ Unutar linux sandbox-a, izvorni kod se nalazi u **`/home/site/wwwroot`** u datot
|
||||
|
||||
U **Windows** funkciji koja koristi NodeJS, kod se nalazio u **`C:\home\site\wwwroot\HttpTrigger1\index.js`**, korisničko ime je bilo **`mawsFnPlaceholder8_f_v4_node_20_x86`** i bio je deo **grupa**: `Mandatory Label\High Mandatory Level Label`, `Everyone`, `BUILTIN\Users`, `NT AUTHORITY\INTERACTIVE`, `CONSOLE LOGON`, `NT AUTHORITY\Authenticated Users`, `NT AUTHORITY\This Organization`, `BUILTIN\IIS_IUSRS`, `LOCAL`, `10-30-4-99\Dwas Site Users`.
|
||||
|
||||
### **Upravljane Identitete & Metapodaci**
|
||||
### **Upravljane identitete i metapodaci**
|
||||
|
||||
Baš kao i [**VMs**](vms/), Functions mogu imati **Upravljane Identitete** od 2 tipa: Sistem dodeljen i Korisnik dodeljen.
|
||||
Baš kao i [**VMs**](vms/index.html), Functions mogu imati **Upravljane identitete** od 2 tipa: Sistem dodeljen i Korisnik dodeljen.
|
||||
|
||||
**Sistem dodeljen** će biti upravljani identitet koji **samo funkcija** kojoj je dodeljen može koristiti, dok su **korisnik dodeljeni** upravljani identiteti upravljani identiteti koje **bilo koja druga Azure usluga može koristiti**.
|
||||
**Sistem dodeljen** će biti upravljani identitet koji **samo funkcija** koja ga ima dodeljenog može koristiti, dok su **korisnik dodeljeni** upravljani identiteti upravljani identiteti koje **bilo koja druga Azure usluga može koristiti**.
|
||||
|
||||
> [!NOTE]
|
||||
> Baš kao u [**VMs**](vms/), Functions mogu imati **1 sistem dodeljen** upravljani identitet i **several korisnik dodeljenih** identiteta, tako da je uvek važno pokušati pronaći sve njih ako kompromitujete funkciju jer biste mogli biti u mogućnosti da eskalirate privilegije na nekoliko upravljanih identiteta iz samo jedne funkcije.
|
||||
> Baš kao i u [**VMs**](vms/index.html), Functions mogu imati **1 sistem dodeljen** upravljeni identitet i **several korisnik dodeljenih**, tako da je uvek važno pokušati pronaći sve njih ako kompromitujete funkciju jer biste mogli biti u mogućnosti da eskalirate privilegije na nekoliko upravljanih identiteta iz samo jedne funkcije.
|
||||
>
|
||||
> Ako se ne koristi sistemski upravljani identitet, ali su jedan ili više korisničkih upravljanih identiteta povezani sa funkcijom, podrazumevano nećete moći dobiti nijedan token.
|
||||
|
||||
@@ -69,42 +69,42 @@ Moguće je koristiti [**PEASS skripte**](https://github.com/peass-ng/PEASS-ng) z
|
||||
|
||||
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
|
||||
|
||||
Imajte na umu da treba da pronađete način da **proverite sve Upravljane Identitete koje funkcija ima povezane** jer ako to ne naznačite, metapodataka krajnja tačka će **koristiti samo podrazumevani** (proverite prethodni link za više informacija).
|
||||
Imajte na umu da treba da pronađete način da **proverite sve upravljane identitete koje funkcija ima povezane** jer ako to ne naznačite, metapodataka krajnja tačka će **koristiti samo podrazumevani** (proverite prethodni link za više informacija).
|
||||
|
||||
## Ključevi Pristupa
|
||||
## Ključevi pristupa
|
||||
|
||||
> [!NOTE]
|
||||
> Imajte na umu da ne postoje RBAC dozvole za davanje pristupa korisnicima da pozivaju funkcije. **Poziv funkcije zavisi od okidača** odabranog prilikom kreiranja i ako je odabran HTTP okidač, možda će biti potrebno koristiti **ključ pristupa**.
|
||||
> Imajte na umu da ne postoje RBAC dozvole za davanje pristupa korisnicima za pozivanje funkcija. **Pozivanje funkcije zavisi od okidača** odabranog prilikom kreiranja i ako je odabran HTTP okidač, možda će biti potrebno koristiti **ključ pristupa**.
|
||||
|
||||
Kada kreirate krajnju tačku unutar funkcije koristeći **HTTP okidač**, moguće je naznačiti **nivo autorizacije ključa pristupa** potreban za aktiviranje funkcije. Dostupne su tri opcije:
|
||||
|
||||
- **ANONYMOUS**: **Svi** mogu pristupiti funkciji putem URL-a.
|
||||
- **FUNCTION**: Krajnja tačka je dostupna samo korisnicima koji koriste **ključ funkcije, host ili master ključ**.
|
||||
- **FUNCTION**: Krajnja tačka je dostupna samo korisnicima koji koriste **ključ funkcije, hosta ili master ključa**.
|
||||
- **ADMIN**: Krajnja tačka je dostupna samo korisnicima sa **master ključem**.
|
||||
|
||||
**Tipovi ključeva:**
|
||||
|
||||
- **Ključevi funkcije:** Ključevi funkcije mogu biti ili podrazumevani ili korisnički definisani i dizajnirani su da omogućavaju pristup isključivo **određenim krajnjim tačkama funkcije** unutar Function App-a, omogućavajući finiju kontrolu pristupa nad krajnjim tačkama.
|
||||
- **Host Ključevi:** Host ključevi, koji takođe mogu biti podrazumevani ili korisnički definisani, pružaju pristup **svim krajnjim tačkama funkcije unutar Function App-a sa FUNCTION nivoom pristupa**.
|
||||
- **Master Ključ:** Master ključ (`_master`) služi kao administrativni ključ koji nudi povišene dozvole, uključujući pristup svim krajnjim tačkama funkcije (uključujući ADMIN nivo pristupa). Ovaj **ključ se ne može opozvati.**
|
||||
- **Sistemski Ključevi:** Sistemski ključevi su **upravljani specifičnim ekstenzijama** i potrebni su za pristup webhook krajnjim tačkama koje koriste interni komponenti. Primeri uključuju Event Grid okidač i Durable Functions, koji koriste sistemske ključeve za sigurno interagovanje sa svojim API-ima.
|
||||
- **Funkcijski ključevi:** Funkcijski ključevi mogu biti ili podrazumevani ili korisnički definisani i dizajnirani su da omogućavaju pristup isključivo **određenim funkcijskim krajnjim tačkama** unutar Function App-a, omogućavajući finiju kontrolu pristupa nad krajnjim tačkama.
|
||||
- **Host ključevi:** Host ključevi, koji takođe mogu biti podrazumevani ili korisnički definisani, pružaju pristup **svim funkcijskim krajnjim tačkama unutar Function App-a sa nivoom pristupa FUNCTION**.
|
||||
- **Master ključ:** Master ključ (`_master`) služi kao administrativni ključ koji nudi povišene dozvole, uključujući pristup svim funkcijskim krajnjim tačkama (uključujući ADMIN nivo pristupa). Ovaj **ključ se ne može opozvati.**
|
||||
- **Sistemski ključevi:** Sistemski ključevi su **upravljački od strane specifičnih ekstenzija** i potrebni su za pristup webhook krajnjim tačkama koje koriste interni komponenti. Primeri uključuju Event Grid okidač i Durable Functions, koji koriste sistemske ključeve za sigurno interagovanje sa svojim API-ima.
|
||||
|
||||
> [!TIP]
|
||||
> Primer za pristup funkciji API krajnjoj tački koristeći ključ:
|
||||
>
|
||||
> `https://<function_uniq_name>.azurewebsites.net/api/<endpoint_name>?code=<access_key>`
|
||||
|
||||
### Osnovna Autentifikacija
|
||||
### Osnovna autentifikacija
|
||||
|
||||
Baš kao u App Services, Functions takođe podržavaju osnovnu autentifikaciju za povezivanje sa **SCM** i **FTP** za implementaciju koda koristeći **korisničko ime i lozinku u URL-u** koji pruža Azure. Više informacija o tome u:
|
||||
Baš kao i u App Services, Functions takođe podržavaju osnovnu autentifikaciju za povezivanje sa **SCM** i **FTP** za implementaciju koda koristeći **korisničko ime i lozinku u URL-u** koji pruža Azure. Više informacija o tome u:
|
||||
|
||||
{{#ref}}
|
||||
az-app-service.md
|
||||
az-app-services.md
|
||||
{{#endref}}
|
||||
|
||||
### Github Zasnovane Implementacije
|
||||
### Github zasnovane implementacije
|
||||
|
||||
Kada se funkcija generiše iz Github repozitorijuma, Azure web konzola omogućava **automatsko kreiranje Github Workflow-a u specifičnom repozitorijumu** tako da kada god se ovaj repozitorijum ažurira, kod funkcije se ažurira. U stvari, Github Action yaml za python funkciju izgleda ovako:
|
||||
Kada se funkcija generiše iz Github repozitorijuma, Azure web konzola omogućava **automatsko kreiranje Github Workflow-a u specifičnom repozitorijumu** tako da kada se ovaj repozitorijum ažurira, kod funkcije se ažurira. U stvari, Github Action yaml za python funkciju izgleda ovako:
|
||||
|
||||
<details>
|
||||
|
||||
@@ -192,14 +192,14 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
|
||||
```
|
||||
</details>
|
||||
|
||||
Pored toga, **Upravljeni Identitet** se takođe kreira kako bi Github Akcija iz repozitorijuma mogla da se prijavi u Azure. To se postiže generisanjem Federisane kredencijale preko **Upravljenog Identiteta** koja omogućava **Izdavaču** `https://token.actions.githubusercontent.com` i **Identifikatoru Subjekta** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>`.
|
||||
Pored toga, **Upravljani identitet** se takođe kreira kako bi Github akcija iz repozitorijuma mogla da se prijavi u Azure. To se postiže generisanjem Federated kredencijala preko **Upravljanog identiteta** koji omogućava **Izdavaču** `https://token.actions.githubusercontent.com` i **Identifikatoru subjekta** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>`.
|
||||
|
||||
> [!CAUTION]
|
||||
> Stoga, svako ko kompromituje taj repozitorijum će moći da kompromituje funkciju i Upravljene Identitete povezane s njom.
|
||||
> Stoga, svako ko kompromituje taj repozitorijum će moći da kompromituje funkciju i Upravljene identitete povezane s njom.
|
||||
|
||||
### Implementacije zasnovane na kontejnerima
|
||||
|
||||
Nisu svi planovi omogućeni za implementaciju kontejnera, ali za one koji to omogućavaju, konfiguracija će sadržati URL kontejnera. U API-ju, podešavanje **`linuxFxVersion`** će imati nešto poput: `DOCKER|mcr.microsoft.com/...`, dok će u web konzoli konfiguracija prikazivati **podešavanja slike**.
|
||||
Nisu svi planovi omogućili implementaciju kontejnera, ali za one koji to rade, konfiguracija će sadržati URL kontejnera. U API-ju, podešavanje **`linuxFxVersion`** će imati nešto poput: `DOCKER|mcr.microsoft.com/...`, dok će u web konzoli konfiguracija prikazivati **podešavanja slike**.
|
||||
|
||||
Pored toga, **niti jedan izvorni kod neće biti pohranjen u skladištu** povezanu sa funkcijom jer to nije potrebno.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user