BridgerAlderson/WordlistKingdom
GitHub: BridgerAlderson/WordlistKingdom
基于目标组织特征关键词的高并发定制化密码字典生成器,用于授权渗透测试中生成满足 AD 密码策略的候选词列表。
Stars: 1 | Forks: 0
# WordlistKingdom
```
██╗ ██╗ ██╗ ██╗
██║ ██║ ██║ ██╔╝
██║ █╗ ██║ █████╔╝
██║███╗██║ ██╔═██╗
╚███╔███╔╝ ██║ ██╗
╚══╝╚══╝ ╚═╝ ╚═╝ WordlistKingdom v1.1
```
**针对特定目标的字典生成器** — 一款高性能、并发的 CLI 工具,用于在授权的渗透测试和红队行动中生成具有组织意识的密码候选词。
## 工作原理
WordlistKingdom 读取包含组织特定词汇(公司名称、城市、部门名称、项目名称等)的纯文本关键词文件(`keywords.txt`),并应用九层变异规则,生成经过去重和策略过滤的字典,可直接输入到 `hydra`、`crackmapexec`、`kerbrute` 或 `hashcat` 等工具中。
### Pipeline 架构
```
keywords.txt
│
▼
[ Reader ] ─── loads & deduplicates keywords
│
▼
[ Generator Goroutines ] ─── applies all 7 mutation rules concurrently
│ (bounded channel with 100k buffer — natural backpressure, zero OOM risk)
▼
[ Filter Workers × NumCPU ]
├── AD Policy Filter (min length · uppercase · digit · special char)
└── Bloom Filter (probabilistic dedup, ~12 MB for 5M entries at 1% FP)
│
▼
[ Buffered Writer ] ─── 64 MiB write buffer, single syscall flush
│
▼
custom_wordlist.txt
```
该 Pipeline 永远不会将完整的候选集保留在内存中。当 channel 填满时 Producer 会阻塞;由 consumer 进行排空。无论关键词数量多少,内存使用都是有界且恒定的。
## 变异规则
### 1. 大小写变体
每个关键词以四种形式输出:
| 形式 | 输入 | 输出 |
|------|-------|--------|
| 小写 | `Admin` | `admin` |
| 大写 | `Admin` | `ADMIN` |
| 首字母大写 | `Admin` | `Admin` |
| 驼峰命名 | `active_directory` | `activeDirectory` |
### 2. Leetspeak(黑客语)替换
对每个大小写变体应用完整的字符替换:
| 字符 | 替换为 |
|------|-----------|
| `a` | `@` |
| `e` | `3` |
| `i` | `1` |
| `o` | `0` |
| `s` | `$` |
| `l` | `1` |
示例:`Password` → `p@$$w0rd`
### 3. 年份追加 / 前置
作为后缀和前缀,以完整形式和 2 位数字的简写形式与每个基础变异结合:
- **动态:** 当前年份 ± 3(每次运行自动更新)
- **历史:** `1071`、`1453`、`1923`、`1999`、`2000`、`2001`、`2019`
示例:`Admin` → `Admin2024`、`2024Admin`、`Admin24`、`24Admin`
### 4. 特殊字符注入
每个候选词有三种注入模式:
| 模式 | 示例 |
|------|---------|
| 后缀(单个) | `Admin!` `Admin@` `Admin#` … |
| 前缀(单个) | `!Admin` `@Admin` … |
| 复杂后缀 | `Admin!123` `Admin!@#` `Admin123!` … |
| 中点插入 | `Ad!min`(长度 ≥ 4 个字符的词) |
单个字符:`! @ # $ % * . _ ? -`
复杂 token:`!.` `!1` `!12` `!123` `!@#` `@123` `123!` `1234` `12345` `#1`
### 5. 关键词组合
关键词列表中的所有有序对通过五个分隔符进行交叉组合,并输出每个对的所有大小写变体:
```
Separators: . _ - @ (none)
```
使用关键词 `Acme` + `Admin` 的示例:
`Acme.Admin`、`acme_admin`、`ACME-ADMIN`、`AcmeAdmin`、`acme@Admin`、…
### 6. 常见前缀 / 后缀词缀
行业标准的角色和部门术语会被前置和附加(带有 `.` 和 `_` 分隔符变体):
| 前缀 | 后缀 |
|----------|----------|
| `Admin` `Test` `User` `Dev` `IT` | `Admin` `Test` `User` `Dev` `IT` |
| `Sistem` `Helpdesk` `Root` `Super` | `123` `1234` `12345` |
| `Backup` `Net` `Sec` | `0` `01` `99` `00` |
示例:`Istanbul` → `AdminIstanbul`、`Admin_Istanbul`、`Istanbul123`、`Istanbul_IT`
### 7. 季节 / 月份交叉组合
通用的季节和月份术语(英语 + 土耳其语)与每个关键词进行交叉组合,然后对每个组合应用年份和特殊字符变体:
```
Seasons: Summer Winter Spring Autumn Yaz Kis Ilkbahar Sonbahar
Months: January February … December / Ocak Subat … Aralik
```
使用关键词 `Acme` 的示例:
`AcmeSummer2024`、`AcmeSummer!`、`WinterAcme2025`、`AcmeOcak!@#`、…
### 8. 用户名 Pivot 变异
当通过 `-userlist` 提供用户名列表时,每个用户名都会通过五个分隔符与每个关键词进行交叉组合,并包含完整的年份和特殊字符变体:
```
Separators: . _ - @ (none)
```
使用用户名 `jsmith` 和关键词 `Acme` 的示例:
`jsmith.Acme2026`、`jsmith_acme!`、`JSMITH@Acme2025`、`JsmithAcme!@#`、…
### 9. Active Directory 策略过滤器
在将任何候选词写入磁盘之前,会根据配置的 AD 复杂性策略对其进行验证:
- 最小长度(默认:**8 个字符**)
- 至少 **1 个大写**字母
- 至少 **1 位数字**
- 至少 **1 个特殊**字符
未通过过滤器的候选词将被丢弃。使用 `-no-filter` 可禁用此功能以输出所有原始变异。
## 安装
### 选项 A — 从源码编译(推荐)
需要 [Go 1.21+](https://go.dev/dl/)。
```
git clone https://github.com/BridgerAlderson/WordlistKingdom.git
cd WordlistKingdom
go build -ldflags="-s -w" -o wordlistkingdom .
```
### 选项 B — 预编译二进制文件
`dist/` 目录中提供了交叉编译的二进制文件:
| 平台 | 二进制文件 |
|----------|--------|
| Linux x86-64 | `dist/wordlistkingdom-linux-amd64` |
| Linux ARM64(树莓派 / 云端) | `dist/wordlistkingdom-linux-arm64` |
| macOS Intel | `dist/wordlistkingdom-darwin-amd64` |
| macOS Apple Silicon | `dist/wordlistkingdom-darwin-arm64` |
| Windows x86-64 | `dist/wordlistkingdom-windows-amd64.exe` |
在 Unix 系统上赋予二进制文件可执行权限:
```
chmod +x dist/wordlistkingdom-linux-amd64
```
### 一次性编译所有平台
```
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o dist/wordlistkingdom-linux-amd64 .
GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o dist/wordlistkingdom-linux-arm64 .
GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o dist/wordlistkingdom-darwin-amd64 .
GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o dist/wordlistkingdom-darwin-arm64 .
GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o dist/wordlistkingdom-windows-amd64.exe .
```
## 用法
```
./wordlistkingdom [flags]
```
### 标志
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `-input` | `keywords.txt` | 关键词文件路径 |
| `-output` | `custom_wordlist.txt` | 输出字典路径(使用 `-` 表示输出到 stdout) |
| `-userlist` | _(无)_ | 用于 pivot 变异的用户名列表路径(SAMAccountName 格式) |
| `-years` | _(无)_ | 要包含的额外年份,以逗号分隔(例如 `1938,2010`) |
| `-workers` | NumCPU | 并行 goroutine 数量 |
| `-min-len` | `8` | 最小密码长度(AD 策略) |
| `-no-filter` | `false` | 禁用 AD 策略过滤器 — 输出所有变异 |
| `-bloom-size` | `5000000` | 预期的唯一候选词数量;用于调整 bloom filter 准确度 |
| `-v` | `false` | 打印实时进度计数器(写入的条目数 + 耗时) |
### 示例
**标准运行 — 开启 AD 策略,详细输出:**
```
./wordlistkingdom -input keywords.txt -output passwords.txt -v
```
**禁用 AD 过滤器 — 输出所有变异,不论复杂性:**
```
./wordlistkingdom -no-filter -output raw_mutations.txt
```
**自定义输入/输出路径并显式指定 worker 数量:**
```
./wordlistkingdom -input /tmp/acme_keywords.txt -output /tmp/acme_wordlist.txt -workers 8
```
**大型关键词集 — 调整 bloom filter 以避免假阳性:**
```
./wordlistkingdom -input big_keywords.txt -bloom-size 20000000 -v
```
**自定义最小密码长度:**
```
./wordlistkingdom -min-len 12 -v
```
**用户名 pivot — 将用户列表与关键词交叉组合:**
```
./wordlistkingdom -input keywords.txt -userlist users.txt -output passwords.txt -v
```
**包含额外的目标特定年份(例如成立年份、已知事件年份):**
```
./wordlistkingdom -input keywords.txt -years 1938,2010 -output passwords.txt -v
```
**通过进程替换直接将输出 pipe 到 crackmapexec:**
```
./wordlistkingdom -no-filter -output - 2>/dev/null | crackmapexec smb 192.168.1.0/24 -u users.txt -p -
```
## keywords.txt 格式
每行一个关键词。以 `#` 开头的行将被视为注释并忽略。重复的条目会被自动丢弃。
```
# 公司名称及变体
Acme
AcmeCorp
# 位置
Istanbul
Ankara
# 部门和角色
IT
Helpdesk
Network
# 项目 / 产品名称
Portal
VPN
ERP
```
**有效关键词提示:**
- 包含公司名称、缩写和本地语言版本
- 添加城市、国家和成立年份
- 包含内部项目名称、产品名称和部门名称
- 如果 OSINT 表明存在密码重用,请添加关键人员的姓名
- 包含不带 TLD 的组织域名
## 性能
在配备 12 核心的机器上,使用 11 个关键词进行的基准测试:
| 模式 | 唯一密码数 | 耗时 | 速度 | 输出大小 |
|------|-----------------|------|-------|-------------|
| 开启 AD 过滤器 | 36,479 | 144 毫秒 | 252,000 /秒 | 438 KB |
| 关闭 AD 过滤器 | 107,566 | 178 毫秒 | 603,000 /秒 | 1.2 MB |
性能随关键词数量呈线性扩展。在大规模运算时的瓶颈是磁盘 I/O;64 MiB 的写入缓冲区将系统调用开销降至最低。
## 项目结构
```
WordlistKingdom/
├── main.go Entry point, CLI flags, progress reporter
├── go.mod
├── keywords.txt Sample keyword file
└── pkg/
├── reader/
│ └── reader.go Keyword file loader (comment skip, dedup)
├── bloom/
│ └── bloom.go Thread-safe probabilistic bloom filter
├── filter/
│ └── policy.go Active Directory complexity policy filter
├── writer/
│ └── writer.go 64 MiB buffered concurrent file writer
└── mutations/
├── engine.go Goroutine pipeline orchestrator
├── case.go Case variation mutations
├── leet.go Leetspeak substitution
├── year.go Year append/prepend variants
├── special.go Special character injection
├── combine.go Cross-keyword combination generator
└── affixes.go Common prefix/suffix affixes
```
## 与常用工具集成
**Hydra(SSH 暴力破解):**
```
hydra -L users.txt -P custom_wordlist.txt ssh://192.168.1.10
```
**CrackMapExec(SMB 密码喷射):**
```
crackmapexec smb 192.168.1.0/24 -u users.txt -P custom_wordlist.txt
```
**Kerbrute(Kerberos 预认证喷射):**
```
kerbrute passwordspray -d corp.local --dc 192.168.1.5 users.txt custom_wordlist.txt
```
**Hashcat(离线破解 — 转换为字典攻击):**
```
hashcat -m 1000 hashes.txt custom_wordlist.txt
```
## 依赖项
零外部依赖。整个项目基于 Go 标准库构建:
- `hash/fnv` — bloom filter 哈希
- `sync` / `sync/atomic` — goroutine 协调
- `bufio` — 缓冲 I/O
- `math` — bloom filter 大小计算
## 许可证
MIT 许可证 — 详见 [LICENSE](LICENSE)。
标签:DOS头擦除, EVTX分析, Go, Ruby工具, 密码字典, 密码破解, 文档结构分析, 日志审计