mkdir -p ~/ctools/ cd ~/ctools/ git clone https://github.com/irsdl/crapsecrets/ cd ~/ctools/crapsecrets pip3 install -r requirements.txt export PYTHONPATH=$(pwd):$PYTHONPATH python3 ./crapsecrets/examples/cli.py -u http://update.microsoft.com/ -r python3 ./crapsecrets/examples/cli.py -u http://update.microsoft.com/ -mrd 5 python3 ./crapsecrets/examples/cli.py -mrd 5 -avsk -fvsp -u http://update.microsoft.com/ python3 ./crapsecrets/examples/cli.py -mrd 5 -avsk -fvsp -mkf ./local/aspnet_machinekeys_local.txt -u http://192.168.6.22:8080/ python3 ./crapsecrets/examples/cli.py -mrd 5 -avsk -fvsp -mkf ./local/aspnet_machinekeys_local.txt -mkf ./crapsecrets/resources/aspnet_machinekeys.txt -u http://192.168.6.22:8080/a1/b/c1/
## Viewstate 使用提示
- 使用 `-mrd 5` 参数运行命令,以便分析较长的重定向响应。
- 使用 `--allviewstatekeys` 或 `-avsk` 尝试所有密钥组合作为验证密钥和加密密钥。
- 当 URL 中缺少 .aspx 时,使用 `--findviewstatepage` 或 `-fvsp` 尝试一组默认页面。
## 通用变更:
- 使用 httpx 替代 requests(主要变更由 AI 完成,测试较少,因此可能存在错误)。
- 增加了重定向深度(`--max-redirect-depth` 参数用于手动重定向)。
- 支持额外的请求头。
- 可使用 `--timeout` 或 `-t` 参数设置请求超时时间。
## Viewstate 变更:
- 包含一些逻辑上的变更。
- 在加密的 .NET 4.0 viewstate 中,显示验证密钥使用 AES 和 3DES 的可能性。
- 从路径中移除无 Cookie(cookieless)值。
- 移除 .aspx 之后的参数。
- 移除多个斜杠和反斜杠字符。
- 改进 .NET4.5 逻辑,以使用子目录中的应用程序名称。
- 检测“MAC is not enabled”(未启用 MAC)的情况。
- 处理存在响应时的长重定向(即未使用 -r 跟随重定向时)。
- 处理重定向到另一个 ASPX 页面的情况(即使用 -r 跟随重定向时)。
- 处理使用 Server.Transfer 而非重定向的情况(生成器与目标不同)。
- 检测使用 MaxPageStateFieldLength 且存在 __VIEWSTATEFIELDCOUNT 的情况。
- 除了检查响应中的 asp.net_sessionid 和 __antixsrftoken Cookie 外,还支持一些预定义的 ViewStateUserKey。
- 正确检测 ASPNET4.5 中 3DES 的解密密钥。
- 新增一个选项,将 aspnet_machinekeys.txt 中的所有字符串分别作为验证密钥和解密密钥各检查一次。当使用 `--allviewstatekeys` 标志时,该工具会尝试找出所有潜在的加密密钥,并以随机顺序逐一尝试解密数据。由于测试的密钥数量众多,单次运行存在命中无效密钥的可能。不过,该工具会列出所有检测到的可能密钥。运行两次工具后,找到有效加密密钥的可能性会显著增加,因为同一个密钥在两次运行中同时出现,几乎可以 100% 确定该密钥是正确的。
- 当给定 URL 中不包含 .aspx 时,使用一组默认页面:`["default.aspx", "index.aspx", "main.aspx", "home.aspx" , "start.aspx", "welcome.aspx", "default2.aspx"]` - 这会显著增加测试时间,但可能带来更多发现。
- 可以使用 `-mkf` 或 `--machinekeyfile` 作为 machinekeys 的资源文件,这样如果本地版本包含敏感密钥,我们就可以使用本地版本。
- 使用自定义版本的 python viewstate 库,以在解析 viewstate 时支持更多对象。
- 新增 `-evsd` 或 `--enable-viewstate-decryption` 参数,即使在未找到验证密钥时也检查解密密钥。当验证密钥与列表中的原始密钥略有不同时,此功能非常有用。
- 通过识别哈希码来计算 `__VIEWSTATEGENERATOR`。如果已提供 `__VIEWSTATEGENERATOR` 和 URL,它还会尽早尝试查找实际路径和应用路径。这可能会提升性能,尤其是在 URL 中缺少可识别的默认 ASPX 页面时。
- 用户可以使用 `-nt` 或 `--num-threads` 选项指定线程数(仅适用于 viewstate 模块)。默认值为 1,在大多数情况下,这反而比 10 更快!
- 应支持无扩展名的文件,但我们会在错误报告出现时进行修复。
- 支持 IsolateApps(适用于 .NET40 旧版)。即验证密钥或解密密钥后带有“,IsolateApps”的情况。
- 通过主动测试来减少 apppath 数量,依据 https://soroush.me/blog/2019/07/iis-application-vs-folder-detection-during-blackbox-testing/。可通过 `-dap` 或 `--disable-active-path-check` 禁用此功能。
- 检查响应体中的 __VIEWSTATE_KEY,并将其也用作 viewstatekey。
- 根据会话 ID 或反 XSRF 令牌,将公共 IP 地址添加到 viewstate 密钥中。
- 当缺少 __VIEWSTATE 时,使用 __EVENTVALIDATION。
- 在一个名为“aspnet_resource.py”的新模块下,使用来自 `/WebResource.axd?d=` 或 `/ScriptResource.axd?d=` 的加密资源值。该模块也支持 IsolateApps 功能。当缺少 __VIEWSTATE 和 __EVENTVALIDATION 时,此功能非常有用。
## TODO:
- 在计算 viewstate 时,为常见页面和目录添加字典。
- 实现对 IsolateByAppId 的支持(可能无法实现,因为它需要注册表中的机密信息,而我们不应拥有这些信息!)。
- 出错时添加重试支持。
- 测试因用 httpx 替换 requests 而导致的错误。
- 由于从 requests 转换为 httpx 以及使用 AI,存在一些失败的测试。在项目根目录运行 `pytest` 即可看到这些失败。虽然其中一些已修复,但测试中仍有一些错误需要在未来解决。我还需要在原始仓库上运行 pytest 进行比较!```
FAILED tests/all_modules_test.py::test_carve_all_cookies - AssertionError: assert 2 == 7
FAILED tests/examples_blacklist3r_test.py::test_examples_blacklist3r_offline - AssertionError: assert 'Did not find viewstate in repsonse from URL' in 'Did not find viewstate in response...
FAILED tests/examples_cli_test.py::test_example_cli_hashcat_telerikhashkey - AssertionError: assert 'Module: [Te...ture Command' not in '\x1b[32m\n ...y_file>]\n\n'
FAILED tests/examples_cli_test.py::test_example_cli_hashcat_telerikhashkey_invalid2 - AssertionError: assert 'Known Secret Found!' in '\x1b[32m\n __ ) | ...
FAILED tests/examples_symfony_signedurl_test.py::test_symfony_brute_success - AssertionError: assert 'Found Symfony Secret! [50c8215b436ebfcc1d568effb624a40e]' in 'Target appears to be ...
FAILED tests/examples_telerik_knownkey_test.py::test_fullrun_PBKDF2 - KeyError: "'additional_matcher' is not a valid Pattern"
FAILED tests/examples_telerik_knownkey_test.py::test_badoutput_PBKDF1_MS - KeyError: "'additional_matcher' is not a valid Pattern"
FAILED tests/examples_telerik_knownkey_test.py::test_fullrun_asyncupload_earlydetection - KeyError: "'additional_matcher' is not a valid Pattern"
FAILED tests/examples_telerik_knownkey_test.py::test_fullrun_asyncupload_success - KeyError: "'additional_matcher' is not a valid Pattern"
FAILED tests/examples_telerik_knownkey_test.py::test_fullrun_asyncupload_PBKDF1_MS - KeyError: "'additional_matcher' is not a valid Pattern"
本软件仅用于学术研究以及开发有效的防御技术,除非获得明确授权,否则不应用于攻击系统。项目维护者不对软件的滥用负责或承担任何责任。请负责任地使用。
本软件是一个个人项目,与任何公司无关,包括项目所有者及贡献者的雇主。

一个纯 Python 库,用于识别各种平台上已知或非常弱的加密密钥的使用情况。该项目旨在既作为各种“已知密钥”的存储库(例如,教程示例中发现的 ASP.NET machine keys),又提供一种与语言无关的抽象层来识别它们的使用。
判断是否使用了“坏密钥”通常需要检查使用该密钥的某种加密产物:例如,使用带密钥的哈希算法签名的 cookie。当你深入研究每个平台提供的具体实现特性时,事情可能会变得复杂,而本库旨在缓解这一问题。
请查看我们在 Black Lantern Security 博客上发布的完整博客文章!
灵感来源于 Blacklist3r,并希望扩展支持的平台并去除对语言和操作系统的依赖。
| 名称 | 描述 |
|---|---|
| ASPNET_Viewstate | 根据已知 machine keys 列表检查 viewstate/generator。 |
| 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 是否存在已知的密钥 |
| Laravel_SignedCookies | 检查 'laravel_session' cookie 是否存在已知的 laravel 'APP_KEY' |
| ASPNET_Vstate | 检查曾经流行的自定义压缩 Viewstate 代码片段,该片段容易受到 RCE 攻击 |
| Rack2_SignedCookies | 检查 Rack 2.x 签名 cookie 是否存在已知的密钥 |
我们有一个 pypi 包,因此你可以直接执行 pip install badsecrets 来使用该库。