diGiCTF/dedup
GitHub: diGiCTF/dedup
密码破解单词列表去重工具,维护主列表并输出与已试词汇的差值以提升效率。
Stars: 0 | Forks: 0
# dedup
一个用于密码破解工作流的单词列表去重工具。维护一个**主**列表,记录你针对特定 engagements 尝试过的每一个单词,并输出一个**过滤**列表,仅包含在主列表中尚未出现的新单词。
其核心思想很简单:不要浪费 GPU 时间对已经尝试过的单词重复进行哈希计算。
## 安装
```
git clone https://github.com/diGiCTF/dedup.git
cd dedup
./install.sh # installs to ~/.local/bin (no sudo)
# 或
./install.sh --system # installs to /usr/local/bin (sudo)
# 或
./install.sh --prefix /opt/tools
```
安装过程中会询问两个问题:
1. **dedup 应将单词列表存储在哪里?**(默认:`~/.dedup`)—— 实际保存到 `~/.config/dedup/config`,因此无论你在何处 `cd`,每次调用 `dedup` 都会解析到同一目录。
2. **添加 `dcd` Shell 辅助工具?**(默认:是)—— 在你的 `~/.bashrc` 或 `~/.zshrc` 中追加 `dcd() { cd "$(dedup -p)"; }`,这样你就可以通过 `dcd` 快速跳转到单词列表目录。
非交互式安装:
```
./install.sh --dir ~/.dedup --no-dcd -y
```
安装程序会在选定的 `bin` 目录中创建一个名为 `dedup` 的符号链接,因此你可以从任意位置调用它:
```
dedup -m ncl2026 new_list.txt
```
若要卸载,请运行 `./install.sh --uninstall`(如果安装时使用了 `--system` 或 `--prefix`,请一并加上相应参数)。
## 用法
```
dedup [options]
dedup -l [] [-d ]
dedup -p
dedup --set-path
dedup --normalize [] [--case ]
```
| 标志 | 描述 |
|------|------|
| `-m`, `--master ` | 命名空间引用。每个 engagement 使用独立的主文件。默认:`default`。 |
| `-d`, `--dir ` | 主文件/过滤文件的目录。仅覆盖当前调用的解析路径。 |
| `-l`, `--locate [name]` | 指定名称时:打印主文件路径到标准输出(便于脚本调用);不指定名称时:列出 `` 中的所有命名空间及其行数和大小写模式。若命名主文件不存在,则以非零状态退出。 |
| `-p`, `--path` | 打印当前解析出的 dedup 目录(错误输出中包含来源注释)。 |
| `--set-path ` | 将 `` 持久化保存为默认 dedup 目录(写入 `~/.config/dedup/config`)。 |
| `--case ` | 大小写归一化模式:`lower`(默认)、`upper`、`proper`、`preserve`。 |
| `-L` / `-U` / `-P` / `-K` | 分别对应 `--case lower` / `upper` / `proper` / `preserve` 的快捷开关。 |
| `--force-case` | 覆盖命名空间元数据中记录的大小写模式(否则模式不匹配会导致错误)。 |
| `--normalize [name]` | 使用记录的大小写模式(或 `--case` 指定的模式)就地重写主文件,并在转换后去重。 |
| `-q`, `--quiet` | 隐藏摘要输出。 |
| `-h`, `--help` | 显示帮助信息。 |
| `-` | 从标准输入读取新的单词列表。 |
### 目录解析优先级
每次调用 dedup 时,会按以下优先级解析 dedup 目录:
1. `-d ` —— 每次调用的覆盖路径
2. `$DEDUP_DIR` —— 环境变量
3. `~/.config/dedup/config` —— 持久化配置(由安装器或 `--set-path` 写入)
4. 当前目录 —— 最后备选
### 定位主文件
```
# 打印特定主文件的路径(标准输出仅为路径 — 可脚本化)
dedup -l ncl2026
# → /home/user/.dedup/dedup_ncl2026_master.txt
# 在管道中使用
wc -l "$(dedup -l ncl2026)"
grep -i admin "$(dedup -l ncl2026)"
# 保护子句:“我是否已启动此命名空间?”
if dedup -l ncl2026 >/dev/null 2>&1; then echo "exists"; fi
# 列出目录中的每个命名空间
dedup -l
# NAMESPACE CASE LINES PATH
# ncl2026 lower 14203 /home/user/.dedup/dedup_ncl2026_master.txt
# client_acme proper 8821 /home/user/.dedup/dedup_client_acme_master.txt
```
### 生成的文件
对于给定的引用名称,`` 中会包含三个文件:
- `dedup__master.txt` —— 你通过该命名空间提交过的每一个唯一单词的累计历史记录。
- `dedup__filtered.txt` —— 与最近一次运行的**差值**:仅包含在主文件中不存在的单词。这是你应提交给 hashcat 的内容。
- `dedup__master.meta` —— 命名空间元数据(目前仅包含大小写模式)。由系统自动管理,可手动编辑。
## 大小写归一化
默认情况下,`dedup` 在比较和存储之前会将每行转换为小写。这意味着 `PRESIDENT47`、`President47` 和 `president47` 都会合并为单个条目 `president47`,从而为你后续提交到工具中的单词列表提供干净且一致的内容。
### 模式
| 模式 | 短标志 | 效果 |
|---|---|---|
| `lower` | `-L` | 对整行应用 `tolower`(默认) |
| `upper` | `-U` | 对整行应用 `toupper` |
| `proper` | `-P` | 先 `tolower`,再将首字母大写(`president47` → `President47`) |
| `preserve` | `-K` | 保持原样;比较时区分大小写 |
```
# 默认 — 不区分大小写 + 清除小写主文件
dedup -m ncl2026 list.txt
# 区分大小写:将 Password1 和 password1 视为不同单词
dedup -m ncl2026 -K list.txt
# 适当大小写 — 用于基于名称的列表
dedup -m starwars -P names.txt
```
### 每个命名空间仅使用一种模式
首次写入会锁定该命名空间的大小写模式到 `dedup__master.meta`。后续运行必须匹配该模式 —— 如果尝试混用模式,`dedup` 会因模式不匹配而报错:
```
Error: namespace 'ncl2026' is recorded as case=lower but --case upper was requested.
Pass --force-case to change it, or run:
dedup --normalize ncl2026 --case upper
```
这可以防止因误用标志而静默污染使用不同大小写约定构建的主文件。
### 迁移或切换命名空间
如果你想更改现有命名空间的大小写模式 —— 或清理在存在大小写元数据之前构建的主文件 —— 可以使用 `--normalize`:
```
# 使用记录的案例重写主文件(转换后去重)
dedup --normalize ncl2026
# 或一次性切换到新的案例模式
dedup --normalize ncl2026 --case proper
```
主文件会被原子重写,在新大小写规则下重复的条目会被移除,元文件也会相应更新。
### 查看命名空间的大小写模式
`dedup -l` 现在会显示大小写列:
```
NAMESPACE CASE LINES PATH
ncl2026 lower 14203 /home/user/.dedup/dedup_ncl2026_master.txt
starwars proper 812 /home/user/.dedup/dedup_starwars_master.txt
legacy - 4120 /home/user/.dedup/dedup_legacy_master.txt
```
`CASE` 列中的 `-` 表示尚未存在元文件(旧版主文件);建议运行 `--normalize` 以采用统一模式。
## 工作流:NCL 密码破解
适用于 NCL 赛季或 CTF 参与的典型场景。
### 1. 初始化主文件
用你已经尝试过(或计划跳过)的列表对其进行初始化:
```
dedup -m ncl2026 /wordlists/rockyou.txt
```
主文件现在包含 rockyou 内容。首次运行时没有过滤输出 —— 因为主文件中尚未有可减去的条目。
### 2. 过滤新的主题化单词列表
当出现新的挑战时,你可以构建一个主题化列表 —— 例如,对 Star Wars 名称应用常见变形:
```
dedup -m ncl2026 starwars_leet.txt
```
`dedup_ncl2026_filtered.txt` 现在仅包含在 rockyou 中不存在的 Star Wars 主题变形单词。将该列表提交给 hashcat:
```
hashcat -m 1000 hashes.txt dedup_ncl2026_filtered.txt \
-r /rules/OneRuleToRuleThemAll.rule
```
### 3. 将破解出的密码回填主文件
当 hashcat 破解出明文后,将这些密码加入主文件,避免后续重复尝试:
```
hashcat -m 1000 hashes.txt --show | cut -d: -f2- | dedup -m ncl2026 -
```
### 4. 重复处理每个新挑战
每个新的单词列表都会与不断增长的主文件进行差值比对。随着一个赛季推进,`filtered.txt` 会不断缩小,仅保留新颖候选词,hashcat 的运行时间也会随之缩短。
## 命名空间
使用 `-m` 保持不同 engagement 的隔离:
- `-m ncl2026` —— 当前 NCL 赛季
- `-m client_acme` —— 客户渗透测试
- `-m ctf_htb` —— HTB 靶机
命名空间之间互不干扰:对客户 A 尝试过的内容不会影响到客户 B 的跳过逻辑。
## 管理存储目录
安装器会在 `~/.config/dedup/config` 中设置一个持久化目录。你可以随时查看或修改它:
```
# 显示当前解析的目录(及原因)
dedup -p
# → /home/user/.dedup
# (来源:配置) ← 标准错误
# 切换到不同的目录(例如移动到新的 CTF 工作区)
dedup --set-path ~/ctfs/ncl2026
# 一次性覆盖,不修改配置
DEDUP_DIR=/tmp/throwaway dedup -m scratch list.txt
dedup -d /some/other/dir -m scratch list.txt
```
如果在安装时选择了“是”来启用 `dcd` 辅助工具,你可以从任意 Shell 跳转到该目录:
```
dcd # cd into whatever `dedup -p` resolves to
```
## 输出示例
```
======================================
Filtered unique lines saved to: /home/user/.dedup/dedup_ncl2026_filtered.txt
======================================
Case mode: lower
Already in master: 14203
Duplicates within input: 47
New unique lines added: 1829
Master updated: /home/user/.dedup/dedup_ncl2026_master.txt
```
- **大小写模式** —— 在比较输入行之前应用的归一化方式。
- **已在主文件中** —— 若不使用本工具,这些单词会被重复尝试。
- **输入内的重复项** —— 新单词列表本身在归一化后包含的重复内容。
- **新增唯一行数** —— 过滤文件的大小以及追加到主文件中的内容。
## 注意事项
- 默认大小写模式为 `lower` —— `PRES47` 与 `president47` 会合并为一条记录。可通过 `-K`(保留)、`-U`、`-P` 或 `--case ` 在每次调用时覆盖。
- 原子化主文件更新:运行中途崩溃不会损坏主文件。
- 支持 TTY 模式:在交互式会话中输出带颜色内容,通过管道时输出纯文本。
- 通过标准输入读取(使用 `-`),因此可与 `hashcat --show`、`cut`、`awk`、`sort -u` 等工具组合使用。
标签:ATT&CK 技巧, Cutter, dedup 工具, DOS头擦除, GPU 加速, meg, PB级数据处理, shell 助手, T1110 密码破解, VEH, XML 请求, 二进制发布, 信息安全, 单词表, 去重, 去重过滤, 命名空间, 字典攻击, 存储路径管理, 安全开发, 安全运维, 密码学, 密码安全, 密码破解, 应用安全, 开源工具, 手动系统调用, 词表去重, 词表管理