- 网络安全
【免费下载链接】sliver
Adversary Emulation Framework
本篇技术指南围绕 Sliver(Adversary Emulation Framework)客户端控制台中的crack命令组展开,系统讲解其命令层级结构、crackstation(破解工作站)状态与后端设备信息、缓存基准测试(benchmarks)、持久化破解任务(jobs)的完整生命周期、词表/规则/hcstat2 文件管理,以及基于 Bubble Tea 的全屏实时监视器crack top。读完本文,你将掌握如何通过 Sliver 客户端把一个基于 Hashcat 的分布式 GPU 破解集群完整地纳管、调度与监控,并理解每个命令背后的 RPC 调用链与源码实现细节。
crack 命令组概览
在 client/command/crack/ 目录中实现的crack命令组,是 Sliver 客户端连接服务端后操作 GPU 口令破解集群的统一入口。从 crack.go 的注释可以看到,它被定位为 "GPU password cracking interface",其核心设计目标包括:
- 分布式任务调度:破解工作由服务端调度到多台已连接的 crackstation(每个 crackstation 上运行 Hashcat),客户端只负责下发任务与查看结果;
- 持久化任务:任务(CrackJob)由服务端持久化,客户端可以随时列出、查看、暂停、恢复、取消和删除;
- 同步查询:keyspace 计算、候选总数、候选定位、哈希类型识别、哈希信息等操作在空闲 crackstation 上同步执行,不创建任务;
- 实时监控:通过全屏 TUI(
crack top)实时观察任务进度、GPU 设备遥测与历史图表。
命令字符串常量定义在 client/constants/constants.go:crack、stations、benchmarks、wordlists、rules、hcstat2。
命令层级结构:Cobra 命令树的构建
crack命令组由 commands.go 中的Commands()函数统一构建,它接收*console.SliverClient并返回根命令,完整的命令树如下:
crack # GPU password cracking(破解调用/信息面板) ├── stations # 管理 crackstation(-–show-benchmarks 显示基准速率) ├── benchmarks # 显示服务端缓存的基准测试结果(-a/--all 显示全部哈希模式) ├── jobs # 列出持久化破解任务 ├── top # 全屏实时监视器(--poll-interval 默认 1s,最小 250ms) ├── job [id] # 查看单个任务(-w/--watch 轮询直到终态;--poll-interval 状态轮询间隔) │ ├── cancel [id] # 取消进行中或已暂停的任务 │ ├── pause [id] # 暂停进行中的任务 │ ├── resume [id] # 恢复已暂停的任务 │ └── rm [id] # 删除已结束(完成/失败/取消)的任务 ├── wordlists # 管理词表 │ ├── add <path> # 上传词表(-n/--name 指定名称,默认取文件名) │ └── rm <name> # 删除词表 ├── rules # 管理规则文件 │ ├── add <path> # 上传规则文件 │ └── rm <name> # 删除规则文件 └── hcstat2 # 管理 Markov hcstat2 文件 ├── add <path> # 上传 hcstat2 文件 └── rm <name> # 删除 hcstat2 文件从源码可以看出几个值得注意的细节:
- 根命令
crack绑定了一个--timeout/-t(默认flags.DefaultTimeout)gRPC 超时参数,用于控制与服务端的 RPC 调用超时; crack与crack jobs、crack job的 handler 都通过flags.Bind("", true, ...)绑定timeout,true表示该标志在子命令间继承;- 所有涉及任务 ID、词表、规则、hcstat2 的位置参数都注册了基于 carapace 的补全器(completer),如
CrackJobIDCompleter、CrackWordlistCompleter、CrackRulesCompleter、CrackHcstat2Completer,其中任务 ID 补全会过滤出可操作的任务(可暂停、可恢复、可取消、终态任务各有专属补全器,见 helpers.go)。
调用分发:一次 crack 命令如何被分类处理
crack根命令的处理器CrackCmd(crack.go)首先调用classifyCrackInvocation(crack-dispatch.go)对命令进行"调用分类",决定本次执行属于哪种模式:
| 调用模式 | 触发条件 | 行为 |
|---|---|---|
crackInvocationDashboard | 无任何破解相关标志/参数 | 显示 crackstation 在线数与已上传破解文件摘要(信息面板) |
crackInvocationJob | 存在--hash、位置参数或破解相关标志 | 构建CrackCommand提交到分布式任务队列,创建持久化任务 |
crackInvocationBackendInfo | --backend-info/--backend-info-level | 直接展示所有已连接 crackstation 注册的后端设备信息,不创建任务 |
crackInvocationKeyspace | --keyspace | 在空闲 crackstation 上同步计算 keyspace 并返回 |
crackInvocationTotalCandidates | --total-candidates | 同步计算候选总数 |
crackInvocationLookup | --lookup <candidate> | 同步定位某个候选在攻击中的位置 |
crackInvocationIdentify | --identify-mode(配合位置哈希或--hash) | 同步识别哈希类型 |
crackInvocationHashInfo | --hash-info/--hash-info-level | 同步返回哈希模式信息 |
分类逻辑有严格的互斥与合法性校验:六种查询模式两两不能组合(会报 "crack query modes cannot be combined");--crackstation必须配合同步查询模式使用;--identify-mode与显式指定--hash-mode/--hash-type互斥;--keyspace/--total-candidates等候选查询与 benchmark、brain、restore、show/left、speed-only 等标志互斥(见incompatibleCandidateQueryFlags,crack-dispatch.go)。
对于任务提交,crack-command.go 中的buildCrackCommand会把 Cobra 标志逐一映射为clientpb.CrackCommandprotobuf 消息,覆盖 Hashcat 的几乎全部参数面:攻击模式(--attack-mode,支持 straight/combination/bruteforce/pcfg/hybrid-wordlist-mask/hybrid-mask-wordlist/generic/association/no-attack/hybrid 或数字,见 crack-command.go)、哈希类型(--hash-type支持数字或枚举名)、--hash-mode、可重复的--hash与--credential、--rules-file、8 个自定义字符集、增量模式、Markov、restore/outfile、benchmark、workload-profile、brain 服务器等。--segment-size已标记为 "removed in Hashcat v7" 并直接报错。
crackstation 状态与后端设备信息
crack stations命令由CrackStationsCmd(crack.go)实现,通过Rpc.Crackstations()获取所有已连接的工作站,并按名称/HostUUID 稳定排序后逐个渲染表格(renderCracker,crack.go)。每个工作站展示:
- 操作系统(GOOS/GOARCH)、Hashcat 版本;
- 后端设备(CUDA / HIP / Metal / OpenCL 四类),每类显示设备名、空闲/总显存、时钟与处理器数量(crack-backend-info.go);
- 加
--show-benchmarks后额外渲染该工作站上报的基准速率表(printBenchmarks)。
而crack --backend-info(或--backend-info-level 1|2)则直接展示注册快照中的后端设备详情:级别 1 只显示设备摘要,级别 2 追加 Vendor、Vendor ID、Backend Device ID、Preferred Thread Size、Unified Memory、Local Memory、Cache Size、PCI Address 等细节,Metal/OpenCL 设备还有物理位置、Registry ID、平台信息等专属字段。代码注释明确说明这些信息来自"registration snapshots",即 crackstation 连接服务端时注册上报的快照,因此该查询不会唤醒空闲工作站执行 Hashcat。
缓存基准测试:crack benchmarks
crack benchmarks由BenchmarksCmd(crack-benchmarks.go)实现,调用Rpc.CrackstationBenchmarks()获取服务端持久化缓存的基准快照(CrackBenchmarkSnapshot),与实时查询不同,工作站离线也能查看历史基准。渲染时每个快照包含:
- 元数据:Name、Host UUID、Operator、Connection(Online/Offline)、Cache(Fresh/Stale)、当前 Hashcat 版本、基准时的 Hashcat 版本、基准 schema 版本、基准时间、缓存模式数;
- 速率表:默认只显示 6 个代表性模式(
representativeCrackBenchmarkModes,crack-benchmarks.go):MD5(0)、SHA1(100)、NTLM(1000)、SHA2-256(1400)、bcrypt(3200)、WPA-PBKDF2(22000);加--all显示全部缓存模式。
所有速率均通过humanizeHashRate以人类可读形式输出(如 12.50 GH/s)。基准快照表宽度被限制在 80 列、哈希类型列 48 列,保证窄终端可读性。
破解任务:从提交到生命周期管理
任务提交
当crack被分类为任务模式时(crack.go),客户端先通过resolveManagedCrackFileReferences把--markov-hcstat2、--rules-file、--restore-file、--potfile等文件标识解析为服务端管理的破解文件引用,然后调用Rpc.Crack()提交。若返回的Job为空,提示 "Crack request submitted";否则打印任务 ID 与初始状态。
任务列表与详情
crack jobs通过Rpc.CrackJobs()拉取全部持久化任务,按更新时间倒序渲染表格,列包括 ID、Status、Created、Updated、Keyspace、Tasks、Results(crack-jobs.go)。
crack job [id]查看单个任务,其详情渲染renderCrackJob(crack-jobs.go)包含四个区段:
- 摘要:ID、状态、创建/更新时间、keyspace、错误信息;
- 任务表:每个子任务的 ID、Kind、State、所在工作站(HostUUID)、分片范围(ShardSkip+ShardLimit)、进度、速率、最高温度、更新时间;
- Hashcat 统计表:Session、Status、Target、Guess(mode/base/mask-length/mod)、Progress、Rejected、Restore Point、Recovered Hashes/Salts、Started、Estimated Stop;
- 设备表:每个 GPU 设备的 ID、Name、Type、Speed、Temp、Util、Fan、Core/Memory 频率、Bus lanes、Power。
这些遥测数据来源于 Hashcat 输出的 JSON 状态:parseCrackStatusJSON(crack-jobs.go)解析任务携带的LatestStatusJSON/RawStatusJSON/StatusJSON字段,兼容多行 JSON 流(decodeLastJSONObject会从后往前尝试解析最后一个 JSON 对象)。所有速率按设备速度汇总后经humanizeHashRate输出;温度取设备最大温度。
--watch/-w模式下,watchCrackJob(crack-jobs.go)按--poll-interval(默认 1 秒)轮询,通过 protobuf 确定性序列化比较前后快照,仅在任务状态变化时重绘,直到任务进入终态(COMPLETED/FAILED/CANCELLED,见crackJobTerminal)或上下文取消。
任务生命周期操作
crack job cancel/pause/resume/rm共享同一套"拉取-校验-确认-变更-校验结果"模板(runCrackJobLifecycleCmd与applyCrackJobLifecycleAction,crack-jobs.go),每个操作有严格的资格检查:
| 操作 | 资格 | 预期状态 | 确认提示 |
|---|---|---|---|
cancel | 进行中或已暂停 | CANCELLED | "未完成的工作将被丢弃" |
pause | 进行中 | PAUSED | "恢复时可能从分片开头重新开始" |
resume | 已暂停 | IN_PROGRESS | — |
rm | 仅终态(完成/失败/取消) | — | 提示将删除 N 个 task 与 M 个 result |
服务端返回后还会校验UpdatedAt > 0、返回 ID 与请求一致、返回状态等于预期状态,防止竞态导致的状态漂移。任务选择支持位置参数直接传 ID;不传 ID 时通过forms.CrackJobSelectForm弹出交互式选择框,且只列出符合条件的任务(例如cancel只列出可取消任务)。
破解结果展示
任务渲染的最后一部分是 "Recovered Credentials" 表,包含 CredentialID、Hash、Plaintext。结果优先取任务级Results字段(服务端已物化的权威结果),为空时才回退解析各 task 的RecoveredJSON中的明文(parseRecoveredResults),并对(CredentialID, Hash, Plaintext)元组去重。非 UTF-8 或含空字节的明文以0x十六进制形式展示(displayCrackPlaintext)。
破解文件管理:词表、规则与 hcstat2
crack wordlists/crack rules/crack hcstat2三个子命令组管理服务端存储的三类破解资产(crack-files.go),底层全部走Rpc.CrackFilesList()并按CrackFileType_WORDLIST / RULES / MARKOV_HCSTAT2过滤。列表视图展示文件名与解压后大小,并附带磁盘配额统计:Disk quota xx.xx% - 已用 of 上限(二进制字节单位,如 GiB)。
上传:流式分块 + zstd 压缩
crack wordlists add <path>(同样适用于 rules/hcstat2)的流程值得重点关注(crack-files.go):
- 校验本地文件(必须为普通文件,拒绝目录);
- 未指定
--name时默认取文件名; - 调用
Rpc.CrackFileCreate()创建服务端文件预留(含 ID 与分块大小ChunkSize); - 进入
uploadCrackFile:读取本地文件,同时用io.TeeReader计算 SHA-256 摘要; chunkReader以 32MB 读缓冲把文件流式写入临时文件,用 zstd(SpeedBetterCompression级别)压缩,再按服务端给定的ChunkSize切成固定大小分块,逐块调用Rpc.CrackFileChunkUpload()上传,并打印上传进度;- 全部上传完成后调用
Rpc.CrackFileComplete()提交 SHA-256 摘要完成校验; - 失败自动清理:任一分块上传失败,defer 中会调用
Rpc.CrackFileDelete()删除服务端预留,避免残留半成品。
删除
crack wordlists rm <name>等删除命令先按类型列出文件、按名称匹配,命中后调用Rpc.CrackFileDelete()删除,未命中时报 "xxx not found"。
实时监视器:crack top
crack top是 crack 命令组的核心亮点之一,其实现位于 client/command/crack/top/ 子包,而 top.go 只是保持 API 兼容的薄壳(facade),把调用转发给cracktop.CrackTopCmd。该监视器是一个基于 Bubble Tea(charm.land/bubbletea/v2)+ Lip Gloss + Huh 的全屏 TUI 仪表盘。
数据加载与刷新策略
- 轻量快照加载器:
loadCrackTopSnapshot一次性拉取任务与工作站的最小快照,避免全量渲染开销; - 双通道刷新:既按
--poll-interval(默认 1 秒,最小强制 250ms,见crackTopMinimumInterval)定时轮询,也订阅服务端事件流(CreateEventListener)在事件到达后以不超过 500ms 的去抖延迟触发刷新(crackTopEventDebounce); - 版本号防抖:轮询与事件刷新都带 generation 计数,过期消息直接丢弃,配合
context取消避免重复拉取; - 动作回显:在 TUI 内执行 pause/resume/cancel/delete 后,先以 RPC 返回的权威状态覆盖本地视图(
jobStatusOverrides),等待后续快照确认后才撤销覆盖,且对"同一秒内两次状态变更"的等版本争议做了兼容处理(top/top.go)。
界面与操作
监视器支持 Jobs/Workers 双窗格布局,宽终端(≥104 列)左右分栏,窄终端上下分栏;终端过小(<64×18)会显示尺寸警告。键盘操作:
| 按键 | 功能 |
|---|---|
q/esc | 退出 |
tab/shift+tab | 在 Jobs 与 Workers 窗格间切换焦点 |
↑/k、↓/j、home/g、end/G | 移动选择 |
f | 打开状态过滤器(all/active/paused/completed/failed) |
d/delete | 删除选中的终态任务(需确认) |
p | 暂停进行中的任务(需确认) |
u | 恢复已暂停的任务 |
c | 取消进行中/已暂停的任务(需确认) |
r | 手动刷新 |
ctrl+c | 退出 |
每个动作都有资格预检(crackTopJobActionEligibilityWarning),如只有终态任务可删除、只有进行中任务可暂停;确认弹窗通过 Huh 表单实现。操作结果以 toast 提示展示(成功/失败,5 秒后消失),并记录到仪表盘日志(journal)。历史快照(history)用于绘制速率/进度趋势图表,测试覆盖见 top/top_test.go 与 top/loader_test.go。
共享展示层:internal/hashcatdisplay
client/command/crack/internal/hashcatdisplay/ 是命令处理器与监视器共享的展示辅助包,避免两者耦合。其中:
hashcatHashTypes是一张覆盖 300+ 个 Hashcat 模式的名称映射表(MD5、NTLM、bcrypt、WPA-PBKDF2、Kerberos、BitLocker、KeePass、VeraCrypt、Ethereum 钱包等),供TypeName(mode)查询;来源注释标明取自 client/credentials/EXAMPLES.md;HumanizeRate(rate)把每秒哈希数格式化为 H/s、kH/s、MH/s、GH/s、TH/s、PH/s。
该包让crack benchmarks、crack stations --show-benchmarks与crack top中哈希类型名称与速率的展示保持一致。
源码级验证与测试
围绕 crack 命令组,仓库提供了较完整的测试覆盖,可作为理解行为的参考:
- crack-benchmarks_test.go:基准快照渲染、代表性模式过滤与
--all行为; - crack-command_test.go:标志到
CrackCommand的映射与参数校验; - crack-job-lifecycle_test.go 与 crack-job-rm_test.go:pause/resume/cancel/rm 的资格校验、确认流程与结果校验;
- crack-files_test.go:分块上传、压缩与失败清理;
- helpers_test.go:任务 ID 补全的过滤逻辑;
- top/top_test.go、top/loader_test.go 等:TUI 状态机与快照合并。
服务端对应的 RPC 实现位于 server/rpc/rpc-crack.go(任务提交/查询/生命周期)与 server/rpc/rpc-crackstations.go(工作站注册与基准缓存),protobuf 定义在 protobuf/clientpb/client.proto 的CrackCommand、CrackJob、Crackstation、CrackBenchmarkSnapshot、CrackFile等消息中。
典型使用流程
一个完整的"上传资产 → 识别哈希 → 提交任务 → 监控 → 取结果"闭环如下:
# 1. 上传词表与规则(名称默认取文件名) crack wordlists add /path/to/rockyou.txt crack rules add /path/to/best64.rule # 2. 查看在线 crackstation 及其基准 crack stations --show-benchmarks # 3. 识别哈希类型(同步查询,不创建任务) crack --identify-mode 5f4dcc3b5aa765d61d8327deb882cf99 # 4. 提交破解任务(-m 指定哈希模式,-a 指定攻击模式) crack -m 0 -a 0 --hash 5f4dcc3b5aa765d61d8327deb882cf99 # 5. 查看任务列表与详情,或进入全屏监视器 crack jobs crack job <id> --watch crack top # 6. 生命周期管理 crack job pause <id> crack job resume <id> crack job cancel <id> crack job rm <id> # 仅终态任务 # 7. 清理不再需要的资产 crack wordlists rm rockyou.txt小结
Sliver 客户端的crack命令组把 Hashcat 的能力完整封装为"服务端调度 + 客户端操作"的分布式破解体系:stations/--backend-info负责集群可见性,benchmarks提供离线可查的基准缓存,jobs系列命令覆盖任务的查看与完整生命周期,wordlists/rules/hcstat2管理破解资产,crack top则以全屏 TUI 提供实时遥测与图表。理解这些命令背后的源码组织(命令树、调用分类、protobuf 映射、流式分块上传、事件驱动的 TUI 状态机),有助于在实战中精准调度 GPU 资源、定位任务瓶颈,并为二次开发或扩展自定义破解工作流提供可靠的代码级依据。
- 网络安全
【免费下载链接】sliver
Adversary Emulation Framework
相关推荐
如何3分钟上手B站视频下载神器:BilibiliDown全功能解析与实战指南 🚀
如何3分钟上手B站视频下载神器:BilibiliDown全功能解析与实战指南 🚀 BilibiliDown是一款面向技术爱好者和普通用户的跨平台B站视频下载工
网络安全Sliver 客户端 beacons 命令组全解析:Beacon 清单、prune/rm/watch 工作流与源码实现
Sliver 客户端 beacons 命令组全解析:Beacon 清单、prune/rm/watch 工作流与源码实现 client/command/beaco
网络安全百度网盘提取码一键获取:3分钟学会免费资源解锁技巧
百度网盘提取码一键获取:3分钟学会免费资源解锁技巧 还在为百度网盘分享链接的提取码而烦恼吗?每次找到心仪的学习资料、工作文件或娱乐资源,却卡在密码输入环节,那种
网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考