PadishahIII/RFGuess

GitHub: PadishahIII/RFGuess

基于随机森林机器学习算法的定向社工密码字典生成工具,利用目标用户个人身份信息训练模型并生成高命中率密码猜测。

Stars: 32 | Forks: 6

RFGuess(随机森林密码猜测模型)

# 概述 本仓库包含论文《[基于随机森林的密码猜测](https://www.usenix.org/conference/usenixsecurity23/presentation/wang-ding-password-guessing)》的复现。作者提出了一系列新方法,将 PII(个人身份信息)数据转换为在经典机器学习模型中表现优异的结构。 我已经实现了论文的核心概念,并编写了一个易于使用的工具,用于训练模型、生成模式、进行猜测和评估准确率。本仓库的贡献包括: - 一个专为基于 PII 的定向密码猜测场景设计的 GUI 程序 - 一个预训练模型 如果您想了解更多关于该项目底层逻辑和训练过程的知识,[这篇文章](https://www.wolai.com/secnote/aL4Xth452sX4XuSydnpqtj)提供了有关算法的更多细节,相应的演讲稿可以在[这里](https://www.wolai.com/secnote/row4spm7VvaYAkUmxsFQBT)找到。 有关系统设计和实现细节,请查看 [DeepWiki 链接](https://deepwiki.com/PadishahIII/RFGuess/1-overview)。 # 目录 - [概述](#overview) - [功能](#features) - [前置条件](#prerequisites) - [用法](#usage) * [主窗口](#main-window) * [生成模式](#generate-pattern-pattern-generator-) * [生成密码字典](#generate-password-dictionary-guess-generator-) * [训练你的专属模型](#train-your-own-model) - [高级配置](#advanced-configuration) - [从源码构建](#build-from-source) - [许可证](#license) - [联系方式](#contact) - [致谢](#acknowledgements) - [附录](#appendix) * [模式格式](#pattern-format) # 功能 - **基于 PII 的定向密码猜测** - 提供基于 11 万条数据训练的预训练模型(在[此处](https://github.com/PadishahIII/RFGuess/releases/download/v1.1/model.clf)获取),开箱即用 - 基于 PII 数据集生成密码模式 - 根据给定的个人信息进行密码猜测 - 支持为自定义数据集训练指定模型 - 支持评估所生成猜测的准确率 # 前置条件 - Python3 - Mysql 8.0.32 - Sklearn 点击此处 - PyQt5 点击此处 # 安装与启动 将本仓库克隆到本地。 推荐使用 `uv`: ``` uv sync uv run python main.py ``` 或者使用 `pip` 安装依赖: ``` pip install -r requirements.txt python main.py ``` 本项目使用 Mysql 存储分析数据,推荐通过 docker 启动预先配置好的数据库: ``` docker-compose up -d ``` 然后连接到 `mysql://root:root@127.0.0.1:3307/rfguess`。 如果您希望使用自定义数据库,则需要手动将 `user.sql` 导入到您的数据库中,这将创建所有的数据表。 # 用法 - [主窗口](#main-window) - [生成模式](#generate-patternpattern-generator) - [生成密码字典](#generate-password-dictionaryguess-generator) - [训练你的专属模型](#train-your-own-model) ## 主窗口 运行可执行文件,您将看到如下面板: ![1](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/99a90b495e114757.png) 用户界面包含三个主要模块:Guess-Generator、Pattern-Generator 和 Model-Trainner。 ## 生成模式(Pattern-Generator) 首先您需要获取一个训练好的模型(无论是通过 [model-trainner](#train-your-own-model) 自行训练,还是使用来自 [rfguess.clf](https://github.com/PadishahIII/RFGuess/releases/download/v1.1/model.clf) 的预训练模型)。 然后设置要生成的模式数量限制并开始生成。 1. 加载模型(.clf) ![2](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/9b893e94a6114800.png) 2. 指定输出路径和限制 ![3](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/e051a5fcca114802.png) ## 生成密码字典(Guess-Generator) 该模块需要一个模式文件(详见[附录](#appendix))和目标用户的 PII 数据。您可以加载由 Pattern-Generator 生成的模式文件,或使用[默认模式文件](https://github.com/PadishahIII/RFGuess/releases/download/v1.1/patterns.txt)。 1. 加载模式文件 ![4](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3b1e73407e114805.png) 2. 填写 PII 数据 输入目标用户的个人数据或从 json 文件加载数据([格式](https://github.com/PadishahIII/RFGuess/blob/v1.1/pii.json)) ![5](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/133f686d16114808.png) ![6](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/328cc49cab114810.png) 3. 生成密码字典 ![7](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/10c56481fb114813.png) ## 训练你的专属模型 与深度学习相比,机器学习的模型训练过程要繁琐得多。本程序中的算法需要使用 mysql 数据库来存储处理原始数据集时的中间数据结构。幸运的是,您只需要一个正常运行的 mysql 服务器并提供一个数据库连接 URL 即可。所有数据结构都会自动配置。 1. 连接到您的数据库并导入数据库结构 连接到数据库 URL: ![8](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/72d752843f114815.png) 导入 sql 文件(在[此处](https://github.com/PadishahIII/RFGuess/blob/v1.1/database_structure.sql)获取)。**请注意,此脚本将删除并重新创建正在使用的数据表(您可以在 `Parse/Config.py` 中查看并修改表名)。** 如果您通过 docker-compose 启动 mysql 服务器(这是推荐的方式),`user.sql` 已在启动时导入,因此您可以跳过此步骤。 ![9](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/8d9f2a786f114818.png) 2. 加载您的 PII 数据集(.txt) PII 数据集应为 csv 格式,并符合以下原则: - 第一行表示字段名 - 字段名应包含在 ['account', 'name', 'phone', 'idcard', 'email', 'password'] 中,**不区分大小写** - 您可以包含允许字段的任意组合,但 ***name*** 和 ***password*** 为必填项 - 每行包含一条 PII 数据 - 每行应包含多个字段,以逗号分隔 - 空白字符将被忽略 合法的数据集示例如下: ``` name, email, password, phone 张三, 350777@aa.com , zhangsan, 111122222 John, 3333@bb.com, 3333, 44444 Jason Harris, aaaa@aa.com, 5555, 5555 ``` 您可以通过 *Charset* 编辑框指定目标数据集的字符集。 ![image](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3c952efed6114820.png) 点击 *Load PII Data* 按钮并等待。您的数据集在经过一些处理后将被解析并存储在数据库中。 ![10](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/99e655510d114824.png) 4. 分析和处理数据集 此步骤会将 PII 数据集分析为一些中间数据。 ![11](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3f5cbddca0114827.png) 6. 训练模型 您将训练一个分类器模型并将其导出为 .clf 文件。 ![12](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/7cebfc2471114830.png) 8. 评估准确率 为了评估模型的准确率,此步骤使用您数据集的 50% 作为训练集,另外 50% 作为测试集,为每条 PII 数据生成一个密码字典,并检查正确密码是否包含在该字典中。 ![13](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/21cbb85da9114833.png) 9. 恢复上次运行的状态 10. 使用 "Update Status" 按钮加载上次运行的进度,并检查各个阶段的状态。 ![14](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/32bba3a527114836.png) # 高级配置 在 [Config.py](https://github.com/PadishahIII/RFGuess/blob/master/Parser/Config.py) 中查看更多详细配置。 **算法配置** 主算法中使用了 *Markov n-gram* 模型,您可以通过 *pii_order* 参数设置 *n*: ``` pii_order = 6 ``` 您可以通过以下两个阈值来控制猜测的数量限制,这些阈值是根据生长模式的可能性计算的。 只有当一种模式的可能性大于阈值时,才会被采用。因此,阈值越大,猜测数量越少,反之亦然。值得注意的是,您不应将阈值设置得过小(小于 *1e-11*),以避免被无用的模式淹没。 ``` general_generator_threshold = 1.2e-8 ``` **数据库配置** 您可以根据需要配置数据库的表名: ``` class TableNames: PII = "PII" pwrepresentation = "pwrepresentation" representation_frequency = "representation_frequency" pwrepresentation_frequency = "pwrepresentation_frequency" pwrepresentation_unique = "pwrepresentation_unique" pwrepresentation_general = f"{pwrepresentation}_general" representation_frequency_base_general = f"representation_frequency_base_general" representation_frequency_general = f"{representation_frequency}_general" pwrepresentation_frequency_general = f"{pwrepresentation_frequency}_general" pwrepresentation_unique_general = f"{pwrepresentation_unique}_general" ``` **分类器配置** 通过以下配置调整随机森林的参数: ``` class RFParams: n_estimators = 30 criterion = 'gini' min_samples_leaf = 10 max_features = 0.8 ``` # 从源码构建 本项目使用 **Python3.11** 编写。推荐的设置使用 `uv`: ``` uv sync uv run python main.py ``` 如果您倾向于使用 `pip`,仍然可以通过以下命令安装依赖: ``` pip install -r requirements.txt ``` 然后运行以下命令启动主窗口: ``` python main.py ``` # 许可证 此代码在 [MIT 许可证](https://github.com/PadishahIII/RFGuess/blob/master/LICENSE)下发布。您可以在此条款下自由使用、修改、分发或出售。 # 联系方式 - straystrayer@gmail.com 项目链接:[https://github.com/PadishahIII/RFGuess](https://github.com/PadishahIII/RFGuess) # 致谢 - [基于随机森林的密码猜测](https://www.usenix.org/conference/usenixsecurity23/presentation/wang-ding-password-guessing) # 附录 ## 模式格式 | 标签 | 描述 | |-----|--------------------------------------------------| | N1 | 全名 | | N2 | 姓名缩写 | | N3 | 姓氏 | | N4 | 名字 | | N5 | 名字首字符加姓氏 | | N6 | 姓氏首字符加名字 | | N7 | 姓氏大写 | | N8 | 姓氏首字符 | | N9 | 名字缩写 | | B1 | 生日 (YYYYMMDD 格式) | | B2 | MMDDYYYY 格式 | | B3 | DDMMYYYY 格式 | | B4 | MMDD 格式 | | B5 | YYYY 格式 | | B6 | YYYYMM 格式 | | B7 | MMYYYY 格式 | | B8 | YYMMDD 格式 | | B9 | MMDDYY 格式 | | B10 | DDMMYY 格式 | | A1 | 账户 | | A2 | 账户的字母部分 | | A3 | 账户的数字部分 | | E1 | 邮箱前缀 | | E2 | 邮箱的字母部分 | | E3 | 邮箱的数字部分 | | E4 | 邮箱站点,如 qq, 163 | | P1 | 电话号码 | | P2 | 电话号码前三位 | | P3 | 电话号码后四位 | | I1 | 身份证号 | | I2 | 身份证号前三位 | | I3 | 身份证号前六位 |
标签:Apex, BSD, DOS头擦除, PII, Python, VEH, 个人身份信息, 后端开发, 图形界面, 字典攻击, 密码安全, 密码猜测, 密码破解, 数据挖掘, 无后门, 机器学习, 社工字典, 网络安全, 请求拦截, 逆向工具, 随机森林, 随机森林模型, 隐私保护