- 网络安全
【免费下载链接】Havoc
The Havoc Framework
导读:Havoc 是一个由 @C5pider 创建的现代可塑(malleable)后渗透 C2(Command and Control)框架,采用「Go 编写的 Teamserver + C++/Qt 编写的跨平台客户端 + C/ASM 编写的旗舰 Agent(Demon)」三段式架构。本文以 README.md 为主线,结合仓库源码与 C2 Profile 配置示例,完整讲解环境准备、双端构建、Teamserver 启动参数、C2 Profile 全量字段,以及 Demon 的睡眠混淆、间接系统调用、SMB 横向移动、External C2 扩展等核心能力,帮助你从零搭建并安全运维一套属于自己的多人在线后渗透作战环境。
一、Havoc 是什么:三大核心组件
Havoc 的定位不是"规避检测"的工具,而是一个高度可塑、高度模块化的后渗透 C2 框架——它把"让 Agent 适配目标环境、规避目标检测系统"的能力交给 Operator 自定义扩展。从 README.md 的 Feature 清单和仓库目录结构(client/、teamserver/、payloads/)可以清晰看到框架由三大部分组成:
| 组件 | 技术栈 | 职责 |
|---|---|---|
| Client | C++ + Qt(跨平台 UI) | Operator 的操作界面,提供会话管理、命令执行、图表展示、事件查看等功能 |
| Teamserver | Golang | 多人协作服务端,负责监听器、Payload 生成、C2 Profile 解析、事件广播与数据持久化 |
| Demon | C + ASM | Havoc 的旗舰 Agent(implant),内置丰富的后渗透命令与高级隐蔽技术 |
1.1 Client:基于 Dracula 暗色主题的跨平台 UI
Client 是跨平台 UI 层,官方描述为 "Cross-platform UI written in C++ and Qt",采用基于 Dracula 目录存放了全部 Qt Designer 界面文件(如Havoc.ui、DemonInteracted.ui、SessionTable.ui、EventViewer.ui等),说明会话列表、事件查看器、脚本管理等交互模块均以独立的.ui资源定义。
1.2 Teamserver:Go 编写的多人协作服务端
Teamserver 是框架的中枢,README 列出的能力包括:
- Multiplayer(多人协作,见 teamserver/pkg/db/ 与 teamserver/pkg/events/ 中的事件/聊天/会话同步机制)
- Payload generation:支持生成 exe / shellcode / dll 三种形态(见 teamserver/pkg/agent/ 与 payloads/ 目录下的
Demon、DllLdr、Shellcode三个子项目) - HTTP/HTTPS listeners(teamserver/pkg/handlers/http.go)
- Customizable C2 profiles(YAOtl/HCL 格式配置,见 teamserver/pkg/profile/)
- External C2(teamserver/pkg/handlers/external.go)
当前仓库版本信息可以在 teamserver/cmd/cmd.go 中直接确认:
VersionNumber = "0.7" VersionName = "Bites The Dust" DatabasePath = "data/teamserver.db"即当前版本为0.7 / CodeName "Bites The Dust",会话数据默认持久化到data/teamserver.db。
1.3 Demon:C + ASM 编写的旗舰 Agent
Demon 是 Havoc 的主力植入体,README 给出的特性清单包括:基于 Ekko、Ziliean 或 FOLIAGE 的睡眠混淆、x64 返回地址欺骗、Nt* API 间接系统调用、SMB 支持、Token 保险库、丰富的内置后渗透命令、基于硬件断点的 AMSI/ETW Patch、代理库加载、睡眠期间的栈复制等。对应源码位于 payloads/Demon/,其中src/core/下的 SleepObf.c、Syscalls.c、Token.c、TransportSmb.c 分别承载上述能力,后面章节会结合配置深入展开。
二、环境要求与准备
README 明确给出运行环境的推荐范围:
- 操作系统:Debian 10/11、Ubuntu 20.04/22.04、Kali Linux,建议使用尽可能新的版本以避免问题;
- Qt:需要较新版本的 Qt(避免编译报错);
- Python:需要Python 3.10.x以避免构建问题。
详细安装步骤见 WIKI.MD,其中包括各发行版的依赖安装命令与两个高频构建报错的处理方案:
fatal error: Python.h: No such file or directory:需要安装 Python 3.10 及其开发头文件(Ubuntu 可用deadsnakesPPA);incomplete type 'QTime' used in nested name specifier:说明 Qt 版本过旧,需升级到较新的 Qt6 dev 包。
以 Debian 系为例的依赖安装(源自 WIKI.MD 的 Pre-requisites 一节):
sudo apt install -y git build-essential apt-utils cmake libfontconfig1 libglu1-mesa-dev \ libgtest-dev libspdlog-dev libboost-all-dev libncurses5-dev libgdbm-dev libssl-dev \ libreadline-dev libffi-dev libsqlite3-dev libbz2-dev mesa-common-dev qtbase5-dev \ qtchooser qt5-qmake qtbase5-dev-tools libqt5websockets5 libqt5websockets5-dev \ qtdeclarative5-dev golang-go python3-dev libboost-all-dev mingw-w64 nasmUbuntu 20.04/22.04 还需启用 Python 3.10:
sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update sudo apt install python3.10 python3.10-dev三、构建:Client 与 Teamserver
仓库根目录的 makefile 提供了统一构建入口,核心目标如下:
# main build target. compiles the teamserver and client all: ts-build client-build ts-build: @ ./teamserver/Install.sh @ cd teamserver; GO111MODULE="on" go build -ldflags="-s -w -X cmd.VersionCommit=$(git rev-parse HEAD)" -o ../havoc main.go @ sudo setcap 'cap_net_bind_service=+ep' havoc # 允许普通用户绑定低端口 client-build: @ git submodule update --init --recursive @ mkdir client/Build; cd client/Build; cmake .. @ cmake --build client/Build -- -j 43.1 构建并运行客户端
# 在仓库根目录执行 make client-build # 启动客户端 ./havoc client构建过程会先同步 git submodule,再通过 CMake 编译client/Build。若你的环境存在多个 Qt 版本,在 macOS 上构建完成后通常需要brew unlink qt && brew link qt处理链接。
3.2 构建并运行 Teamserver
# 安装 Go 依赖(若 go build 提示缺失) go mod download golang.org/x/sys go mod download github.com/ugorji/go # 构建 teamserver 二进制 make ts-build # 启动 teamserver(以指定 profile 运行,-v 输出详细信息,--debug 开启调试) sudo ./havoc server --profile ./profiles/havoc.yaotl -v --debugmake ts-build会先执行 teamserver/Install.sh 完成交叉编译器等系统包安装,随后编译出根目录下的havoc可执行文件。所有与 Teamserver 交互产生的文件(会话数据库、Loot 等)默认存放于data/目录下;从 teamserver/cmd/server.go 可以看到每次启动还会在data/loot/<时间戳>下生成操作日志目录。
3.3 Docker 部署
仓库同时提供容器化方案,Teamserver-Dockerfile 用于构建服务端镜像,WIKI 中还给出了 Jenkins 流水线构建 Client 镜像的示例:
sudo docker build -t havoc-client -f Client-Dockerfile .四、Teamserver 启动参数详解
Teamserver 的命令行参数在 teamserver/cmd/cmd.go 中定义,完整列表如下:
| 参数 | 简写 | 默认值 | 说明 |
|---|---|---|---|
--profile | 无 | 空 | 指定 Havoc Teamserver 的 C2 Profile 文件路径 |
--default | -d | false | 使用默认 Profile(data/havoc.yaotl),会覆盖--profile |
--debug | 无 | false | 开启调试模式 |
--debug-dev | 无 | false | 开发者调试模式(以 debug 宏重新编译 Agent) |
--send-logs | 无 | false | Agent 通过 HTTP(S) 向 Teamserver 回传日志 |
--verbose | -v | false | 显示详细消息 |
启动流程(见 teamserver/cmd/server.go)大致为:创建 Teamserver 实例 → 初始化data/loot日志目录 → 输出版本与启动时间 → 加载 Profile(默认或指定路径)→ 校验系统依赖包(FindSystemPackages,缺失会提示 "Please install needed packages")→Server.Start()正式拉起服务。
命令行中如不提供任何参数(./havoc或./havoc server),程序会直接打印帮助信息并退出。
五、C2 Profile 全量配置解析(核心)
Havoc 使用YAOtl(一种基于 HCL 的配置语法)编写 C2 Profile,仓库内置了三个可直接使用的示例:
- profiles/havoc.yaotl —— 仅含 Teamserver/Operators/Service/Demon 的最小基础配置;
- profiles/http_smb.yaotl —— 包含 HTTP 监听器与 SMB 监听器的完整仿冒配置(模拟 Microsoft Teams 流量);
- profiles/webhook_example.yaotl —— WebHook 通知配置示例。
Profile 的结构定义位于 teamserver/pkg/profile/config.go,顶层共 6 个 Block:
type HavocConfig struct { Server *ServerProfile `yaotl:"Teamserver,block"` Operators *OperatorsBlock `yaotl:"Operators,block"` Listener *Listeners `yaotl:"Listeners,block"` Demon *Demon `yaotl:"Demon,block"` Service *ServiceConfig `yaotl:"Service,block"` WebHook *WebHookConfig `yaotl:"WebHook,block"` }5.1 Teamserver 块:服务端地址与交叉编译工具链
Teamserver { Host = "0.0.0.0" Port = 40056 Build { Compiler64 = "/usr/bin/x86_64-w64-mingw32-gcc" # 64 位 Windows 交叉编译器 Compiler86 = "/usr/bin/i686-w64-mingw32-gcc" # 32 位 Windows 交叉编译器 Nasm = "/usr/bin/nasm" # NASM 汇编器(编译 Agent 汇编代码) } }Host/Port:Teamserver 的监听地址与端口(默认0.0.0.0:40056,供 Client 与 Agent 回连);Build块:Payload 生成所需的 MinGW 交叉编译器与 NASM 路径。默认 Profile(data/havoc.yaotl)中使用的是data/x86_64-w64-mingw32-cross/bin/...的本地工具链路径,说明不同安装方式下路径会不同,需按实际环境调整。
5.2 Operators 块:操作员账号(多人协作)
Operators { user "5pider" { Password = "password1234" } user "Neo" { Password = "password1234" } }每个user块的label(双引号内的名称)即用户名(对应源码中Name string \yaotl:"Name,label"`),块内Password字段为登录密码。Operators块定义了哪些 Operator 可以连接 Teamserver 进行多人协同作战,Profile 解析时通过ListOfUsernames()([profile.go](https://link.gitcode.com/i/05c9f796f5ed5a6e395fc97e69884183))提取全部用户名用于鉴权。示例密码password1234` 仅为演示,实际部署务必更换强密码。
5.3 Listeners 块:监听器配置(HTTP / SMB)
Listeners块支持三类监听器(源码见 config.go):Http、Smb、External。
HTTP/HTTPS 监听器全字段
以 http_smb.yaotl 中的完整示例为准:
Listeners { Http { Name = "teams profile - http" Hosts = [ "5pider.net" ] # 回调域名(Agent 连接用) HostBind = "0.0.0.0" # 监听器绑定地址 HostRotation = "round-robin" # 多 Host 轮换策略 PortBind = 443 # 服务端绑定端口 PortConn = 443 # Agent 连接端口 Secure = false # 是否启用 HTTPS(生产环境务必开启!) KillDate = "2024-01-02 12:00:00" # 到期时间,格式 2006-01-02 15:04:05 UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" Uris = [ "/Collector/2.0/settings/" ] # 回调 URI 路径 Headers = [ # 请求头(仿冒合法请求) "Accept: json", "Referer: https://teams.microsoft.com/_", "x-ms-session-id: f73c3186-057a-d996-3b63-b6e5de6ef20c", "x-ms-client-type: desktop", "x-mx-client-version: 27/1.0.0.2021020410", "Accept-Encoding: gzip, deflate, br", "Origin: https://teams.microsoft.com" ] Response { # 服务端响应头(仿冒目标服务) Headers = [ "Content-Type: application/json; charset=utf-8", "Server: Microsoft-HTTPAPI/2.0", "X-Content-Type-Options: nosniff", "x-ms-environment: North Europe-prod-3,_cnsVMSS-6_26", "x-ms-latency: 40018.2038", "Access-Control-Allow-Origin: https://teams.microsoft.com", "Access-Control-Allow-Credentials: true", "Connection: keep-alive" ] } } ... }对照 config.go 的结构体,各字段含义与约束如下:
| 字段 | 是否必填 | 说明 |
|---|---|---|
Name | 必填 | 监听器名称(Teamserver 端唯一,重名会报 "listener already exists") |
Hosts | 必填 | 回调域名列表,可配置多个,配合HostRotation轮换 |
HostBind/HostRotation | 必填 | 绑定地址 / 多域名轮换策略 |
PortBind/PortConn | 必填/可选 | 服务端绑定端口 / Agent 实际连接端口 |
Secure | 可选 | 是否启用 HTTPS(示例注释明确警告:生产环境一定要开启) |
KillDate | 可选 | 会话到期时间,格式2006-01-02 15:04:05 |
WorkingHours | 可选 | 工作时间窗口,格式如8:00-17:00 |
Method/UserAgent | 可选 | 请求方法 / 请求 UA 伪装 |
Headers/Uris | 可选 | 请求头集合 / 回调 URI 集合 |
Cert | 可选 | HTTPS 证书:Cert+Key两个子字段 |
Response | 可选 | 服务端响应头集合(Headers子字段) |
Proxy | 可选 | 上游代理:Host、Port、Username、Password |
实战提示:
http_smb.yaotl示例整体模仿 Microsoft Teams 的流量特征(UA、x-ms-*头、响应头均取自真实 Teams 服务),这正是 README 所述"malleable(可塑)"能力的体现——通过 Profile 让 C2 流量在网络上呈现为合法业务流量。
SMB 监听器(横向移动 / 内网 pivot)
Smb { Name = "Pivot - Smb" PipeName = "demon_pipe" # 命名管道名称 }SMB 监听器用于内网环境下的 Pivot 通信,对应源码 teamserver/pkg/handlers/smb.go 与 ListenerStart 中的LISTENER_PIVOT_SMB分支。它同样支持可选的KillDate与WorkingHours字段。
External 监听器
External { Name = "..." Endpoint = "..." # 外部 C2 端点 }External 监听器通过 external.go 实现,接收外部 C2 客户端(如自定义转发器)发来的流量,是构建"边界隔离 / 域前置"等复杂通信链路的入口,详见下文"可扩展性"。
5.4 Demon 块:Agent 行为配置
Demon块控制 Agent 的运行时行为(config.go):
Demon { Sleep = 2 # 心跳间隔(秒) Jitter = 20 # 心跳抖动百分比(%) TrustXForwardedFor = false # 是否信任 X-Forwarded-For 头 Injection { Spawn64 = "C:\\Windows\\System32\\Werfault.exe" # 64 位注入进程 Spawn32 = "C:\\Windows\\SysWOW64\\Werfault.exe" # 32 位注入进程 } }完整字段表(含可选高级项):
| 字段 | 类型 | 说明 |
|---|---|---|
Sleep/Jitter | int | 心跳间隔(秒)与抖动百分比,对抗流量分析 |
IndirectSyscall | bool | 是否启用间接系统调用(Nt* API) |
StackDuplication | bool | 睡眠期间是否进行栈复制 |
SleepTechnique | string | 睡眠混淆技术(如 Ekko) |
ProxyLoading | string | 代理库加载模式 |
AmsiEtwPatching | string | AMSI/ETW Patch 模式(基于硬件断点) |
ProcessInjection | block | Spawn64/Spawn32注入目标进程路径 |
DotNetNamePipe | string | .NET 执行使用的命名管道 |
Binary | block | 可执行文件伪装:Header(MagicMz-x64/x86、CompileTime、ImageSize-x64/x86)、ReplaceStrings-x64/x86(字符串替换) |
TrustXForwardedFor | bool | 是否信任 XFF 头以获取真实 IP |
其中Binary块是实现二进制文件形态伪装的关键:可改写 PE 的 Magic 字节、编译时间戳、镜像大小,并对特征字符串进行替换,从文件层面规避静态检测。
5.5 Service 块与 WebHook 块
# 可选配置:不使用可整体删除 Service { Endpoint = "service-endpoint" Password = "service-password" } WebHook { Discord { Url = "https://discord.com/api/webhooks/..." # Discord Webhook URL AvatarUrl = "..." # 可选:头像地址 User = "Havoc" # 可选:展示用户名 } }Service块用于启用服务端 Agent(service agent)接口;WebHook.Discord用于将告警/事件推送到 Discord(实现见 teamserver/pkg/webhook/discord.go)。两者均为可选。
六、监听器生命周期:从 Profile 到上线
监听器启动入口位于 teamserver/cmd/server/listener.go:
- 遍历
t.Listeners,若已有同名监听器则报错listener already exists; - 按类型分发:
LISTENER_HTTP→handlers.NewConfigHttp();LISTENER_PIVOT_SMB→handlers.NewPivotSmb();LISTENER_EXTERNAL→handlers.NewExternal(...); - 注入 Teamserver 引用后调用
Start()拉起服务。
Agent 上线后的数据流:请求进入后由 handlers.go 的 parseAgentRequest 解析包头并路由到handleDemonAgent/handleServiceAgent,随后按会话的 AES 密钥进行解密(Parser.DecryptBuffer)与任务下发。SMB Pivot 场景下(handlers.go),Teamserver 会依据DEMON_PIVOT_SMB_COMMAND找到父会话PivotInstance,通过父 Agent 中转子 Agent 的加密流量——这就是内网横向扩展的底层机制。
七、Demon 旗舰 Agent 特性深挖
README 列出的 Demon 特性均可与 payloads/Demon/ 源码一一对应:
| README 特性 | 对应源码 | 说明 |
|---|---|---|
| Sleep Obfuscation(Ekko / Ziliean / FOLIAGE) | Obf.c、SleepObf.h | 心跳间隔期间加密内存中的敏感数据,规避内存扫描 |
| Stack duplication during sleep | 同上(SleepObf 体系) | 睡眠时复制栈,抹去调用痕迹 |
| Indirect Syscalls for Nt* APIs | Syscalls.c、Syscalls.h | 间接系统调用绕过用户态 Hook |
| x64 return address spoofing | Spoof.x64.asm、Spoof.c | 伪造返回地址,干扰栈回溯分析 |
| Patching AMSI/ETW via Hardware breakpoints | HwBpEngine.c | 用硬件断点方式 patch,避免常规内存 patch 特征 |
| SMB support | TransportSmb.c、Pivot.c | SMB 命名管道传输与 Pivot |
| Token vault | Token.c | 令牌管理(窃取/恢复/提权) |
| Proxy library loading | Memory.c 等 | 内存加载库避免落盘 |
| 丰富的内置后渗透命令 | Commands.c | 详见客户端会话控制台帮助(见上文第三张截图) |
设计注意(README "Note" 一节):Havoc 官方明确说明不接受任何与"检测规避"相关的 Issue。框架本身不以隐蔽性为首要目标,而是把可塑性(malleable)与模块化(modular)作为设计核心——让 Operator 有能力自行添加自定义特性或模块,去适配各自目标的检测环境。
八、可扩展性:External C2、自定义 Agent、Python API 与 Modules
README 的 "Extensibility" 一节给出了四条扩展路径:
External C2:通过 External 监听器对接外部 C2 通信链路,适合需要把流量转发、中继或隐藏在第三方通道(如合法云服务)中的场景。核心实现见 external.go,其
Request方法接收外部客户端 POST 的加密请求并交给parseAgentRequest处理。自定义 Agent 支持(Custom Agent Support):框架并非只能使用 Demon。官方维护的 Talon 即为一个示例自定义 Agent(从 teamserver/pkg/agent/ 的包设计可看出,Agent 侧以
agent.Agent抽象与 Teamserver 交互,支持接入新 Agent 类型)。Python API:官方提供独立仓库 havoc-py(含
HavocUi、PyAgentClass、PyDemonClass、PyWidgetClass等模块)与 ScriptManager.ui,Client 内建脚本管理器,对应源码 PythonScript.cc。Modules:官方 Modules 仓库提供可插拔模块,
make client-build时若检测到本地client/Modules目录不存在会自动 clone 到 client/Modules,随后在 CMake 构建中编译进 Client。
九、典型部署流程速览
综合以上内容,一次完整的部署与使用流程如下:
# 1. 安装系统依赖(见 WIKI.MD 各发行版命令) # 2. 构建客户端与服务端 make client-build make ts-build # 3. 按需编辑 C2 Profile(仿冒流量、账号、监听器等) vim profiles/http_smb.yaotl # 4. 启动 Teamserver(使用自定义 Profile) sudo ./havoc server --profile ./profiles/http_smb.yaotl -v --debug # 5. 启动 Client 并连接 Teamserver ./havoc client登录后即可在 Client 中创建 HTTP/SMB/External 监听器、生成 Demon Payload(exe/shellcode/dll)、下发会话命令,并借助多 Operator 账号实现多人协同。
十、常见问题与注意事项
- 不要提交检测类 Issue:README 明确声明不处理任何 detection 相关报告,这是框架定位决定的;
Couldn't compile implant: exit status 1:多为交叉编译器或 NASM 路径配置错误,请核对 Profile 中Build块的Compiler64/Compiler86/Nasm是否指向真实存在的工具链(Install.sh 会安装标准路径工具,自定义目录需手动对齐);- HTTPS 务必开启:
http_smb.yaotl示例中Secure = false仅为便于观察明文流量,Profile 注释已明确警示生产环境必须启用Secure = true并配置Cert/Key; - 默认数据目录:所有会话数据库、操作日志、生成的 Payload 均写入
data/目录,注意权限与备份。
结语
Havoc 以「可塑 + 模块化」为核心设计哲学,通过 Go Teamserver、C++/Qt Client、C/ASM Demon 的三层架构,配合 YAOtl 格式的 C2 Profile 与 External C2、Python API、Modules 等扩展机制,构建了一套可深度定制的后渗透作战体系。本文基于 README.md 与仓库源码,从环境准备、构建运行、Profile 全字段到 Agent 高级特性给出了完整的技术路径,更多细节(版本历史、命令参考、Custom Agent 接入等)可继续查阅 WIKI.MD 与 RELEASE.md 获取。
- 网络安全
【免费下载链接】Havoc
The Havoc Framework
相关推荐
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考