发布于15小时前15小时 背景在一次已授权的终端安全排查中,某 Windows 10 主机持续向外部高位端口建立短连接。EDR 仅记录到 rundll32.exe 发起网络访问,但未能直接确认载荷来源。主机同时存在异常计划任务,任务执行目标位于用户目录下,文件无数字签名且时间戳与系统安装时间明显不符。这类远控样本常通过系统程序代理执行、用户级持久化和加密配置降低可见性。逆向时不应只关注样本“具有什么功能”,还要还原落地、启动、通信和权限边界,最终形成可用于全网排查的文件、注册表、任务计划、网络和内存指标。以下操作应在隔离实验环境中进行。建议使用无生产凭据的虚拟机、Host-only 网络和可回滚快照,禁止让未知样本直接访问互联网。一、先确认执行链,而不是立即双击样本现场发现的计划任务名为 UpdateCheck,动作如下:rundll32.exe C:\Users\Public\Libraries\version.dll,Start首先导出任务定义、计算哈希并检查签名。不要在原主机上反复启动文件,以免覆盖 Prefetch、任务历史和临时文件等证据。schtasks /query /tn "UpdateCheck" /xml > C:\IR\UpdateCheck.xml certutil -hashfile "C:\Users\Public\Libraries\version.dll" SHA256 powershell -NoProfile -Command "Get-AuthenticodeSignature 'C:\Users\Public\Libraries\version.dll' | Format-List *" wevtutil epl Microsoft-Windows-TaskScheduler/Operational C:\IR\TaskScheduler.evtx reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /s reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /s任务 XML 中应重点记录 Author、Principal、LogonType、RunLevel、Triggers 和 Actions。若任务以普通用户创建,却设置 HighestAvailable,需要继续核对该用户是否属于本地管理员组,以及创建时是否发生过 UAC 提权。二、静态分析:判断文件类型和加载方式对 DLL 的初步检查包括 PE 头、导入表、节区熵、导出函数和资源。该样本导出了 Start,导入表仅保留 LoadLibraryW、GetProcAddress、VirtualAlloc 和 VirtualProtect,且 .data 节熵接近 7.8,符合运行时解析 API 和加密配置的特征。sigcheck64.exe -a -h -i "C:\Samples\version.dll" pefile-info.exe "C:\Samples\version.dll" strings64.exe -n 6 "C:\Samples\version.dll" > strings.txt floss.exe "C:\Samples\version.dll" > floss.txt capa.exe "C:\Samples\version.dll"如果普通 strings 输出很少,而 FLOSS 能恢复互斥体、注册表路径或域名,应优先定位字符串解码函数的交叉引用。常见识别方法是寻找循环中的 XOR、ROL/ROR、加法以及固定长度内存遍历。不要仅凭高熵判断文件被加壳,压缩资源、签名数据和加密配置也会提高局部熵。三、逆向入口与配置解密在 Ghidra 或 IDA 中,从导出函数 Start 向下跟踪。该样本先取得 %APPDATA%,再拼接缓存目录,随后读取自身 .data 节末尾的一段结构。解密循环可抽象为逐字节异或,但密钥并非硬编码明文,而是由 PE 时间戳和固定常量派生。解密后的配置结构包含版本号、两个候选主机、端口、轮询间隔、互斥体名称和持久化模式。分析记录中应保留字段偏移和长度,不要只抄出域名。这样即使后续样本更换基础设施,仍可通过结构特征识别同一家族。偏移长度含义验证方式0x004配置版本解密后为小端整数0x042端口与 connect 参数对照0x062轮询秒数与 Sleep 参数对照0x0864主机字段观察 DNS 查询0x4832互斥体名称在 CreateMutexW 处验证若静态反编译结果不稳定,可以在 x64dbg 中对 VirtualProtect、CreateMutexW、WinHttpConnect、connect 和 CreateProcessW 设置断点。在样本完成自解密后,再转储对应内存区域。重点记录调用栈、参数、返回地址和内存保护属性,不建议只依赖单步跟踪。bp kernel32.VirtualProtect bp kernel32.CreateMutexW bp winhttp.WinHttpConnect bp ws2_32.connect bp kernel32.CreateProcessW命中 VirtualProtect 时,检查目标地址是否位于原 PE 映像节区之外。如果内存先以 PAGE_READWRITE 分配,写入后改为 PAGE_EXECUTE_READ,且线程入口落在该区域,应按解包或内存载荷处理。此时需要同时保存进程内存和线程起始地址,避免只导出一段缺少重定位信息的数据。四、动态观察:控制网络并保留日志实验机建议连接 INetSim 或 FakeNet-NG,使用模拟 DNS、HTTP 和 TCP 服务接收连接。不要把 DNS 指向公共解析器。Procmon 过滤条件可设置为 Process Name is rundll32.exe,并额外关注 WriteFile、RegSetValue、CreateFile、Process Create 和 TCP Connect。fakenet.exe -i 0 --outputpath C:\Analysis\FakeNet pktmon start --capture --pkt-size 0 --file-name C:\Analysis\sample.etl rundll32.exe C:\Samples\version.dll,Start pktmon stop pktmon etl2pcap C:\Analysis\sample.etl --out C:\Analysis\sample.pcapng netstat -abno动态运行后观察到样本创建固定互斥体,读取 MachineGuid,并将计算机名、用户名、进程位数和系统版本组织为 TLV 数据。随后通过 TCP 连接候选主机,首包前四字节为固定魔数,后接版本和载荷长度。这里应区分“协议特征”和“单次会话内容”:固定魔数、字段顺序和长度编码更适合检测,临时会话 ID 不适合作为长期指标。五、定位远控能力与权限边界样本命令分发函数通常表现为 switch、跳转表或连续比较。分析时应列出命令编号、参数解析函数和敏感 API,而不是尝试实际调用远控命令。本例能够确认的能力包括进程枚举、文件读写、子进程创建和屏幕采集,但未发现驱动加载、令牌复制或 LSASS 访问逻辑。进程枚举:CreateToolhelp32Snapshot、Process32FirstW、Process32NextW。命令执行:CreateProcessW,并将标准输入输出重定向到匿名管道。文件操作:CreateFileW、ReadFile、WriteFile、MoveFileExW。屏幕采集:GetDC、CreateCompatibleBitmap、BitBlt。权限判断:OpenProcessToken、GetTokenInformation。权限边界必须结合运行主体判断。若计划任务以普通用户上下文运行,样本通常只能访问该用户可读文件和会话桌面;若用户属于本地管理员组且任务配置为最高权限,则应进一步检查任务创建事件、UAC 日志和管理员令牌使用情况。不要因为样本具备执行命令功能,就直接认定其获得 SYSTEM 权限。六、主机与网络留痕排查建议从以下位置回溯执行链:任务计划日志:Microsoft-Windows-TaskScheduler/Operational,关注 106、140、200、201 等事件。进程创建:安全日志 4688 或 Sysmon 事件 1,核对 rundll32.exe 的命令行和父进程。网络连接:Sysmon 事件 3、EDR 网络遥测、防火墙日志和 DNS 缓存。文件落地:Sysmon 事件 11、USN Journal、MFT 和 Prefetch。注册表:Sysmon 事件 12、13、14,重点检查 Run、RunOnce 和用户级 COM 劫持位置。wevtutil qe Security /q:"*[System[(EventID=4688)]]" /f:text /c:100 wevtutil qe Microsoft-Windows-TaskScheduler/Operational /q:"*[System[(EventID=106 or EventID=140 or EventID=200 or EventID=201)]]" /f:text powershell -NoProfile -Command "Get-ScheduledTask | Where-Object {$_.Actions.Execute -match 'rundll32|Users\\Public|AppData'} | Format-List *" powershell -NoProfile -Command "Get-CimInstance Win32_Process | Where-Object {$_.Name -eq 'rundll32.exe'} | Select ProcessId,ParentProcessId,CommandLine"如果部署 Sysmon,至少确保记录进程创建、网络连接、映像加载、文件创建和注册表修改。单纯记录进程名意义有限,必须保留完整命令行、父进程、哈希、签名状态和目标地址。<RuleGroup name="Rundll32SuspiciousLoad" groupRelation="or"> <ProcessCreate onmatch="include"> <Image condition="end with">\rundll32.exe</Image> <CommandLine condition="contains any">\AppData\;\Users\Public\;javascript:;http:</CommandLine> </ProcessCreate> <NetworkConnect onmatch="include"> <Image condition="end with">\rundll32.exe</Image> </NetworkConnect> </RuleGroup>该规则适合做调查线索,不应直接作为阻断规则。rundll32.exe 可能被合法软件调用,需要结合 DLL 签名、落地目录、父进程和网络目的地降低误报。七、提取可复用检测特征文件哈希只能覆盖单个样本。更稳妥的做法是组合导出名、配置结构、互斥体片段、协议魔数和导入特征。下面的 YARA 规则用于隔离样本库初筛,字符串应根据实际逆向结果替换和验证。rule RAT_DLL_Config_And_Protocol_Indicator { meta: description = "Detects observed RAT DLL configuration and protocol markers" scope = "authorized incident response" strings: $export = "Start" ascii $mutex = "Global\\UpdateCache_" wide $cfg = { 43 46 47 31 ?? ?? 00 00 } $proto = { 52 41 54 31 01 00 ?? ?? } condition: uint16(0) == 0x5A4D and filesize < 5MB and 3 of ($export, $mutex, $cfg, $proto) }规则上线前应在干净软件集和历史样本集中测试。宽泛字符串、单个 API 名称以及短字节序列容易误报。若配置数据位于高熵节区,可将节区名称、导出表和 PE 特征加入条件,但不要把编译时间戳当作唯一依据,因为该字段很容易伪造。八、处置与修复建议先隔离主机,再保存内存、事件日志、任务 XML、可疑文件、MFT 和网络记录;不要先删除文件后取证。在确认任务与样本关联后,禁用并删除恶意任务,同时清理对应 DLL、临时副本和用户级启动项。封禁已确认的域名、IP、证书指纹和协议特征,但保留日志查询能力,避免封禁动作破坏历史回溯。检查受影响账户的登录记录、浏览器凭据、远程桌面和横向访问痕迹;账户曾在感染期间登录时,应进行凭据轮换。限制普通用户在高风险目录执行 DLL,结合 WDAC 或 AppLocker 控制 Users、Public、AppData 和临时目录中的未签名代码。启用 PowerShell、任务计划、进程创建和 DNS 日志,EDR 策略中保留命令行、父子关系、签名与哈希。若发现 SYSTEM 权限执行、驱动载荷或凭据访问证据,不应只做文件清理,建议重装系统并重新评估同网段资产。九、复核清单任务计划和自启动项是否已清除,重启后是否再次生成。rundll32.exe 是否仍从用户可写目录加载 DLL。DNS、代理、防火墙和 EDR 中是否还有相同协议或基础设施连接。同一哈希、互斥体、配置结构和落地路径是否出现在其他终端。受影响账户是否存在异常登录、远程服务创建或管理共享访问。总结远控木马逆向的重点不是展示某个远控命令,而是把样本行为还原成可验证的攻击链:载荷如何落地、由谁启动、以什么权限运行、配置如何保存、通信如何编码,以及系统留下了哪些证据。将静态结构、动态调用、事件日志和网络流量相互印证,才能得到可靠的检测指标和修复范围。处置时则应区分普通用户级驻留与高权限入侵,避免只删除样本却遗漏账户风险、横向活动和同源感染。 逆向分析、样本行为与调试流程示意 网络请求、日志与边界流量分析示意
14小时前14小时 这类远控排查建议先保全现场,再做静态分析。不要一上来删除启动项或直接运行样本,否则容易丢失进程树、内存配置和短生命周期的 C2 连接。 1. 持久化入口不要只盯 Run 键 Windows 样本常把入口拆到计划任务、服务、WMI 永久订阅和登录脚本中。可以先导出以下信息,并重点核对“创建时间接近首次失陷时间”“命令行指向用户可写目录”“名称仿冒系统组件”的条目: reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /s reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /s reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit schtasks /query /fo LIST /v sc query type= service state= all wmic service get Name,DisplayName,PathName,StartMode,State powershell -NoProfile -Command ^ "Get-CimInstance -Namespace root/subscription -Class __EventFilter; ^ Get-CimInstance -Namespace root/subscription -Class CommandLineEventConsumer; ^ Get-CimInstance -Namespace root/subscription -Class __FilterToConsumerBinding" 计划任务还应直接检查 C:\Windows\System32\Tasks 下的 XML,因为任务显示名可能正常,但实际 Command、Arguments 或触发器存在异常。服务项则注意未加引号路径、DLL 型服务,以及 ImagePath 中的 PowerShell、rundll32、regsvr32、mshta。 2. 配置解密先定位“配置边界”,不要直接猜算法 静态分析时先找网络 API、域名字符串、互斥体、注册表路径及资源段引用,再沿交叉引用回溯。常见结构是“读取资源/尾部数据 → Base64 或自定义解码 → XOR/RC4/AES → JSON/TLV 解析”。动态验证建议在隔离虚拟机中断网调试,在解密函数返回处或网络请求构造前下断点,直接保存明文缓冲区。 如果怀疑单字节 XOR,可以用下面的脚本快速筛选包含 URL、JSON 字段或常见 C2 配置关键字的结果: from pathlib import Path data = Path("config.bin").read_bytes() marks = (b"http", b"host", b"port", b"mutex", b"campaign", b'{"') for key in range(1, 256): out = bytes(b ^ key for b in data) if any(mark.lower() in out.lower() for mark in marks): print(f"key=0x{key:02x}", out[:300]) 如果是 AES/RC4,不要只搜索算法常量。很多样本会动态解析加密 API,或内联实现算法;更有效的是追踪密钥和 IV 的来源:硬编码、机器 GUID、用户名、卷序列号、资源字段,还是由 C2 下发。解密结果同时记录偏移、字段长度和字节序,后续才能稳定提取 IOC,而不是只得到一次性的明文。 3. C2 留痕需要把进程、DNS、连接和落地文件串起来 现场仍在线时,可先采集连接与进程映射: netstat -abno ipconfig /displaydns powershell -NoProfile -Command "Get-NetTCPConnection | Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,State,OwningProcess" powershell -NoProfile -Command "Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine,ExecutablePath" Windows 事件日志中建议关注 Sysmon 的 1(进程创建)、3(网络连接)、11(文件创建)、13(注册表修改)、22(DNS 查询),以及 Security 4688、TaskScheduler Operational、PowerShell 4104。可按可疑进程 PID、落地路径和首次发现时间做时间线,而不是只按域名搜索: wevtutil epl Microsoft-Windows-Sysmon/Operational sysmon.evtx wevtutil epl Microsoft-Windows-TaskScheduler/Operational tasks.evtx wevtutil epl Microsoft-Windows-PowerShell/Operational powershell.evtx powershell -NoProfile -Command ^ "Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational';Id=3,22} | Select-Object TimeCreated,Id,Message | Export-Csv -NoTypeInformation -Encoding UTF8 c2_timeline.csv" 域名被 CDN 或动态 DNS 隐藏时,域名本身不一定适合作为封禁指标。可以进一步提取请求 URI、Host/SNI、User-Agent、固定 Cookie、心跳周期、报文长度和 TLS 证书特征。若条件允许,结合代理、DNS 和防火墙日志,查询同一时间窗内访问相同基础设施的其他主机。 4. 处置时区分证据保全与清除 至少保留样本哈希、原始路径、文件时间戳、数字签名、父子进程关系、持久化项导出、内存镜像和相关 EVTX。确认范围后再隔离主机、禁用持久化、封禁 C2,并轮换该主机上可能暴露的浏览器凭据、会话令牌和运维账号。仅删除木马文件通常不够,远控若具备凭据窃取或横向移动能力,应同步检查同网段登录事件、远程服务创建和异常 SMB/RDP 活动。 最终 IOC 最好分成三类:稳定指标(证书、公钥、协议字段)、半稳定指标(域名、URI、互斥体、任务名)和易变指标(IP、文件名、单次哈希)。这样后续检测不会过度依赖攻击者很容易替换的 IP 或样本哈希。
创建帐户或登录后发表意见