freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

HardHatC2技术剖析
2023-10-17 10:46:33

0x00 摘要

红队作战时,远控平台是不可或缺的一个工具,随着各大安全厂商对Cobal Strike等C2的检测查杀趋于完善和严格,不少攻击者们把目标转向了新兴C2以逃避检测。本文将介绍一款命令与控制框架Hardhat。该项目与Covenant相似,基于.NET开发,旨在协助红队作战和渗透测试。

0x01架构

HardHat包含三个主要组件:ASP.NET Core团队服务器、Blazor .NET 客户端和基于 C# 的Engineer。因为HardHat整体由.Net Core开发,所以支持跨平台。

项目架构如下图所示。

Manager是监听器,对应Cobal Strike的listner,支持HTTP、HTTPS、tcp、smb通信,不支持DNS

Engineer是植入物,对应Cobal Strike中的beacon,支持植入方式有shellcode、powershell、exe、dll、serviceExe,但所有的植入物都是无阶段的。

Teamserver采用ASP.NET Core + WebAPI的模式开发。Teamserver主要负责用户、Enginneer、Manager的管理,例如用户与角色的创建修改、Manager的创建删除等,这些都涉及到了数据库交互,HardhatC2默认使用Sqlite轻量数据库,直接访问Teamserver端默认会定向到Swagger界面。

Client采用ASP.NET Core Blazor Server模式开发,通过signaIR或webAPI与Teamserver进行实时通信(如指令下发和engineer生成),除了负责处理与Teamserver的通信,还负责Manager、Engineer和一些辅助功能的可视化。

框架本身在认证方面使用JWT进行认证,JWT的生成Key默认会放在appsetting.json中。在授权方面使用RBAC进行鉴权,HardhatC2默认有10个不同权限的角色组。

0x02 Engineer分析

特点:

  • 采用Roslyn .NET 编译器动态编译,利用模板参数替换掉Engineer项目中的Program.cs中的预定义参数(如C2 profile、监听器地址和端口等)。然后使用 ilrepacking 将任何所需的 DLL 合并到默认的程序集中,以创建最终的植入文件,最后生成命名形式为Enginner_xxxx.exe的文件。
  • 众所周知,Cobal Strike大量使用了反射注入dll,而在HardHat里,相对应的是所有指令动态加载,涉及到WinAPI调用使用D-Invoke,免杀效果较好。
  • 线程注入技术支持简单线程注入、MapViewAPCResumeThread(Early Bird技术)、MapViewCreateThread三种。
  • 使用ConfuseEx混淆代码
  • 指令主要靠调用C#语言层面的API和系统API实现大部分的功能。
  • 支持Bof执行,相关代码位置在Engineer\Modules\BofExecution.cs

缺点:

  • 生成的程序集太大,280k,包含全部命令需要500多k
  • 所有的植入物只有stageless
  • HardHat的C2 profile只包含了一些基础流量特征,如下图所示。其他常见的C2配置文件选项,例如睡眠、jitter、kill时间、窃取令牌掩码、注入技术等,被设置了指令。

  • 支持beacon类型太少,其他方式像钓鱼攻击、web delivery、office宏不支持。

0x03 HTTP通信流程浅析

下面是Engineer、Client、Teamserver间通信流程。

用户在client端输入指令,点击Send,触发Interact页面MudButton组件中的SendTask函数,该函数会使用RestClient封装Http请求,向TeamserverIP/engineer/{engineer.Id}发起Post请求,该url匹配Temserver的Engineer控制器中的TaskEngineer方法。

该方法会调用HardHub类方法,HardHub会通过rpc的方式调用client端同名方法进行client的界面通知和设置,然后向localhost:5000/{engineer.id}/tasks/taskID发起请求,匹配到GetTaskResult方法,获取到Engineer端命令执行的结果。

下面是Engineer端的处理流程,beacon端将teamserver返回结果第一次aes解密,反序列化解密字符串为List<C2TaskMessage>,结构如下

如果PathMessage数量=1,则用硬编码密钥再次AES解密TaskData数据,接着反序列化为List<EngineerTask>,但不是直接执行,而是加入HttpEmm类的Inbound属性,这是个待执行任务并发队列

