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
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
]
|
||||
}
|
||||
```
|
||||
Ve ele geçirme, **şablonun yüklendiği andan** **şablonun dağıtıldığı ana kadar** olan **küçük bir zaman penceresi** olduğu için mümkündür. Bir saldırgan, hesabında **bir lambda fonksiyonu** oluşturabilir ve bu fonksiyon **bir bucket bildirimi gönderildiğinde tetiklenecek** ve **o bucket'ın içeriğini ele geçirecektir**.
|
||||
Ve ele geçirme, **şablonun yüklendiği andan** **şablonun dağıtıldığı ana** kadar olan **küçük bir zaman penceresi** olduğu için mümkündür. Bir saldırgan, hesabında **bir lambda fonksiyonu** oluşturabilir ve bu fonksiyon **bir bucket bildirimi gönderildiğinde tetiklenecek** ve **o bucket'ın** **içeriğini ele geçirecektir**.
|
||||
|
||||
.png>)
|
||||
|
||||
@@ -52,14 +52,14 @@ Bunlar bazı örneklerdir:
|
||||
|
||||
### `s3:PutObject`, `s3:GetObject` (isteğe bağlı) terraform durum dosyası üzerinden
|
||||
|
||||
[terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) durum dosyalarının bulut sağlayıcılarının blob depolama alanlarına kaydedilmesi oldukça yaygındır, örneğin AWS S3. Bir durum dosyasının dosya uzantısı `.tfstate`dir ve bucket adları genellikle terraform durum dosyalarını içerdiğini gösterir. Genellikle, her AWS hesabının durum dosyalarını depolamak için böyle bir bucket'ı vardır. Ayrıca genellikle, gerçek dünya hesaplarında neredeyse her geliştiricinin `s3:*` ve bazen hatta iş kullanıcılarının `s3:Put*` erişimi vardır.
|
||||
[terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) durum dosyalarının bulut sağlayıcılarının blob depolama alanlarına kaydedilmesi oldukça yaygındır, örneğin AWS S3. Bir durum dosyasının dosya uzantısı `.tfstate`dir ve bucket adları genellikle terraform durum dosyalarını içerdiğini gösterir. Genellikle, her AWS hesabının durum dosyalarını saklamak için böyle bir bucket'ı vardır. Ayrıca genellikle, gerçek dünya hesaplarında neredeyse her geliştiricinin `s3:*` ve bazen hatta iş kullanıcılarının `s3:Put*` erişimi vardır.
|
||||
|
||||
Bu nedenle, bu dosyalar üzerindeki izinlere sahipseniz, `terraform` ayrıcalıklarıyla pipeline'da RCE elde etmenizi sağlayan bir saldırı vektörü vardır - çoğu zaman `AdministratorAccess`, sizi bulut hesabının yöneticisi yapar. Ayrıca, `terraform`'un meşru kaynakları silmesini sağlayarak bir hizmet reddi saldırısı yapmak için bu vektörü kullanabilirsiniz.
|
||||
Bu nedenle, bu dosyalar üzerindeki izinlere sahipseniz, `terraform` ayrıcalıklarıyla, çoğu zaman `AdministratorAccess` ile, pipeline'da RCE elde etmenizi sağlayan bir saldırı vektörü vardır; bu da sizi bulut hesabının yöneticisi yapar. Ayrıca, `terraform`'un meşru kaynakları silmesini sağlayarak bir hizmet reddi saldırısı yapmak için bu vektörü kullanabilirsiniz.
|
||||
|
||||
Doğrudan kullanılabilir istismar kodu için *Terraform Güvenliği* sayfasının *Terraform Durum Dosyalarını Kötüye Kullanma* bölümündeki açıklamayı takip edin:
|
||||
|
||||
{{#ref}}
|
||||
terraform-security.md#abusing-terraform-state-files
|
||||
pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
|
||||
{{#endref}}
|
||||
|
||||
### `s3:PutBucketPolicy`
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
Azure App hizmetleri hakkında daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#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
|
||||
@@ -34,7 +34,7 @@ ssh root@127.0.0.1 -p 39895
|
||||
```
|
||||
- **Uygulamayı Hata Ayıklama**:
|
||||
1. VScode'da Azure uzantısını yükleyin.
|
||||
2. Uzantıda Azure hesabınızla oturum açın.
|
||||
2. Uzantıya Azure hesabınızla giriş yapın.
|
||||
3. Abonelik içindeki tüm Uygulama hizmetlerini listeleyin.
|
||||
4. Hata ayıklamak istediğiniz Uygulama hizmetini seçin, sağ tıklayın ve "Hata Ayıklamayı Başlat" seçeneğini seçin.
|
||||
5. Uygulama hata ayıklama etkin değilse, uzantı bunu etkinleştirmeye çalışacaktır ancak hesabınızın bunu yapabilmesi için `Microsoft.Web/sites/config/write` iznine ihtiyacı vardır.
|
||||
@@ -94,7 +94,7 @@ az webapp deployment list-publishing-profiles --name <app-name> --resource-group
|
||||
}
|
||||
]
|
||||
```
|
||||
Not edin ki **kullanıcı adı her zaman aynıdır** (FTP'de uygulamanın adı başta eklenir) ama **şifre hepsi için aynıdır**.
|
||||
Not edin ki **kullanıcı adı her zaman aynıdır** (FTP'de uygulamanın adı başta eklenmiş olsa da) ama **şifre hepsi için aynıdır**.
|
||||
|
||||
Ayrıca, **SCM URL'si `<app-name>.scm.azurewebsites.net`**.
|
||||
|
||||
@@ -116,7 +116,7 @@ az webapp deployment list-publishing-credentials --name <app-name> --resource-gr
|
||||
"type": "Microsoft.Web/sites/publishingcredentials"
|
||||
}
|
||||
```
|
||||
Not edin ki **kimlik bilgileri aynıdır** önceki komutla.
|
||||
Not edin ki **kimlik bilgileri aynı**dır önceki komutta.
|
||||
|
||||
- Başka bir seçenek, **kendi kimlik bilgilerinizi ayarlamak** ve bunları kullanmaktır:
|
||||
```bash
|
||||
@@ -155,7 +155,7 @@ az rest --method PUT \
|
||||
|
||||
Geçerli SCM kimlik bilgilerine sahip olmak, **kod yayınlamak** için mümkündür. Bu, aşağıdaki komut kullanılarak yapılabilir.
|
||||
|
||||
Bu python örneği için https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart adresinden repoyu indirebilir, istediğiniz **değişiklikleri** yapabilir ve ardından **zip'leyebilirsiniz: `zip -r app.zip .`**.
|
||||
Bu python örneği için https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart adresinden repoyu indirebilir, istediğiniz **değişiklikleri** yapabilir ve ardından **şu komutu çalıştırarak zipleyebilirsiniz: `zip -r app.zip .`**.
|
||||
|
||||
Ardından, aşağıdaki komut ile bir web uygulamasında **kod yayınlayabilirsiniz**:
|
||||
```bash
|
||||
@@ -163,7 +163,7 @@ curl -X POST "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<us
|
||||
```
|
||||
### Webjobs: Microsoft.Web/sites/publish/Action | SCM kimlik bilgileri
|
||||
|
||||
Bahsedilen Azure izni, SCM kimlik bilgileri ile de gerçekleştirilebilecek birkaç ilginç eylemi gerçekleştirmeye olanak tanır:
|
||||
Bahsedilen Azure izni, SCM kimlik bilgileriyle de gerçekleştirilebilecek birkaç ilginç eylemi gerçekleştirmeye olanak tanır:
|
||||
|
||||
- **Webjobs** günlüklerini oku:
|
||||
```bash
|
||||
@@ -205,7 +205,7 @@ curl -X PUT \
|
||||
```
|
||||
### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
|
||||
|
||||
Bu izinler, **yönetilen bir kimlik atamaya** olanak tanır, bu nedenle daha önce ele geçirilmiş bir App hizmeti varsa, bu saldırganın App hizmetine yeni yönetilen kimlikler atamasına ve **yetkileri artırmasına** olanak tanır.
|
||||
Bu izinler, **yönetilen bir kimlik atamaya** olanak tanır, bu nedenle eğer bir App hizmeti daha önce tehlikeye atıldıysa, bu saldırganın App hizmetine yeni yönetilen kimlikler atamasına ve **yetkileri yükseltmesine** olanak tanır.
|
||||
```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>
|
||||
```
|
||||
@@ -250,7 +250,7 @@ https://graph.microsoft.com/v1.0/me/drive/root/children
|
||||
```
|
||||
### Uygulama Kodunu Kaynaktan Güncelle
|
||||
|
||||
- Yapılandırılmış kaynak bir üçüncü taraf sağlayıcı (Github, BitBucket veya Azure Repository gibi) ise, depodaki kaynak kodunu ele geçirerek **uygulama kodunu güncelleyebilirsiniz**.
|
||||
- Eğer yapılandırılmış kaynak bir üçüncü taraf sağlayıcı ise, örneğin Github, BitBucket veya bir Azure Repository, kaynak kodunu tehlikeye atarak **uygulama kodunu güncelleyebilirsiniz**.
|
||||
- Uygulama **uzaktan bir git deposu** (kullanıcı adı ve şifre ile) kullanacak şekilde yapılandırılmışsa, değişiklikleri klonlamak ve itmek için **URL ve temel kimlik bilgilerini** almak mümkündür:
|
||||
- İzin kullanarak **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name <app-name> --resource-group <res-group>`
|
||||
- İzin kullanarak **`Microsoft.Web/sites/config/list/action`**:
|
||||
@@ -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`
|
||||
|
||||
Bu, bir web uygulaması tarafından kullanılan **konteyneri değiştirmeye** olanak tanıyan izinler setidir. Bir saldırgan, bunu kötü niyetli bir konteynerin çalıştırılması için bir web uygulamasını istismar etmek amacıyla kullanabilir.
|
||||
Bu, bir web uygulaması tarafından kullanılan **konteyneri değiştirmeye** izin veren izinler setidir. Bir saldırgan bunu kötü niyetli bir konteyner çalıştırmak için kötüye kullanabilir.
|
||||
```bash
|
||||
az webapp config container set \
|
||||
--name <app-name> \
|
||||
|
||||
@@ -4,72 +4,72 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**Azure Function Apps**, temel altyapıyı yönetmeden **fonksiyon** adı verilen küçük kod parçalarını çalıştırmanıza olanak tanıyan bir **sunucusuz hesaplama hizmetidir**. HTTP istekleri, zamanlayıcılar veya Blob Storage veya Event Hubs gibi diğer Azure hizmetlerinden gelen olaylar gibi çeşitli tetikleyicilere yanıt olarak kodu çalıştırmak için tasarlanmıştır. Function Apps, C#, Python, JavaScript ve Java dahil olmak üzere birden fazla programlama dilini destekler, bu da onları **olay odaklı uygulamalar**, iş akışlarını otomatikleştirme veya hizmetleri entegre etme için çok yönlü hale getirir. Genellikle kodunuz çalıştığında yalnızca kullanılan hesaplama süresi için ödeme yapmanız gerektiğinden maliyet etkilidir.
|
||||
**Azure Function Apps**, temel altyapıyı yönetmeden **fonksiyon** adı verilen küçük kod parçalarını çalıştırmanıza olanak tanıyan bir **sunucusuz hesaplama hizmetidir**. HTTP istekleri, zamanlayıcılar veya Blob Depolama veya Olay Hub'ları gibi diğer Azure hizmetlerinden gelen olaylar gibi çeşitli tetikleyicilere yanıt olarak kod çalıştırmak için tasarlanmıştır. Function Apps, C#, Python, JavaScript ve Java gibi birden fazla programlama dilini destekleyerek **olay odaklı uygulamalar**, iş akışlarını otomatikleştirme veya hizmetleri entegre etme için çok yönlü hale getirir. Genellikle kodunuz çalıştığında yalnızca kullanılan hesaplama süresi için ödeme yapmanız gerektiğinden maliyet açısından etkilidir.
|
||||
|
||||
> [!NOTE]
|
||||
> **Fonksiyonların, App Services'ın bir alt kümesi olduğunu** unutmayın, bu nedenle burada tartışılan birçok özellik, Azure Apps (`webapp` cli'de) olarak oluşturulan uygulamalar tarafından da kullanılacaktır.
|
||||
> **Fonksiyonlar, Uygulama Hizmetlerinin** bir alt kümesidir, bu nedenle burada tartışılan birçok özellik, Azure Uygulamaları (`webapp` cli'de) olarak oluşturulan uygulamalar tarafından da kullanılacaktır.
|
||||
|
||||
### Farklı Planlar
|
||||
|
||||
- **Flex Tüketim Planı**: Talebe göre fonksiyon örneklerini ekleyip çıkararak **dinamik, olay odaklı ölçeklendirme** sunar ve kullanım başına ödeme modeli ile çalışır. **Sanal ağ** ve **önceden sağlanmış örnekler** ile soğuk başlangıçları azaltır, bu da konteyner desteği gerektirmeyen **değişken iş yükleri** için uygun hale getirir.
|
||||
- **Geleneksel Tüketim Planı**: Fonksiyonlar çalıştığında yalnızca **hesaplama kaynakları için ödeme yaptığınız** varsayılan sunucusuz seçenektir. Gelen olaylara göre otomatik olarak ölçeklenir ve **soğuk başlangıç optimizasyonları** içerir, ancak konteyner dağıtımlarını desteklemez. Otomatik ölçeklendirme gerektiren **kesintili iş yükleri** için idealdir.
|
||||
- **Premium Plan**: **Tutarlı performans** için tasarlanmıştır, soğuk başlangıçları ortadan kaldırmak için **önceden ısıtılmış işçiler** ile birlikte gelir. **Uzun süreli yürütme süreleri, sanal ağ** sunar ve **özel Linux görüntülerini** destekler, bu da yüksek performans ve gelişmiş özellikler gerektiren **misyon kritik uygulamalar** için mükemmel hale getirir.
|
||||
- **Dedicated Plan**: **Öngörülebilir faturalama** ile özel sanal makinelerde çalışır ve manuel veya otomatik ölçeklendirmeyi destekler. Aynı planda birden fazla uygulama çalıştırmaya olanak tanır, **hesaplama izolasyonu** sağlar ve **App Service Environments** aracılığıyla **güvenli ağ erişimi** sağlar, bu da tutarlı kaynak tahsisi gerektiren **uzun süreli uygulamalar** için idealdir.
|
||||
- **Flex Tüketim Planı**: Talebe göre fonksiyon örneklerini ekleyip kaldırarak **dinamik, olay odaklı ölçekleme** sunar ve kullanım başına ödeme modeli ile çalışır. **Sanal ağ** ve **önceden sağlanmış örnekler** ile soğuk başlangıçları azaltarak, konteyner desteği gerektirmeyen **değişken iş yükleri** için uygundur.
|
||||
- **Geleneksel Tüketim Planı**: Fonksiyonlar çalıştığında yalnızca hesaplama kaynakları için **ödeme yaptığınız** varsayılan sunucusuz seçenektir. Gelen olaylara göre otomatik olarak ölçeklenir ve **soğuk başlangıç optimizasyonları** içerir, ancak konteyner dağıtımlarını desteklemez. Otomatik ölçekleme gerektiren **kesintili iş yükleri** için idealdir.
|
||||
- **Premium Plan**: **Tutarlı performans** için tasarlanmıştır, soğuk başlangıçları ortadan kaldırmak için **önceden ısıtılmış işçiler** sunar. **Uzun süreli yürütme süreleri, sanal ağ** sunar ve **özel Linux görüntülerini** destekler, bu da onu yüksek performans ve gelişmiş özellikler gerektiren **misyon kritik uygulamalar** için mükemmel hale getirir.
|
||||
- **Özel Plan**: Öngörülebilir faturalama ile özel sanal makinelerde çalışır ve manuel veya otomatik ölçeklemeyi destekler. Aynı planda birden fazla uygulama çalıştırmaya olanak tanır, **hesaplama izolasyonu** sağlar ve **App Service Environments** aracılığıyla **güvenli ağ erişimi** sağlar, bu da onu tutarlı kaynak tahsisi gerektiren **uzun süreli uygulamalar** için ideal hale getirir.
|
||||
- **Konteyner Uygulamaları**: **Konteynerleştirilmiş fonksiyon uygulamalarını** yönetilen bir ortamda, mikro hizmetler ve API'lerle birlikte dağıtmayı sağlar. Özel kütüphaneleri, eski uygulama geçişini ve **GPU işleme** desteğini içerir, Kubernetes küme yönetimini ortadan kaldırır. **Olay odaklı, ölçeklenebilir konteynerleştirilmiş uygulamalar** için idealdir.
|
||||
|
||||
### **Depolama Kovalari**
|
||||
|
||||
Yeni bir konteynerleştirilmemiş Function App oluşturduğunuzda (ancak çalıştırılacak kodu veriyorsanız), **kod ve diğer Fonksiyon ile ilgili veriler bir Depolama hesabında saklanacaktır**. Varsayılan olarak, web konsolu her fonksiyon için kodu saklamak üzere yeni bir tane oluşturur.
|
||||
Yeni bir konteynerleştirilmemiş Function App oluşturduğunuzda (ancak çalıştırılacak kodu veriyorsanız), **kod ve diğer Fonksiyon ile ilgili veriler bir Depolama hesabında saklanacaktır**. Varsayılan olarak, web konsolu her fonksiyon için kodu saklamak üzere yeni bir tane oluşturacaktır.
|
||||
|
||||
Ayrıca, kova içindeki kodu (farklı formatlarda saklanabileceği) değiştirdiğinizde, **uygulamanın kodu yeni olanla değiştirilir ve bir sonraki Fonksiyon çağrıldığında çalıştırılır**.
|
||||
Ayrıca, kova içindeki kodu (farklı formatlarda saklanabileceği) değiştirdiğinizde, **uygulamanın kodu yeni olanla değiştirilecek ve bir sonraki fonksiyon çağrıldığında çalıştırılacaktır**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Bu, bir saldırganın **bu kovaya yazma erişimi** olması durumunda **kodun tehlikeye atılmasına ve Fonksiyon App içindeki yönetilen kimliklere yetki yükseltmesine** olanak tanıdığı için saldırganlar açısından çok ilginçtir.
|
||||
> Bu, bir saldırganın **bu kovaya yazma erişimi** olması durumunda **kodun tehlikeye atılmasına ve Fonksiyon Uygulamasındaki yönetilen kimliklere yetki yükseltmesine** olanak tanıdığı için saldırganlar açısından çok ilginçtir.
|
||||
>
|
||||
> Bununla ilgili daha fazla bilgi **yetki yükseltme bölümünde**.
|
||||
> Bununla ilgili daha fazla bilgi **yetki yükseltme bölümünde** bulunmaktadır.
|
||||
|
||||
Ayrıca, **`azure-webjobs-secrets`** konteynerinde depolama hesabında saklanan **master ve fonksiyon anahtarlarını** bulmak da mümkündür, bu anahtarlar **`<app-name>`** klasöründeki JSON dosyalarında bulunabilir.
|
||||
Ayrıca, **`azure-webjobs-secrets`** konteynerinde depolama hesabında saklanan **master ve fonksiyon anahtarlarını** bulmak da mümkündür; bu anahtarlar **`<app-name>`** klasöründeki JSON dosyalarında bulunabilir.
|
||||
|
||||
Fonksiyonların ayrıca kodu uzaktan bir konumda saklamaya da izin verdiğini unutmayın, sadece URL'yi belirtmeniz yeterlidir.
|
||||
Fonksiyonların ayrıca kodu uzaktan bir konumda saklamaya da izin verdiğini unutmayın; sadece URL'yi belirtmeniz yeterlidir.
|
||||
|
||||
### Ağ
|
||||
|
||||
HTTP tetikleyicisi kullanarak:
|
||||
|
||||
- **İnternetten bir fonksiyona erişim** vermek mümkündür, herhangi bir kimlik doğrulama gerektirmeden veya IAM tabanlı erişim vermek mümkündür. Ancak bu erişimi kısıtlamak da mümkündür.
|
||||
- **İnternetten bir fonksiyona erişim** vermek mümkündür; bu, herhangi bir kimlik doğrulama gerektirmeden veya IAM tabanlı erişim vermeden yapılabilir. Ancak bu erişimi kısıtlamak da mümkündür.
|
||||
- **Bir iç ağdan (VPC)** bir Function App'a **erişim vermek veya kısıtlamak** da mümkündür.
|
||||
|
||||
> [!CAUTION]
|
||||
> Bu, bir saldırganın **internet üzerinden maruz kalan bir zayıf Fonksiyondan iç ağlara geçiş yapma** olasılığı nedeniyle saldırganlar açısından çok ilginçtir.
|
||||
> Bu, bir saldırganın **internet üzerinden maruz kalan bir zayıf Fonksiyondan iç ağlara geçiş yapma** olasılığı olduğu için saldırganlar açısından çok ilginçtir.
|
||||
|
||||
### **Function App Ayarları & Ortam Değişkenleri**
|
||||
|
||||
Bir uygulama içinde ortam değişkenlerini yapılandırmak mümkündür, bu değişkenler hassas bilgiler içerebilir. Ayrıca, varsayılan olarak **`AzureWebJobsStorage`** ve **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (diğerleri arasında) ortam değişkenleri oluşturulur. Bu değişkenler özellikle ilginçtir çünkü **uygulamanın verilerini içeren depolama hesabını kontrol etmek için TAM izinlere sahip hesap anahtarını içerir**. Bu ayarlar, Depolama Hesabından kodu çalıştırmak için de gereklidir.
|
||||
Bir uygulama içinde ortam değişkenlerini yapılandırmak mümkündür; bu değişkenler hassas bilgiler içerebilir. Ayrıca, varsayılan olarak **`AzureWebJobsStorage`** ve **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (diğerleri arasında) gibi env değişkenleri oluşturulur. Bu değişkenler özellikle ilginçtir çünkü **uygulamanın verilerini içeren depolama hesabını kontrol etmek için TAM izinlere sahip hesap anahtarını içerir**. Bu ayarlar, Depolama Hesabından kodu çalıştırmak için de gereklidir.
|
||||
|
||||
Bu ortam değişkenleri veya yapılandırma parametreleri, Fonksiyonun kodu nasıl çalıştırdığını da kontrol eder; örneğin, **`WEBSITE_RUN_FROM_PACKAGE`** varsa, bu uygulamanın kodunun bulunduğu URL'yi belirtir.
|
||||
Bu env değişkenleri veya yapılandırma parametreleri, Fonksiyonun kodu nasıl çalıştırdığını da kontrol eder; örneğin, **`WEBSITE_RUN_FROM_PACKAGE`** varsa, bu, uygulamanın kodunun bulunduğu URL'yi belirtir.
|
||||
|
||||
### **Function Sandbox**
|
||||
|
||||
Linux sandbox içinde kaynak kodu **`/home/site/wwwroot`** dizininde **`function_app.py`** dosyasında (Python kullanılıyorsa) bulunur, kodu çalıştıran kullanıcı **`app`**'dir (sudo izinleri olmadan).
|
||||
Linux sandbox içinde kaynak kodu **`/home/site/wwwroot`** dizininde **`function_app.py`** dosyasında (Python kullanılıyorsa) bulunur; kodu çalıştıran kullanıcı **`app`**'dir (sudo izinleri olmadan).
|
||||
|
||||
Bir **Windows** fonksiyonunda NodeJS kullanıldığında kod **`C:\home\site\wwwroot\HttpTrigger1\index.js`** dizininde bulunuyordu, kullanıcı adı **`mawsFnPlaceholder8_f_v4_node_20_x86`** idi ve **grupların** bir parçasıydı: `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`.
|
||||
Bir **Windows** fonksiyonunda NodeJS kullanıldığında kod **`C:\home\site\wwwroot\HttpTrigger1\index.js`** dizininde bulunuyordu; kullanıcı adı **`mawsFnPlaceholder8_f_v4_node_20_x86`** idi ve **grupların** bir parçasıydı: `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`.
|
||||
|
||||
### **Yönetilen Kimlikler & Meta Veriler**
|
||||
|
||||
[**VM'ler**](vms/) gibi, Fonksiyonlar da **2 tür Yönetilen Kimlik** alabilir: Sistem atanan ve Kullanıcı atanan.
|
||||
[**VM'ler**](vms/index.html) gibi, Fonksiyonların **2 tür Yönetilen Kimliği** olabilir: Sistem atanan ve Kullanıcı atanan.
|
||||
|
||||
**Sistem atanan** olan, **yalnızca atanan fonksiyon** tarafından kullanılabilecek bir yönetilen kimliktir, **kullanıcı atanan** yönetilen kimlikler ise **herhangi bir diğer Azure hizmeti tarafından kullanılabilecek** yönetilen kimliklerdir.
|
||||
**Sistem atanan** olan, **yalnızca atanan fonksiyon** tarafından kullanılabilecek bir yönetilen kimliktir; **kullanıcı atanan** yönetilen kimlikler ise **herhangi bir diğer Azure hizmeti tarafından kullanılabilecek** yönetilen kimliklerdir.
|
||||
|
||||
> [!NOTE]
|
||||
> [**VM'ler**](vms/) gibi, Fonksiyonlar **1 sistem atanan** yönetilen kimlik ve **birkaç kullanıcı atanan** yönetilen kimlik alabilir, bu nedenle fonksiyonu tehlikeye attığınızda hepsini bulmaya çalışmak her zaman önemlidir çünkü yalnızca bir Fonksiyondan birkaç yönetilen kimliğe yetki yükseltebilirsiniz.
|
||||
> [**VM'ler**](vms/index.html) gibi, Fonksiyonların **1 sistem atanan** yönetilen kimliği ve **birden fazla kullanıcı atanan** yönetilen kimliği olabilir, bu nedenle fonksiyonu tehlikeye attığınızda hepsini bulmaya çalışmak her zaman önemlidir; çünkü bir Fonksiyondan birden fazla yönetilen kimliğe yetki yükseltebilirsiniz.
|
||||
>
|
||||
> Eğer bir sistem yönetilen kimliği kullanılmıyorsa ancak bir veya daha fazla kullanıcı yönetilen kimliği bir fonksiyona eklenmişse, varsayılan olarak herhangi bir token alamazsınız.
|
||||
|
||||
[**PEASS scriptlerini**](https://github.com/peass-ng/PEASS-ng) kullanarak, meta veri uç noktasından varsayılan yönetilen kimlikten token alabilirsiniz. Ya da bunları **manuel olarak** alabilirsiniz, açıklamalar için:
|
||||
[**PEASS scriptlerini**](https://github.com/peass-ng/PEASS-ng) kullanarak, varsayılan yönetilen kimlikten token almak mümkündür. Ya da bunları **manuel olarak** almak için aşağıdaki gibi yapabilirsiniz:
|
||||
|
||||
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
|
||||
|
||||
Bir fonksiyonun ekli olduğu **tüm Yönetilen Kimlikleri kontrol etmenin** bir yolunu bulmanız gerektiğini unutmayın, çünkü belirtmezseniz, meta veri uç noktası **yalnızca varsayılan olanı** kullanacaktır (daha fazla bilgi için önceki bağlantıya bakın).
|
||||
Bir fonksiyonun bağlı olduğu **tüm Yönetilen Kimlikleri kontrol etmenin** bir yolunu bulmanız gerektiğini unutmayın; çünkü belirtmezseniz, meta veri uç noktası **yalnızca varsayılan olanı** kullanacaktır (daha fazla bilgi için önceki bağlantıya bakın).
|
||||
|
||||
## Erişim Anahtarları
|
||||
|
||||
@@ -79,15 +79,15 @@ Bir fonksiyonun ekli olduğu **tüm Yönetilen Kimlikleri kontrol etmenin** bir
|
||||
Bir fonksiyon içinde bir **HTTP tetikleyici** kullanarak bir uç nokta oluşturduğunuzda, fonksiyonu tetiklemek için gereken **erişim anahtarı yetkilendirme seviyesini** belirtmek mümkündür. Üç seçenek mevcuttur:
|
||||
|
||||
- **ANONYMOUS**: **Herkes**, URL aracılığıyla fonksiyona erişebilir.
|
||||
- **FUNCTION**: Uç nokta yalnızca **bir fonksiyon, ana bilgisayar veya master anahtarı** kullanan kullanıcılara açıktır.
|
||||
- **ADMIN**: Uç nokta yalnızca **bir master anahtarı** kullanan kullanıcılara açıktır.
|
||||
- **FUNCTION**: Uç nokta yalnızca **fonksiyon, ana bilgisayar veya master anahtar** kullanan kullanıcılara açıktır.
|
||||
- **ADMIN**: Uç nokta yalnızca **master anahtar** kullanan kullanıcılara açıktır.
|
||||
|
||||
**Anahtar türleri:**
|
||||
|
||||
- **Fonksiyon Anahtarları:** Fonksiyon anahtarları varsayılan veya kullanıcı tanımlı olabilir ve yalnızca bir Function App içindeki **belirli fonksiyon uç noktalarına** erişim sağlamak için tasarlanmıştır, bu da uç noktalar üzerinde daha ince ayarlı bir erişim sağlar.
|
||||
- **Fonksiyon Anahtarları:** Fonksiyon anahtarları varsayılan veya kullanıcı tanımlı olabilir ve yalnızca bir Function App içindeki **belirli fonksiyon uç noktalarına** erişim sağlamak için tasarlanmıştır; bu, uç noktalar üzerinde daha ince ayarlı bir erişim sağlar.
|
||||
- **Ana Bilgisayar Anahtarları:** Ana bilgisayar anahtarları, varsayılan veya kullanıcı tanımlı olabilir ve **FUNCTION erişim seviyesine sahip bir Function App içindeki tüm fonksiyon uç noktalarına** erişim sağlar.
|
||||
- **Master Anahtar:** Master anahtar (`_master`), tüm fonksiyon uç noktalarına (ADMIN erişim seviyesi dahil) erişim sağlayan yükseltilmiş izinler sunan bir yönetim anahtarıdır. Bu **anahtar iptal edilemez.**
|
||||
- **Sistem Anahtarları:** Sistem anahtarları, **belirli uzantılar tarafından yönetilir** ve iç bileşenler tarafından kullanılan webhook uç noktalarına erişim için gereklidir. Örnekler arasında, sistem anahtarlarını kullanarak ilgili API'leri güvenli bir şekilde etkileşimde bulunan Event Grid tetikleyicisi ve Dayanıklı Fonksiyonlar bulunur.
|
||||
- **Sistem Anahtarları:** Sistem anahtarları, **belirli uzantılar tarafından yönetilir** ve iç bileşenler tarafından kullanılan webhook uç noktalarına erişim için gereklidir. Örnekler arasında, sistem anahtarlarını kullanarak ilgili API'leri güvenli bir şekilde etkileşimde bulunan Olay Grid tetikleyicisi ve Dayanıklı Fonksiyonlar bulunur.
|
||||
|
||||
> [!TIP]
|
||||
> Bir anahtar kullanarak bir fonksiyon API uç noktasına erişim örneği:
|
||||
@@ -96,15 +96,15 @@ Bir fonksiyon içinde bir **HTTP tetikleyici** kullanarak bir uç nokta oluştur
|
||||
|
||||
### Temel Kimlik Doğrulama
|
||||
|
||||
App Services'da olduğu gibi, Fonksiyonlar da **SCM** ve **FTP** ile bağlanmak için temel kimlik doğrulamayı destekler ve kodu dağıtmak için Azure tarafından sağlanan **bir URL'deki kullanıcı adı ve şifre** kullanır. Bununla ilgili daha fazla bilgi:
|
||||
Uygulama Hizmetlerinde olduğu gibi, Fonksiyonlar da **SCM** ve **FTP** ile bağlanmak için temel kimlik doğrulamayı destekler; bu, Azure tarafından sağlanan bir **kullanıcı adı ve şifreyi URL'de** kullanarak kod dağıtımına olanak tanır. Bununla ilgili daha fazla bilgi:
|
||||
|
||||
{{#ref}}
|
||||
az-app-service.md
|
||||
az-app-services.md
|
||||
{{#endref}}
|
||||
|
||||
### Github Tabanlı Dağıtımlar
|
||||
|
||||
Bir fonksiyon bir Github reposundan oluşturulduğunda, Azure web konsolu, bu depo güncellendiğinde fonksiyonun kodunun güncellenmesi için **belirli bir depoda otomatik olarak bir Github İş Akışı oluşturmasına** olanak tanır. Aslında, bir Python fonksiyonu için Github Action yaml'ı şöyle görünür:
|
||||
Bir fonksiyon bir Github deposundan oluşturulduğunda, Azure web konsolu, bu depo güncellendiğinde fonksiyonun kodunu otomatik olarak güncellemek için **belirli bir depoda bir Github İş Akışı oluşturmayı** sağlar. Aslında, bir Python fonksiyonu için Github Action yaml'ı şöyle görünür:
|
||||
|
||||
<details>
|
||||
|
||||
@@ -192,16 +192,16 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
|
||||
```
|
||||
</details>
|
||||
|
||||
Ayrıca, bir **Managed Identity** oluşturulur, böylece depodaki Github Action Azure'a bu kimlik ile giriş yapabilir. Bu, **Managed Identity** üzerinde **Issuer** `https://token.actions.githubusercontent.com` ve **Subject Identifier** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>` ile bir Federated credential oluşturarak gerçekleştirilir.
|
||||
Ayrıca, bir **Managed Identity** de oluşturulur, böylece depodaki Github Action Azure'a bu kimlik ile giriş yapabilir. Bu, **Managed Identity** üzerinde bir Federated kimlik bilgisi oluşturarak yapılır ve **Issuer** `https://token.actions.githubusercontent.com` ile **Subject Identifier** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>` izin verilir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Bu nedenle, o depoyu ele geçiren herkes, işlevi ve ona bağlı Managed Identities'i ele geçirebilecektir.
|
||||
> Bu nedenle, o depoyu ele geçiren herkes, işlevi ve ona bağlı Managed Identities'i ele geçirebilir.
|
||||
|
||||
### Konteyner Tabanlı Dağıtımlar
|
||||
|
||||
Tüm planlar konteyner dağıtımına izin vermez, ancak izin verenler için yapılandırma konteynerin URL'sini içerecektir. API'de **`linuxFxVersion`** ayarı şöyle bir şeye sahip olacaktır: `DOCKER|mcr.microsoft.com/...`, web konsolunda ise yapılandırma **image settings** olarak gösterilecektir.
|
||||
|
||||
Ayrıca, işlevle ilgili depolama hesabında **hiçbir kaynak kodu saklanmayacaktır** çünkü bu gerekli değildir.
|
||||
Ayrıca, **kaynak kodu işlevle ilgili depolama** hesabında saklanmayacaktır çünkü bu gerekli değildir.
|
||||
|
||||
## Enumeration
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user