技术分享 | 谈一谈CTF中的python沙箱逃逸

0x01 前言

笔者在最近的CTF比赛中遇到了几次关于python沙箱逃逸的web题目,故此做一些总结。在阅读这篇文章之前,我相信你已经了解关于python的一些基本语法以及沙箱逃逸的思路,所以这里就不再赘述了。

0x02 内置模块

在谈python沙箱逃逸之前,我们先来学习一下python常用的内置模块

1. os模块,可以通过os.system(cmd)调用系统命令,例如os.system(‘whoami’)

2. timeit模块,这个模块中的timeit函数本来返回的是命令执行时间的,但是我们也可以利用它来执行任意命令,例如:

3. subprocess模块,在python中,我们可以通过标准库中的subprocess包来fork一个字进程,并运行一个外部的程序。subprocess.call(),父进程等待子进程完成。例如:

4. commands模块,利用这个模块同样能执行任意命令,例如

5. platform模块,这个模块最常见是用来获取系统应用信息的,我们同样能使用它来进行任意命令执行。例如:

除了以上几个常用模块之外,exec和eval两个函数也是经常用来执行系统命令的,这里两个函数的区别是eval是要返回计算结果的,然而exec是不会返回的。

0x03 绕过

介绍了常用的执行系统命令的方法之后,下面我们来谈谈绕过

1.既然有那么多的用来执行系统命令的模块和函数存在,出题人可以直接使用del删除它们

应对:如果说没有过滤reload函数的话,我们可以使用它来重载我们需要的模块就行

2. 正则匹配并过滤掉一些危险函数或者危险模块

应对:这里我提供几个实例大家慢慢体会并且可以举一反三

其他的编码绕过方式或者字符串拼接执行读者可以自己去脑洞。

3. 使用内联函数,我们可以使用内联函数__import__和__builtins__调用一切函数。

在做python sand box题的时候我们可以自己去定义object类,原因是object类中基本涵盖了Python的所有基础函数。例如:

我们发现定义的object中存在hook函数,那么我们利用起来执行任意命令。

这也是常用的魔术方法。

0x4 再谈timeit模块

在前面我们提到了timeit模块可以用来执行任意系统命令,但是细心地同学会发现timeit只返回给我们执行命令所花的时间,如果不能通过cloudeye等外带通道获取命令执行的结果,那么这样用起来就非常的鸡肋了。幸运的是我们可以利用时间盲注(time based rce)去获取信息。

利用这个小trick我们就可以写个脚本愉快的python沙箱逃逸了。

0x05 总结

python沙箱逃逸需要我们熟练掌握python的一些基础知识,并且在平时我们要学会举一反三,尽量的脑洞一些新技巧。笔者之前看到有大牛通过pwn去做python沙箱逃逸题,如果说能控制PyCodeObject里边的字节码就变相决定了python去执行什么样的字节码,那也就等价于能执行任意命令了,所幸python作为动态语言是允许使用types操作字节码的。无奈笔者对二进制研究颇浅,师傅们可以自行去研究,Orz。

原文发布于微信公众号 - 安恒网络空间安全讲武堂(gh_fa1e45032807)

原文发表时间:2017-12-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

Java中文乱码问题分析与标本兼治的方法

你是否遇到过这种情景,代码都写OK了,测试也没问题,但一运行发现显示的是乱码,这下坏了,明天还要给客户做演示汇报,现在已经到晚上22点了,别无选择,只能连夜查找...

31480
来自专栏JarvanMo的IT专栏

Flutter实战:手把手教你写Flutter Plugin

如果你对移动端有所关注,那么你一定会听说过Flutter。得益于Google,Flutter一经推出便得受到了广泛关注。很多开发者跃跃欲试,国内部分大厂,诸如美...

1.9K20
来自专栏JackeyGao的博客

Python 和 Golang 一点愚见

Python 之所以有很好开发效率是因为语法简单,灵活。有大量的轮子可供选择, 文档支持非常棒。 我用Python编程的时候,基本成了一把梭“拿起键盘复制粘贴,...

14720
来自专栏偏前端工程师的驿站

JS读书心得:《JavaScript框架设计》——第12章 异步处理

一、何为异步                                 执行任务的过程可以被分为发起和执行两个部分。 同步执行模式:任务发起后必须等待直...

22570
来自专栏Ldpe2G的个人博客

ScalaMP ---- 模仿 OpenMp 的一个简单并行计算框架

这个项目是一次课程作业,要求是写一个并行计算框架,本人本身对openmp比较熟,

21860
来自专栏Java后端技术栈

Java代码评审歪诗!让你写出更加优秀的代码!

架构师说, 用20个字描述代码评审的内容, 自省也省人。由于是一字一含义, 不连贯, 为了增强趣味性, 每句都增加对应的歪解。只是对常见评审的描述, 不尽之处,...

10810
来自专栏C语言及其他语言

【编程经验】C语言中EOF是什么意思

C语言中EOF的意思 今天跟大家说道说道这个C语言中EOF是什么意思。 相信很多朋友在学习C语言过程中,都看到过EOF的字样,但翻过整本C语...

46570
来自专栏前端下午茶

JS 状态模式

状态模式(State)允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类。 其实就是用一个对象或者数组记录一组状态,每个状态对应一个实现...

39440
来自专栏数据和云

中文命名可能有什么坏处?

在最近的一个报告分析中,再次遭遇到全中文的数据结构设计。从图示中可以看到,所有的表名、索引名等,都是用中文命名的。 我们不考虑面向对象、方法那回事,单纯从技术角...

39150
来自专栏互扯程序

毕业季,跳槽季,不刷点面试题怎么能行?

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。 前言 马上就是一年一度的毕业季 跳槽季,找工作三大要素,简...

36150

扫码关注云+社区

领取腾讯云代金券