
一个纯 Python 库,用于在多种平台上识别已知或非常弱的加密密钥的使用。该项目既是一个各种“已知密钥”的存储库(例如,在教程示例中发现的 ASP.NET 机器密钥),也提供了一个与语言无关的抽象层来识别它们的使用。
了解何时使用了“坏密钥”通常需要检查使用了该密钥的某个加密产物:例如,使用带密钥的哈希算法签名的 cookie。当你深入研究每个平台提供的各个实现特性时,事情可能会变得复杂,而本库旨在缓解这一问题。
请查看我们在 Black Lantern Security 博客上的完整博客文章!
灵感来自 Blacklist3r,旨在扩展支持的平台并消除语言和操作系统依赖。
被动模块分析你已拥有的加密产物(cookie、令牌、签名 URL 等)。它们通过尝试使用已知密钥数据库解密或验证产物来离线工作。
| 名称 | 描述 |
|---|---|
| ASPNET_Viewstate | 根据已知机器密钥列表检查 viewstate/generator。 |
| ASPNET_Resource | 根据已知机器密钥列表检查 WebResource.axd 和 ScriptResource.axd 加密 URL。当页面上不存在 __VIEWSTATE 时很有用。 |
| Telerik_HashKey | 检查已修补(2017+)版本的 Telerik UI 是否存在已知的 Telerik.Upload.ConfigurationHashKey |
| Telerik_EncryptionKey | 检查已修补(2017+)版本的 Telerik UI 是否存在已知的 Telerik.Web.UI.DialogParametersEncryptionKey |
| Flask_SignedCookies | 检查弱 Flask cookie 签名密码。是 flask-unsign 的封装。 |
| Peoplesoft_PSToken | 可以检查 peoplesoft PS_TOKEN 是否存在错误/弱的签名密码 |
| Django_SignedCookies | 检查 django 的会话 cookie(在 signed_cookie 模式下)是否存在已知的 django secret_key |
| Rails_SecretKeyBase | 检查 Ruby on Rails 签名或加密的会话 cookie(来自多个主要版本)是否存在已知的 secret_key_base |
| Generic_JWT | 检查 JWT 是否存在已知的 HMAC 密钥或 RSA 私钥 |
| Jsf_viewstate | 检查 Java Server Faces (JSF) 的 Mojarra 和 Myfaces 实现是否存在已知或弱的密钥 |
| Symfony_SignedURL | 检查 symfony "_fragment" URL 是否存在已知的 HMAC 密钥。操作完整 URL,包括哈希 |
| Express_SignedCookies_ES | 检查 express.js express-session 中间件的签名 cookie 和会话 cookie 是否存在已知的 'session secret' |
| Express_SignedCookies_CS | 检查 express.js cookie-session 中间件的签名 cookie 和会话 cookie 是否存在已知的 secret |
| Laravel_SignedCookies | 检查 'laravel_session' cookie 是否存在已知的 laravel 'APP_KEY' |
| ASPNET_Compressedviewstate | 检查曾经流行的自定义压缩 Viewstate 代码片段,该片段易受 RCE 攻击 |
| Rack2_SignedCookies | 检查 Rack 2.x 签名 cookie 是否存在已知的密钥 |
| Yii2_SignedCookies | 检查 Yii2 框架签名 cookie 是否存在已知的 cookie 验证密钥 |
| Shiro_RememberMe | 检查 Apache Shiro rememberMe cookie 是否存在已知的 AES 加密密钥 |
| LTPA_Token | 检查 IBM WebSphere LtpaToken 和 LtpaToken2 cookie 是否存在已知的 LTPA 加密密钥 |
| NextAuth | 检查 NextAuth.js / Auth.js JWE 会话 cookie 是否存在已知或弱的 NEXTAUTH_SECRET / AUTH_SECRET |
主动模块比被动检测更进一步。它们使用基于 YARA 的预过滤来对活动目标进行指纹识别(基于 HTTP 响应头、cookie 和正文内容),然后使用已知密钥伪造加密产物并将其发送到目标,以确认密钥是否被接受。这使得它们在你尚未拥有可分析的令牌但怀疑目标可能使用默认或众所周知的密钥时非常有用。
主动模块在 URL 模式(--url)下默认启用。使用 --passive-only 禁用它们。
| 名称 | 描述 |
|---|---|
| Shiro_RememberMe_Key | 使用已知 AES 密钥伪造 Apache Shiro rememberMe cookie,并测试目标是否接受它们(反序列化 RCE) |
| GlobalProtect_DefaultMasterKey | 测试 PAN-OS GlobalProtect 门户是否使用默认主加密密钥 |
| LTPA_Token_Key | 使用已知 LTPA 密钥伪造 IBM WebSphere LtpaToken2 cookie,并测试目标是否授予身份验证(身份验证绕过) |
我们有一个 pypi 包,因此你只需执行 pip install badsecrets 即可使用该库。
使用 Badsecrets 的最佳方式是在执行 pip install 后直接运行 badsecrets:
pip install badsecrets
badsecrets eyJhbGciOiJIUzI1NiJ9.eyJJc3N1ZXIiOiJJc3N1ZXIiLCJVc2VybmFtZSI6IkJhZFNlY3JldHMiLCJleHAiOjE1OTMxMzM0ODMsImlhdCI6MTQ2NjkwMzA4M30.ovqRikAo_0kKJ0GVrAwQlezymxrLGjcEiW_s3UJMMCo
在底层,它使用的是 cli.py 示例。CLI 也可以在不进行 pip 安装的情况下手动访问:
git clone https://github.com/blacklanternsecurity/badsecrets.git
cd badsecrets
python ./badsecrets/examples/cli.py eyJhbGciOiJIUzI1NiJ9.eyJJc3N1ZXIiOiJJc3N1ZXIiLCJVc2VybmFtZSI6IkJhZFNlY3JldHMiLCJleHAiOjE1OTMxMzM0ODMsImlhdCI6MTQ2NjkwMzA4M30.ovqRikAo_0kKJ0GVrAwQlezymxrLGjcEiW_s3UJMMCo
要使用这些示例,在完成 pip 安装后,只需 git clone 该仓库并 cd 进入 badsecrets 目录:
git clone https://github.com/blacklanternsecurity/badsecrets.git
cd badsecrets
以下示例部分中的命令假定您位于此目录中。
如果您正在使用 Badsecrets BBOT 模块,则无需进行其他操作——BBOT 会为您安装该包。
Bad secrets 包含一个示例 CLI,以便在手动检查密钥时使用。如上所述,在成功执行 pip 安装后,只需执行 badsecrets 即可访问它。
usage: badsecrets [-h] [-nc] [-j] [-u URL] [-nh] [-c FILE_OR_MODULE:KEYS]
[-p PROXY] [-a USER_AGENT] [-H HEADER] [-d] [-t TIMEOUT]
[-P] [-l]
[product ...]
Check cryptographic products against badsecrets library
positional arguments:
product Cryptographic product to check for known secrets
options:
-h, --help show this help message and exit
-nc, --no-color Disable color message in the console
-j, --json Output results as JSON only (no banner, no color).
Outputs nothing on no detection
-u URL, --url URL Use URL Mode. Specified the URL of the page to access
and attempt to check for secrets
-nh, --no-hashcat Skip the check for compatable hashcat commands when
secret isn't found
-c FILE_OR_MODULE:KEYS, --custom-secrets FILE_OR_MODULE:KEYS
Custom secrets to check. Can be specified multiple
times. Without a module prefix, the file is loaded for
all modules. With a module prefix (MODULE:value), keys
are targeted to that module only. Value can be a file
path or comma-separated inline keys. Example: -c
my_keys.txt or -c Shiro_RememberMe_Key:key1,key2 or -c
GlobalProtect_DefaultMasterKey:keys.txt
-p PROXY, --proxy PROXY
In URL mode, Optionally specify an HTTP proxy
-a USER_AGENT, --user-agent USER_AGENT
In URL mode, Optionally set a custom user-agent
-H HEADER, --header HEADER
Custom header (e.g., -H 'Cookie: foo=bar'). Can be
specified multiple times
-d, --debug Enable debug output (request URL, response status,
headers, etc.)
-t TIMEOUT, --timeout TIMEOUT
Request timeout in seconds (default: 10)
-P, --passive-only Disable active probing in URL mode (only run passive
analysis)
-l, --list-modules List all available modules with descriptions and exit
badsecrets eyJhbGciOiJIUzI1NiJ9.eyJJc3N1ZXIiOiJJc3N1ZXIiLCJVc2VybmFtZSI6IkJhZFNlY3JldHMiLCJleHAiOjE1OTMxMzM0ODMsImlhdCI6MTQ2NjkwMzA4M30.ovqRikAo_0kKJ0GVrAwQlezymxrLGjcEiW_s3UJMMCo
它有一个 URL 模式,该模式会连接到目标并尝试提取加密产品,并将发现的任何产品与所有模块进行比对。
badsecrets --url http://example.com/contains_bad_secret.html
你也可以在此模式下使用 --user-agent "user-agent string" 设置自定义 user-agent,或使用 --proxy http://127.0.0.1 设置代理。
ASPNET_Viewstate 模块最多接受四个位置参数——viewstate、__VIEWSTATEGENERATOR 值、页面 URL 以及 ViewStateUserKey。顺序无关紧要;每个参数通过其形态来识别(8 个十六进制字符是生成器,以 http:///https:// 开头的任何内容是 URL,其他任何内容则是用户密钥)。
badsecrets <viewstate> <generator> <url> [viewstateuserkey]