拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

MS17-010永恒之蓝漏洞全解析:从SMBv1原理到企业安全加固

MS17-010永恒之蓝漏洞全解析:从SMBv1原理到企业安全加固 1. 为什么一个2017年的老漏洞到现在还有人在中招先讲一个前几天真实发生的事。有个朋友的公司内网一台Windows Server 2008 R2常年跑着一个老旧的ERP系统一直没动过。前阵子全公司电脑突然开始弹勒索提示文件全部被加密后缀统一变成随机的字母组合。排查下来入口就是这台Server 2008 R2攻击者利用的正是MS17-010也就是大家常说的永恒之蓝。这绝对不是什么小概率事件。虽然这个漏洞的补丁早在2017年3月就发布了之后又经历了WannaCry的全球大爆发但直到今天它依然是内网渗透测试和真实攻击中出场频率最高的漏洞之一。很多安全团队统计过在暴露到公网的Windows主机里开着445端口且未修复MS17-010的系统数量仍然是一个可观的数字。你甚至不需要什么高深的攻击技巧只要能跟目标主机建立SMB连接把精心构造的数据包发过去就能获得远程代码执行权限。这个现象背后的原因其实很现实。第一大量老旧的Windows系统还在服役尤其是Windows 7、Windows Server 2008这类已经停止官方支持的系统企业因为业务兼容性、老旧硬件驱动、内部软件依赖等种种原因没法升级。第二补丁管理在中小型企业里长期处于装了就好、没装也没事的放任状态等意识到问题的时候攻击者早就进过好几轮了。第三永恒之蓝这个漏洞利用本身的稳定性非常高攻击者不需要做太多适配工作就能打穿目标攻击成本低、回报又高自然被反复使用。这篇文章我想把MS17-010彻底讲透。从漏洞的根源成因、攻击链路里的每一步关键动作到如何在企业环境里做排查、验证、修复和长期防御全部用实际场景来说明。文章里不会带任何具体的攻击载荷代码重点是从防御和运维的视角帮你理解这个漏洞是怎么回事、该怎么对付它以及它背后暴露出来的一系列Windows内网安全问题。如果你是安全运维工程师、系统管理员、企业IT负责人或者只是自己电脑上开着共享文件夹的普通用户这篇内容应该对你有实际帮助。你会知道为什么445端口这么危险、SMBv1协议为什么必须干掉、以及当你说这台机器打了补丁的时候到底应该验证什么。2. 漏洞根源SMB协议和srv.sys的那些算不清的账MS17-010不是一个单一漏洞而是一组漏洞的集合。微软在2017年3月发布的安全公告里把这个更新编号为MS17-010对应的CVE编号包括CVE-2017-0143、CVE-2017-0144、CVE-2017-0145等几个全部集中在SMBv1协议的远程代码执行漏洞上。要说清楚这个漏洞得先搞明白SMB协议在Windows体系里是什么位置。2.1 SMB协议到底是干什么的SMBServer Message Block是Windows系统最核心的网络文件共享协议。你在资源管理器里输入\\192.168.1.10\share去访问另一台电脑的共享文件夹走的就是SMB。打印机共享、域环境里的很多认证交互、组策略下发也都依赖SMB。它天生就是一个允许远程系统在你机器上读写文件、执行特定操作的协议所以攻击面天然就大。SMB协议运行在TCP的139端口NetBIOS会话和445端口直接承载SMB流量上。其中445端口是重中之重因为现代Windows环境里SMB流量基本都走445。你把一台Windows电脑插上网线系统默认就会监听445端口等待其他机器发起SMB连接。这意味着每一台接入网络的Windows设备本质上都开了一扇让别人能按SMB规则跟你交互的门。如果这道门后面的代码有漏洞风险就是全域性的。2.2 SMBv1为什么成了老古董里的高危品SMB家族里目前主流的是SMBv2和SMBv3但SMBv1这个版本从1980年代的DOS时代就开始积累历史包袱了。它是一个极其古老的协议版本设计时根本没考虑过今天的安全威胁模型——没有现代加密、没有完整性校验、认证机制薄弱。更要命的是出于兼容性考虑一直到Windows 10和Windows Server 2016系统默认还保留着对SMBv1的接收和处理能力很多共享打印机、老旧NAS也还在用SMBv1通信。漏洞的具体位置是在Windows内核驱动srv.sys处理SMBv1请求的过程中。这里说的内核驱动你可以理解成负责跟网络请求打交道、并直接访问系统核心资源的底层程序。攻击者发送特制的SMB数据包srv.sys在处理这些数据包时没有正确验证数据结构的长度、偏移量和边界条件导致内存中的数据写入超出了预期范围触发缓冲区溢出。我举个粗浅但不失真的类比。缓冲区就像一个小桶程序预期每一份请求数据都装得进这个桶。但如果桶的容积是固定的而请求里携带的附加内容不受控制地往桶里灌水就会溢出桶外。在安全领域溢出到桶外的水会覆盖相邻内存区域里原本的数据如果攻击者能精准控制溢出的内容就能改变程序原本的执行逻辑让系统去执行攻击者想执行的代码。MS17-010系列漏洞的可怕之处就是在内核这个最高权限层发生了这种溢出一旦利用成功攻击者拿到的直接就是系统最高权限SYSTEM权限。2.3 为什么SMBv1的代码路径成了重灾区你可能想问SMBv2和SMBv3也有漏洞为什么SMBv1偏偏成了经典中的经典因为微软在SMBv2/v3的代码设计上引入了大量现代安全机制比如更严格的输入验证、更安全的内存分配策略、对异常长度的处理更完善。而SMBv1的代码路径几十年没变过很多旧代码为了兼容各种老设备保留了自由度过高的解析方式比如说在处理SMB_COM_TRANSACTION这类复杂事务结构时对嵌套数据块的大小和偏移量验证不足。攻击者只需要精心构造几个字段让SrvOs2FeaToNt这类函数在处理扩展属性Extended Attributes时发生内核态越界写入就能稳定地触发漏洞。这也是为什么MS17-010的利用代码在野外的成功率特别高——它对协议的理解要求并不高关键是构造的数据包能精确命中那些没做边界检查的代码分支。这个漏洞爆出来之后安全圈迅速给出了多个版本的利用工具而且被集成进了Metasploit等主流渗透框架门槛进一步降低。做完这些事的人心知肚明漏洞利用的门槛越低防御侧的生存压力就越大。3. 攻击链路拆解从端口扫描到拿到系统权限一共几步理解了漏洞本质我们再看攻击者的完整行动路径。把攻击链路拆开看每一步其实都有对应的防御抓手。3.1 第一步发现暴露在公网或内网的SMB服务攻击者需要先找到目标。互联网上有大量主动扫描器在持续测绘全网IP段寻找开放445端口的Windows系统这个行为本身就是自动化脚本在跑的无时无刻不在发生。在内网渗透场景里攻击者往往先通过钓鱼邮件打进一台机器或者通过Wifi进入办公网然后用扫描工具对网段内的主机做一轮快捷的端口扫描找出所有监听445的主机。这个步骤里攻击者关心几个信息445端口是否开放、操作系统是什么版本、补丁打得新不新。Windows系统的TCP/IP协议栈指纹、SMB协商返回值等都能泄露系统的具体版本号。老版本系统Win7、Server 2008、Server 2008 R2一旦被发现几乎就等于暴露了自己的弱点。3.2 第二步漏洞探测与目标确认攻击者会发送探测包判断目标是否真的存在MS17-010相关漏洞。这个探测逻辑基于SMB协议本身的特性——未打补丁的系统在解析某些特定格式的数据包时响应内容和已打补丁的系统有明显差异。例如利用smb_ms17_010这类探测模块攻击者可以快速批量验证内网里哪些主机存在漏洞。这一步的核心价值在于攻击者不希望把宝贵的时间浪费在打不穿的目标上。一个优秀攻击者的思维是先找到最佳切入点再集中资源突破。3.3 第三步触发溢出获得代码执行权限确认目标存在漏洞后攻击者就开始发送精心构造的恶意SMB数据包。整个利用过程大致分几个阶段先建立SMB会话然后发送特定类型的事务请求触发srv.sys中的越界写入再通过内存布局的精细控制实现任意地址写入最终完成内核态Shellcode的落地和跳转执行。从攻击者的视角看这里最关键的是利用稳定性。有些缓冲区溢出漏洞利用就跟开盲盒一样打十次只能成功两三次但永恒之蓝不是这样——它的利用脚本经过大量改进后在目标系统未打补丁的前提下成功率非常高。而且它还有一个很实际的优点无需用户交互、无需认证直接远程触发。也就是说只要攻击者和目标主机之间存在网络通路并且445端口可达攻击者就能完成从网络请求到系统权限的跃迁。3.4 第四步注入载荷实现长期控制拿到代码执行权限后攻击者通常会立刻执行一段Payload为自己建立一个高权限的远程会话。常见的选择包括添加一个新的管理员账户或启用Guest账户并加入管理员组为后续远程登录留后门。上传Webshell如果目标是Web服务器。直接运行勒索软件WannaCry就是很好的例子把整个磁盘的文件加密后勒索赎金。植入C2木马把主机纳入僵尸网络后续随时下发指令。永恒之蓝在WannaCry事件里扮演的是运输工具角色——它负责把勒索载荷送到目标机器上并执行。到了今天不少勒索软件家族的变种仍然在复用这个能力包括一些针对特定行业医院、制造业的攻击行动依然是先扫445再试永恒之蓝。3.5 防御侧真正该关注的事情攻击链路拆完之后你会发现每个环节都有切断它的办法。端口扫描靠网络边界防火墙控制漏洞探测靠及时打补丁利用触发靠禁用SMBv1、升级SMB协议版本最后载荷执行靠终端安全软件EDR/杀软和行为检测。没有任何单一防御手段是万能的但多层防御叠加起来攻击者的成本就会急剧上升很多时候他就放弃你这个目标转去打更容易得手的家伙了。4. 排查与验证怎么判断自家环境里到底有没有风险在实际运维工作中最怕的不是漏洞本身而是不知道自己有没有中招、不确定环境里是否还存在风险。我见过太多事故报告最后复盘时发现那台机器三年前就该打补丁一直没人管。所以从排查开始就要有章法。4.1 从主机侧检查补丁安装情况对于一台在网的Windows主机第一步是看系统补丁是否覆盖了MS17-010。你可以在这台机器上直接查看已安装更新进入控制面板-程序和功能-查看已安装的更新搜索KB4012212Windows 7 SP1和Windows Server 2008 R2 SP1对应的安全更新。不同系统版本对应的补丁号不同Windows Server 2012对应KB4012216Windows 8.1对应KB4012213Windows 10的早期版本对应KB4012606等。用PowerShell也可以查询wmic qfe list | find 4012212或者Get-HotFix -Id KB4012212。这里有一个容易踩的坑就算你看到系统装了某个2017年之后的累积更新包也不能想当然地认为MS17-010已经被修复。有些更新包确实包含安全修复但有些独立安全更新和累积更新的覆盖关系非常复杂。最稳妥的办法还是直接用漏洞扫描器去验证或者手工构造探测包确认。4.2 检查SMBv1是否处于启用状态如果没有安装补丁但SMBv1已经被禁用那么风险也能大幅降低——攻击者的利用链根本走不通。所以SMBv1的状态检查非常关键。在Windows 10/Windows Server 2016及以上的系统上用管理员权限打开PowerShellGet-SmbServerConfiguration | Select EnableSMB1Protocol如果返回结果是True说明SMBv1还是开着的。对于Windows Server 2008 R2这类老系统没有这么直接的命令你需要通过查询注册表来判断HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 注册表项 SMB1 的值0表示禁用1表示启用 HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters 注册表项 SMB1 的值同理这里提醒一句仅仅禁用SMBv1不等于彻底免疫MS17-010。微软在MS17-010公告里明确说明这个漏洞虽然出现在SMBv1的代码路径里但禁用SMBv1只是缓解措施最可靠的做法仍然是安装对应补丁。况且SMBv2/v3历史上也出过其他漏洞补丁管理始终是主旋律。4.3 从网络侧扫描确认暴露面内网里这么多机器一台台去登录检查不现实更高效的办法是从网络侧做一轮扫描。Nmap是这里最常用的工具比如扫描某个网段内开放445端口的主机nmap -p 445 --open -sV 192.168.1.0/24这个命令会列出网段内所有445端口开放的主机并且通过服务版本探测返回系统类型信息。先圈定445端口开放这个高风险集合再结合Get-HotFix或扫描器检查补丁状态重点去验证那些最危险的主机。如果你有Nessus、OpenVAS这类漏洞扫描器里面有现成的插件专门检测MS17-010扫出来的结果会直接标明Critical或者严重。内网渗透和红队评估里也常用Metasploit的smb_ms17_010模块做验证用于确认漏洞存在这类使用属于授权范围内的安全测试我反复强调一句未经授权对任何系统做漏洞探测和利用都是违法行为这篇文章所有内容仅限于你对自己负责的网络资产做防御性检查。4.4 安全日志里找痕迹如果你的环境里已经发生过攻击或者你想确认某个系统是否曾经被扫描/被利用过可以查看Windows安全日志。MS17-010利用过程通常伴随着异常的大量SMB连接请求、登录失败记录以及可疑的账户创建/更改事件。重点看几个点安全日志中的4625事件登录失败、4624事件登录成功特别是来自异常源IP、异常时间段的记录。系统日志里来自srv.sys的报错或警告记录。是否有新账户被创建事件ID 4720下设账户是否被加入本地管理员组事件ID 4732。网络连接日志里是否有大量指向同一IP的445端口连接。我建议有条件的企业把这些日志集中采集上来比如Windows事件转发或SIEM否则攻击事件发生之后你根本拼不出完整的攻击链。等你知道被打了可能已经过去几个星期了。4.5 一个典型的排查判断逻辑综合以上你可以按下面的逻辑去判断一台主机是否高风险条件风险判定445端口对外开放公网可达极高风险未安装MS17-010安全更新极高风险SMBv1协议处于启用状态高风险系统为Windows 7/Server 2008/Server 2008 R2且停止支持高风险内网可达但入站流量有防火墙白名单限制中风险已安装补丁且SMBv1已禁用低风险真实环境里你还会遇到一些看起来打不了补丁的机器。这时不要直接放弃而是要把风险量化这台机器在内网哪个位置、谁能访问它、它跟域控和关键业务系统的关系是什么。单独看补丁状态是不够的要从网络访问路径的综合视角看风险。5. 修复与加固从补丁到网络层层层堵死漏洞利用路径排查出风险不等于风险被处置了。真正动手加固的时候要按优先级和可操作性来排。下面是我在实际项目里总结出来的加固顺序。5.1 最根本的修复给操作系统打上MS17-010补丁只要系统还在支持周期内安装安全更新永远是第一选择。MS17-010对应的补丁号已经在上文提到了这里再把典型版本的补丁号列一遍系统版本对应安全更新编号Windows 7 SP1 / Server 2008 R2 SP1KB4012212Windows Server 2008 SP2KB4012215Windows 8.1 / Server 2012 R2KB4012213Windows Server 2012KB4012216Windows 10 (1511版)KB4012606Windows Server 2016KB4013429打补丁之前建议先在非生产环境验证一遍确认业务系统兼容性没问题再批量推广。尤其是那些跑着老旧业务系统的机器补丁引发的问题有时候比漏洞引发的问题更让你头疼。不过头疼也要打实在打不了的就看下面的替代方案。5.2 彻底禁用SMBv1协议所有联网的Windows机器尤其是Server系统我都建议直接禁用SMBv1。除非你有确凿的兼容性需求比如老旧的复印机、扫描仪必须用SMBv1共享否则这个2019年就被微软标记为不再默认安装的老协议没有理由继续留在生产环境里。在Windows 10/Server 2016上一行PowerShell就够了Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force Set-SmbClientConfiguration -EnableSMB1Protocol $false -Force禁用之后建议重启系统然后用Get-SmbServerConfiguration再核实一次。对于Windows Server 2008 R2这类老系统通过注册表和关闭依赖功能来实现Get-WindowsFeature FS-SMB1 Remove-WindowsFeature FS-SMB1同时把注册表里的SMB1值改为0。这里注意禁用SMBv1之后依赖SMBv1的旧设备可能无法正常访问共享你需要提前把打印机、计费系统、老旧NAS等设备排查一遍。我的建议是宁愿后续一个个解决兼容性问题也不要留着一个被全网攻击者垂涎的漏洞。5.3 网络边界449和139端口不该暴露在公网如果你的业务场景真的不需要从公网访问Windows共享那么任何公网或跨安全域边界的445/139端口流量都应该被阻断。在边界防火墙上明确拒绝以下入站规则TCP 445SMB直接承载TCP 139NetBIOS会话TCP 137/138NetBIOS名称服务通常配合139使用UDP 137/138NetBIOS名称解析不要觉得这是理所当然的。我见过不少制造业公司、医疗机构的IT环境边界防火墙规则形同虚设或者运维人员为了远程调试某个共享文件夹把445端口映射到了公网。更常见的情况是运营商分配的公网IP直接暴露了内网服务器而防火墙策略压根没有限制445入站。用防火墙规则阻断公网访问之后还要确认一件事你内网里不同安全域之间445端口是否也必须全互通好的做法是只允许业务确实需要SMB互访的子网之间开通规则其余网段全部默认拒绝。5.4 遗留系统与无法打补丁设备的替代方案在医院、工控、制造业这些场景里这台机器没法打补丁是真实存在的情况。一台医疗影像设备连着Windows 7主机一套工控软件只认Server 2008运维团队一听要打补丁就摇头。这种情况下就要做无补丁补偿性控制把风险先用别的方式压缩下来将这些设备单独划分到一个隔离VLAN或安全域禁止与办公网、互联网互通。配置严格的防火墙白名单只允许该设备的业务端口和特定管理IP访问其余一律拒绝。在网络边界部署入侵检测/防御系统重点监控SMB协议的可疑流量特征。如果硬件资源允许考虑把这些服务虚拟化后迁移到现代虚拟化平台上通过虚拟机快照来做安全补丁验证。给这些机器装上轻量级EDR或者至少可靠的杀毒软件并设置主动式威胁防护策略。必须承认这些补偿控制措施的效果不完全等于打补丁但结合网络隔离后攻击者要触达目标得穿透的层数就大幅增加了很多自动化攻击脚本会在第一层就被挡住。5.5 修复完成后的验证修复做完后一定要验证不要觉得我打了补丁应该没事了。我的习惯是修复一批就立刻扫一遍确认结果落库。验证方式包括用漏洞扫描器重新扫描整改过的主机确认MS17-010插件不再报漏洞。用Get-HotFix检查补丁是否真的安装成功。用Get-SmbServerConfiguration确认SMBv1状态是False。检查防火墙策略确认445端口入站规则已生效。把验证结果记录到整改台账里哪天有人问这台机器到底处理过没有你拿出来的不应该是记忆而是扫描报告和时间戳。6. 从永恒之蓝看企业安全建设的底层逻辑写到这里我想跳出漏洞本身聊聊这次事件背后的东西。我刚入行的时候也以为安全建设就是装个杀毒软件、定期打补丁就完了。但后来经历了几次真实的事件响应慢慢意识到永恒之蓝这类漏洞更像是一面镜子把企业安全体系的薄弱环节照得清清楚楚。首当其冲的是资产盘点问题。很多企业根本说不清自己有多少台Windows机器更别说每台机器安装了哪些补丁、暴露了哪些端口。这就像一个仓库管理员不知道仓库里有什么货物那防盗系统做得再好也只是花架子。我自己处理过的一个案例里客户IT部门报给管理层的有286台服务器实际扫描发现445端口开放的主机有412台多出来的100多台根本没进资产台账。资产管理做不到位漏洞管理就是一场盲人摸象。补丁管理也很有代表性。MS17-010之所以成了经典漏洞就是因为补丁已经在系统里躺了很多年企业还是没有安装。我见过有的企业补丁分发全靠管理员手工去每台机器上装也见过有的企业SCCM这类自动化工具都有买但分发策略配得一团乱补丁装了又回滚回滚后也没人发现。补丁管理不是有空再打它是整个安全体系里可量化、可自动化的安全措施之一值得用制度化流程去推进。每个季度做一次全员漏洞扫描、每周同步一次补丁状态都可以大大降低被人用着犊子漏洞打进内网的概率。再说说网络分层的价值。永恒之蓝只能通过SMB协议路径利用这一事实说明网络访问控制是极其重要的纵深。如果边界防火墙上445端口压根就不对公网开放那WannaCry当年再厉害也最多只能在受害者的内网里横向移动而不是从公网直接打进来。将不同业务系统按安全级别隔离特别是生产网、办公网、开发测试网、外部服务网这四类网络之间严格控制访问策略很多基于网络可达性的漏洞就失去了用武之地。我还想特别提醒一点不要迷信杀软能挡住一切。WannaCry爆发初期不少装了杀毒软件的主机一样被加密。终端安全产品的价值在于提升攻击者的执行成本、减少攻击后的影响面但它替代不了补丁管理、网络隔离和资产识别。安全建设讲究的是多个层次的防守每层都做一点攻击者付出的代价就高一点直到他觉得你这块骨头太难啃自动放弃为止。最后说点个人体会处理这类遗留漏洞最大的障碍从来不是技术而是组织和管理上的惯性。你可以在技术博客里写一百种封堵方法但真到了企业里要让各部门配合停业务、打补丁、改端口难度比技术本身大得多。我的建议是先把风险数据说话用扫描报表告诉老板再不打补丁下一次勒索事件的赎金可能比打补丁的成本高几个数量级推动管理层把漏洞处置变成硬性指标。技术是死的管理是活的真正能把安全做好的企业不是没有遇到过永恒之蓝而是遇到之后用体系化的方式把它彻底堵死了。
返回列表