Payload编写
在 ExpDepos 中 Payload 和 Encoder 都是以模块形式实现,他们的父类 PayloadBase 和 EncodeBase 与 ExploitBase 一样都继承自 ModuleBase。所以在编写 Payload 或 Encoder 与编写 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 设置参数时用法一样。