Sliver 凭据管理模块解析:哈希嗅探、类型识别与creds命令实战
【免费下载链接】sliverAdversary Emulation Framework项目地址: https://gitcode.com/gh_mirrors/sl/sliver
client/credentials是 Sliver(Adversary Emulation Framework)客户端中的凭据管理工具包,为操作人员提供哈希嗅探(hash sniffing)、凭据导入辅助、存储与输出格式化能力。本文基于 client/credentials/README.md 展开,结合 sniff.go、credentials.go 及上层creds命令源码,讲解哈希类型识别的工作原理、凭据数据库的增删查操作,以及如何将捕获的散列快速整理为可交付给 Hashcat 的格式。读完本文,你将掌握 Sliver 中"捕获凭据 → 识别哈希类型 → 入库 → 导出破解"的完整链路。
一、包结构与职责定位
按照 client/credentials/README.md 的说明,该包是面向"操作人员"(operators)的凭据管理工具集合,核心逻辑(core logic)聚焦于 credentials 包内的sniff能力。包内包含三个 Go 文件:
| 文件 | 职责 |
|---|---|
| credentials.go | 实现客户端侧的凭据存储、查找与格式化辅助(哈希类型名称映射、Hashcat 模式号参考表) |
| sniff.go | 提供凭据嗅探例程,把捕获到的输出解析为结构化记录(通过前缀特征识别哈希类型) |
| sniff_test.go | 测试文件,使用样例凭据数据验证嗅探/解析辅助函数 |
需要指出的是,该包本身并不负责凭据的持久化存储——真正落地存储与命令行交互的是client/command/creds命令模块(见下文第三节),本包为其提供哈希类型的枚举与识别基础设施。
二、哈希类型识别:从字符串嗅探到 Hashcat 模式
2.1SniffHashType:基于前缀特征的快速识别
sniiff.go 中定义的SniffHashType(unknownHash string) clientpb.HashType是整个嗅探逻辑的核心。它采用"摘低垂果实"(low hanging fruit)的策略——先通过strings.HasPrefix检查常见的特征前缀,命中即返回对应的clientpb.HashType枚举,全部未命中则返回clientpb.HashType_INVALID。
func SniffHashType(unknownHash string) clientpb.HashType { // $DCC2$10240#tom#e4e938d12fe5974dc4... if strings.HasPrefix(unknownHash, "$DCC2$") { return clientpb.HashType_DCC2 } // $krb5pa$23$*user$realm$hash if strings.HasPrefix(unknownHash, "$krb5pa$23$") { return clientpb.HashType_KERBEROS_23_SA_REQ_PREAUTH } // $krb5tgs$23$ if strings.HasPrefix(unknownHash, "$krb5tgs$23$") { return clientpb.HashType_KERBEROS_23_TGS_REP } // ... if strings.HasPrefix(unknownHash, "$2a$") { return clientpb.HashType_BCRYPT_UNIX } // $6$ if strings.HasPrefix(unknownHash, "$6$") { return clientpb.HashType_SHA512_CRYPT_UNIX } // SCRYPT:... if strings.HasPrefix(unknownHash, "SCRYPT:") { return clientpb.HashType_SCRYPT } return clientpb.HashType_INVALID }当前版本支持的前缀与哈希类型对应关系如下:
| 特征前缀 | 识别出的哈希类型 | 典型场景 |
|---|---|---|
$DCC2$ | DCC2 | Windows 域缓存凭据(MS Cache 2) |
$krb5pa$23$ | KERBEROS_23_SA_REQ_PREAUTH | Kerberos 5 etype 23 预认证(AS-REQ) |
$krb5tgs$23$ | KERBEROS_23_TGS_REP | Kerberos 5 etype 23 TGS-REP(服务票据) |
$krb5asrep$23$ | KERBEROS_23_AS_REP | Kerberos 5 etype 23 AS-REP(AS-REP roasting) |
$krb5tgs$17$ | KERBEROS_17_TGS_REP | Kerberos AES128 TGS-REP |
$krb5pa$17$ | KERBEROS_17_PREAUTH | Kerberos AES128 预认证 |
$krb5tgs$18$ | KERBEROS_18_TGS_REP | Kerberos AES256 TGS-REP |
$krb5pa$18$ | KERBEROS_18_PREAUTH | Kerberos AES256 预认证 |
$2a$ | BCRYPT_UNIX | bcrypt(Unix/Blowfish) |
$6$ | SHA512_CRYPT_UNIX | Linux sha512crypt(/etc/shadow) |
SCRYPT: | SCRYPT | scrypt KDF |
源码注释(sniff.go)明确写道:"目前我们只摘低垂的果实,之后可以加入长度检查、正则表达式等"——这意味着该实现有意保持轻量,靠"代价极低"的前缀比较换取快速判断,后续可扩展为更精确的启发式。
2.2 测试用例验证
sniff_test.go 使用表驱动(table-driven)测试覆盖了全部 11 个正向分支和 1 个负向分支,包括:
{ name: "DCC2 hash", input: "$DCC2$10240#tom#e4e938d12fe5974dc4...", expected: clientpb.HashType_DCC2, }, { name: "Invalid hash", input: "invalid_hash", expected: clientpb.HashType_INVALID, },值得注意的是测试数据直接沿用了 Hashcat 官方示例哈希的格式(如$DCC2$10240#tom#...对应 EXAMPLES.md 中 Hash-Mode 2100 的样例),说明嗅探逻辑的设计目标就是"识别出的哈希可直接喂给 Hashcat"。
2.3 哈希类型名称映射
credentials.go 中维护了两张映射表:
AllHashTypes:完整映射clientpb.HashType枚举 → 人类可读名称,覆盖 MD4/MD5/SHA 系列、Keccak、GOST(Streebog)、Kerberos 各 etype、NetNTLMv1/v2、LM/NTLM、DCC/DCC2、macOS PBKDF2-SHA512 等;CommonHashTypes:Windows 域渗透中最常用的子集,包括 LM、NTLM、DCC、DCC2、Kerberos 17/18/23 系列、NetNTLMv1/v2,以及 MD5、SHA1、SHA2-256、SHA2-512。
辅助函数HashNameFromHashType(hashType clientpb.HashType) string提供反向查询——给定枚举返回名称,未命中返回"Unknown"。这层映射正是上层creds命令在表格输出"Hash Type"列时的人类可读来源。
此外,credentials.go 还内嵌了一份 Hashcat hash-mode 参考表(# | Name | Category),涵盖 Raw Hash、salted、authenticated、网络协议(WPA、Kerberos、NetNTLM、SNMPv3)、操作系统(LM/NTLM、DPAPI、各种 Unix crypt)、数据库服务器、全盘加密(BitLocker、FileVault、VeraCrypt、LUKS)、文档、密码管理器(KeePass、1Password、LastPass)、加密货币钱包等类别,为操作人员离线核对模式号提供了便利。
三、上层命令:creds凭据数据库管理
3.1 命令树结构
client/command/creds/commands.go 注册了creds命令及其子命令,通过 RPC 与 Sliver 服务端交互:
creds # 列出凭据数据库中的全部凭据 ├── creds add # 添加单条凭据 │ └── creds add file # 从文件批量导入凭据 └── creds rm # 删除凭据3.2 查看凭据:creds
creds.go 中的CredsCmd调用con.Rpc.Creds()拉取全部凭据,无数据时输出No credentials;有数据时由PrintCreds按Collection(凭据集合)分组,每个集合渲染一张表,表头为:
ID | Username | Plaintext | Hash | Hash Type | Cracked其中 ID 只显示 UUID 前缀,Hash Type直接使用枚举的字符串值,Cracked以布尔形式标识是否已破解。
3.3 添加凭据:creds add与creds add file
add.go 定义了两种添加途径:
单条添加creds add支持以下参数(见 commands.go):
| 参数 | 简写 | 含义 |
|---|---|---|
--collection | -c | 凭据所属集合名称 |
--username | -u | 用户名 |
--plaintext | -p | 明文口令 |
--hash | -P | 哈希值 |
--hash-type | -H | 哈希类型(枚举名) |
约束逻辑:plaintext与hash至少提供一个,否则报错;hash-type非法(解析为HashType_INVALID)时报错。哈希类型解析走parseHashTypeString,即通过clientpb.HashType_value[raw]反查枚举(add.go)。命令还通过CredsHashTypeCompleter提供 carapace 自动补全,--hash-type会列出 hash-types.go 中数百种枚举名及其描述。
文件批量导入creds add file支持三种--file-format(默认hash):
| 格式常量 | 文件内容 | 解析方式 |
|---|---|---|
user:hash | 每行username:hash | 按:拆分,严格要求恰好 2 段 |
hash | 每行一个哈希 | 整行作为 Hash |
csv | 每行username,hash | 跳过表头,按,拆分取前两列 |
解析函数parseUserColonHashNewline/parseHashNewline/parseCSV均在 add.go 中实现,导入成功后回显Adding N credential(s) ...并重新打印凭据表。
3.4 删除凭据:creds rm
creds rm接受凭据 ID 作为位置参数,并通过CredsCredentialIDCompleter提供补全——补全描述中会附带主机 UUID 摘要、哈希类型、破解标记([C]/[ ])与用户名(creds.go),方便精确定位要删除的记录。
四、从嗅探到破解的实战链路
结合以上源码,一条典型的实战路径是:
- 捕获哈希:从内存转储、网络流量、
/etc/shadow等渠道获得原始哈希字符串; - 嗅探识别:将字符串交给
SniffHashType(或以HashNameFromHashType反向查名),判断其属于 DCC2、Kerberos(17/18/23)、bcrypt、sha512crypt、scrypt 等已知类型; - 入库:通过
creds add --hash <hash> --hash-type <类型>或creds add file -F <格式> <文件>批量导入,必要时用--collection按目标主机或渗透阶段分组; - 导出破解:凭据库中的哈希格式与 Hashcat 模式号对齐(参考 credentials.go 内嵌的 mode 表),可导出后交由 Hashcat 离线破解;
- 结果回填:破解出的明文通过
creds add的--plaintext字段回填,Cracked标记随之更新,形成可审计的凭据台账。
五、局限与扩展方向
从源码可以明确看到两个设计取舍:
- 嗅探覆盖面有限:
SniffHashType目前只覆盖约 12 种带强特征前缀的哈希。源码注释表明这是有意为之("先摘低垂果实"),纯 hex 的 MD5/SHA 等无前缀哈希、需要长度判断的类型均返回INVALID,需要人工指定类型; - 识别依赖前缀:实现依赖 Hashcat 生态的"魔数前缀"约定(如
$DCC2$、$krb5tgs$、$2a$、SCRYPT:),这意味着与 Hashcat 的格式兼容性是第一优先级的,扩展新类型时也需遵循同样的前缀约定。
从代码结构推断,后续扩展点在于:为SniffHashType增加长度检查与正则匹配,从而覆盖更多"无特征前缀但结构可辨"的哈希类型。
六、相关文件索引
- 包说明:client/credentials/README.md
- 哈希类型映射与 Hashcat mode 表:client/credentials/credentials.go
- 嗅探实现:client/credentials/sniff.go
- 嗅探测试:client/credentials/sniff_test.go
- 命令注册:client/command/creds/commands.go
- 列表/输出:client/command/creds/creds.go
- 添加/文件导入:client/command/creds/add.go
- 哈希类型枚举描述表:client/command/creds/hash-types.go
- Hashcat 示例哈希参考:client/credentials/EXAMPLES.md
【免费下载链接】sliverAdversary Emulation Framework项目地址: https://gitcode.com/gh_mirrors/sl/sliver
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考