任务的执行位于Tasking类的DealWithTasks(List<EngineerTask>),该方法首先会将CancellationTokenSource和taskID绑定存到字典中,这是为了执行CancelTask命令。然后判断任务是否阻塞,无阻塞,则直接异步执行;阻塞则同步执行。

Engineer端会根据sleep时间定期向teamserver发起请求。如果是https类型的Manager,请求发起是由EngHttpComm.Checkin方法完成的。

0x04 其他分析

免杀

先来看一下免杀情况。VirusTotal查杀结果如下,可以看到,像CrowdStrike、Google等厂商已经把该项目标记了,但国内厂商还没有标记。

沙箱检测指出,Engineer匹配到了ATT&CK矩阵中的执行、防御规避、发现、收集四个战术中的一些技术。

360核晶无检测,上线成功

执行常规cmd命令不会拦截

如果执行敏感操作,360还是会拦截的。

defender无检测,上线成功

指令

与Cobal Strike相比,HardHat没有cs灵活强大的C2 Profile,但是HardHat将C2 Profile的功能拆成了一个个的指令,可以在动态编译Engineer时选择是否添加。不少指令采用了新技术实现。HardHat包含了Cobal Strike的大部分指令,实现方式也大致相同,例如getsystem、stealtoken、sleep、spawn、文件操作等指令。除此之外,还有一些比较有特点的指令,主要涉及PE和.Net Assembly的执行,这些指令对于权限维持和提升带来非常大的便利。所有的指令代码位置在Engineer\Commands目录下

cancelTask:

该指令可以取消正在执行的任务。由于beacon端使用基于Task的异步编程,再加上每次执行指令前会把TaskID存到一个字典中,因此只需调用对应TaskID的CancellationTokenSource.Cancel() 方法就可以取消任务线程的执行。

Remote-Exec:

该指令用于横向移动,有五种形式可以利用,分别是psexec、wmic、wmic-powershell、winrm、dcom。五种利用方式都是自实现。

LoadAssembly指令:

该指令会手动装载PE文件,然后执行名为Main的导出函数。这里既可以运行非托管程序,也可以运行.Net程序集,但要设置程序集的导出信息。详细内容可参照参考链接3。

execute-PE:

该指令借鉴了RunPE项目,可以在不创建新进程的情况下,手动将非托管程序映射到内存中,经过修复导入表、重定位表、设置内存页权限后,执行入口点,实现了PE loader

ExecuteAssembly:

该指令主要通过shellcode注入执行PE文件,方式如下:创建子进程notepad.exe,然后注入shellcode形式的程序集。

InlineAssembly:

该指令主要用于在Engineer进程内加载程序集并运行,通过Assembly.load加载,支持在新建Appdomain和默认Appdomain内加载。

InlineDll:

该指令会手动装载Dll,然后调用指定的导出函数。

LdapSearch:

域内常用的ldap搜索实现

Patch AMSI与Patch ETW:

InlineHook修复AMSI和ETW

0X05 检测防御

针对此工具的检测,本文作抛砖引玉。首先该工具的Teamserver端和Client具有web页面,则可以针对页面指纹或者端口提取特征;其次,可以考虑从Teamserver和Client默认的X.509证书入手,另外,默认的C2Profile具有很明显的请求头与响应头特征;最后,从代码角度,请求特有路由判断是否能够击中目标。

0x6 总结

本文从代码和实用性两方面,介绍和分析了基于.Net开发的HardHatC2,并从几个角度简要介绍了如何检测防御。在实用性方面,客户端web页面用户交互操作性较差,有待改进。但HardHatC2的指令非常丰富和强大,很适合在目标上线后进行后渗透操作,几乎每一个都可以单独提取为工具,可结合个人实际需要,有所修改,以增强防御规避能力和提高交互体验。

参考链接

https://github.com/DragoQCC/HardHatC2

https://github.com/nettitude/RunPE

https://blog.xpnsec.com/rundll32-your-dotnet/

# 远控 # C2
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录