作者:
DM_
·
2014/11/03 10:03
0x01 簡介
Powershell Remoting建立在windows WinRM服務之上,可以一對一或一對多遠端控制,也可以建立HTTP 或 HTTPS的“listeners”,使用WS-MAM協議接收遠端傳遞的命令。
Windows 遠端管理(WinRM)是 WS-Management 協議的 Microsoft 實現,該協議為使用 Web 服務的本地計算機和遠端計算機之間的通訊提供了一種安全的方式。 也就是說在WS-MAN協議基礎上,客戶端執行環境可以多樣化。 比如openwsman。
圖片來源:v3 Secrets of PowerShell Remoting
0x02 遠端管理
Powershell Remoting在windows server 2008以前預設是不開啟的,需要透過administrator使用者執行Enable-PSRemoting命令開啟。
在windows server 2012中,Powershell Remoting預設開啟。
在windows下,powershell預設使用winrm進行遠端管理,winrm版本不同預設的監聽埠也不同。如下:
The default ports for winrm 1.1 are http port 80 and https port 443
The default ports for winrm 2.x are http port 5985 and https port 5986
可以在參考這裡判斷winrm版本。
透過Enable-PSRemoting
命令開啟PS遠端,預設是啟動了Kerberos認證。這個方法只適合兩臺電腦在相同域或信任域內的指定電腦(名字可以帶字尾).但它不支援跨域、域外或IP地址。
如果要跨域、或指定IP地址執行時我們可以在客戶端這裡執行下面的程式碼,需要將所有或單一遠端主機新增在信任表中。
Set-Item WSMan:\localhost\Client\TrustedHosts -Value * -Force
刪除所有遠端信任主機
Clear-Item WSMan:\localhost\Client\TrustedHosts
如果要刪除單一遠端主機,則可以執行:
$newvalue = ((Get-ChildItem WSMan:\localhost\Client\TrustedHosts).Value).Replace("computer01,","")
Set-Item WSMan:\localhost\Client\TrustedHosts $newvalue
更改computer01。
列出所有遠端信任主機
Get-Item WSMan:\localhost\Client\TrustedHosts
在使用遠端執行時如果只提供使用者名稱,那麼則會彈窗輸入密碼。此時我們可以建立PSCredential物件將使用者名稱和密碼儲存在裡面。然後再傳遞給-Credential
引數。-ScriptBlock
引數後跟要執行的程式碼。
$UserName = "admin3"
$serverpass = "admin123!@"
$Password = ConvertTo-SecureString $serverpass -AsPlainText –Force
$cred = New-Object System.Management.Automation.PSCredential($UserName,$Password)
invoke-command -ComputerName localhost -Credential $cred -ScriptBlock { ipconfig }
使用help * -Parameter computername
命令可以列出所有預設可以遠端使用的命令。並且認證過程都可以像上面的程式碼一樣傳遞$cred。
之後寫個for迴圈就可以一對多的執行了。
如果輸出內容過於冗雜,還可以使用ConvertTo-Csv
或者ConvertTo-Html
將powershell物件的輸出轉換為html或者csv。
如果想一對一獲取互動式powershell,可以像這樣執行Enter-PSSession
:
Enter-PSSession -ComputerName 192.168.200.161 -Credential $cred
0x03 多工分發
在使用invoke-command
的時候,computername
可為多個引數。在執行的時候可以使用-Asjob
引數將執行過程放在後臺。 接收回顯的時候可以使用get-job
檢視job id
,然後用receive-job
接收全部回顯結果。 但是如果我只是想檢視某個遠端主機的執行結果呢? 那麼就可以像下面這樣做:
Get-Job -Id 1 | select -ExpandProperty childjobs
得到child job id
之後,再用 receive-job
接收回顯結果。
0x04 域內資訊蒐集
基本的資訊蒐集(日誌、程式、服務等)可以靠上面列出的命令來收集,但是遠端執行invoke-command
是需要憑證的,如果是在域內我們是不是可以先用nltest
蒐集下信任域?
在windows中有個System.DirectoryServices.ActiveDirectory
名稱空間,和windows域有關。 其下有個類Domain,其中GetAllTrustRelationships()
方法可以獲得信任域。
那麼在powershell就可以這樣執行:
([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()
獲得域之前的信任關係。 如果需要自行開發指令碼,也可以參考下面的文件。
除此之外,還記得之前metasploit筆記中那個local_admin_search
模組嗎?veil-powerview
中也有透過相同的方式實現了這一過程。
兩種不同的指令碼都透過呼叫OpenSCManagerA API連線遠端主機測試是否成功。
Local_admin_search.rb
Invoke-CheckLocalAdminAccess
附veil-powerview作者部落格中的測試截圖:
0x05 參考
0x06 powershell pentest project 學習推薦
整理的過程發現了很多牛人的部落格和專案,在這裡分享一下。
Powershell HID attack toolkit :https://github.com/samratashok/Kautilya
post exploitation :https://github.com/samratashok/nishang
Remote DLL inject :https://github.com/clymb3r
aspx的Powershell webshell :https://github.com/samratashok/nishang/tree/master/Antak- WebShell
Veil Post exploitation :https://github.com/Veil-Framework/Veil-PowerView
A PowerShell Post-Exploitation Framework :https://github.com/mattifestation/PowerSploit
local privilege escalation : https://github.com/HarmJ0y/PowerUp
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!