Werkzeug / Flask Debug

即时可用的漏洞评估和渗透测试设置。使用 20 多种工具和功能从侦察到报告运行完整的渗透测试。我们不取代渗透测试人员 - 我们开发定制工具、检测和利用模块,让他们有更多时间深入挖掘、弹出 shell 并享受乐趣。
控制台 RCE
如果调试处于活动状态,您可以尝试访问 /console
并获取 RCE。
__import__('os').popen('whoami').read();

在互联网上还有一些漏洞,比如这个或者在metasploit中的一个。
Pin Protected - 路径遍历
在某些情况下,/console
端点将受到 pin 的保护。如果您有一个文件遍历漏洞,您可以泄露所有必要的信息来生成该 pin。
Werkzeug 控制台 PIN 利用
强制应用中的调试错误页面以查看此内容:
The console is locked and needs to be unlocked by entering the PIN.
You can find the PIN printed out on the standard output of your
shell that runs the server
遇到“控制台已锁定”情况时,尝试访问Werkzeug的调试界面,需要输入PIN码才能解锁控制台。建议通过分析Werkzeug的调试初始化文件(__init__.py
)中的PIN码生成算法来利用控制台PIN码。可以从Werkzeug源代码存储库中研究PIN码生成机制,但建议通过文件遍历漏洞获取实际服务器代码,以避免潜在的版本差异。
要利用控制台PIN码,需要两组变量,probably_public_bits
和private_bits
:
probably_public_bits
probably_public_bits
username
:指的是启动Flask会话的用户。modname
:通常被指定为flask.app
。getattr(app, '__name__', getattr(app.__class__, '__name__'))
:通常解析为Flask。getattr(mod, '__file__', None)
:表示Flask目录中app.py
的完整路径(例如,/usr/local/lib/python3.5/dist-packages/flask/app.py
)。如果不适用app.py
,请尝试app.pyc
。
private_bits
private_bits
uuid.getnode()
:获取当前计算机的MAC地址,使用str(uuid.getnode())
将其转换为十进制格式。要确定服务器的MAC地址,必须识别应用程序使用的活动网络接口(例如
ens3
)。在存在不确定性的情况下,**泄露/proc/net/arp
以查找设备ID,然后从/sys/class/net/<device id>/address
**中提取MAC地址。将十六进制MAC地址转换为十进制可以按以下示例进行:
# 示例MAC地址:56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
get_machine_id()
:将/etc/machine-id
或/proc/sys/kernel/random/boot_id
的数据与/proc/self/cgroup
最后一个斜杠(/
)后的第一行连接起来。
最后更新于