From f62b7c04097b1a73d49701318bb801f1778816c1 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 6 Jan 2025 17:12:10 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/ --- .gitignore | 1 + hacktricks-preprocessor.py | 46 ++++++++----- .../aws-s3-privesc.md | 8 +-- .../az-app-services-privesc.md | 18 ++--- .../az-services/az-function-apps.md | 66 +++++++++---------- 5 files changed, 78 insertions(+), 61 deletions(-) diff --git a/.gitignore b/.gitignore index 8d12fbb76..9e7a262f7 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ Temporary Items book book/* hacktricks-preprocessor.log +hacktricks-preprocessor-error.log diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py index 0077da80f..af5949449 100644 --- a/hacktricks-preprocessor.py +++ b/hacktricks-preprocessor.py @@ -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"""{title}""" @@ -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 diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md index a25a976d3..b3fc46a13 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md @@ -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**. ![](<../../../images/image (174).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` diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md index 91a6da7d1..b2d794823 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md @@ -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 --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 `.scm.azurewebsites.net`**. @@ -116,7 +116,7 @@ az webapp deployment list-publishing-credentials --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 "/api/publish?type=zip" --data-binary "@./app.zip" -u ' --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ ``` @@ -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 --resource-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 \ diff --git a/src/pentesting-cloud/azure-security/az-services/az-function-apps.md b/src/pentesting-cloud/azure-security/az-services/az-function-apps.md index a054bae20..0aff1ac46 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-function-apps.md +++ b/src/pentesting-cloud/azure-security/az-services/az-function-apps.md @@ -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 **``** 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 **``** 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:
@@ -192,16 +192,16 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }} ```
-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:/:ref:refs/heads/` 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:/:ref:refs/heads/` 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