Powershell tricks::Powershell Remoting

wyzsk發表於2020-08-19
作者: 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

enter image description here

圖片來源:v3 Secrets of PowerShell Remoting

0x02 遠端管理


Powershell Remoting在windows server 2008以前預設是不開啟的,需要透過administrator使用者執行Enable-PSRemoting命令開啟。

enter image description here

在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 }

enter image description here

使用help * -Parameter computername命令可以列出所有預設可以遠端使用的命令。並且認證過程都可以像上面的程式碼一樣傳遞$cred。

之後寫個for迴圈就可以一對多的執行了。

enter image description here

如果輸出內容過於冗雜,還可以使用ConvertTo-Csv或者ConvertTo-Html將powershell物件的輸出轉換為html或者csv。

如果想一對一獲取互動式powershell,可以像這樣執行Enter-PSSession

Enter-PSSession -ComputerName 192.168.200.161 -Credential $cred

enter image description here

0x03 多工分發


在使用invoke-command 的時候,computername 可為多個引數。在執行的時候可以使用-Asjob引數將執行過程放在後臺。 接收回顯的時候可以使用get-job檢視job id,然後用receive-job接收全部回顯結果。 但是如果我只是想檢視某個遠端主機的執行結果呢? 那麼就可以像下面這樣做:

Get-Job -Id 1 | select -ExpandProperty childjobs

得到child job id之後,再用 receive-job 接收回顯結果。

enter image description here

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連線遠端主機測試是否成功。

enter image description here

Local_admin_search.rb

enter image description here

Invoke-CheckLocalAdminAccess

veil-powerview作者部落格中的測試截圖:

enter image description here

0x05 參考


0x06 powershell pentest project 學習推薦


整理的過程發現了很多牛人的部落格和專案,在這裡分享一下。

Powershell HID attack toolkithttps://github.com/samratashok/Kautilya

post exploitationhttps://github.com/samratashok/nishang

Remote DLL injecthttps://github.com/clymb3r

aspx的Powershell webshellhttps://github.com/samratashok/nishang/tree/master/Antak- WebShell

Veil Post exploitationhttps://github.com/Veil-Framework/Veil-PowerView

A PowerShell Post-Exploitation Frameworkhttps://github.com/mattifestation/PowerSploit

local privilege escalation : https://github.com/HarmJ0y/PowerUp

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章