mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-18 18:22:41 -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,6 +52,11 @@ def ref(matchobj):
|
||||
try:
|
||||
if href.endswith("/"):
|
||||
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")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
@@ -52,12 +64,17 @@ def ref(matchobj):
|
||||
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")
|
||||
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"]}')
|
||||
title = 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
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
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
|
||||
{
|
||||
"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**.
|
||||
|
||||
.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>
|
||||
|
||||
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 zapisu** do nich mógłby **zmodyfikować dane, aby nadużyć jakiejś usługi i spróbować podnieść uprawnienia**.\
|
||||
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.
|
||||
|
||||
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}}
|
||||
terraform-security.md#abusing-terraform-state-files
|
||||
pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
|
||||
{{#endref}}
|
||||
|
||||
### `s3:PutBucketPolicy`
|
||||
@@ -123,7 +123,7 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-n
|
||||
```
|
||||
### `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
|
||||
```bash
|
||||
# Update bucket ACL
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
Aby uzyskać więcej informacji na temat usług Azure App, sprawdź:
|
||||
|
||||
{{#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
|
||||
|
||||
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
|
||||
# Direct option
|
||||
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`**.
|
||||
|
||||
> [!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
|
||||
# Enable basic authentication for SCM
|
||||
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.
|
||||
|
||||
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:
|
||||
```bash
|
||||
@@ -205,7 +205,7 @@ curl -X PUT \
|
||||
```
|
||||
### 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
|
||||
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>`
|
||||
|
||||
> [!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]
|
||||
> 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`
|
||||
|
||||
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
|
||||
az webapp config container set \
|
||||
--name <app-name> \
|
||||
|
||||
@@ -4,24 +4,24 @@
|
||||
|
||||
## 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]
|
||||
> 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
|
||||
|
||||
- **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 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 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 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.
|
||||
- **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**.
|
||||
- **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 **przerywanych obciążeń** wymagających automatycznego skalowania.
|
||||
- **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 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 opartych na zdarzeniach i skalowalnych**.
|
||||
|
||||
### **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]
|
||||
> 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źć.
|
||||
|
||||
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
|
||||
|
||||
@@ -44,37 +44,37 @@ Używając wyzwalacza HTTP:
|
||||
|
||||
### **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**
|
||||
|
||||
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`.
|
||||
|
||||
### **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ć**.
|
||||
|
||||
> [!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.
|
||||
|
||||
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" %}
|
||||
|
||||
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
|
||||
|
||||
> [!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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
{{#ref}}
|
||||
az-app-service.md
|
||||
az-app-services.md
|
||||
{{#endref}}
|
||||
|
||||
### Wdrożenia oparte na Githubie
|
||||
|
||||
Reference in New Issue
Block a user