ARTICLE DETAIL

资讯详情

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

Windows服务器安全排查实战:从进程到日志的入侵溯源链路

Windows服务器安全排查实战:从进程到日志的入侵溯源链路 前几课讲了网络基础这课把Windows系统安全排查单独拎出来说。很多同学遇到Windows服务器疑似中毒第一反应是装个杀毒软件全盘扫描或者干脆直接重装系统。但真实场景里客户不会给你重装的机会——数据、业务连续性、合规审计全绑在同一台机器上你多待的每一分钟都可能决定这个隐患是被彻底拔掉还是仅仅被掩盖。这课我会按照一套可复现的排查链路来讲从思路准备、账户层、运行态进程/网络/服务、安全日志、持久化机制到文件痕迹最后用一个完整场景把整个流程串起来。内容偏向Windows Server和Win10/11所有命令都在原生命令行或PowerShell里执行不需要额外装工具保证你在现场也能用。1. 排查前的思路准备先假设被入侵再寻找证据1.1 为什么不能一上来就杀毒我见过太多“排查”变“破坏”的案例管理员发现服务器异常直接打开杀毒软件一键清毒病毒确实删了但攻击者用来建立持久化的计划任务、注册表项、账户还在第二天病毒又被下载回来或者核心业务因为杀毒误删直接宕机。安全排查的本质是取证不是清理。你首先要回答三个问题攻击者是怎么进来的他做了什么现在还在不在第三个问题答案决定你能不能重启、能不能动文件、能不能删进程。如果连“还在不在”都没搞清楚就动手那你只是在帮攻击者清理痕迹。正确的做法是先把机器隔离——拔网线、在云控制台配置安全组只允许管理IP访问然后保持系统当前运行状态开始逐层收集证据。整个过程里任何修改系统的操作都要先记录下来包括你执行过的命令、改过的东西、看到的时间点。1.2 攻击者动作链与逆向排查法Windows服务器被攻破绝大多数遵循一个固定链路获取初始访问权弱口令、RDP爆破、Web漏洞、未修复的漏洞。建立持久化计划任务、注册表Run键、服务、WMI事件订阅保证你重启后他还能回来。提权与横向拿到System权限或者通过内网跳板机打其他机器。窃取或破坏传回重要文件、加密勒索、部署挖矿程序。我们要做的排查就是沿着这条链路逆向走先找持久化因为攻击者一定会留后门这是最清晰的线索再找当前还在运行的异常进程和网络连接然后翻日志还原入口最后回到文件系统找证据。所以本节先定了整个排查顺序隔离 - 账户 - 运行态进程/网络/服务 - 安全日志 - 自启动与计划任务 - 文件痕迹。后面全部章节按这个顺序展开。1.3 证据保全的几个习惯开始动手之前先花5分钟做三件事# 记录当前时间和系统运行时长 systeminfo | findstr /i 系统启动时间 系统时间 # 导出进程、服务、网络连接全量快照 tasklist /v /fo csv C:\evidence\tasklist_before.csv sc query type service state all C:\evidence\services_before.txt netstat -ano C:\evidence\netstat_before.txt然后把这个C:\evidence目录告诉任何人都别乱动。这份快照是后续对比的基线尤其是对比“现在”和“你排查后”的状态——如果排查过程中某个进程突然消失或者某个端口突然关闭那本身就是重要信号。2. 账户层排查入口和隐藏后门的第一站2.1 先看一眼系统里有哪些账户账户是Windows认证体系的基石攻击者拿到初始访问权之后最直接的动作就是创建一个新账户留后门或者把已有账户加入管理员组。所以排查第一站永远是账户列表。# 普通用户列表兼容Win7/Win10/Win11/Server net user # 更详细的账户属性、SID、状态 wmic useraccount get name,fullname,sid,disabled,localaccount # 新版PowerShell推荐用这个 Get-LocalUser | Select-Object Name, Enabled, LastLogon, SID第一眼先看有没有不认识的账户尤其是名字带$结尾的如backdoor$、用户名看起来像是手滑打出来的、或者你根本不知道谁创建的。注意系统自身有一些带$的账户如WDAGUtilityAccount不要误杀但凡是出现在管理员组里的陌生账户基本可以判定有问题。2.2 隐藏账户和克隆账户的识别Windows有个经典隐藏手段net user hacker$ /add。net user不显示以$结尾的账户但系统确实创建了。用上面的wmic useraccount get name就能看到它。如果图形界面和net user都看不到就得直接查注册表SAMreg query HKLM\SAM\SAM\Domains\Account\Users\Names /s需要管理员权限且要在注册表编辑器的权限设置里给Administrators完全控制才能展开SAM这一步在取证时可以直接用管理员命令行执行能列出所有账户名包括隐藏账户。比隐藏账户更阴险的是“克隆账户”把admin账户注册表里F值的二进制数据覆盖到目标账户的F值上实现net user显示为普通用户、但实际权限是管理员的畸形状态。识别方法也简单看所有管理员权限账户的SID是否异常或者用wmic useraccount get name,sid暴力对比正常账户的SID必然唯一。发现有两个账户SID完全相同不管用户名是什么先按后门处理。Windows 10/11上这种老技术利用难度变高了但Windows Server 2008/2012的老系统还大量存在值得检查。2.3 管理员组成员与登录事件初步筛选net localgroup administrators wmic group where nameadministrators get name,members确认管理员组成员列表对比你心里“应该有哪些人”的基线。多出来的陌生账户直接记下名字和SID下一步去安全日志里反查这个账户的登录痕迹。同一时间在事件查看器eventvwr.msc里快速过滤近7天的登录成功事件事件ID 4624重点看来源IP。RDP爆破特征非常明显同一IP短时间几十上百次4625失败记录后突然出现一条4624成功那基本就是爆破进来了。登录类型相关内容留到第4章详细展开。3. 运行态排查进程、网络与服务3.1 可疑进程的甄别思路账户层查完接着看当前系统上正在跑什么。这一步很多人只会tasklist看一眼就过了但我建议至少做两个动作看进程路径、看父子关系。# 查看所有进程的PID、名称、可执行路径、父进程PID wmic process get processid,name,executablepath,parentprocessid # 新版PowerShell推荐 Get-CimInstance Win32_Process | Select-Object ProcessId, Name, ExecutablePath, ParentProcessId拿到结果后按以下规则筛选命中越多越可疑路径可疑exe/dll位于C:\Windows\Temp、C:\Users\Public\Documents、C:\ProgramData、用户AppData的Temp目录或者干脆路径写的是“奇怪的组合字符”。伪装系统进程进程名为svchost.exe但路径不是C:\Windows\System32\svchost.exe——这是最常见的一眼假。父进程异常cmd.exe的父进程应该是用户会话或者另一个程序启动它如果看到powershell.exe的父进程是w3wp.exe或某个Web服务说明可能是Web漏洞传递过来的命令执行。正常业务系统里一个Word文件的父进程不可能是Windows资源管理器之外的玩意。查签名能进一步确认Get-AuthenticodeSignature C:\可疑文件路径。微软签名的进程有大半是正常的但注意一种“白加黑”利用——攻击者用合法的签名exe去加载同级目录下恶意的DLL签名合法但行为非法所以签名校验只能作为辅助不能作为排除依据。3.2 网络连接排查谁在偷偷外联Windows服务器被入侵后最大的特征是出现异常外联——挖矿连接矿池、木马连接C2服务器。所以netstat是必查项netstat -ano | findstr ESTABLISHED逐条看目标地址和端口重点标记外部IP的高端口如 4444、5555、8080 之外的高位端口以及常见的挖矿端口 3333、4444、5555、6666、7777、8888。连向你业务根本不需要访问的外部IP的连接例如数据库服务器不应该连外部陌生IP。监听的0.0.0.0端口——如果你的服务根本没有对外需求却在0.0.0.0监听多半是后门开着等连接。找到PID后用tasklist /fi pid eq 1234回查进程然后顺着进程路径继续查文件、查启动项。网络连接排查常见误区只查“当前建立的连接”忽略了监听端口和TIME_WAIT状态的残留连接。木马可能连一下就跑TIME_WAIT状态的连接一样能指向外部C2地址建议把netstat -ano完整结果保存下来再针对ESTABLISHED TIME_WAIT LISTENING三种状态分别筛查一遍。3.3 服务与驱动排查服务是Windows持久化的另外一块沃土因为服务自带开机自启和崩溃重启能力攻击者写一个“服务”跑木马比注册表Run键稳定得多。sc query type service state all | findstr /i SERVICE_NAME DISPLAY_NAME STATE wmic service get name,displayname,pathname,startmode,state重点看三个特征StartModeAuto且路径指向C:\Windows\Temp、C:\Users\Public、非系统目录的。服务名的拼音或字母组合看起来很“随机”如Microsoft Update Service这类伪造微软名字的服务。路径是cmd.exe /c开头的服务这种服务执行完就退出了但攻击者用这一条命令去下载运行后续payload。驱动服务更隐蔽driverquery /v可以列出所有驱动对比是否多了奇怪的第三方驱动。普通管理员一般记不住全部正常驱动所以这里建议借助工具如Sysinternals Autoruns或PowerShell的Get-CimInstance Win32_SystemDriver然后优先找启动类型为“系统”或“自动”的陌生驱动。驱动层后门Rootkit在真实攻防里确实存在但对大多数中毒服务器来说能走到查服务这步基本已经能定位了。4. Windows安全日志最该被重视的证据源4.1 先确认日志策略还活着很多管理员排查时不看安全日志理由是“看不懂”。但Windows安全日志是整个取证过程最权威的官方记录攻击者做什么都会留下痕迹——除非他自己就是管理员先把日志停了或者改了策略。所以第一步先检查审核策略是否完好auditpol /get /category:*看“登录/注销”“账户登录”“账户管理”“进程创建”这几类是否处于“成功和失败”或至少“成功”。如果关键策略被关闭说明攻击者有意清理过这也是一个重要结论。4.2 必须认识的几个事件ID打开eventvwr.msc进入Windows日志 - 安全按下面的表格重点筛选事件ID含义排查要点4624登录成功看得登录类型、源IP、登录进程4625登录失败短时间内高频出现爆破4672授予特殊权限管理员权限登录配合4624看4720创建用户新账户出现的时间点4732成员添加到安全组谁把谁加入了管理员组4726删除用户攻击者清理痕迹也可能删账户1102安全日志已被清除重大异常信号直接定级事故7045新服务安装系统日志服务型后门创建记录4.3 登录类型解读4624背后的“Type”秘密安全日志里4624事件中最关键的一个字段叫“登录类型”Logon Type。把登录类型搞明白你才能判断一条登录记录到底是人坐在电脑前输密码还是攻击者远程爆破进来的Logon Type含义说明2交互式登录本机键盘输入或物理机控制台3网络登录访问共享、DCOM等内网凭据验证常见于横向移动4批处理登录计划任务以账户身份运行5服务登录服务以账户身份启动8网络明文登录某些旧协议或IIS基本认证9新凭据登录使用runas或凭据管理器10远程交互登录RDP远程桌面登录排查的重点如果服务器是机房里的物理机或云上的Windows虚机你发现凌晨3点有Type 10登录成功来源IP还是海外那基本不需要再犹豫了——这条记录很可能就是攻击入口。4.4 用PowerShell快速过滤可疑登录事件查看器图形界面筛选慢字段对不上建议直接用PowerShell。比如查最近7天所有RDP远程登录成功的记录Get-WinEvent -FilterHashtable {LogNameSecurity; Id4624; StartTime(Get-Date).AddDays(-7)} | Where-Object { $_.Properties[8].Value -eq 10 } | ForEach-Object { [PSCustomObject]{ TimeCreate $_.TimeCreated User $_.Properties[5].Value SourceIP $_.Properties[18].Value LogonType $_.Properties[8].Value } } | Sort-Object TimeCreateProperties[8]对应LogonTypeProperties[18]对应来源IPProperties[5]对应用户名。不同Windows版本的属性下标可能有差异实际使用时先选中一条4624事件点击“XML视图”看字段名称和对应的Properties下标确认后再批量跑。这是排查过程中最容易踩的坑我第一次用这脚本查日志时就因为下标对不上把管理员用户名全筛出来了白忙一下午。4.5 日志被人清空了怎么办看到事件ID 1102说明安全日志被某人攻击者或管理员主动清除过。这本身就是最高优先级的证据——正常运维不会闲着没事清安全日志。日志被清不代表没线索攻击者清除本机日志之前可能已经在域控、防火墙、云平台安全组、Web服务器日志里留下了横向痕迹。查一下DNS记录、防火墙会话日志、RDP网关日志往往能找到本机日志缺失时间段前后的网络外联行为。另外检查C:\Windows\System32\winevt\Logs\Security.evtx文件大小和写入时间——如果文件被整个删了还没覆盖部分数据恢复工具可能救回一些片段但别抱太大期望重点是转到网络侧查。5. 持久化排查计划任务、自启动与WMI5.1 注册表Run键与启动文件夹攻击者留后门的第一选择永远是“开机自启”最传统的路径就是注册表Run键。手工查一遍也不难reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run reg query HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run这四个位置是最常规的。RunOnce、RunServices、以及策略位置HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run也要看。启动文件夹shell:startup和shell:common startup同理右键属性看指向的exe路径。手工查容易漏更推荐Sysinternals的Autoruns勾选“Hide Signed Microsoft Entries”把微软签名项隐藏掉剩下非微软的启动项逐一核对路径和签名。截图保存一份这就是你判断“开机自启有没有被加料”的依据。5.2 计划任务攻击者最喜欢的隐藏地计划任务比Run键高级的地方在于它可以设置“登录时触发”“系统启动时触发”“每5分钟重复运行”还可以用SYSTEM权限执行真正做到重启后不掉线。攻击者特别喜欢把任务藏到微软自己的任务目录下例如\Microsoft\Windows\...你如果不逐个展开根本找不到。排查命令schtasks /query /fo LIST /v输出结果很长重点看三列任务名称、触发时间/触发器、要运行的任务。发现以下特征就要点开看XMLschtasks /query /xml /tn 任务名任务名伪装成Windows更新或系统组件如Microsoft\Windows\Update\xxx。操作Actions里执行的命令是powershell.exe -enc ...、cmd.exe /c ...、或者指向C:\Windows\Temp下的某个exe。触发条件是“登录时”或“启动时”且重复间隔很短例如每5分钟跑一次——这种设计是为了保证即使你删掉正在运行的进程任务也会把它拉起来。PoewerShell过滤任务XML更高效Get-ScheduledTask | ForEach-Object { $info $_ | Get-ScheduledTaskInfo $actions ($_ | Select-Object -ExpandProperty Actions).Execute [PSCustomObject]{ TaskName $_.TaskName State $_.State Actions ($actions -join ; ) LastRun $info.LastRunTime } } | Where-Object { $_.Actions -match temp|powershell|cmd|public }5.3 WMI事件订阅与COM劫持WMI持久化是近几年攻防教材的高频词因为它完全不出现在启动项、任务计划里甚至tasklist里都看不到它靠WMI服务常驻内存、事件触发执行。排查WMI事件订阅用PowerShell最直接Get-WmiObject -Namespace root\subscription -Class __EventFilter Get-WmiObject -Namespace root\subscription -Class __EventConsumer Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding正常机器上这三个查询结果应该很少基本是空白。出现__EventConsumer里带有CommandLineEventConsumer或ActiveScriptEventConsumer的特别是执行路径指向 exe、bat、ps1、vbs 的基本可以判定是后门。删除可以先记录下来别急着删等文件层证据收集完之后统一清理。COM劫持也值得提一句通过修改注册表HKLM\SOFTWARE\Classes\CLSID\{...}\InprocServer32的默认值把某个正常程序启动时加载的DLL指向恶意DLL。排查方法是导出HKEY_CLASSES_ROOT\CLSID下所有InprocServer32键的默认值筛选指向非系统目录或非微软已签名的DLL项。这类手法比较进阶但后果很隐蔽——很多杀毒软件全盘扫不出来因为木马本身不落地为独立进程而是寄生在正常程序里。6. 文件痕迹排查从时间线还原攻击路径6.1 MACE时间属性文件分析的重武器Windows文件有四个时间属性M(Modified修改时间)、A(Accessed访问时间)、C(Created创建时间)、E(Entry Modified目录项修改时间也就是文件记录本身被改写的时间)合称MACE时间。安全排查时创建时间和修改时间最重要的。攻击者的工具payload、扫描器、加密脚本一定会在某个时间点写入磁盘。你只需要把最近7天内新建的、可执行文件全部列出来基本就能看到攻击者活动的轨迹。入口处建议先查这几个目录这是攻击脚本和下载器最爱的落脚点C:\Windows\TempC:\Users\Public\DocumentsC:\Users\用户\AppData\Local\TempC:\ProgramData\Microsoft\Windows\Templates各盘符根目录下的隐藏文件夹命令示例$dirs ( C:\Windows\Temp, C:\Users\Public, C:\ProgramData, $env:LOCALAPPDATA\Temp ) Get-ChildItem -Path $dirs -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.Extension -in .exe,.dll,.bat,.cmd,.ps1,.vbs,.scr,.sys } | Sort-Object CreationTime -Descending | Select-Object -First 80 FullName, CreationTime, LastWriteTime结果里出现一个7天前创建的svchost.exe那基本等于直球攻击了。6.2 DLL加载与白加黑的核查光查“有没有可疑exe”还不够很多木马以DLL形式存在被正常程序白加黑加载。对着第3章查到的异常进程用Process Explorer或Process Hacker打开点击“DLLs”标签看加载的所有DLL路径。发现某个进程加载了来自Temp、Public、ProgramData的DLL不管这个进程是不是微软签名的都要把这个DLL当作重点样本。没有图形工具也可以PowerShell查模块路径Get-Process -Name 疑似的进程名 | Select-Object -ExpandProperty Modules | Select-Object ModuleName, FileName | Where-Object { $_.FileName -match Temp|Public|ProgramData }查到结果后不要急着删文件。先把文件的创建时间、修改时间、大小、签名状态记录到排查文档里再用copy 路径 C:\evidence\样本名.exe备份一份。后续分析可以用在线沙箱提交到VirusTotal一类平台确认行为也可以本地方便时用隔离环境复现。6.3 查杀工具的正确用法谈到文件层排查必然绕不过杀毒软件。我的建议是在证据收集完成之前别开全盘清除。杀软的全盘扫描和清除功能会直接删掉恶意文件等于把你的证据销毁了。正确顺序是先按前面章节完成人工排查把样本和日志备份好最后才进入清理阶段。清理阶段可以用Windows自带的Microsoft Defender离线扫描或者常用的火绒、360系统急救箱等工具做最后一遍查漏。真正的排查看重不在一键扫描而在于你通过时间线、路径、进程、日志把人家的“作案路径”拼出来了查杀只是收尾动作。7. 一次典型排查场景串联7.1 场景凌晨的挖矿告警某台Windows Server 2016同事凌晨收到告警CPU持续跑到90%以上外联流量异常增大。我远程登录上去后第一步不是看CPU也不是杀毒而是先确认这台机器能不能断网——跟业务方确认可以隔离后在云控制台只放行我的管理IP相当于拔了对外网线。然后按时间顺序执行第1章说的证据保全命令把进程、网络、服务、账户列表全部导出到C:\evidence。7.2 顺着链路定位打开进程列表先看到名为svchost.exe的进程占CPU极高但路径指向C:\Windows\Temp\svchost.exe第一眼就锁定异常。再用netstat -ano找到这个PID对应了到境外IP 45.xx.xx.xx:3333 的ESTABLISHED连接挖矿特征极其明显。接着查计划任务果然发现一个叫Microsoft\Windows\Maintenance\SystemCheck的任务每5分钟执行一次C:\Windows\Temp\svchost.exe。顺手查账户列表发现多了一个helpdesk$用户。安全日志里攻击前一天的凌晨有从某个内网办公IP发起的大量4625失败记录随后跟着一条4624成功记录登录类型是10RDP。到这里整个事件链已经拼出来了攻击者通过RDP爆破进来创建隐藏账户建立长期入口写入计划任务保证挖矿进程被杀了也能拉起来挖矿程序本身放在Temp目录伪装成系统进程。7.3 处置与加固完整证据备份后清理动作按顺序执行禁用并删除计划任务schtasks /delete /tn Microsoft\Windows\Maintenance\SystemCheck /f。删除隐藏账户net user helpdesk$ /delete顺手复查管理员组确保没有别的残留账户。结束挖矿进程并删除C:\Windows\Temp\svchost.exe。修改所有管理员密码并把Administrator账户改名或禁用RDP设置上启用NLA网络级别身份验证。在RDP层面配置账户锁定阈值连续5次失败锁定15分钟同时限制来源IP白名单。这一套下来挖矿告警没有再出现过。事后复盘最关键的转折点其实就是第3章那个路径查询命令——如果没有看进程路径光靠杀毒软件扫大概率只能清掉进程而漏掉计划任务重启后一切照旧。最后分享几点心得做Windows安全排查这几年我最深的体会是“先保现场、后谈修复”这条铁律。大多数人在看到异常的第一反应是着急处理但这种着急恰恰会让问题变成僵尸——看起来没了过两天又起来。备份证据、记录操作、按链路逐层排查看起来慢实际上是最快的路。还有个小技巧把日志审查做成例行习惯不要等出事才去翻事件查看器。每周花十分钟看一眼4625失败次数和7045新服务记录很多问题在爆发之前就有明显的预兆。我见过太多真实案例攻击者早就进来了在后门里蹲了几周甚至几个月期间系统日志里全是爆破失败的记录但因为没人看直到数据被加密勒索才被发现。养成看日志的习惯比装多少安全软件都管用。
返回列表