Sliver 凭据管理模块解析:哈希嗅探、类型识别与 `creds` 命令实战 Sliver 凭据管理模块解析哈希嗅探、类型识别与creds命令实战【免费下载链接】sliverAdversary Emulation Framework项目地址: https://gitcode.com/gh_mirrors/sl/sliverclient/credentials是 SliverAdversary 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$DCC2Windows 域缓存凭据MS Cache 2$krb5pa$23$KERBEROS_23_SA_REQ_PREAUTHKerberos 5 etype 23 预认证AS-REQ$krb5tgs$23$KERBEROS_23_TGS_REPKerberos 5 etype 23 TGS-REP服务票据$krb5asrep$23$KERBEROS_23_AS_REPKerberos 5 etype 23 AS-REPAS-REP roasting$krb5tgs$17$KERBEROS_17_TGS_REPKerberos AES128 TGS-REP$krb5pa$17$KERBEROS_17_PREAUTHKerberos AES128 预认证$krb5tgs$18$KERBEROS_18_TGS_REPKerberos AES256 TGS-REP$krb5pa$18$KERBEROS_18_PREAUTHKerberos AES256 预认证$2a$BCRYPT_UNIXbcryptUnix/Blowfish$6$SHA512_CRYPT_UNIXLinux sha512crypt/etc/shadowSCRYPT:SCRYPTscrypt 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、GOSTStreebog、Kerberos 各 etype、NetNTLMv1/v2、LM/NTLM、DCC/DCC2、macOS PBKDF2-SHA512 等CommonHashTypesWindows 域渗透中最常用的子集包括 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 查看凭据credscreds.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 fileadd.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每行一个哈希整行作为 Hashcsv每行username,hash跳过表头按,拆分取前两列解析函数parseUserColonHashNewline/parseHashNewline/parseCSV均在 add.go 中实现导入成功后回显Adding N credential(s) ...并重新打印凭据表。3.4 删除凭据creds rmcreds rm接受凭据 ID 作为位置参数并通过CredsCredentialIDCompleter提供补全——补全描述中会附带主机 UUID 摘要、哈希类型、破解标记[C]/[ ]与用户名creds.go方便精确定位要删除的记录。四、从嗅探到破解的实战链路结合以上源码一条典型的实战路径是捕获哈希从内存转储、网络流量、/etc/shadow等渠道获得原始哈希字符串嗅探识别将字符串交给SniffHashType或以HashNameFromHashType反向查名判断其属于 DCC2、Kerberos17/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.goHashcat 示例哈希参考client/credentials/EXAMPLES.md【免费下载链接】sliverAdversary Emulation Framework项目地址: https://gitcode.com/gh_mirrors/sl/sliver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考