当前位置:首页 > 科技  > 软件

Havoc远控源码剖析(协议篇)

来源: 责编: 时间:2023-09-28 10:09:09 477观看
导读近期阅读了一款开源远控Havoc的源码,留下了一些笔记,干脆发出来一起学习一下,这个远控据说使用了很多高端免杀技术,比如Ekko,Ziliean,FOLIAGE睡眠混淆,返回地址欺骗,Indirect SysCall,Etw Patch,堆加密等等。前言FullSessionG

近期阅读了一款开源远控Havoc的源码,留下了一些笔记,干脆发出来一起学习一下,这个远控据说使用了很多高端免杀技术,比如Ekko,Ziliean,FOLIAGE睡眠混淆,返回地址欺骗,Indirect SysCall,Etw Patch,堆加密等等。cH428资讯网——每日最新资讯28at.com

前言

Pasted image 20230906161038.pngcH428资讯网——每日最新资讯28at.com

话不多说,直接进入主题,远控提供了HTTP(S)、SMB的Agent,SMB是内网中继直连用的,直接来看HTTP(S)方面的代码。。cH428资讯网——每日最新资讯28at.com

握手前校验

首先只有POST请求会被处理,其他请求都是直接跳fake404页面。cH428资讯网——每日最新资讯28at.com

h.GinEngine.POST("/*endpoint", h.request)h.GinEngine.GET("/*endpoint", h.fake404)

request里首先是对请求的header头进行判断,不符合直接跳fake404。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906160945.pngcH428资讯网——每日最新资讯28at.com

具体的Header头定义在havoc.yaotl中。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906160453.pngcH428资讯网——每日最新资讯28at.com

然后是检查url、ua,同样是不符合跳fake404,默认配置的url是这样子的。cH428资讯网——每日最新资讯28at.com

Uris = [    "/funny_cat.gif",    "/index.php",    "/test.txt",    "/helloworld.js"]

Pasted image 20230906161244.pngcH428资讯网——每日最新资讯28at.com

数据包的处理

经过一连串的判断后,来到parseAgentRequest函数,开始对Body内容进行判断。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906161529.pngcH428资讯网——每日最新资讯28at.com

在ParseHeader中,最终是返回Header结构。cH428资讯网——每日最新资讯28at.com

type Header struct {	Size       int	MagicValue int	AgentID    int	Data       *parser.Parser}

Pasted image 20230906162130.pngcH428资讯网——每日最新资讯28at.com

NewParser时,试图将body内容赋值给Parser结构的buffer中,至于bigEndian默认是true。cH428资讯网——每日最新资讯28at.com

type Parser struct {	buffer    []byte	bigEndian bool}

这里似乎将数据包分为了三种情况:cH428资讯网——每日最新资讯28at.com

p.Length()小于4的情况下,直接丢弃该包,返回空的Response;cH428资讯网——每日最新资讯28at.com

p.Length()等于4的情况下,直接将所有data复制到Header.Data中;cH428资讯网——每日最新资讯28at.com

p.Length()大于4的情况下,将从末尾分别切出Size、MagicValue、AgentID,各为4个字节;cH428资讯网——每日最新资讯28at.com

所以一个正常数据包的结构大致应该如下所示。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906172119.pngcH428资讯网——每日最新资讯28at.com

然后如果切出的MagicValue等于DEMON_MAGIC_VALUE,也就是0xDEADBEEF。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906170312.pngcH428资讯网——每日最新资讯28at.com

意味着是普通Deomon,否则是第三方Agent...等会,它是不是忘了什么?加解密呢?这不是白给么,建议做blueteam的小伙伴加一下流量规则。cH428资讯网——每日最新资讯28at.com

Agent注册

继续跟进到DemonAgent,进来直接查AgentID;cH428资讯网——每日最新资讯28at.com

if Teamserver.AgentExist(Header.AgentID){	...}else{	...}

