0x01 前言
最近学习了几个比较好的漏洞挖掘姿势与案例,记录分享一下。
0x02 Cloud Shell 命令注入 - ¥13337
该漏洞案例来自2022年GoogleCloud VRP中赏金top7的漏洞(参考https://j0o1ey.github.io/2023/06/28/GoogleCloudVrp-top7-2022-Study-and-Ideas/)
在GoogleCloud的web editor中,内置了shell,而url中的project参数似乎总会出现在python config脚本中,并且会引发脚本执行
单引号触发了一个python console error
根据目标的闭合feature构造一个oneline命令执行
0x03 python沙箱逃逸命令执行
我们通常所说的 Python 沙箱逃逸就是绕过模拟的 Python 终端,最终实现命令执行。导入模块
在 Python 的内建函数中,有一些函数可以帮助我们实现任意命令执行:
os.system() os.popen()
commands.getstatusoutput() commands.getoutput()
commands.getstatus()
subprocess.call(command, shell=True) subprocess.Popen(command, shell=True)
pty.spawn()
在 Python 中导入模块的方法通常有三种(xxx 为模块名称):
import xxx
from xxx import *
__import__('xxx')
我们可以通过上述的导入方法,导入相关模块并使用上述的函数实现命令执行。
但是,正常的 Python 沙箱会以黑名单的形式禁止使用一些模块如 os 或以白名单的形式只允许用户使用沙箱提供的模块,用以阻止用户的危险操作。而如何进一步逃逸沙箱就是我们的重点研究内容。
有时候挖一些资产,会有一些在线供人练习代码的功能点,例如【python大闯关】功能点,实际浏览进一步突破
import os
os.system
import os
import os
import os
...
都可以。如果多个空格也过滤了,Python 能够 import 的可不止 import,还有 import__:__import(‘os’),__import__被干了还有 importlib:importlib.import_module(‘os’).system(‘ls’)
这样就安全了吗?实际上import可以通过其他方式完成。回想一下 import 的原理,本质上就是执行一遍导入的库。这个过程实际上可以用 execfile 来代替:
execfile('/usr/lib/python2.7/os.py')
system('ls')
这里提示非法import但是并没有给出是import语句非法还是import这个字符串非法所以进一步测试认证一下
成功输出“import”所以是禁用了import语句而并非禁用了字符串,所以就有了操作空间这块直接构造payload试试:
command = 'import os\nos.system("id")'
exec(command)
这个payload是将 import os\nos.system(“id”) 作为一个字符串赋值给 command 变量,并使用 exec 函数执行了这个字符串中的代码。这样就能够实现和 os.system(“id”) 类似的效果,所以就绕过了import导入os的这一步操作从而绕过沙箱禁用import:
免责声明:
「由于传播、利用本公众号虫洞小窝所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本公众号及作者不为此承担任何责任,一旦造成后果请自行承担!」