可自定义参数的 PoC #
自定义参数示例及使用方法 #
如果你需要编写一个可以交互参数的 PoC 文件(例如有的 PoC 脚本需要填写登录信息,或者任意命令执行时执行任意命令),那么可以在 PoC 文件中声明一个 _options 方法。一个简单的例子如下:
from pocsuite3.api import Output, POCBase, POC_CATEGORY, register_poc, requests, VUL_TYPE
from pocsuite3.api import OrderedDict, OptString
class DemoPOC(POCBase):
    vulID = '0'
    version = '1.0'
    author = ['seebug']
    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()
register_poc(DemoPOC)
你可以在 console 或者 cli 模式下调用。
- 在 console 模式下,Pocsuite3 模仿了 Metasploit 的操作模式,你只需要使用 
set命令来设置相应的参数,然后run或者check来执行(attack和shell命令也可以)。 - 在 cli 模式下,如上面例子所示,定义了 
username和password两个字段,你可以在参数后面加上--username test --password test来调用执行,需要注意的是,如果你的参数中包含了空格,用双引号"来包裹它。 
支持的自定义字段类型 #
和上面类似,如果你想使用自定义的字段,将它定义到 _options 方法中,然后返回一个数组。Pocsuite3 支持的自定义字段类型如下:
from pocsuite3.api import OptString, OptDict, OptIP, OptPort, OptBool, OptInteger, OptFloat, OptItems
| 字段类型 | 字段描述 | 参数解释 | 相关例子 | 
|---|---|---|---|
| OptString | 接收字符串类型参数 | default: 传入一个默认值 descript: 字段描述,默认为空 require: 是否必须,默认 False  | |
| OptDict | 接收一个字典类型参数,在选择上如果选择 key,调用时会调用对应的 value | default: 传入一个默认值 descript: 字段描述,默认为空 require: 是否必须,默认 False  | |
| OptIP | 接收 IP 类型的字符串 | default: 传入一个默认值 descript: 字段描述,默认为空 require: 是否必须,默认 False  | |
| OptPort | 接收端口类型参数 | default: 传入一个默认值 descript: 字段描述,默认为空 require: 是否必须,默认 False  | |
| OptBool | 接收布尔类型参数 | default: 传入一个默认值 descript: 字段描述,默认为空 require: 是否必须,默认 False  | |
| OptInteger | 接收整数类型参数 | default: 传入一个默认值 descript: 字段描述,默认为空 require: 是否必须,默认 False  | |
| OptFloat | 接收浮点数类型参数 | default: 传入一个默认值 descript: 字段描述,默认为空 require: 是否必须,默认 False  | |
| OptItems | 接收 list 类型参数 | default: 传入一个默认值 selectd: 默认选择 descript: 字段描述,默认为空 require: 是否必须,默认 False  | 
需要注意的是,console 模式支持所有的参数类型,cli 模式除了OptDict、OptBool、OptItems 类型外都支持。
Pocsuite3