前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从沙盒逃逸看Python黑科技(下篇)

从沙盒逃逸看Python黑科技(下篇)

作者头像
七夜安全博客
发布于 2020-07-08 08:54:29
发布于 2020-07-08 08:54:29
1.4K00
代码可运行
举报
文章被收录于专栏:七夜安全博客七夜安全博客
运行总次数:0
代码可运行

前言

本周发的有点晚了,本来周三发的,有点生病,就拖到现在了,希望大家见谅。接着上一篇的内容,讲解一下Python中的黑科技。如果大家想回顾上文,可以点下面的链接:

从沙盒逃逸看Python黑科技(上篇)

一.回顾

理理思路

在上一篇文章中,我总结了Python沙箱逃逸这道CTF题涉及的主要知识点 ,其中上篇讲解了其中两个,本篇继续。

  1. Python 如何导包
  2. Python 如何执行代码和命令
  3. Python 文件读取
  4. 内置模块
  5. 对象创建与引用

二.Python 文件读取

实践出真知

本节主要介绍Python文件读取,为什么要介绍这个呢?主要是因为沙箱是黑盒的,如果我们能读取当前正在运行脚本的内容,对我们的帮助会非常大。上文介绍的单文件沙箱,我们可以通过读取__file__来获取内容,查看对应的过滤规则。

初级

对于python文件读取,大家比较熟悉的是open 或者file 函数:

(1) open (py2,py3)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
open(__file__).read()

(2) file (py2)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
file(__file__).read()

这些常见的函数,在沙箱中一般会被禁用掉,我们需要挖掘更多文件的读取的方式

高级

(1) codecs 模块 (py2,py3)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import codecscodecs.open(__file__).read()

(2) types 模块 (py2)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import typestypes.FileType(__file__,"r").read()

(3) os.open (py2,py3)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import osfd = os.open(__file__, os.O_RDONLY)print(os.read(fd,1024))

(4) file:/// 伪协议

py3:

py2:

(5) fileinput 模块

(5) ctypes 模块

三.内置模块

如果沙箱不让我们导入外部模块,或者是要导入的模块被禁用,那我们只能求助于Python的内部模块__builtins__( 即Python 本身默认已经导入模块中的函数)。

