Sliver 凭据管理模块解析:哈希嗅探、类型识别与 `creds` 命令实战
2026/9/23 12:35:01 网站建设 项目流程

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$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-REP(AS-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_UNIXbcrypt(Unix/Blowfish)
$6$SHA512_CRYPT_UNIXLinux sha512crypt(/etc/shadow)
SCRYPT: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、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;有数据时由PrintCredsCollection(凭据集合)分组,每个集合渲染一张表,表头为:

ID | Username | Plaintext | Hash | Hash Type | Cracked

其中 ID 只显示 UUID 前缀,Hash Type直接使用枚举的字符串值,Cracked以布尔形式标识是否已破解。

3.3 添加凭据:creds addcreds add file

add.go 定义了两种添加途径:

单条添加creds add支持以下参数(见 commands.go):

参数简写含义
--collection-c凭据所属集合名称
--username-u用户名
--plaintext-p明文口令
--hash-P哈希值
--hash-type-H哈希类型(枚举名)

约束逻辑:plaintexthash至少提供一个,否则报错;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),方便精确定位要删除的记录。

四、从嗅探到破解的实战链路

结合以上源码,一条典型的实战路径是:

  1. 捕获哈希:从内存转储、网络流量、/etc/shadow等渠道获得原始哈希字符串;
  2. 嗅探识别:将字符串交给SniffHashType(或以HashNameFromHashType反向查名),判断其属于 DCC2、Kerberos(17/18/23)、bcrypt、sha512crypt、scrypt 等已知类型;
  3. 入库:通过creds add --hash <hash> --hash-type <类型>creds add file -F <格式> <文件>批量导入,必要时用--collection按目标主机或渗透阶段分组;
  4. 导出破解:凭据库中的哈希格式与 Hashcat 模式号对齐(参考 credentials.go 内嵌的 mode 表),可导出后交由 Hashcat 离线破解;
  5. 结果回填:破解出的明文通过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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询