函数内容是迭代Teamserver中所有的Agent,true的话就是已经存在,先看false情况,也就是注册的功能。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906171621.pngcH428资讯网——每日最新资讯28at.com

再次切掉一个CommandID,如果CommandID等于agent.DEMON_INIT也就是99,就意味着是注册包,然后切掉RequestID丢掉,进入注册流程。cH428资讯网——每日最新资讯28at.com

Agent = agent.ParseDemonRegisterRequest(Header.AgentID, Header.Data, ExternalIP)if Agent == nil {    return Response, false}go Agent.BackgroundUpdateLastCallbackUI(Teamserver)

接着从末尾切出AESKey和AESIv,并调用Parser.DecryptBuffer对Parser.buffer进行解密,解密完的结果放回buffer里。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906204004.pngcH428资讯网——每日最新资讯28at.com

所以数据包具体应该是这样的。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906204313.pngcH428资讯网——每日最新资讯28at.com

至于解密出来的buffer,据官方说法如下。cH428资讯网——每日最新资讯28at.com

[ Agent ID     ] 4 bytes <-- this is needed to check if we successfully decrypted the data			[ Host Name    ] size + bytes			[ User Name    ] size + bytes			[ Domain       ] size + bytes			[ IP Address   ] 16 bytes?			[ Process Name ] size + bytes			[ Process ID   ] 4 bytes			[ Parent  PID  ] 4 bytes			[ Process Arch ] 4 bytes			[ Elevated     ] 4 bytes			[ Base Address ] 8 bytes			[ OS Info      ] ( 5 * 4 ) bytes			[ OS Arch      ] 4 bytes			..... more

如果注册成功,将返回这个Agent的AgentID。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906205319.pngcH428资讯网——每日最新资讯28at.com

心跳包

回到AgentExist,如果已经注册,进入心跳包流程。cH428资讯网——每日最新资讯28at.com

/* get our agent instance based on the agent id */Agent = Teamserver.AgentInstance(Header.AgentID)Agent.UpdateLastCallback(Teamserver)

先根据ID查出对象,更新心跳时间,同样切出Command和RequestID。cH428资讯网——每日最新资讯28at.com

Command = uint32(Header.Data.ParseInt32())RequestID = uint32(Header.Data.ParseInt32())

这里有点小混乱,划分了第一次post的包和重连的包,如果是第一次提交,先进行解密(小声叨叨:那重连的包不用解密了?)cH428资讯网——每日最新资讯28at.com

Pasted image 20230906210103.pngcH428资讯网——每日最新资讯28at.com

然后判断命令,是任务回显还是GET_JOB。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906210153.pngcH428资讯网——每日最新资讯28at.com

如果是GET_JOB,就从Agent.GetQueuedJobs()拿任务,又分别对COMMAND_PIVOT、COMMAND_SOCKET、COMMAND_FS、COMMAND_MEM_FILE额外追加了一些参数,尤其是COMMADN_PIVOT内,如果是DEMON_PIVOT_SMB_COMMAND另外特殊处理。另外三个还没有开发完毕,是空着的。cH428资讯网——每日最新资讯28at.com

Pasted image 20230906211059.pngcH428资讯网——每日最新资讯28at.com

没有细看,大意是对内网SMB Agent进行Socks代理时的特殊处理。cH428资讯网——每日最新资讯28at.com

小结

算了,通讯协议这部分大概就看到这里了,总结一下,其通讯协议整体来说是不那么可靠的。cH428资讯网——每日最新资讯28at.com

CobaltStrike、Sliver常用的基本RSA+AES模式都没有实现到,甚至AES密钥同加密包一同发送。这个水准属于是有点让人失望了,希望在Agent端能够让人改观。cH428资讯网——每日最新资讯28at.com

本文作者:t43, 转载请注明来自FreeBuf.COMcH428资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-11886-0.htmlHavoc远控源码剖析(协议篇)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 50 种 ES6 模块,面试被问麻了

下一篇: 消息队列技术选型:这七种消息场景一定要考虑!

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
Top