dir内置函数可以列出一个模块/类/对象下面所有的属性和函数,查看一下__builtins__中的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> dir(__builtins__)[['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError',
, ....]

为什么dir可以查看__builtins__ 函数呢?本质上是每个模块/类/对象/ 有一个__dict__ 字段,通过遍历 __dict__ 得到里面包含的属性和函数。

例如,我们可以引用__import__ 来导入os,并执行命令:

导入的函数,模块都变成字符串模式时,所有的静态检测手段都会失效,因为我们可以通过各种编码手段进行混淆。

由于内置模块中的危险函数过多,比如eval,exec等,导致上文使用的沙箱对__builtins__进行了处理,通过 del 关键字将里面的所有函数引用都删除了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
del __builtins__.__dict__['xxx']

如果保留reload内置函数,我们还可以通过 reload( __builtins__) 恢复,但是现在通过__builtins__来进行逃逸已经不现实了。

对象创建与引用

在上一节中,不知道大家有没有注意到 我说的一句话:

上文沙箱将__builtins__中的所有函数引用都删除

删除的是只是函数引用,而不是函数本身,如果你们熟悉C语言的话,函数引用可以理解为函数指针,既然__builtins__中的引用没了,那我们就需要从其他地方找到敏感函数的引用,从而实现逃逸。

在Python中一切皆是对象,比如常见的 "",[],(),{} ,我们可以使用type函数查看他们的类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> type("")<type 'str'>>>> type([])<type 'list'>>>> type(())<type 'tuple'>>>> type({})<type 'dict'>>>> type(1)<type 'int'>>>> type(1.1)<type 'float'>

我们可以通过这些Python 内置类型的继承链来寻找更多的引用,以下字段是寻找继承链的关键:

  • __class__ :返回一个实例所属的类
  • __bases__ :返回一个类直接所继承的类(元组形式)
  • __mro__ :列出解析方法的调用顺序
  • __subclasses__():返回子类列表
  • __dict__ :列出当前属性/函数的字典
  • func_globals:返回一个包含函数全局变量的字典引用 (python2)
  • __globals__:返回一个当前空间下能使用的模块,方法和变量的字典 (python2,python3)

其中 __bases__ 和__mro__ 类似的,用来寻找父类,__subclasses__()用来寻找子类。示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> [].__class__.__bases__(<type 'object'>,)>>> [].__class__.__mro__(<type 'list'>, <type 'object'>)>>> [].__class__.__mro__[-1].__subclasses__()[<<type 'type'>, <type 'weakref'>, <type 'weakcallableproxy'>, <type 'weakproxy'>, <type 'int'>, <type 'basestring'>, <type 'bytearray'>, <type 'list'>, <type 'NoneType'>, <type 'NotImplementedType'>, <type 'traceback'>, <type 'super'>, <type 'xrange'>,

假如我们想在Python3中调用os模块中system方法,而不用 import os ,就可以采用这种方式:

但是大家可能会发现,这么多的类哪些 符合要求呢?给大家一个小脚本,遍历出os模块的引用:

结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(72, <class 'site._Printer'>, 'os', <module 'os' from 'D:\anaconda2\lib\os.pyc'>, <module 'os' from 'D:\anaconda2\lib\os.pyc'>)
(77, <class 'site.Quitter'>, 'os', <module 'os' from 'D:\anaconda2\lib\os.pyc'>, <module 'os' from 'D:\anaconda2\lib\os.pyc'>)
(98, <class 'socket._socketobject'>, 'os', <module 'os' from 'D:\anaconda2\lib\os.pyc'>, <module 'os' from 'D:\anaconda2\lib\os.pyc'>)
(99, <class 'socket._fileobject'>, 'os', <module 'os' from 'D:\anaconda2\lib\os.pyc'>, <module 'os' from 'D:\anaconda2\lib\os.pyc'>)

如果想寻找其他模块,例如 sys,__builtins__, 都可以往代码中列表中添加。

还有一种是利用builtin_function_or_method 的 __call__,找到对应的序号:

使用exec执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[].__class__.__mro__[-1].__subclasses__()[34].__call__(exec, 'import os;os.system("whoami")')

[].__getattribute__('append').__class__.__call__(exec, 'import os;os.system("whoami")')

最后

下篇敬请期待,代码的排版还得优化一下,有点乱,只能截图代替了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七夜安全博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
碎片化学习前端知识
针对对象:前端初学者,初级程序员 前言 既要完成工作又想在工作中得到提升,初期的时候进步很快。但是慢慢的就会进入舒适区,怎么才能不在舒适区中陷入泥潭。 想学习,但是时间不够,时间太散,项目一个接一个,而且做的都是重复复用的工作,没时间造轮子,只有一个一个的读人家的 api 或者 google 解决问题,进而利用碎片化的时间进行一定的学习和补足自己啦? 作为一个前端的初学者我一直有这样的疑问和困惑,怎么能在这种环境下提高自己,怎么利用碎片化的时间学习。 要有个目的 学习知识的目的就是赚钱,给家人和自己带
西南_张家辉
2021/02/02
3990
这3个原则可以提高你的工作效率
做一件事情之前,最重要的是明白这件事情对你的意义有多大,这样你才有动力和意愿去付诸实践。这部分我们会聊聊为什么管理好工作任务,让你可以超过同龄人。
猴子数据分析
2022/12/12
3560
这3个原则可以提高你的工作效率
如何长时间高效学习?
熟悉我的人,知道我同时可以干很多事情。所以,经常会有人问我,有什么好的习惯、高效的学习方法,可以提高效率?
猴子数据分析
2020/12/02
7060
碎片化、干货、速成…这类流行词正在让你慢慢变傻
作者 CDA 数据分析师 生活在这个快捷的时代,很多人都热衷于“快餐式”生活。 于是“碎片化”“干货”“速成”“公开课”等逐渐成为流行热词。 而碎片化学习的最大危害是让人们把“知道”当做“懂得”。 网上有个段子关于这群热衷干货喜欢走捷径的人: “如果你每天还在看耶鲁公开课,上3W咖啡听创业讲座,知乎果壳关注无数,36氪每日必读,对马云的创业史了如指掌,对张小龙的贪嗔痴如数家珍,喜欢罗振宇胜过乔布斯,逢人便谈互联网思维……那你应该还在每天挤地铁。” 学习本质是获取信息,知识系统全面 在没有一个整体框架
CDA数据分析师
2018/02/26
7890
碎片化、干货、速成…这类流行词正在让你慢慢变傻
好书 | 《碎片化时代:重新定义互联网+商业新常态 》
书名:《碎片化时代:重新定义互联网+商业新常态 》 原书名:The Great Fragmentation: And Why the Future of All Business is Small 著
CDA数据分析师
2018/02/23
1.1K0
好书 | 《碎片化时代:重新定义互联网+商业新常态 》
如何系统学习数据分析?
很多学习数据分析的同学也都有这样一种困惑“为什么学了那么多工具,还是不会数据分析?”,原因无外乎两个,一是只学到了碎片的知识,没有建立知识之间的连接,无法形式自己的知识体系,二是缺乏实践,导致无法形成
小莹莹
2018/04/23
8280
如何系统学习数据分析?
001 | 如何高效学习
就像建一栋大厦一样,需要先打地基,地基打得好,大厦才够稳。在进阶全栈的路上,同样也需要先打好地基,所以我会将基础软技能板块排在专栏提纲的最前面。先帮你们打好基础,后面的学习才会事半功倍。而基础中的基础,就是学习力,所以第一个要讲的,就是如何提高大家的学习力。另外,我会在后面的内容中,给你们提供不断练习基础技能的机会,帮助你们不断在实践中提高自己的各项技能。
Keegan小钢
2018/08/10
5350
如何高效读懂一本书
(2)特别交代作者所在时代的特点、弊病,有针对性地叙述作者的经历,总结作者通过此事是战胜困难还是被打败,然后分析造成最后结局的关键要素,思考解决问题的方式、手段是什么
yeedomliu
2021/09/08
7170
优势资本-吴克忠:通证颠覆资本下,产业重构的区块链思维
所以我一直说我们做股权投资是十年一遇的机会,并购是30年一遇的机会,中国原来真正的并购从来没出现过,中国现在的并购都是假并购,都是炒市值的并购,都是有套利的空间。我15倍收的到二级市场就是30倍,以对赌形式,三年以后,如果对赌输了,你就要赔我。从来没有真正产业的,所以都是假并购。中国还没有开始,所以这是30年一遇的机会。中国100年一遇的机会是互联网带来的机会。而区块链带来的机会,我觉得是500年一遇的机会,因为他改变的不是生产力,它改变的是生产关系。
辉哥
2018/08/10
5220
优势资本-吴克忠:通证颠覆资本下,产业重构的区块链思维
微信小程序凭什么能成为企业、商家流量变现竞争新宠?
PC互联网时代的商业模式是通过入口级产品获取用户,把控网络流量,最后通过流量变现来赢利。
场景录小程序
2018/07/27
4040
微信小程序凭什么能成为企业、商家流量变现竞争新宠?
微信小程序凭什么能成为企业、商家流量变现竞争新宠?
PC互联网时代的商业模式是通过入口级产品获取用户,把控网络流量,最后通过流量变现来赢利。
速成应用小程序开发平台
2018/07/19
4980
金融科技的碎片化思考(上)
从事金融科技行业已久,也一直想写写金融科技相关的文字,又惶恐间,深觉如此大的话题hold不住而贻笑大方。偶然翻开束之高阁多年的《蚂蚁金服-从支付宝到新金融生态圈》,惊喜之余亦将自己碎片化的那点浅识愚见串联起不少。行文仓促,些许是经历,些许是总结,些许是念头,唯恐扭头就忘,权当流水记账给自己看也好。
曲水流觞
2020/07/13
5600
金融科技的碎片化思考(上)
高效学习的 36 种思维
2008 年,我正在读研究生,再过一年即将毕业,那时实践能力比较弱,对未来很迷茫,不知道自己该干什么。
IT阅读排行榜
2019/11/22
7230
高效学习的 36 种思维
Keep不甘做“工具人”
后半年来,在路边做游泳、健身、瑜伽推广的人员越来越多,几乎在每一个人流量较大的街区,都会见到很多这些在线下推广健身业务的人。这也从一个侧面表现出,在经历了疫情影响的阵痛期后,健身行业也逐渐回到了原来的发展轨道上。
刘旷
2021/01/18
2900
如何避免一步步走向平庸?
没钱没资源,想做点事的人 怎么走向阶段性成功? 知识星球首著《绝非偶然》 给出了 21 种接地气的方法论 为庆祝《绝非偶然》 即将在韩国翻译出版 和大家分享一下书中精彩段落✨ ▊ 《绝非偶然》精华内容摘录 1. 我给不少人提过有关写东西的建议,建议他们在刚开始写的时候不用总写大话题,可以从小的「点」写起,锻炼自己写东西的感觉和能力。 这也正是我一直抱定的目的,写出来的东西要对他人有参考价值,而写作者可以从分享的过程中收获快乐。 2. 在现实生活里,我内心比较封闭,并不擅长与人交流,但是个性又很鲜明,所
博文视点Broadview
2023/05/19
1980
如何避免一步步走向平庸?
002 | 我是如何学习区块链的
前几天我们已经学了如何学习的“道”和“术”,学完之后就应该落地到实践上,通过不断地实践练习,才能将这些 知识资源 转化为我们的 知识资本。如果你看完前面的文章后,觉得讲得真好,然后缺乏思考缺乏行动,然后就没有然后了。为了更好地指导你们如何实践,本篇文章我将与你分享我是如何将知识资源转化为我的知识资本的。
Keegan小钢
2018/08/10
2K1
002 | 我是如何学习区块链的
一文看懂腾讯培训如何与互联网共舞
对于腾讯来说,业务和资金都不是最重要的,业务可以拓展,可以更换,资金可以吸收,可以调整,而人才却是最不可轻易替代的,是最宝贵的财富。——马化腾 作为目前中国最大的互联网综合服务提供商之一的腾讯
用户1756920
2018/06/20
1.1K0
Project CHIP试图解决物联网设备和网络碎片化问题
去年12月,Zigbee联盟发起了“Project Connected Home over IP(基于IP的家庭互联项目)”(CHIP),其宏伟目标是实现即插即用型消费物联网设备。 由亚马逊,苹果和谷歌领导的Project CHIP计划于今年晚些时候发布规格和开源代码。现在,最初的媒体和分析师的报道已经尘埃落定,CHIP项目就值得我们仔细研究,因为大型、知名的公司只有真正相信自己能够实现目标,才能够围绕这样一个大胆的目标团结起来。
用户4122690
2020/07/17
1.2K0
Project CHIP试图解决物联网设备和网络碎片化问题
互动百科被315点名了,知识产品如何优雅地赚钱?
2016年,知识经济很火。分答、知乎Live等平台先后入局,最近就连那个一直低调潜行的豆瓣也推出了内容付费产品:豆瓣时间,用时髦的话说内容付费俨然已成互联网风口。 一项互联网业务到了风口,就可能被315点名。 在一年一度的“公关节”315晚会上知识分享平台互动百科就被点名了,理由是因为它的付费服务:企业缴纳费用之后具有更强的编辑权限,甚至可以发布虚假信息,来龙去脉不必赘述,但“互动百科”这家百科知识平台为什么会采取“付费”模式,却值得深究。 百科是互联网最古老的内容形态之一。说到百科,人们首先会想到2001
罗超频道
2018/04/26
9360
互动百科被315点名了,知识产品如何优雅地赚钱?
陆奇的创业方法论:潮流、挑战和机遇
创业很难,挑战很多,往往九死一生,但创业机会也很大,如何拥抱机会,应对挑战是创业者们关心的话题。
AI科技大本营
2020/01/16
7260
陆奇的创业方法论:潮流、挑战和机遇
推荐阅读
相关推荐
碎片化学习前端知识
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档