发布于10月10日10月10日 背景前段时间在一次授权内网渗透复盘中,蓝队在出口防火墙上发现一台办公终端持续向境外 VPS 发起 TCP 长连接,目的端口为 443,但流量并非标准 TLS。该终端同时存在异常自启动项和可疑进程注入行为。样本整体行为符合传统远控木马特征,协议层又能看到 Gh0st 家族的影子,但做了简单变种处理。本文只围绕“逆向木马远控”这个点展开:从样本落地、自启动、进程行为、C2 回连协议和日志留痕几个角度拆解,便于在授权场景下做验证、排查和修复。不会讨论投递和攻击扩展。问题定位现场最早的告警来自出口设备,特征是某终端周期性连接固定 IP,连接保持时间较长,且每隔几十秒发送少量心跳数据。主机侧初步排查发现以下现象:用户目录下存在伪装成输入法组件的可执行文件:C:\Users\Public\Libraries\imehost.exe注册表 Run 项存在异常自启动:HKCU\Software\Microsoft\Windows\CurrentVersion\Run\ImeHost进程 imehost.exe 对 explorer.exe 有远程线程注入痕迹网络连接目标为固定 IP,目的端口 443,但没有 TLS ClientHello这里需要注意,远控木马常见的伪装方式不是“特别高级”,而是利用路径、文件名、签名缺失、父子进程关系异常来降低人工排查概率。对蓝队来说,先把异常链路串起来,比只盯单个 IOC 更有效。技术分析1. 样本基本信息样本为 32 位 PE 文件,无有效数字签名,编译时间被修改为较早日期,不具备直接参考价值。静态字符串经过简单异或处理,导入表能看到网络、注册表和进程相关 API。项目结果文件路径C:\Users\Public\Libraries\imehost.exe文件类型PE32 executable签名状态Unsigned可疑 APIRegSetValueExW、CreateRemoteThread、VirtualAllocEx、WriteProcessMemory、connect、send、recv主要行为自启动、解密配置、C2 回连、心跳、进程注入2. 配置解密逻辑样本没有明文保存 C2 地址,而是在 .rdata 中保存一段固定长度的加密配置。逆向时可以从网络连接函数向上回溯,找到配置解密函数。该变种使用简单异或循环,key 长度为 4 字节。def xor_decode(data: bytes, key: bytes) -> bytes: out = bytearray() for i, b in enumerate(data): out.append(b ^ key[i % len(key)]) return bytes(out) # 从样本 .rdata 中提取的配置片段,示例已做脱敏 enc = bytes.fromhex("1f0a1c5e061d0b4b120d1a5d") key = b"K3y!" print(xor_decode(enc, key))解密后能得到类似结构:c2_host=203.0.113.10 c2_port=443 group=office-01 mutex=Global\MSIME_{D9E1A} sleep=30000这里的 group 字段很像 Gh0st 系远控常见的分组标识,用于服务端区分上线主机。mutex 用来避免重复运行,sleep 控制心跳间隔。3. 回连协议特征虽然使用 443 端口,但抓包看不到 TLS 握手。连接建立后,客户端首先发送固定魔数、长度和压缩后的主机信息。该行为与一些 Gh0st 变种比较接近,只是魔数从经典的 Gh0st 修改成了自定义 5 字节标识。0000 47 68 30 31 74 58 00 00 00 21 00 00 00 78 9c 4b Gh01tX...!...x.K 0010 ce cf 2d c8 49 55 30 34 d0 33 30 36 31 50 08 f6 ..-.IU04.3061P.. 0020 f7 0d 71 0d 0e 51 70 74 71 0c 00 62 1d 08 6a ..q..Qptq..b..j字段可按如下方式理解:47 68 30 31 74:协议魔数,ASCII 为 Gh01t后续 4 字节:压缩前数据长度再后续 4 字节:压缩后数据长度剩余部分:zlib 压缩数据,解压后包含主机名、用户名、系统版本、权限信息等在排查中,不能只用端口判断是否正常。远控常用 80、443、8080 这类端口伪装业务流量,真正有效的是结合协议首包、连接周期、进程路径和父子进程关系来判断。4. 主机行为拆解样本启动后主要做了四件事:创建互斥体,避免重复运行写入当前用户 Run 项,建立自启动解密 C2 配置并进行回连尝试注入到 explorer.exe,降低进程列表可见性对应的注册表位置如下:reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v ImeHost如果要快速确认进程网络连接,可以在主机上执行:netstat -ano | findstr ESTABLISHED tasklist /fi "PID eq 进程PID" wmic process where processid=进程PID get ProcessId,ParentProcessId,ExecutablePath,CommandLine如果环境中部署了 Sysmon,建议重点看以下事件:Event ID 1:进程创建,确认父子进程关系和命令行Event ID 3:网络连接,确认进程到 C2 的连接Event ID 7:镜像加载,观察异常 DLL 加载Event ID 8:CreateRemoteThread,排查远程线程注入Event ID 11:文件创建,定位样本落地路径Event ID 13:注册表值设置,定位自启动写入操作步骤下面是现场可执行的排查流程,适合在授权应急或内网攻防复盘中使用。1. 从出口日志反查终端# 防火墙或流量平台中重点筛选 src_ip = 内网终端IP dst_ip = 可疑C2 IP dst_port in (80,443,8080,8443) session_duration > 300 bytes_out 小且周期稳定如果有 Zeek 日志,可查 conn.log 中长连接和周期连接,再结合 ssl.log 判断是否真的是 TLS。目的端口为 443 但没有对应 TLS 解析记录时,要优先关注。2. 主机侧确认进程与落地文件Get-Process | Sort-Object CPU -Descending | Select-Object -First 20 Get-NetTCPConnection -State Established | Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,OwningProcess Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,ExecutablePath,CommandLine | findstr /i "imehost public libraries"重点看三点:路径是否异常、父进程是否合理、命令行是否伪装系统组件。正常系统组件一般不会从 Users\Public、Temp、AppData\Roaming 这类目录长期运行。3. 检查自启动与计划任务reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" schtasks /query /fo LIST /v | findstr /i "Public AppData Temp imehost"不少远控会同时写 Run 项和计划任务,单删文件不清理自启动,重启后可能再次拉起或报错留下痕迹。4. 提取样本和内存证据在应急场景中,不建议直接双击或随意复制运行样本。可以先计算哈希、打包留存,再进行离线分析。certutil -hashfile C:\Users\Public\Libraries\imehost.exe SHA256 powershell -Command "Compress-Archive -Path C:\Users\Public\Libraries\imehost.exe -DestinationPath C:\Temp\sample.zip"如果怀疑进程注入,建议先保留内存证据,再做隔离和清除。否则只看磁盘文件,可能漏掉注入后的有效载荷。代码/命令示例:用 YARA 匹配 Gh0st 变种协议痕迹下面这条 YARA 规则用于样本初筛,重点匹配 Gh0st 变种的协议魔数、zlib 使用痕迹以及远控常见 API。实际环境中要结合误报测试,不建议直接作为阻断规则。rule Trojan_RemoteAccess_Gh0st_Variant_Basic { meta: description = "Detect Gh0st-like RAT variant with modified magic and remote control behaviors" author = "community" scope = "authorized incident response" strings: $magic1 = "Gh0st" ascii nocase $magic2 = "Gh01t" ascii $api1 = "CreateRemoteThread" ascii $api2 = "VirtualAllocEx" ascii $api3 = "WriteProcessMemory" ascii $api4 = "RegSetValueEx" ascii $zlib1 = "inflate" ascii $zlib2 = "deflate" ascii $path1 = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" wide ascii condition: uint16(0) == 0x5A4D and filesize < 5MB and ( any of ($magic*) or (2 of ($api*) and 1 of ($zlib*) and $path1) ) }如果要在流量侧做初筛,可以用 Zeek 或 Suricata 关注“443 端口非 TLS + 固定首包魔数 + 周期心跳”的组合。单独匹配 Gh0st 容易漏掉变种,匹配过宽又容易误报。风险与修复建议先隔离主机:确认存在远控回连后,优先从网络层隔离终端,避免继续接收控制指令。保留证据:在清除前保存样本、哈希、进程列表、网络连接、注册表自启动、Sysmon/EDR 告警和出口日志。清理持久化:删除异常 Run 项、计划任务、服务项,确认重启后不再出现可疑进程。排查横向痕迹:检查该主机近期是否访问管理端口、共享目录、域控、堡垒机和代码仓库。重点看 4624、4627、4648、4672、4688、7045 等事件。收敛权限:如果终端登录过域管理员、运维账号或 VPN 账号,应立即评估凭据泄露风险并轮换密码。出口控制:办公网终端不应任意直连公网高危 VPS,建议按业务白名单控制出站访问,并对 443 非 TLS 流量做审计。增强日志:建议部署 Sysmon,并开启进程创建、网络连接、远程线程、注册表修改等关键事件采集。一个可参考的 Sysmon 关注点是:普通用户目录下的可执行文件发起公网连接,且同一进程写入 Run 项或创建远程线程。这类组合告警的价值通常高于单个 IOC。总结这类远控木马并不一定依赖复杂技术,更多是通过伪装路径、修改协议特征、使用常见端口和持久化项来延长驻留时间。逆向分析时建议从三个点入手:配置解密、C2 首包协议、主机持久化行为。蓝队排查时则要把出口日志、主机进程、注册表、自启动和 Sysmon 事件串成一条时间线。在授权内网攻防或应急复盘中,判断一个样本是否为远控,不要只看文件名和端口。真正可靠的是行为闭环:异常落地文件、持久化、自解密配置、主动回连、心跳通信、远程控制相关 API。证据链完整后,再做隔离、清除和权限修复,效果会比简单删除文件稳得多。 逆向分析、样本行为与调试流程示意
10月10日10月10日 这类 Gh0st 变种排查时,建议把“样本行为”和“回连日志”做一次交叉验证,不要只盯单个 IOC。几个比较实用的点: 先从主机侧确认持久化位置。Gh0st 变种常见会落在用户目录、ProgramData、Temp 或伪装成系统服务名。可以重点查最近新增的自启动项、服务和计划任务: reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" reg query "HKLM\SYSTEM\CurrentControlSet\Services" /s | findstr /i "ImagePath" schtasks /query /fo LIST /v | findstr /i "TaskName Task To Run Author" 回连定位建议看进程树 + 连接归属,尤其是样本是否注入到 explorer.exe、svchost.exe、rundll32.exe 这类进程里。现场可以用 netstat 先粗定位 PID,再反查进程路径: netstat -ano | findstr ESTABLISHED tasklist /fi "PID eq <PID>" /v wmic process where ProcessId=<PID> get ProcessId,ParentProcessId,ExecutablePath,CommandLine 如果有 Sysmon,建议查 Event ID 3 网络连接和 Event ID 1 进程创建,把回连 IP、端口、进程路径、父进程串起来。 内网日志侧不要只按 C2 IP 查。很多变种会更换域名或端口,但 User-Agent、连接周期、固定包头可能比较稳定。可以在代理、防火墙、DNS 日志里按以下维度扩展: 同一主机短周期重复访问固定外联地址; 非常规端口长连接,例如 443/80 以外的 7000、8080、9000、上线端口等; DNS 查询低频但解析后立即建立长连接; 同一 JA3/JA3S 或异常 TLS 指纹,如果环境有采集。 样本拆解时可以关注配置解密逻辑。Gh0st 系家族经常把 C2、端口、分组名、互斥体、安装路径写在资源段或加密 blob 里。用 strings 不一定能直接看到,建议结合 x64dbg/IDA 看几个位置: 启动后第一批 CreateMutex / RegSetValue / CreateService 调用; connect / gethostbyname / InternetConnectA / WinHttpConnect 之前的数据来源; 是否有简单 XOR、RC4、自定义滚动异或解密配置; 是否有 gzip/zlib、固定 magic header 或 Gh0st 原版特征包头变形。 现场处置顺序建议先隔离网络,不要立刻删除样本。先保留内存、进程、网络、注册表和落地文件证据,否则后面很难还原入口和横向路径: tasklist /v > tasklist.txt netstat -ano > netstat.txt wmic process get ProcessId,ParentProcessId,ExecutablePath,CommandLine > process.txt wevtutil epl Security security.evtx wevtutil epl System system.evtx wevtutil epl Microsoft-Windows-Sysmon/Operational sysmon.evtx 另外,如果帖子里已经拿到了回连日志,建议把时间线往前推 24 到 72 小时,重点找首次落地时间、首次外联时间、同源登录事件和文件写入事件。Gh0st 本身只是结果,入口可能是弱口令 RDP、WebShell、计划任务投递或者 SMB 横向复制,定位入口比单纯清样本更关键。
创建帐户或登录后发表意见