From 55b7d7cdf67515665d2ee2fd4fecf491892f03b9 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 6 Jan 2025 17:12:43 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/ --- .gitignore | 1 + hacktricks-preprocessor.py | 46 ++++++++++----- .../aws-s3-privesc.md | 16 +++--- .../az-app-services-privesc.md | 38 ++++++------- .../az-services/az-function-apps.md | 56 +++++++++---------- 5 files changed, 87 insertions(+), 70 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 744897a43..d32885ee4 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 @@ -38,7 +38,7 @@ ![](<../../../images/image (174).png>) -Pacuモジュール [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) を使用して、この攻撃を自動化できます。\ +Pacuモジュール[`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection)を使用して、この攻撃を自動化できます。\ 詳細については、元の研究を確認してください: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/) ### `s3:PutObject`, `s3:GetObject` @@ -50,22 +50,22 @@ Pacuモジュール [`cfn__resouce_injection`](https://github.com/RhinoSecurityL - EC2インスタンスが**ユーザーデータをS3バケットに保存している**場合、攻撃者はそれを変更して**EC2インスタンス内で任意のコードを実行する**ことができます。 -### `s3:PutObject`, `s3:GetObject` (optional) over terraform state file +### `s3:PutObject`, `s3:GetObject` (オプション) terraformステートファイル上 -[terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html)の状態ファイルがクラウドプロバイダーのブロブストレージに保存されることは非常に一般的です。例えば、AWS S3です。状態ファイルのファイルサフィックスは`.tfstate`であり、バケット名も通常、terraform状態ファイルを含んでいることを示します。通常、すべてのAWSアカウントには、アカウントの状態を示す状態ファイルを保存するためのそのようなバケットが1つあります。\ +[terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html)のステートファイルがクラウドプロバイダーのブロブストレージに保存されることは非常に一般的です。例えば、AWS S3です。ステートファイルのファイルサフィックスは`.tfstate`であり、バケット名も通常、terraformステートファイルを含んでいることを示します。通常、すべてのAWSアカウントには、アカウントの状態を示すステートファイルを保存するためのそのようなバケットが1つあります。\ また、実際のアカウントでは、ほとんどすべての開発者が`s3:*`を持ち、時にはビジネスユーザーでさえ`s3:Put*`を持っています。 -したがって、これらのファイルに対してリストされた権限を持っている場合、`terraform`の特権でパイプライン内でRCEを取得することを可能にする攻撃ベクターがあります。ほとんどの場合、`AdministratorAccess`であり、クラウドアカウントの管理者になります。また、そのベクターを使用して、`terraform`に正当なリソースを削除させることによるサービス拒否攻撃を行うこともできます。 +したがって、これらのファイルに対してリストされた権限を持っている場合、`terraform`の特権でパイプライン内でRCEを取得することを可能にする攻撃ベクターがあります - ほとんどの場合、`AdministratorAccess`であり、あなたをクラウドアカウントの管理者にします。また、そのベクターを使用して、`terraform`に正当なリソースを削除させることによるサービス拒否攻撃を行うこともできます。 直接使用可能なエクスプロイトコードについては、*Terraform Security*ページの*Abusing Terraform State Files*セクションの説明に従ってください: {{#ref}} -terraform-security.md#abusing-terraform-state-files +pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files {{#endref}} ### `s3:PutBucketPolicy` -攻撃者は、**同じアカウントからである必要があり**、そうでない場合はエラー`The specified method is not allowed will trigger`が発生します。この権限を持つ攻撃者は、バケットに対して自分自身により多くの権限を付与し、読み取り、書き込み、変更、削除、バケットを公開することができるようになります。 +攻撃者は、**同じアカウントからである必要があり**、そうでない場合はエラー`The specified method is not allowed will trigger`が発生します。この権限を持つ攻撃者は、バケットに対して自分自身により多くの権限を付与し、バケットを読み取り、書き込み、変更、削除、公開することができるようになります。 ```bash # Update Bucket policy aws s3api put-bucket-policy --policy file:///root/policy.json --bucket @@ -123,8 +123,8 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket 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 d0dcf49aa..909b508f5 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,19 +7,19 @@ Azure App Servicesに関する詳細情報は、以下を確認してください: {{#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 これらの権限により、ウェブアプリ内で**SSHシェル**を取得できます。また、アプリケーションを**デバッグ**することも可能です。 -- **単一コマンドでSSH**: +- **単一コマンドでSSH**: ```bash # Direct option az webapp ssh --name --resource-group ``` -- **トンネルを作成し、次にSSHに接続する**: +- **トンネルを作成し、その後SSHに接続する**: ```bash az webapp create-remote-connection --name --resource-group @@ -37,13 +37,13 @@ ssh root@127.0.0.1 -p 39895 2. Azureアカウントで拡張機能にログインします。 3. サブスクリプション内のすべてのAppサービスをリストします。 4. デバッグしたいAppサービスを選択し、右クリックして「デバッグの開始」を選択します。 -5. アプリにデバッグが有効になっていない場合、拡張機能はそれを有効にしようとしますが、そのためにはあなたのアカウントに`Microsoft.Web/sites/config/write`の権限が必要です。 +5. アプリにデバッグが有効でない場合、拡張機能はそれを有効にしようとしますが、そのためにはあなたのアカウントに`Microsoft.Web/sites/config/write`の権限が必要です。 ### SCM資格情報の取得と基本認証の有効化 SCM資格情報を取得するには、次の**コマンドと権限**を使用できます: -- 権限**`Microsoft.Web/sites/publishxml/action`**は、呼び出すことを許可します: +- 権限**`Microsoft.Web/sites/publishxml/action`**は、次の呼び出しを許可します: ```bash az webapp deployment list-publishing-profiles --name --resource-group # Example output @@ -96,7 +96,7 @@ az webapp deployment list-publishing-profiles --name --resource-group ``` **ユーザー名は常に同じ**であることに注意してください(FTPではアプリの名前が最初に追加されます)が、**パスワードはすべて同じ**です。 -さらに、**SCM URLは`.scm.azurewebsites.net`です**。 +さらに、**SCM URLは`.scm.azurewebsites.net`**です。 - 権限**`Microsoft.Web/sites/config/list/action`**は、呼び出すことを許可します: ```bash @@ -124,14 +124,14 @@ az webapp deployment user set \ --user-name hacktricks \ --password 'W34kP@ssw0rd123!' ``` -その後、これらの資格情報を使用して**SCMおよびFTPプラットフォームにアクセス**できます。これは持続性を維持するための優れた方法でもあります。 +次に、これらの資格情報を使用して**SCMおよびFTPプラットフォームにアクセス**できます。これは持続性を維持するための優れた方法でもあります。 **WebからSCMプラットフォームにアクセスするには、`/BasicAuth`にアクセスする必要があります**。 > [!WARNING] > すべてのユーザーは前のコマンドを呼び出すことで自分の資格情報を設定できますが、ユーザーがSCMまたはFTPにアクセスするための十分な権限を持っていない場合、資格情報は機能しません。 -- これらの資格情報が**REDACTED**と表示される場合、それは**SCM基本認証オプションを有効にする必要がある**ためであり、そのためには2番目の権限(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)が必要です: +- これらの資格情報が**REDACTED**と表示される場合、それは**SCM基本認証オプションを有効にする必要がある**ためで、そのためには2番目の権限(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)が必要です。 ```bash # Enable basic authentication for SCM az rest --method PUT \ @@ -155,9 +155,9 @@ az rest --method PUT \ 有効なSCM資格情報があれば、**コードを公開**することが可能です。これは次のコマンドを使用して行うことができます。 -このPythonの例では、https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart からリポジトリをダウンロードし、任意の**変更**を加えた後、**`zip -r app.zip .`**を実行して圧縮します。 +このPythonの例では、https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart からリポジトリをダウンロードし、任意の**変更**を加えた後、**`zip -r app.zip .`を実行してzip化します。** -その後、次のコマンドを使用してWebアプリに**コードを公開**できます: +その後、次のコマンドを使用してウェブアプリに**コードを公開**できます: ```bash curl -X POST "/api/publish?type=zip" --data-binary "@./app.zip" -u ':' -H "Content-Type: application/octet-stream" ``` @@ -165,7 +165,7 @@ curl -X POST "/api/publish?type=zip" --data-binary "@./app.zip" -u '/vfs/data/jobs//rev5/job_log.txt" --resource "https://management.azure.com/" @@ -225,7 +225,7 @@ az rest --method GET \ ``` このコマンドは、Github、Bitbucket、Dropbox、およびOneDriveのトークンを返します。 -ここにトークンを確認するためのいくつかのコマンドの例があります: +ここにトークンを確認するためのいくつかのコマンド例があります: ```bash # GitHub – List Repositories curl -H "Authorization: token " \ @@ -251,26 +251,26 @@ https://graph.microsoft.com/v1.0/me/drive/root/children ### アプリコードのソースからの更新 - 設定されたソースがGithub、BitBucket、またはAzureリポジトリのようなサードパーティプロバイダーである場合、リポジトリ内のソースコードを侵害することでアプリサービスの**コードを更新**できます。 -- アプリが**リモートgitリポジトリ**(ユーザー名とパスワードを使用)を使用して構成されている場合、次のコマンドを使用して**URLと基本認証情報**を取得し、変更をクローンおよびプッシュすることが可能です: -- 権限**`Microsoft.Web/sites/sourcecontrols/read`**を使用:`az webapp deployment source show --name --resource-group ` +- アプリが**リモートgitリポジトリ**(ユーザー名とパスワードを使用)を使用するように設定されている場合、次のコマンドを使用して**URLと基本認証情報**を取得し、変更をクローンおよびプッシュすることが可能です: +- 権限**`Microsoft.Web/sites/sourcecontrols/read`**を使用: `az webapp deployment source show --name --resource-group ` - 権限**`Microsoft.Web/sites/config/list/action`**を使用: - `az webapp deployment list-publishing-credentials --name --resource-group ` - `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` -- アプリが**ローカルgitリポジトリ**を使用するように構成されている場合、リポジトリを**クローン**し、**変更をプッシュ**することが可能です: -- 権限**`Microsoft.Web/sites/sourcecontrols/read`**を使用:`az webapp deployment source show --name --resource-group `を使用してgitリポジトリのURLを取得できますが、アプリのSCM URLと同じで、パスは`/.git`になります(例:`https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`)。 +- アプリが**ローカルgitリポジトリ**を使用するように設定されている場合、リポジトリを**クローン**し、**変更をプッシュ**することが可能です: +- 権限**`Microsoft.Web/sites/sourcecontrols/read`**を使用: `az webapp deployment source show --name --resource-group `を実行することでgitリポジトリのURLを取得できますが、アプリのSCM URLと同じで、パスは`/.git`になります(例: `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`)。 - SCM資格情報を取得するには、次の権限が必要です: - **`Microsoft.Web/sites/publishxml/action`**:次に、`az webapp deployment list-publishing-profiles --resource-group -n `を実行します。 - **`Microsoft.Web/sites/config/list/action`**:次に、`az webapp deployment list-publishing-credentials --name --resource-group `を実行します。 > [!WARNING] -> 権限`Microsoft.Web/sites/config/list/action`とSCM資格情報を持っている場合、前のセクションで述べたように、サードパーティプロバイダーを使用するように構成されていても、webappにデプロイすることは常に可能です。 +> 権限`Microsoft.Web/sites/config/list/action`とSCM資格情報を持っている場合、前のセクションで述べたように、サードパーティプロバイダーを使用するように設定されていても、ウェブアプリにデプロイすることは常に可能です。 > [!WARNING] -> 以下の権限を持っている場合、webappが異なる構成であっても**任意のコンテナを実行することが可能**です。 +> 以下の権限を持っている場合、ウェブアプリが異なる設定であっても**任意のコンテナを実行することが可能**です。 ### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read` -これは、webappによって使用される**コンテナを変更する**ことを許可する権限のセットです。攻撃者はこれを悪用してwebappに悪意のあるコンテナを実行させることができます。 +これは、ウェブアプリによって使用される**コンテナを変更する**ことを許可する権限のセットです。攻撃者はこれを悪用して、ウェブアプリが悪意のあるコンテナを実行するようにすることができます。 ```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 21218fe7f..5e9e0713c 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,43 +4,43 @@ ## 基本情報 -**Azure Function Apps** は **サーバーレスコンピューティングサービス** であり、基盤となるインフラストラクチャを管理することなく、**関数**と呼ばれる小さなコードの断片を実行することを可能にします。これらは、**HTTPリクエスト、タイマー、またはBlob StorageやEvent Hubsなどの他のAzureサービスからのイベント**など、さまざまなトリガーに応じてコードを実行するように設計されています。Function AppsはC#、Python、JavaScript、Javaなど複数のプログラミング言語をサポートしており、**イベント駆動型アプリケーション**の構築、ワークフローの自動化、サービスの統合に適しています。通常、コードが実行されるときに使用されたコンピューティング時間に対してのみ支払うため、コスト効率が高いです。 +**Azure Function Apps** は **サーバーレスコンピューティングサービス** で、基盤となるインフラを管理することなく、**関数**と呼ばれる小さなコードの断片を実行できます。これらは、**HTTPリクエスト、タイマー、またはBlob StorageやEvent Hubsなどの他のAzureサービスからのイベント**に応じてコードを実行するように設計されています。Function AppsはC#、Python、JavaScript、Javaなど複数のプログラミング言語をサポートしており、**イベント駆動型アプリケーション**の構築、ワークフローの自動化、サービスの統合に適しています。通常、コードが実行されるときに使用されたコンピューティング時間に対してのみ支払うため、コスト効率が良いです。 > [!NOTE] -> **FunctionsはApp Servicesのサブセット**であるため、ここで説明される多くの機能はAzure Apps(cliでは`webapp`)として作成されたアプリケーションでも使用されます。 +> **FunctionsはApp Servicesのサブセット**であるため、ここで説明される多くの機能はAzure Apps(CLIでは`webapp`)として作成されたアプリケーションでも使用されます。 ### 異なるプラン - **Flex Consumption Plan**: **動的でイベント駆動型のスケーリング**を提供し、需要に応じて関数インスタンスを追加または削除する従量課金制です。**仮想ネットワーキング**と**事前プロビジョニングされたインスタンス**をサポートし、コールドスタートを減少させ、コンテナサポートを必要としない**変動するワークロード**に適しています。 -- **Traditional Consumption Plan**: デフォルトのサーバーレスオプションで、関数が実行されるときにのみ**コンピューティングリソースに対して支払います**。受信イベントに基づいて自動的にスケールし、**コールドスタートの最適化**が含まれていますが、コンテナデプロイメントはサポートしていません。自動スケーリングを必要とする**断続的なワークロード**に最適です。 -- **Premium Plan**: **一貫したパフォーマンス**を提供するように設計されており、コールドスタートを排除するための**事前ウォームアップされたワーカー**を備えています。**拡張実行時間、仮想ネットワーキング**を提供し、**カスタムLinuxイメージ**をサポートしており、高パフォーマンスと高度な機能を必要とする**ミッションクリティカルなアプリケーション**に最適です。 +- **Traditional Consumption Plan**: デフォルトのサーバーレスオプションで、**関数が実行されるときのみコンピューティングリソースに対して支払います**。受信イベントに基づいて自動的にスケールし、**コールドスタートの最適化**が含まれていますが、コンテナデプロイメントはサポートしていません。自動スケーリングを必要とする**断続的なワークロード**に最適です。 +- **Premium Plan**: **一貫したパフォーマンス**を提供するように設計されており、コールドスタートを排除するための**事前ウォームされたワーカー**を備えています。**拡張実行時間、仮想ネットワーキング**を提供し、**カスタムLinuxイメージ**をサポートしており、高パフォーマンスと高度な機能を必要とする**ミッションクリティカルなアプリケーション**に最適です。 - **Dedicated Plan**: 専用の仮想マシン上で実行され、**予測可能な請求**を提供し、手動または自動スケーリングをサポートします。同じプランで複数のアプリを実行でき、**コンピューティングの隔離**を提供し、App Service Environmentsを介して**安全なネットワークアクセス**を確保し、一貫したリソース割り当てを必要とする**長時間実行されるアプリケーション**に最適です。 - **Container Apps**: **コンテナ化された関数アプリ**を管理された環境でデプロイでき、マイクロサービスやAPIと共に使用できます。カスタムライブラリ、レガシーアプリの移行、**GPU処理**をサポートし、Kubernetesクラスターの管理を排除します。**イベント駆動型でスケーラブルなコンテナ化されたアプリケーション**に最適です。 ### **ストレージバケット** -コンテナ化されていない新しいFunction Appを作成する際、**コードとその他のFunction関連データはストレージアカウントに保存されます**。デフォルトでは、Webコンソールはコードを保存するために関数ごとに新しいものを作成します。 +新しいFunction Appをコンテナ化せずに作成する際、**コードとその他のFunction関連データはストレージアカウントに保存されます**。デフォルトでは、Webコンソールはコードを保存するために関数ごとに新しいものを作成します。 さらに、バケット内のコードを変更すると(保存されるさまざまな形式で)、**アプリのコードは新しいものに変更され、次回Functionが呼び出されると実行されます**。 > [!CAUTION] -> これは攻撃者の視点から非常に興味深いものであり、**このバケットに対する書き込みアクセス**があれば、攻撃者は**コードを妥協し、Function App内の管理されたIDの権限を昇格させる**ことができます。 +> これは攻撃者の視点から非常に興味深いもので、**このバケットに対する書き込みアクセス**があれば、攻撃者は**コードを妥協し、Function App内の管理されたIDの権限を昇格させる**ことができます。 > > これについては**権限昇格セクション**で詳しく説明します。 -ストレージアカウント内のコンテナ **`azure-webjobs-secrets`** に、フォルダ **``** 内のJSONファイルに保存されている**マスターキーと関数キー**を見つけることも可能です。 +ストレージアカウント内のコンテナ **`azure-webjobs-secrets`** に、フォルダ **``** 内のJSONファイルに保存された**マスターキーと関数キー**を見つけることも可能です。 -Functionsは、URLを指定するだけでリモートの場所にコードを保存することも可能です。 +Functionsは、リモートロケーションにコードを保存することも可能で、URLを指定するだけで済みます。 ### ネットワーキング -HTTPトリガーを使用する場合: +HTTPトリガーを使用すると: -- **インターネットから関数へのアクセスを提供する**ことが可能で、認証を必要とせず、IAMベースのアクセスを提供することもできます。ただし、このアクセスを制限することも可能です。 -- **内部ネットワーク(VPC)**からFunction Appへのアクセスを**提供または制限する**ことも可能です。 +- **インターネット全体から関数へのアクセスを提供**することが可能で、認証を必要とせず、IAMベースのアクセスを提供することもできます。ただし、このアクセスを制限することも可能です。 +- **内部ネットワーク(VPC)**からFunction Appへのアクセスを**提供または制限**することも可能です。 > [!CAUTION] -> これは攻撃者の視点から非常に興味深いものであり、インターネットに公開された脆弱なFunctionから**内部ネットワークにピボットする**ことが可能かもしれません。 +> これは攻撃者の視点から非常に興味深いもので、インターネットに公開された脆弱なFunctionから**内部ネットワークにピボットする**ことが可能かもしれません。 ### **Function Appの設定と環境変数** @@ -52,16 +52,16 @@ HTTPトリガーを使用する場合: Linuxサンドボックス内では、ソースコードは **`/home/site/wwwroot`** にあり、ファイル **`function_app.py`**(Pythonを使用している場合)に格納されています。コードを実行するユーザーは **`app`** で、sudo権限はありません。 -**Windows**関数でNodeJSを使用している場合、コードは **`C:\home\site\wwwroot\HttpTrigger1\index.js`** にあり、ユーザー名は **`mawsFnPlaceholder8_f_v4_node_20_x86`** で、**グループ**には `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` が含まれていました。 +**Windows**の関数でNodeJSを使用している場合、コードは **`C:\home\site\wwwroot\HttpTrigger1\index.js`** にあり、ユーザー名は **`mawsFnPlaceholder8_f_v4_node_20_x86`** で、**グループ**には `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` が含まれていました。 ### **管理されたIDとメタデータ** -[**VMs**](vms/)と同様に、Functionsは2種類の**管理されたID**を持つことができます:システム割り当てとユーザー割り当て。 +[**VMs**](vms/index.html)と同様に、Functionsは2種類の**管理されたID**を持つことができます:システム割り当てとユーザー割り当て。 -**システム割り当て**のものは、**その関数**に割り当てられた管理されたIDであり、他のAzureサービスは使用できません。一方、**ユーザー割り当て**の管理されたIDは、**他のAzureサービスが使用できる管理されたID**です。 +**システム割り当て**のものは、**その関数**に割り当てられた管理されたIDであり、他のAzureサービスが使用することはできません。一方、**ユーザー割り当て**の管理されたIDは、**他のAzureサービスが使用できる管理されたID**です。 > [!NOTE] -> [**VMs**](vms/)と同様に、Functionsは**1つのシステム割り当て**の管理されたIDと**複数のユーザー割り当て**の管理されたIDを持つことができるため、関数を妥協した場合は、すべての管理されたIDを見つけることが常に重要です。1つのFunctionから複数の管理されたIDに権限を昇格させることができるかもしれません。 +> [**VMs**](vms/index.html)と同様に、Functionsは**1つのシステム割り当て**の管理されたIDと**複数のユーザー割り当て**の管理されたIDを持つことができるため、関数を妥協した場合は、すべての管理されたIDを見つけることが常に重要です。1つのFunctionから複数の管理されたIDに権限を昇格させることができるかもしれません。 > > システム管理されたIDが使用されていない場合でも、1つ以上のユーザー管理されたIDが関数に添付されている場合、デフォルトではトークンを取得することはできません。 @@ -69,12 +69,12 @@ Linuxサンドボックス内では、ソースコードは **`/home/site/wwwroo {% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %} -関数に添付されている**すべての管理されたIDを確認する方法を見つける**必要があることに注意してください。指定しない場合、メタデータエンドポイントは**デフォルトのもののみを使用します**(詳細については前のリンクを確認してください)。 +関数に添付されている**すべての管理されたIDを確認する方法**を見つける必要があることに注意してください。指定しない場合、メタデータエンドポイントは**デフォルトのもののみを使用します**(詳細については前のリンクを参照してください)。 ## アクセスキー > [!NOTE] -> ユーザーに関数を呼び出すアクセスを与えるためのRBAC権限はありません。**関数の呼び出しは、作成時に選択されたトリガーに依存します**。HTTPトリガーが選択された場合、**アクセスキー**を使用する必要があるかもしれません。 +> 関数を呼び出すためにユーザーにアクセスを与えるRBAC権限は存在しないことに注意してください。**関数の呼び出しは、作成時に選択されたトリガーに依存します**。HTTPトリガーが選択された場合、**アクセスキー**を使用する必要があるかもしれません。 HTTPトリガーを使用して関数内にエンドポイントを作成する際、関数をトリガーするために必要な**アクセスキーの認証レベル**を指定することが可能です。利用可能なオプションは3つあります: @@ -84,10 +84,10 @@ HTTPトリガーを使用して関数内にエンドポイントを作成する **キーの種類:** -- **関数キー**: 関数キーはデフォルトまたはユーザー定義のいずれかであり、Function App内の**特定の関数エンドポイント**へのアクセスを独占的に付与するように設計されています。 -- **ホストキー**: ホストキーもデフォルトまたはユーザー定義のいずれかであり、**FUNCTIONアクセスレベル**を持つFunction App内の**すべての関数エンドポイント**へのアクセスを提供します。 -- **マスターキー**: マスターキー(`_master`)は、すべての関数エンドポイントへのアクセスを含む管理キーであり、権限が昇格されます。この**キーは取り消すことができません**。 -- **システムキー**: システムキーは**特定の拡張機能によって管理され**、内部コンポーネントによって使用されるWebhookエンドポイントにアクセスするために必要です。例としては、Event GridトリガーやDurable Functionsがあり、システムキーを使用してそれぞれのAPIと安全に対話します。 +- **関数キー**: 関数キーはデフォルトまたはユーザー定義のいずれかで、Function App内の**特定の関数エンドポイント**へのアクセスを独占的に付与するように設計されています。これにより、エンドポイントに対するより細かいアクセス制御が可能です。 +- **ホストキー**: ホストキーもデフォルトまたはユーザー定義のいずれかで、Function App内の**すべての関数エンドポイントにFUNCTIONアクセスレベルでアクセス**を提供します。 +- **マスターキー**: マスターキー(`_master`)は、すべての関数エンドポイントへのアクセスを提供する管理キーで、ADMINアクセスレベルを含む昇格された権限を提供します。この**キーは取り消すことができません**。 +- **システムキー**: システムキーは**特定の拡張機能によって管理され**、内部コンポーネントによって使用されるWebhookエンドポイントにアクセスするために必要です。例としては、Event GridトリガーやDurable Functionsがあり、これらはそれぞれのAPIと安全に対話するためにシステムキーを利用します。 > [!TIP] > キーを使用して関数APIエンドポイントにアクセスする例: @@ -96,15 +96,15 @@ HTTPトリガーを使用して関数内にエンドポイントを作成する ### 基本認証 -App Servicesと同様に、Functionsも**SCM**および**FTP**に接続してコードをデプロイするための基本認証をサポートしています。これは、Azureが提供する**ユーザー名とパスワードを含むURL**を使用します。詳細については以下を参照してください: +App Servicesと同様に、Functionsも**SCM**および**FTP**に接続してコードをデプロイするための基本認証をサポートしています。これは、Azureが提供する**URL内のユーザー名とパスワード**を使用します。詳細については: {{#ref}} -az-app-service.md +az-app-services.md {{#endref}} ### Githubベースのデプロイメント -関数がGithubリポジトリから生成されると、Azure Webコンソールは**特定のリポジトリにGithubワークフローを自動的に作成する**ことを許可します。これにより、このリポジトリが更新されるたびに関数のコードが更新されます。実際、Python関数のGithub Action yamlは次のようになります: +関数がGithubリポジトリから生成されると、Azure Webコンソールは**特定のリポジトリにGithubワークフローを自動的に作成**することを許可します。これにより、このリポジトリが更新されるたびに関数のコードが更新されます。実際、Python関数のGithub Action YAMLは次のようになります:
@@ -192,16 +192,16 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }} ```
-さらに、**Managed Identity**も作成されるため、リポジトリからのGithub Actionはそれを使用してAzureにログインできるようになります。これは、**Managed Identity**上にフェデレーテッド資格情報を生成することによって行われ、**Issuer** `https://token.actions.githubusercontent.com` と **Subject Identifier** `repo:/:ref:refs/heads/` が許可されます。 +さらに、**Managed Identity**も作成されるため、リポジトリからのGithub Actionはそれを使用してAzureにログインできるようになります。これは、**Managed Identity**上に連邦資格情報を生成することによって行われ、**Issuer** `https://token.actions.githubusercontent.com` と **Subject Identifier** `repo:/:ref:refs/heads/` が許可されます。 > [!CAUTION] > したがって、そのリポジトリを侵害した者は、関数およびそれに関連付けられたManaged Identitiesを侵害することができます。 ### コンテナベースのデプロイメント -すべてのプランがコンテナのデプロイを許可しているわけではありませんが、許可されているプランでは、構成にコンテナのURLが含まれます。APIでは、**`linuxFxVersion`**設定は次のようになります: `DOCKER|mcr.microsoft.com/...`、一方、ウェブコンソールでは、構成に**image settings**が表示されます。 +すべてのプランがコンテナのデプロイを許可しているわけではありませんが、許可されているプランでは、設定にコンテナのURLが含まれます。APIでは、**`linuxFxVersion`**設定は次のようになります: `DOCKER|mcr.microsoft.com/...`、一方、ウェブコンソールでは、設定に**image settings**が表示されます。 -さらに、**ソースコードは関数に関連するストレージ**アカウントに保存されません。必要ないためです。 +さらに、**ソースコードは関数に関連するストレージ**アカウントに保存されることはありません。必要ないためです。 ## 列挙 ```bash