Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/

This commit is contained in:
Translator
2025-01-06 17:12:39 +00:00
parent c33e400bb4
commit 11f43ae269
5 changed files with 65 additions and 48 deletions

1
.gitignore vendored
View File

@@ -34,3 +34,4 @@ Temporary Items
book book
book/* book/*
hacktricks-preprocessor.log hacktricks-preprocessor.log
hacktricks-preprocessor-error.log

View File

@@ -7,7 +7,14 @@ from os import path
from urllib.request import urlopen, Request from urllib.request import urlopen, Request
logger = logging.getLogger(__name__) 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=(),): def findtitle(search ,obj, key, path=(),):
@@ -45,6 +52,11 @@ def ref(matchobj):
try: try:
if href.endswith("/"): if href.endswith("/"):
href = href+"README.md" # Fix if ref points to a folder href = href+"README.md" # Fix if ref points to a folder
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") chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}') logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name'] title = chapter['name']
@@ -52,12 +64,17 @@ def ref(matchobj):
try: try:
dir = path.dirname(current_chapter['source_path']) 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))}') 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") 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"]}') logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
except Exception as e: except Exception as e:
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}') logger.debug(e)
print(f'Error getting chapter title: {path.normpath(path.join(dir,href))}') logger.error(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
sys.exit(1) sys.exit(1)
@@ -85,13 +102,11 @@ def files(matchobj):
except Exception as e: except Exception as e:
logger.debug(e) logger.debug(e)
logger.debug(f'Error searching file: {href}') logger.error(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1) sys.exit(1)
if title=="": if title=="":
logger.debug(f'Error searching file: {href}') logger.error(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1) sys.exit(1)
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>""" 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']): for chapter in iterate_chapters(book['sections']):
logger.debug(f"Chapter: {chapter['path']}") logger.debug(f"Chapter: {chapter['path']}")
current_chapter = chapter 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']) new_content = re.sub(regex, ref, chapter['content'])
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}' 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) new_content = add_read_time(new_content)
chapter['content'] = new_content chapter['content'] = new_content

View File

@@ -8,7 +8,7 @@
Napastnik z tymi uprawnieniami do interesujących bucketów może być w stanie przejąć zasoby i eskalować uprawnienia. Napastnik z tymi uprawnieniami do interesujących bucketów może być w stanie przejąć zasoby i eskalować uprawnienia.
Na przykład, napastnik z tymi **uprawnieniami do bucketu cloudformation** o nazwie "cf-templates-nohnwfax6a6i-us-east-1" będzie w stanie przejąć wdrożenie. Dostęp można przyznać za pomocą następującej polityki: Na przykład, napastnik z tymi **uprawnieniami do bucketu cloudformation** o nazwie "cf-templates-nohnwfax6a6i-us-east-1" będzie mógł przejąć wdrożenie. Dostęp można przyznać za pomocą następującej polityki:
```json ```json
{ {
"Version": "2012-10-17", "Version": "2012-10-17",
@@ -34,7 +34,7 @@ Na przykład, napastnik z tymi **uprawnieniami do bucketu cloudformation** o naz
] ]
} }
``` ```
I możliwe jest przejęcie, ponieważ istnieje **mały przedział czasowy od momentu przesłania szablonu** do koszyka do momentu, gdy **szablon jest wdrażany**. Napastnik może po prostu stworzyć **funkcję lambda** w swoim koncie, która **wywoła się, gdy wysłane zostanie powiadomienie z koszyka**, i **przejmie** **zawartość** tego **koszyka**. I przejęcie jest możliwe, ponieważ istnieje **mały przedział czasowy od momentu przesłania szablonu** do koszyka do momentu, gdy **szablon jest wdrażany**. Napastnik może po prostu stworzyć **funkcję lambda** w swoim koncie, która **wywoła się, gdy wysłane zostanie powiadomienie o koszyku**, i **przejmie** **zawartość** tego **koszyka**.
![](<../../../images/image (174).png>) ![](<../../../images/image (174).png>)
@@ -43,7 +43,7 @@ Aby uzyskać więcej informacji, sprawdź oryginalne badania: [https://rhinosecu
### `s3:PutObject`, `s3:GetObject` <a href="#s3putobject-s3getobject" id="s3putobject-s3getobject"></a> ### `s3:PutObject`, `s3:GetObject` <a href="#s3putobject-s3getobject" id="s3putobject-s3getobject"></a>
To są uprawnienia do **pobierania i przesyłania obiektów do S3**. Wiele usług w AWS (i poza nim) używa przechowywania S3 do przechowywania **plików konfiguracyjnych**.\ To są uprawnienia do **pobierania i przesyłania obiektów do S3**. Kilka usług w AWS (i poza nim) używa przechowywania S3 do przechowywania **plików konfiguracyjnych**.\
Napastnik z **dostępem do odczytu** do nich może znaleźć **wrażliwe informacje** w nich.\ Napastnik z **dostępem do odczytu** do nich może znaleźć **wrażliwe informacje** w nich.\
Napastnik z **dostępem do zapisu** do nich mógłby **zmodyfikować dane, aby nadużyć jakiejś usługi i spróbować podnieść uprawnienia**.\ Napastnik z **dostępem do zapisu** do nich mógłby **zmodyfikować dane, aby nadużyć jakiejś usługi i spróbować podnieść uprawnienia**.\
Oto kilka przykładów: Oto kilka przykładów:
@@ -57,10 +57,10 @@ Również zazwyczaj, w rzeczywistych kontach prawie zawsze wszyscy deweloperzy m
Więc, jeśli masz uprawnienia wymienione nad tymi plikami, istnieje wektor ataku, który pozwala ci uzyskać RCE w pipeline z uprawnieniami `terraform` - najczęściej `AdministratorAccess`, co czyni cię administratorem konta w chmurze. Możesz również użyć tego wektora do przeprowadzenia ataku typu denial of service, powodując, że `terraform` usunie legalne zasoby. Więc, jeśli masz uprawnienia wymienione nad tymi plikami, istnieje wektor ataku, który pozwala ci uzyskać RCE w pipeline z uprawnieniami `terraform` - najczęściej `AdministratorAccess`, co czyni cię administratorem konta w chmurze. Możesz również użyć tego wektora do przeprowadzenia ataku typu denial of service, powodując, że `terraform` usunie legalne zasoby.
Postępuj zgodnie z opisem w sekcji *Nadużywanie plików stanu Terraform* na stronie *Bezpieczeństwo Terraform* w celu uzyskania bezpośrednio używalnego kodu exploita: Postępuj zgodnie z opisem w sekcji *Abusing Terraform State Files* na stronie *Terraform Security* w celu uzyskania bezpośrednio używalnego kodu exploit:
{{#ref}} {{#ref}}
terraform-security.md#abusing-terraform-state-files pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
{{#endref}} {{#endref}}
### `s3:PutBucketPolicy` ### `s3:PutBucketPolicy`
@@ -123,7 +123,7 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-n
``` ```
### `s3:GetBucketAcl`, `s3:PutBucketAcl` ### `s3:GetBucketAcl`, `s3:PutBucketAcl`
Napastnik mógłby nadużyć tych uprawnień, aby **przyznać sobie więcej dostępu** do konkretnych koszy.\ Napastnik mógłby nadużyć tych uprawnień, aby **przyznać sobie więcej dostępu** do konkretnych bucketów.\
Należy zauważyć, że napastnik nie musi pochodzić z tego samego konta. Co więcej, dostęp do zapisu Należy zauważyć, że napastnik nie musi pochodzić z tego samego konta. Co więcej, dostęp do zapisu
```bash ```bash
# Update bucket ACL # Update bucket ACL

View File

@@ -7,14 +7,14 @@
Aby uzyskać więcej informacji na temat usług Azure App, sprawdź: Aby uzyskać więcej informacji na temat usług Azure App, sprawdź:
{{#ref}} {{#ref}}
../az-services/az-app-service.md ../az-services/az-app-services.md
{{#endref}} {{#endref}}
### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read ### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read
Te uprawnienia pozwalają uzyskać **SSH shell** wewnątrz aplikacji webowej. Pozwalają również na **debugowanie** aplikacji. Te uprawnienia pozwalają uzyskać **SSH shell** wewnątrz aplikacji webowej. Pozwalają również na **debugowanie** aplikacji.
- **SSH w jednej komendzie**: - **SSH w pojedynczej komendzie**:
```bash ```bash
# Direct option # Direct option
az webapp ssh --name <name> --resource-group <res-group> az webapp ssh --name <name> --resource-group <res-group>
@@ -129,9 +129,9 @@ Następnie możesz użyć tych danych uwierzytelniających do **uzyskania dostę
Pamiętaj, że aby uzyskać dostęp do platformy SCM z **sieci, musisz uzyskać dostęp do `<SCM-URL>/BasicAuth`**. Pamiętaj, że aby uzyskać dostęp do platformy SCM z **sieci, musisz uzyskać dostęp do `<SCM-URL>/BasicAuth`**.
> [!WARNING] > [!WARNING]
> Zauważ, że każdy użytkownik może skonfigurować własne dane uwierzytelniające, wywołując poprzednie polecenie, ale jeśli użytkownik nie ma wystarczających uprawnień do uzyskania dostępu do SCM lub FTP, dane uwierzytelniające nie będą działać. > Zauważ, że każdy użytkownik może skonfigurować swoje własne dane uwierzytelniające, wywołując poprzednie polecenie, ale jeśli użytkownik nie ma wystarczających uprawnień do uzyskania dostępu do SCM lub FTP, dane uwierzytelniające nie będą działać.
- Jeśli widzisz, że te dane uwierzytelniające są **REDACTED**, to dlatego, że **musisz włączyć opcję podstawowej autoryzacji SCM**, a do tego potrzebujesz drugiego uprawnienia (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`): - Jeśli widzisz, że te dane uwierzytelniające są **REDACTED**, to dlatego, że **musisz włączyć opcję podstawowej autoryzacji SCM** i do tego potrzebujesz drugiego uprawnienia (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`):
```bash ```bash
# Enable basic authentication for SCM # Enable basic authentication for SCM
az rest --method PUT \ az rest --method PUT \
@@ -155,7 +155,7 @@ az rest --method PUT \
Mając ważne poświadczenia SCM, możliwe jest **publikowanie kodu** w usłudze App. Można to zrobić za pomocą następującego polecenia. Mając ważne poświadczenia SCM, możliwe jest **publikowanie kodu** w usłudze App. Można to zrobić za pomocą następującego polecenia.
W tym przykładzie Pythona możesz pobrać repozytorium z https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, wprowadzić dowolne **zmiany**, a następnie **spakować je, uruchamiając: `zip -r app.zip .`**. W tym przykładzie Pythona możesz pobrać repozytorium z https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, wprowadzić dowolne **zmiany**, które chcesz, a następnie **spakować je, uruchamiając: `zip -r app.zip .`**.
Następnie możesz **opublikować kod** w aplikacji internetowej za pomocą następującego polecenia: Następnie możesz **opublikować kod** w aplikacji internetowej za pomocą następującego polecenia:
```bash ```bash
@@ -205,7 +205,7 @@ curl -X PUT \
``` ```
### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action ### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
Te uprawnienia pozwalają na **przypisanie tożsamości zarządzanej** do usługi App, więc jeśli usługa App była wcześniej skompromitowana, to pozwoli to atakującemu na przypisanie nowych tożsamości zarządzanych do usługi App i **eskalację uprawnień** do nich. Te uprawnienia pozwalają na **przypisanie zarządzanej tożsamości** do usługi App, więc jeśli usługa App została wcześniej skompromitowana, to pozwoli to atakującemu na przypisanie nowych zarządzanych tożsamości do usługi App i **eskalację uprawnień** do nich.
```bash ```bash
az webapp identity assign --name <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name> az webapp identity assign --name <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
``` ```
@@ -263,14 +263,14 @@ https://graph.microsoft.com/v1.0/me/drive/root/children
- **`Microsoft.Web/sites/config/list/action`**: Następnie uruchom `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>` - **`Microsoft.Web/sites/config/list/action`**: Następnie uruchom `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>`
> [!WARNING] > [!WARNING]
> Zauważ, że posiadanie uprawnienia `Microsoft.Web/sites/config/list/action` i poświadczeń SCM zawsze umożliwia wdrożenie do aplikacji webowej (nawet jeśli była skonfigurowana do używania dostawcy zewnętrznego), jak wspomniano w poprzedniej sekcji. > Zauważ, że posiadanie uprawnienia `Microsoft.Web/sites/config/list/action` oraz poświadczeń SCM zawsze umożliwia wdrożenie do aplikacji webowej (nawet jeśli była skonfigurowana do używania dostawcy zewnętrznego), jak wspomniano w poprzedniej sekcji.
> [!WARNING] > [!WARNING]
> Zauważ, że posiadanie poniższych uprawnień również **umożliwia wykonanie dowolnego kontenera**, nawet jeśli aplikacja webowa była skonfigurowana inaczej. > Zauważ, że posiadanie poniższych uprawnień również **umożliwia wykonanie dowolnego kontenera**, nawet jeśli aplikacja webowa była skonfigurowana inaczej.
### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read` ### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read`
To zestaw uprawnień, który pozwala na **modyfikację kontenera używanego** przez aplikację webową. Napastnik mógłby to wykorzystać do zmuszenia aplikacji webowej do wykonania złośliwego kontenera. To zestaw uprawnień, który pozwala na **modyfikację kontenera używanego** przez aplikację webową. Napastnik mógłby to wykorzystać do uruchomienia złośliwego kontenera w aplikacji webowej.
```bash ```bash
az webapp config container set \ az webapp config container set \
--name <app-name> \ --name <app-name> \

View File

@@ -4,24 +4,24 @@
## Podstawowe informacje ## Podstawowe informacje
**Azure Function Apps** to **usługa obliczeniowa bezserwerowa**, która pozwala na uruchamianie małych fragmentów kodu, zwanych **funkcjami**, bez zarządzania infrastrukturą. Zostały zaprojektowane do wykonywania kodu w odpowiedzi na różne wyzwalacze, takie jak **żądania HTTP, timery lub zdarzenia z innych usług Azure**, takich jak Blob Storage czy Event Hubs. Function Apps obsługują wiele języków programowania, w tym C#, Python, JavaScript i Java, co czyni je wszechstronnymi do budowania **aplikacji wyzwalanych zdarzeniami**, automatyzacji przepływów pracy lub integracji usług. Są opłacalne, ponieważ zazwyczaj płacisz tylko za czas obliczeniowy używany podczas uruchamiania kodu. **Azure Function Apps** to **usługa obliczeniowa bezserwerowa**, która pozwala na uruchamianie małych fragmentów kodu, zwanych **funkcjami**, bez zarządzania infrastrukturą. Zostały zaprojektowane do wykonywania kodu w odpowiedzi na różne wyzwalacze, takie jak **żądania HTTP, timery lub zdarzenia z innych usług Azure**, takich jak Blob Storage czy Event Hubs. Function Apps obsługują wiele języków programowania, w tym C#, Python, JavaScript i Java, co czyni je wszechstronnymi do budowania **aplikacji opartych na zdarzeniach**, automatyzacji procesów roboczych lub integracji usług. Są opłacalne, ponieważ zazwyczaj płacisz tylko za czas obliczeniowy używany podczas uruchamiania kodu.
> [!NOTE] > [!NOTE]
> Należy pamiętać, że **Funkcje są podzbiorem App Services**, dlatego wiele funkcji omówionych tutaj będzie również używanych przez aplikacje tworzone jako Azure Apps (`webapp` w cli). > Zauważ, że **Funkcje są podzbiorem App Services**, dlatego wiele funkcji omówionych tutaj będzie również używanych przez aplikacje tworzone jako Azure Apps (`webapp` w cli).
### Różne plany ### Różne plany
- **Plan Flex Consumption**: Oferuje **dynamiczne, wyzwalane zdarzeniami skalowanie** z ceną płatności za użycie, dodając lub usuwając instancje funkcji w zależności od popytu. Obsługuje **wirtualne sieci** i **wstępnie przydzielone instancje**, aby zredukować zimne uruchomienia, co czyni go odpowiednim dla **zmiennych obciążeń**, które nie wymagają wsparcia kontenerów. - **Plan Flex Consumption**: Oferuje **dynamiczne, oparte na zdarzeniach skalowanie** z ceną płatności za użycie, dodając lub usuwając instancje funkcji w zależności od popytu. Obsługuje **wirtualne sieci** i **wstępnie przydzielone instancje**, aby zredukować zimne uruchomienia, co czyni go odpowiednim dla **zmiennych obciążeń**, które nie wymagają wsparcia kontenerów.
- **Plan Traditional Consumption**: Domyślna opcja bezserwerowa, w której **płacisz tylko za zasoby obliczeniowe, gdy funkcje są uruchamiane**. Automatycznie skaluje się w zależności od nadchodzących zdarzeń i zawiera **optymalizacje zimnego uruchomienia**, ale nie obsługuje wdrożeń kontenerów. Idealny dla **przypadkowych obciążeń** wymagających automatycznego skalowania. - **Plan Traditional Consumption**: Domyślna opcja bezserwerowa, w której **płacisz tylko za zasoby obliczeniowe, gdy funkcje są uruchamiane**. Automatycznie skaluje się w zależności od nadchodzących zdarzeń i zawiera **optymalizacje zimnego uruchomienia**, ale nie obsługuje wdrożeń kontenerów. Idealny dla **przerywanych obciążeń** wymagających automatycznego skalowania.
- **Plan Premium**: Zaprojektowany dla **spójnej wydajności**, z **wstępnie podgrzewanymi pracownikami**, aby wyeliminować zimne uruchomienia. Oferuje **wydłużone czasy wykonania, wirtualne sieci** i obsługuje **niestandardowe obrazy Linux**, co czyni go idealnym dla **aplikacji krytycznych dla misji**, które potrzebują wysokiej wydajności i zaawansowanych funkcji. - **Plan Premium**: Zaprojektowany dla **spójnej wydajności**, z **wstępnie podgrzanymi pracownikami**, aby wyeliminować zimne uruchomienia. Oferuje **wydłużone czasy wykonania, wirtualne sieci** i obsługuje **niestandardowe obrazy Linux**, co czyni go idealnym dla **aplikacji krytycznych dla misji**, które potrzebują wysokiej wydajności i zaawansowanych funkcji.
- **Plan Dedicated**: Działa na dedykowanych maszynach wirtualnych z **przewidywalnym rozliczeniem** i obsługuje ręczne lub automatyczne skalowanie. Umożliwia uruchamianie wielu aplikacji na tym samym planie, zapewnia **izolację obliczeniową** i zapewnia **bezpieczny dostęp do sieci** za pośrednictwem Środowisk Usług Aplikacji, co czyni go idealnym dla **aplikacji długoterminowych** wymagających spójnej alokacji zasobów. - **Plan Dedicated**: Działa na dedykowanych maszynach wirtualnych z **przewidywalnym rozliczeniem** i obsługuje ręczne lub automatyczne skalowanie. Umożliwia uruchamianie wielu aplikacji w tym samym planie, zapewnia **izolację obliczeniową** i zapewnia **bezpieczny dostęp do sieci** za pośrednictwem Środowisk Usług Aplikacji, co czyni go idealnym dla **aplikacji długoterminowych** wymagających spójnej alokacji zasobów.
- **Container Apps**: Umożliwia wdrażanie **kontenerowych aplikacji funkcji** w zarządzanym środowisku, obok mikroserwisów i interfejsów API. Obsługuje niestandardowe biblioteki, migrację aplikacji dziedzicznych i **przetwarzanie GPU**, eliminując zarządzanie klastrami Kubernetes. Idealny dla **aplikacji kontenerowych wyzwalanych zdarzeniami i skalowalnych**. - **Container Apps**: Umożliwia wdrażanie **kontenerowych aplikacji funkcji** w zarządzanym środowisku, obok mikroserwisów i interfejsów API. Obsługuje niestandardowe biblioteki, migrację aplikacji dziedzicznych i **przetwarzanie GPU**, eliminując zarządzanie klastrami Kubernetes. Idealny dla **aplikacji kontenerowych opartych na zdarzeniach i skalowalnych**.
### **Koszyki pamięci** ### **Koszyki pamięci**
Podczas tworzenia nowej aplikacji funkcji, która nie jest kontenerowa (ale daje kod do uruchomienia), **kod i inne dane związane z funkcją będą przechowywane w koncie pamięci**. Domyślnie konsola internetowa utworzy nową dla każdej funkcji, aby przechować kod. Podczas tworzenia nowej aplikacji funkcji, która nie jest kontenerowa (ale przekazuje kod do uruchomienia), **kod i inne dane związane z funkcją będą przechowywane w koncie pamięci**. Domyślnie konsola internetowa utworzy nową dla każdej funkcji, aby przechować kod.
Co więcej, modyfikując kod wewnątrz koszyka (w różnych formatach, w jakich może być przechowywany), **kod aplikacji zostanie zmodyfikowany na nowy i uruchomiony** następnym razem, gdy funkcja zostanie wywołana. Co więcej, modyfikując kod wewnątrz koszyka (w różnych formatach, w jakich może być przechowywany), **kod aplikacji zostanie zmodyfikowany na nowy i wykonany** następnym razem, gdy funkcja zostanie wywołana.
> [!CAUTION] > [!CAUTION]
> To jest bardzo interesujące z perspektywy atakującego, ponieważ **dostęp do zapisu w tym koszyku** pozwoli atakującemu na **kompromitację kodu i eskalację uprawnień** do zarządzanych tożsamości wewnątrz aplikacji funkcji. > To jest bardzo interesujące z perspektywy atakującego, ponieważ **dostęp do zapisu w tym koszyku** pozwoli atakującemu na **kompromitację kodu i eskalację uprawnień** do zarządzanych tożsamości wewnątrz aplikacji funkcji.
@@ -30,7 +30,7 @@ Co więcej, modyfikując kod wewnątrz koszyka (w różnych formatach, w jakich
Możliwe jest również znalezienie **kluczy głównych i funkcji** przechowywanych w koncie pamięci w kontenerze **`azure-webjobs-secrets`** wewnątrz folderu **`<app-name>`** w plikach JSON, które można tam znaleźć. Możliwe jest również znalezienie **kluczy głównych i funkcji** przechowywanych w koncie pamięci w kontenerze **`azure-webjobs-secrets`** wewnątrz folderu **`<app-name>`** w plikach JSON, które można tam znaleźć.
Należy pamiętać, że Funkcje również pozwalają na przechowywanie kodu w zdalnej lokalizacji, wskazując po prostu URL do niej. Zauważ, że Funkcje pozwalają również na przechowywanie kodu w zdalnej lokalizacji, wskazując po prostu URL do niego.
### Sieciowanie ### Sieciowanie
@@ -44,37 +44,37 @@ Używając wyzwalacza HTTP:
### **Ustawienia aplikacji funkcji i zmienne środowiskowe** ### **Ustawienia aplikacji funkcji i zmienne środowiskowe**
Możliwe jest skonfigurowanie zmiennych środowiskowych wewnątrz aplikacji, które mogą zawierać wrażliwe informacje. Co więcej, domyślnie zmienne środowiskowe **`AzureWebJobsStorage`** i **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (wśród innych) są tworzone. Te są szczególnie interesujące, ponieważ **zawierają klucz konta do zarządzania z PEŁNYMI uprawnieniami kontem pamięci zawierającym dane aplikacji**. Te ustawienia są również potrzebne do wykonania kodu z konta pamięci. Możliwe jest skonfigurowanie zmiennych środowiskowych wewnątrz aplikacji, które mogą zawierać wrażliwe informacje. Co więcej, domyślnie zmienne env **`AzureWebJobsStorage`** i **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (wśród innych) są tworzone. Te są szczególnie interesujące, ponieważ **zawierają klucz konta do kontrolowania z PEŁNYMI uprawnieniami konta pamięci zawierającego dane aplikacji**. Te ustawienia są również potrzebne do wykonania kodu z konta pamięci.
Te zmienne środowiskowe lub parametry konfiguracyjne kontrolują również, jak funkcja wykonuje kod, na przykład jeśli **`WEBSITE_RUN_FROM_PACKAGE`** istnieje, wskaże URL, gdzie znajduje się kod aplikacji. Te zmienne env lub parametry konfiguracyjne kontrolują również, jak funkcja wykonuje kod, na przykład jeśli **`WEBSITE_RUN_FROM_PACKAGE`** istnieje, wskaże URL, gdzie znajduje się kod aplikacji.
### **Piaskownica funkcji** ### **Piaskownica funkcji**
Wewnątrz piaskownicy Linux kod źródłowy znajduje się w **`/home/site/wwwroot`** w pliku **`function_app.py`** (jeśli używany jest Python), użytkownik uruchamiający kod to **`app`** (bez uprawnień sudo). Wewnątrz piaskownicy linux kod źródłowy znajduje się w **`/home/site/wwwroot`** w pliku **`function_app.py`** (jeśli używany jest python), użytkownik uruchamiający kod to **`app`** (bez uprawnień sudo).
W **funkcji Windows** używającej NodeJS kod znajdował się w **`C:\home\site\wwwroot\HttpTrigger1\index.js`**, nazwa użytkownika to **`mawsFnPlaceholder8_f_v4_node_20_x86`** i był częścią **grup**: `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`. W **funkcji Windows** używającej NodeJS kod znajdował się w **`C:\home\site\wwwroot\HttpTrigger1\index.js`**, nazwa użytkownika to **`mawsFnPlaceholder8_f_v4_node_20_x86`** i był częścią **grup**: `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`.
### **Zarządzane tożsamości i metadane** ### **Zarządzane tożsamości i metadane**
Podobnie jak [**VMs**](vms/), Funkcje mogą mieć **Zarządzane Tożsamości** dwóch typów: przypisane systemowo i przypisane przez użytkownika. Podobnie jak [**VMs**](vms/index.html), Funkcje mogą mieć **Zarządzane Tożsamości** dwóch typów: przypisane systemowo i przypisane przez użytkownika.
**Zarządzana tożsamość przypisana systemowo** będzie to zarządzana tożsamość, którą **tylko funkcja**, która ją ma przypisaną, będzie mogła używać, podczas gdy **zarządzane tożsamości przypisane przez użytkownika** to zarządzane tożsamości, które **każda inna usługa Azure będzie mogła używać**. **Zarządzana tożsamość przypisana systemowo** będzie to zarządzana tożsamość, którą **tylko funkcja**, która ją ma przypisaną, będzie mogła używać, podczas gdy **zarządzane tożsamości przypisane przez użytkownika** to zarządzane tożsamości, które **każda inna usługa Azure będzie mogła używać**.
> [!NOTE] > [!NOTE]
> Podobnie jak w [**VMs**](vms/), Funkcje mogą mieć **1 zarządzaną tożsamość przypisaną systemowo** i **wiele przypisanych przez użytkownika**, więc zawsze ważne jest, aby spróbować znaleźć wszystkie z nich, jeśli skompromitujesz funkcję, ponieważ możesz być w stanie eskalować uprawnienia do kilku zarządzanych tożsamości z jednej funkcji. > Podobnie jak w [**VMs**](vms/index.html), Funkcje mogą mieć **1 zarządzaną tożsamość przypisaną systemowo** i **wiele przypisanych przez użytkownika**, więc zawsze ważne jest, aby spróbować znaleźć wszystkie z nich, jeśli skompromitujesz funkcję, ponieważ możesz być w stanie eskalować uprawnienia do kilku zarządzanych tożsamości z jednej funkcji.
> >
> Jeśli nie jest używana zarządzana tożsamość systemowa, ale jedna lub więcej zarządzanych tożsamości użytkownika są przypisane do funkcji, domyślnie nie będziesz w stanie uzyskać żadnego tokena. > Jeśli nie jest używana zarządzana tożsamość systemowa, ale jedna lub więcej zarządzanych tożsamości użytkownika są przypisane do funkcji, domyślnie nie będziesz w stanie uzyskać żadnego tokena.
Możliwe jest użycie [**skryptów PEASS**](https://github.com/peass-ng/PEASS-ng) do uzyskania tokenów z domyślnej zarządzanej tożsamości z punktu końcowego metadanych. Możesz je również uzyskać **ręcznie**, jak wyjaśniono w: Możliwe jest użycie [**skryptów PEASS**](https://github.com/peass-ng/PEASS-ng) do uzyskania tokenów z domyślnej zarządzanej tożsamości z punktu końcowego metadanych. Lub możesz je uzyskać **ręcznie**, jak wyjaśniono w:
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %} {% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
Należy pamiętać, że musisz znaleźć sposób na **sprawdzenie wszystkich zarządzanych tożsamości, które funkcja ma przypisane**, ponieważ jeśli tego nie wskażesz, punkt końcowy metadanych **użyje tylko domyślnej** (sprawdź poprzedni link, aby uzyskać więcej informacji). Zauważ, że musisz znaleźć sposób na **sprawdzenie wszystkich zarządzanych tożsamości, które funkcja ma przypisane**, ponieważ jeśli tego nie wskażesz, punkt końcowy metadanych **użyje tylko domyślnej** (sprawdź poprzedni link, aby uzyskać więcej informacji).
## Klucze dostępu ## Klucze dostępu
> [!NOTE] > [!NOTE]
> Należy pamiętać, że nie ma uprawnień RBAC do udzielania użytkownikom dostępu do wywoływania funkcji. **Wywołanie funkcji zależy od wyzwalacza** wybranego podczas jej tworzenia, a jeśli wybrano wyzwalacz HTTP, może być konieczne użycie **klucza dostępu**. > Zauważ, że nie ma uprawnień RBAC do udzielania użytkownikom dostępu do wywoływania funkcji. **Wywołanie funkcji zależy od wyzwalacza** wybranego podczas jej tworzenia, a jeśli wybrano wyzwalacz HTTP, może być konieczne użycie **klucza dostępu**.
Podczas tworzenia punktu końcowego wewnątrz funkcji za pomocą **wyzwalacza HTTP** możliwe jest wskazanie **poziomu autoryzacji klucza dostępu** potrzebnego do wywołania funkcji. Dostępne są trzy opcje: Podczas tworzenia punktu końcowego wewnątrz funkcji za pomocą **wyzwalacza HTTP** możliwe jest wskazanie **poziomu autoryzacji klucza dostępu** potrzebnego do wywołania funkcji. Dostępne są trzy opcje:
@@ -99,7 +99,7 @@ Podczas tworzenia punktu końcowego wewnątrz funkcji za pomocą **wyzwalacza HT
Podobnie jak w Usługach Aplikacji, Funkcje również obsługują podstawową autoryzację do łączenia się z **SCM** i **FTP** w celu wdrożenia kodu za pomocą **nazwa użytkownika i hasło w URL** dostarczonym przez Azure. Więcej informacji na ten temat w: Podobnie jak w Usługach Aplikacji, Funkcje również obsługują podstawową autoryzację do łączenia się z **SCM** i **FTP** w celu wdrożenia kodu za pomocą **nazwa użytkownika i hasło w URL** dostarczonym przez Azure. Więcej informacji na ten temat w:
{{#ref}} {{#ref}}
az-app-service.md az-app-services.md
{{#endref}} {{#endref}}
### Wdrożenia oparte na Githubie ### Wdrożenia oparte na Githubie