Payload编写

ExpDeposPayloadEncoder 都是以模块形式实现,他们的父类 PayloadBaseEncodeBaseExploitBase 一样都继承自 ModuleBase。所以在编写 PayloadEncoder 与编写 Exploit 模块类似,如下模板代码所示:

from ExpDepos.libs.core.base.PayloadBase import *


class example(PayloadBase):
    Name = 'payload example'  # payload名称
    Alias = 'payload_example'  # 漏洞别名
    Author = 'Castiel'  # 编写作者
    Category = EXP_CATEGORY.EXPLOITS.WEBAPP
    Create_Date = '2021-12-01'  # payload编写日期
    Update_Date = '2021-12-01'  # payload更新日期
    Desc = """payload 演示模块"""
    Description = """
- 在一个payload模块中可以使用OptPayload类型参数让用户指定一个其他的payload来构建当前payload
- 当使用OptPayload类型让用户提供其他payload的时候系统会为当前payload创建PAYLOAD_OPTS、PAYLOAD_ENC、PAYLOAD_ENC_OPTS参数
    - PAYLOAD_OPTS 参数用于设置其他payload参数
    - PAYLOAD_ENC  参数用于设置其他payload编码器
    - PAYLOAD_ENC_OPTS  用于设置其他payload编码器参数
    使用这些参数可以像在命令行中为payload设置参数用法一样,比如选择使用NormalEval来构建当前payload,NormalEval需要用户提供 lang 和 pass
    参数使用以下设置。
        - set PAYLOAD_OPTS --lang php --pass 123456
    """

    def _options(self):
        options = dict()
        options["payload"] = OptPayload("", description="选择要生成的payload", require=True)
        options["filename"] = OptString("cmd", description="连接密码", require=True)
        return options

    def _generate(self) -> any([str, builtins.bytes]):
        return f"filename: {self.get_option('filename')}, payload: {self.get_option('payload')}"

模块定义

Exploit 模块编写一样,Payload 编写需要首先引入父类 PayloadBase 所有内容,并新建继承自 PayloadBase 和文件名相同的类名。与 Exploit 不同之处在于 Payload 模块需要实现 _generate 函数:

from ExpDepos.libs.core.base.PayloadBase import *

def _options(self):
    options = dict()
    options["payload"] = OptPayload("", description="选择要生成的payload", require=True)
    options["filename"] = OptString("cmd", description="连接密码", require=True)
    return options

def _generate(self) -> any([str, builtins.bytes]):
    return f"filename: {self.get_option('filename')}, payload: {self.get_option('payload')}"

_generate 函数中可以实现具体的 payload 并返回 str 或者 bytes 类型。

基本属性

Exploit 一样,Payload 也需要设置以下基本属性用于描述 Payload 信息:

Name = 'payload example'        # payload名称
Alias = 'payload_example'       # 漏洞别名
Author = 'Castiel'              # 编写作者
Category = EXP_CATEGORY.EXPLOITS.WEBAPP
Create_Date = '2021-12-01'      # payload编写日期
Update_Date = '2021-12-01'      # payload更新日期
Desc = """payload 演示模块"""
Description = """ payload 具体描述
"""

使用其他Payload

Payload 参数定义中可以让用户自由选择其他 Payload,这在某些特殊 payload 中非常有用。比如需要定义一个自动生成任意文件的 Payload,生成的内容就需要用户自由选择其他的 Payload。因此只需定义一个类型为 OptPayload 的参数即可,如下代码所示:

def _options(self):
    options = dict()
    options["payload"] = OptPayload("", description="选择要生成的payload", require=True)
    return options

备注

当使用OptPayload类型让用户提供其他payload的时候系统会为当前payload创建PAYLOAD_OPTS、PAYLOAD_ENC、PAYLOAD_ENC_OPTS参数:

  • PAYLOAD_OPTS 参数用于设置其他payload参数

  • PAYLOAD_ENC 参数用于设置其他payload编码器

  • PAYLOAD_ENC_OPTS 用于设置其他payload编码器参数

使用这些参数可以像在命令行中为 Payload 设置参数时用法一样。