尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

老远控gh0st 3.6源码分析:从通信特征到威胁检测的蓝队教材

老远控gh0st 3.6源码分析:从通信特征到威胁检测的蓝队教材 简介gh0st3.6是一款基于VC编写的远程控制软件RAT完整源代码面向网络安全学习者、恶意代码分析人员和Windows底层开发爱好者用于研究远控通信机制、权限维持与反检测思路。压缩包共298个文件、1.33MB核心代码以145个头文件.h和87个C源文件.cpp为主另含10个库文件.lib、工程文件.dsp/.dsw以及若干图标、位图等界面资源便于配合Visual Studio与最新Windows SDK进行编译和调试。代码覆盖TCP/IP套接字编程、多线程并发、AES/RSA等加密通信、Windows API系统调用、动态链接库模块设计、权限提升及反调试/反病毒对抗等关键点同时包含隐蔽通信与代码混淆相关实现适合逐模块拆解学习。已有313人学习下载是理解经典RAT内部结构和技术演进的较好参考样本。 群里有人把 gh0st 3.6 源代码翻出来问我这东西现在还有没有分析价值。说实话这款老远控在我的样本库里躺了好几年隔段时间就会被人拎出来讨论一次。作为攻击工具它早就过时了但作为恶意代码研究样本它依然是绕不开的经典。这篇文章不教怎么拿它重新搭一套 C2这既没必要也不合适。我想换一个角度站在安全分析和防守的立场聊聊这份源代码里真正值得看的东西以及它能给今天的威胁检测带来什么启发。如果你做蓝队、恶意样本分析或者刚入门安全研究想找一份既有完整协议又有大量主机行为的代码来练手gh0st 3.6 源代码其实是非常合适的“考古标本”。它能让你看到老一代远控木马是怎么设计通信、怎么实现功能、怎么留下大量可检测特征的。把这些看明白再回头看现在各种商业远控、无文件攻击反而能更容易抓住本质。1. gh0st 3.6 到底是什么一个老远控的典型画像1.1 它为什么叫“远控”而不是单纯叫“木马”很多人把 gh0st 直接称为木马这没错但不太准确。它更完整的定位是 RATRemote Access Tool也就是远程管理工具。远控和普通木马最大的区别在于功能面普通的木马可能只做键盘记录、截屏或者下载执行某类恶意文件而远控从设计之初就追求“把受害机器变成管理员手里的一台远程电脑”。gh0st 这种老牌远控功能基本覆盖了屏幕查看、键盘记录、文件管理、进程管理、注册表操作、命令行执行、视频音频捕获等几乎你能想到的远程运维能力它都有。gh0st 3.6 这一版之所以经典是因为它的代码结构比较清晰地体现了传统远控的核心链路客户端被投递到目标机器运行之后会主动向外发起连接连接上控制端之后等待命令控制端下发命令客户端根据命令字进入对应处理分支。整个链路并不复杂思路直白所以特别适合用来理解“远控类恶意软件到底在做什么”。1.2 它当年强在哪现在又弱在哪在技术选型上gh0st 3.6 体现了那个年代比较典型的思路。它采用反向连接模式也就是被控端主动去连控制端而不是控制端来找被控端。这种设计在现在看来没有多稀奇但在早期 IPv4 地址紧张、大量主机在 NAT 后面的环境下反向连接是远控存活率最高的方案。你不需要被控端有公网 IP只要它能访问外网就能主动找到控制端。简单说控制端只需要一个可以接收连接的地址剩下的事全由被控端自己完成。另一个技术点是并发处理。从源码的实现思路来看它用异步 IO 模型处理大量网络连接目的很明确一台控制端可能要同时管理成百上千台被控端如果每个连接都开一个线程资源开销会非常难看。异步模型加上消息驱动是那个时期远控的常规选择也说明了 gh0st 从设计上就不是一个小打小闹的玩具而是一套面向大规模管理的工具。但它的“弱”也特别明显。首先是通信几乎没有身份认证控制端与被控端之间没有可靠的握手鉴别机制谁拿到通信格式都可以模拟控制端下发指令其次是加密手段非常初级所谓加密更多是混淆级别密钥内嵌在客户端代码里而且整个数据的“加密强度”经不起任何像样的分析。还有一个问题是它不做运行时的自我保护没有对抗调试器、没有虚拟化检测行为特征全部裸奔在系统里。这些缺陷放到今天对攻击者来说全是硬伤但对防御者来说全是检测抓手。2. 从源代码里能看出的通信指纹流量侧检测思路2.1 反向连接与心跳主动出网带来的检测机会gh0st 3.6 的通信就是被控端对外主动建连这个过程在流量侧会留下非常明显的时间规律。被控端上线之后并不会一直有数据流动而是以固定周期发送心跳包来确认控制端还活着。这个心跳周期在每个样本里可能是写死的也可能是配置项但无论哪种只要一段时间内观测到某个外联 IP 上出现周期性、规律极强的小流量包就值得高度怀疑。很多人误以为反向连接远控只要走 443 端口就安全了其实不是。流量检测的关键从来不是端口而是行为规律和包结构。哪怕它把流量伪装成 HTTPS只要没有真正完成 TLS 握手抓包下来看内容依然能发现端倪。gh0st 这种老远控更不用说了它不做完整的 TLS 加密自定义协议的特征非常容易被提取。2.2 自定义包头与弱混淆不必逆向也能还原的通信数据源码里最值得看的部分我觉得是它的数据包设计。整个协议是自己定义的包头有固定的结构包括包长度、命令字、保留字段等。功能分发靠的就是这个命令字控制端发什么命令被控端就跳转到对应的处理函数。加密上它使用的是逐字节异或这类弱混淆算法。这类算法的特点就是只要你知道或者猜出密钥里任意一个字节整段密文的规律就全破了。更关键的是密钥就写死在客户端二进制里不会通过任何协商流程动态生成。拿到样本定位密钥再对着抓包文件做一遍异或还原就能直接把控制端和被控端之间的通信内容看得清清楚楚。这不是我空口说的而是我在分析多个远控样本之后验证过的通用流程。对于 gh0st 这类老代码整个过程顺利得让人怀疑它到底有没有认真做反分析。2.3 从流量指纹到检测规则基于上面的特征检测规则写起来并不复杂。团队在做 IDS 规则时可以从这么几个维度入手心跳包周期固定间隔的小包单包长度相对稳定。自定义包头结构抓包后对比前 N 字节的固定魔数或固定长度字段。加密后的熵值特征异或混淆后的数据在单位长度内重复出现的概率较高和随机数有明显区别。方向性大多数流量由被控端主动向外发起入站方向以下发命令为主。把这几条组合进 Suricata 或者 Zeek 的逻辑里再去回扫历史流量往往能挖出不少“看起来没毛病”的可疑外联。这个过程本身就是一种威胁狩猎而且是非常有性价比的那种。3. 主机侧行为链源码里那些暴露行踪的细节3.1 落盘与伪装系统目录里的可疑文件gh0st 3.6 的源码在主机的行为上同样留下了大量检测点。运行后它会把自己复制到系统目录或者释放一个主体文件出来文件名通常会往系统进程上靠比如伪装成 svchost.exe、explorer.exe 之类的常见名字或者干脆用随机名。老式样本还有一个习惯在原始路径执行后立刻自删除避免用户和杀软在下载目录里直接看到原始文件。检测这类行为别只看文件名字像不像系统进程更核心的指标是路径与完整行为链。一个从临时目录启动、随后向 System32 目录释放同名文件的进程哪怕名字再像系统进程行为上也完全不合理。EDR 产品里对这种“文件落地加自删除”组合告警率一直很高原因就在这儿。3.2 持久化与互斥体最容易留痕的两个位置持久化这块gh0st 3.6 正处在老技术向新技术过渡的时期。源码里能看到注册表 Run 键和创建系统服务这两条经典路径。注册表 Run 键是用户态自启动最常用的位置开机就会拉起创建服务则更隐蔽一点服务项的 ImagePath 可以写得比较隐蔽而且还能设置自动启动。无论是哪种方式在 Sysmon、注册表审计日志里都会留下对应事件。只要把“已知可执行文件路径 新建服务 Run 键写入 外联心跳”这四个事件做关联分析一个完整的感染链就出来了。互斥体是源码分析里容易被忽略但非常关键的信息。为了防止同一台机器上跑多个实例程序会创建一个全局互斥体。这个互斥体名字在代码里是写死的不同作者写的木马名字往往不一样所以它天然就是一条稳定的主机侧特征。安全研究圈常讲的 IOC 里就有互斥体这一类原因很简单文件哈希可以改运行后文件名可以随机但互斥体名一旦写死在源码里换壳也换不掉。3.3 注入与线程进程视角下的异常行为在 gh0st 3.6 的源码里还能看到远程线程注入的思路。它会把恶意代码写入到某个系统进程中再在目标进程内创建远程线程去执行。这么做的目的很直接网络通信和数据操作都借系统进程的名义进行规避基于进程名的检测规则。站在检测角度远程线程创建本身就是高风险行为。尤其当源进程是一个刚从临时目录释放出来的程序目标进程却变成了系统进程这个跨越可信边界的动作在行为链上非常刺眼。现代 EDR 的思路也基本一致不关心单点行为而是把进程创建、文件写入、权限提升、线程注入、网络连接串成一条完整链条再判断这条链是否合理。gh0st 的行为链在源码里写得明明白白照着链路上的每一步埋检测点命中率相当可观。4. 源码公开这件事为什么反而成了蓝队教材4.1 源码公开养活了多少检测规则gh0st 3.6 源代码的传播客观上产生了两个结果。一个是让大量低成本攻击者可以改一改配置就生成自己的变种导致当年安全厂商对这类远控的查杀规则迅速积累另一个是让防守方第一次拥有了“可以逐行审阅攻击者代码”的机会。前者让 gh0st 在很多年里都是安全产品特征库里的常客后者则让一批安全研究员通过读代码直接提取出了准确度极高的检测特征。我自己的经验是从源码提取 IOC 比从二进制逆向提取要高效得多。读二进制你得先对抗混淆、还原控制流、猜测数据结构读源码你直接就能看到文件路径、注册表位置、互斥体名字、默认端口、命令字字段、加密密钥。这些信息一旦提取出来转成 YARA 规则也好转成 IDS 签名也好都是直接能用的。这也是为什么到现在还有很多人在研究老远控源码因为它是练习“源代码审计能力”和“IOC 提取能力”的绝佳素材。4.2 从 IOC 到威胁狩猎老代码教给新蓝队的东西研究 gh0st 3.6 不应该止步于提取几个特征字符串更重要的是理解它背后的战术思想。反向连接解决 NAT 穿透问题、异步模型解决并发管理问题、模块化功能设计解决扩展问题、自定义协议和弱混淆解决“不想被人一眼看穿”的问题这套思路在今天几乎所有商业远控里仍然能看到只是实现得更复杂、隐藏得更深。所以我在带新人时经常说不要觉得老样本没用。你理解了 gh0st 怎么做任务分发再去看现在那些基于 TCP 协议的商业木马会发现核心思路几乎没变变的只是加密强度、通信伪装和检测对抗能力。老代码就是一部攻防演进的教材读它让你知道当前这些复杂手段是从哪里长出来的。5. 分析 gh0st 3.6 源代码之前先想清楚边界和方法5.1 安全红线绝对不要在实机执行单独做源代码审计问题不大但如果拿到的是编译好的样本想跑起来做动态分析我这里必须把边界说清楚。任何恶意代码的动态行为验证都应该在隔离环境中进行。虚拟机加网络隔离是最低要求能断网就断网不能断网也要把出站流量限制到模拟的伪造服务端上。绝对不要在办公机、个人主力电脑上直接运行未知远控样本。gh0st 这类老远控哪怕再“经典”一旦跑起来就是真实感染。做安全研究的底线是研究对象是代码而不是让自己变成受害者。给虚拟机拍好快照、用完回滚这是对自己也是对同事负责。5.2 静态分析优先动态行为验证殿后我的建议是先做静态分析而且优先级极高。拿 Ghidra 或 IDA 加载样本后第一眼不要急着看反汇编。先看字符串gh0st 3.6 这种老代码里的字符串几乎不加密文件路径、命令提示、错误信息、互斥体名全都明晃晃摆在 .rdata 节里。字符串过一遍能筛出 50% 的有效信息。第二步看导入表。调用了 CreateService 说明有服务持久化调用了 RegSetValueEx 说明有注册表自启动调用了 CreateRemoteThread 说明有远线程注入。导入表本身就是一张行为清单比对着反汇编代码逐行猜快得多。第三步才是动态行为验证。在隔离虚拟机里用 Procmon 记录文件系统、注册表、进程活动用 Wireshark 抓取对外流量再把静态分析得到的行为预判和动态观测结果做对照。这种“先预测、后验证”的方式比一上来就跑样本然后对着日志瞎猜要更有收获。5.3 用“写规则”的思维读源码分析 gh0st 3.6 源代码我最推荐的姿势是带着“写规则”的目的去读。每看一个功能模块就问自己一个问题这一段逻辑如果落到流量或者主机行为上会产生什么特征这个特征能不能被 IDS 规则、Sysmon 配置、YARA 规则或者 EDR 检测逻辑捕获到比如看到心跳包发送的逻辑就想心跳周期的表达式怎么写看到互斥体创建的代码就想这个互斥体名值不值得直接上情报库看到远端 shell 执行的分支就想进程树里突然出现的 cmd.exe 子进程该用什么规则去命中。带着这种思维读一遍读完之后你会发现自己不仅看懂了这份代码还顺手攒下了一整套针对它的检测方案。这份能力比背多少攻击利用技巧都值钱。我个人在实际分析这类老远控源码时还有一个体会不要只盯着攻击功能看要把注意力放在“程序为了自己生存下去做的那些事”上。文件怎么落地、进程怎么隐藏、开机怎么拉起、通信怎么保活这些才是防守侧最能转化成检测规则的部分。gh0st 3.6 源代码恰好把这些过程写得足够直白读一遍下来你会对远控类恶意软件的整体套路有一个非常扎实的底子。以后再遇到新样本至少不会被花里胡哨的混淆吓住因为你知道流量层面、主机层面该盯的点到底在哪里。本文还有配套的精品资源点击获取
返回列表