本期作者/牛杰
介绍
Havoc是一个开源渗透框架,其客户端用 C++ 和 Qt 编写的跨平台 UI,Teamserver用 Golang 编写,支持团队合作,HTTPHTTPS监听器,可定制化C2profile,Havoc可以作为CobaltStrike的代替方案。
安装
Havoc 源代码可在 github 上clone
git clone https://github.com/HavocFramework/Havoc.git
下载后进入Havoc目录
cd Havoc
安装依赖项
注:代码构建时请使用最新版本的QT和python3.10。
本篇使用kali构建项目,构建前请查看kali版本,如果使用其他环境构建,需要根据实际环境做对应的修改
cat /etc/os-release
如果你的kali版本为2021.2,其自带的python是3.9,需要升级之后安装依赖库
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 qtbase5-dev libqt5websockets5-dev python3-dev libboost-all-dev mingw-w64 nasm
安装go依赖项
Havoc的teamserver需要golang 1.18才能编译和运行
cd teamserver
go mod download golang.org/x/sys
go mod download github.com/ugorji/go
编译Teamserver
cd ..
make ts-build
启动Teamserver
./havoc server --profile ./profiles/havoc.yaotl -v
-v 参数 在打印日志签名加时间戳
启动默认端口为40056,默认账号为5pider,密码password1234,这些配置信息可以通过profiles目录下的xxx.yaotl更改,将在后文中介绍。启动项可以添加--debug参数,查看debug信息
编译客户端
如果编译环境内存2G可能会卡死,建议内存4G以上
make client-build
启动客户端
./havoc client
登录后
profiles
profiles文件夹有三个默认yaotl文件,yaotl包含 teamserver 运行所需的配置信息,yaotl 是流行配置语言 HCL 的一个分支。
Teamserver配置
Teamserver {
Host = "0.0.0.0"
Port = 40056
Build {
Compiler64 = "data/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-gcc"
Compiler86 = "data/i686-w64-mingw32-cross/bin/i686-w64-mingw32-gcc"
Nasm = "/usr/bin/nasm"
}
}
Host 绑定指定的地址
Port 绑定指定的端口
Build 指定用于编译 C 和汇编文件的编译器,默认配置在data目录下,可以根据自己环境进行替换。
Operators配置
Operators {
user "5pider" {
Password = "password1234"
}
user "Neo" {
Password = "password1234"
}
}
配置客户端连接到Server的用户,默认用户可以在这里更改
Listeners
在启动时添加监听器,Havoc在client端可以通过可视化工具对监听器进行配置。
http_smb.yaotl文件Listener
Listeners {
Http {
Name = "teams profile - http"
Hosts = [
"5pider.net", # our callback host.
]
HostBind = "0.0.0.0" # the address where the listener should bind to.
HostRotation = "round-robin"
PortBind = 443
PortConn = 443
Secure = false # for now disabled so we can see the traffic content. (but alaways enabled this!!!)
KillDate = "2024-01-02 12:00:00"
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/"
]
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"
]
}
}
Smb {
Name = "Pivot - Smb"
PipeName = "demon_pipe"
}
使用http_smb.yaotl启动服务端,客户端看到的可视化界面
teams profile - http
Smb
Demon
Havoc的agent被称为Demon,类似于CobaltStrike的Beacon,源码文件在payloadsDemon下。通过可视化界面Attacks生成Payload,也提供了丰富的预设编译选项。
睡眠混淆
Havoc默认睡眠技术WaitForSingleObjectEx,不执行任何类型睡眠加密。睡眠混淆技术是恶意载荷为达到间歇性执行、隐藏自身活动以逃避内存扫描的目的所采用的隐匿策略,在对抗沙箱中能起到保护自身恶意行为的作用,Havoc原生生成器提供了三种睡眠混淆技术。
-
Ekko,该方案利用线程池API创建计时器,在回调中调用内存权限修改、内存加解密于延迟执行的功能代码。该技术在商业渗透框架Nighthawk上同样被应用。
-
Foliage选项,该技术通过建一个新线程并使用 NtApcQueueThread 对 ROP 链, ROP 链会加密内存并延迟执行。睡眠混淆根据实际需求自行选择。
-
Zilean 在Havoc0.6版本新添加的睡眠混淆技术,使用RtlRegisterWait。
sleep调用堆栈欺骗
安全人员分析恶意程序时,会验证恶意程序的返回地址是否为已加载模块地址,通过rax或者rbx直接跳转敏感函数(VirtualProtect、加密,内存拷贝等)而不是获取地址再调用的方式。
宏定义
代码实现
代理DLL加载
您通过VirtualAlloc或相对NTAPI NtAllocateVirtualMemory分配一些内存,然后复制shellcode并执行它,这些shellcode有自己的依赖项,需要调用LoadLibrary加载DLL。如果你执行LoadLibrary来加载DLL,这意味着在用户模式下或通过内核回调/ETW 挂钩的任何 EDR 都可以检查上次返回地址区域或调用来自何处,然后杀死您的有效负载。因此,Havoc提供了三种ntdll中未记录的API(RtlRegisterWait、RtlCreateTimer、RtlQueueWorkItem)来加载DLL。
测试上线
通过payload生成的Demon上线
原文始发于微信公众号(蛇矛实验室):开源渗透框架Havoc
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论