第六章 寻找零日漏洞

最后更新于:2022-04-01 21:17:01

8月一个周五的夜晚,莫楚(Liam O’Murchu)正在加州威尼斯一个时尚的楼顶酒吧里,为自己的33岁庆生。他租下了欧文酒店顶楼一处可以看海的露天U形酒吧卡座,正在开心的跟女朋友、爱尔兰来的表兄妹和一大帮朋友一起,一杯接一杯的喝着酒。就在他们旁边,一名真人秀节目记者正在拍摄坐在一起的一对男女,不放过这场“私人约会”中任何一个会让观众捧腹的尴尬举动。耶,这就是传说中的度假天堂——南加州。 [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-08_5666b176695d0.jpg)](http://www.aqniu.com/wp-content/uploads/2015/10/640.webp-24.jpg) 欧文酒店 [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-08_5666b17681e72.jpg)](http://www.aqniu.com/wp-content/uploads/2015/10/640.webp-25.jpg) 楼顶的酒吧卡座 钱哥9点钟露面时,莫楚他们已经玩了3个小时了。但钱哥的心思根本不在Party上。他特别想给朋友和同事们看个邮件,告诉他们当天早些时候突然出现的一个重大新闻。但他又怕莫楚一看到这个,就没心思想别的事了。结果,他还是没忍住。“我告诉你一件事,”钱哥跟莫楚说,“但你得答应我今天晚上不要谈论它。”莫楚点点头。 钱哥掏出黑莓手机,打开了邮件。邮件是另一家反病毒公司的研究员发来的,内容是提示他们,震网中可能还利用了另外一个零日漏洞。莫楚瞪大了双眼,盯着钱哥。他们已经花了几周时间,对震网的各个组件进行逆向工程,也的确发现过暗示存在其他零日漏洞的线索,但却没有足够的时间去进一步挖掘。漏洞的线索藏在实现传播病毒的“导弹”部分代码中,但他们一直在聚焦于感染西门子软件和PLC的“载荷”部分代码。 邮件没讲多少细节,而且也看不出这位研究员到底是已经找出了新的零日漏洞,还是跟他们一样只看到了线索。不管是什么情况,莫楚的斗志再次被点燃了。“就这样,”莫楚说,“今天晚上我不会再喝了。”第二天,周六一早,莫楚就来到办公室,一头扎进代码里。 周六的办公室空空荡荡,真是专心做事的好地方。在转向载荷部分之前,公司研究团队已经完成震网导弹部分中多数代码的功能标注工作,那么现在要做的,就是结合这些标注,把整个导弹部分代码仔细梳理一遍,以寻找漏洞利用程序的踪迹。当然,这事可不像说起来这么容易。必须跟踪代码与操作系统和其他应用程序之间的每一个动作,并观察代码与系统和程序间相互作用的方式,看其中是否存在疑点。比如,它是否强制某个应用程序执行了一个本不应执行的动作?是否越过了安全边界?是否绕过了系统权限?经过逆向工程之后的导弹部分,共有数千行代码,必须要对每一行进行认真检查。 震网的结构是非线性的,所以要对其行为进行追踪倍加困难。命令跳转来跳转去,莫楚只好一行代码一行代码的抠、一个步骤一个步骤的看。 1小时后,他非常确信,自己发现了第二个漏洞利用程序。他立刻搜索了漏洞利用程序的档案库,看看这个漏洞是否曾被人利用过,结果是“没有记录”。之后,他又用一台安装Windows最新版本和升级补丁的计算机对这个漏洞利用程序进行测试,结果仍然符合预期。零日漏洞的身份得到了确认。这一次,震网利用一个Windows键盘文件中的零日漏洞,实现了对系统的提权。(非法获得System权限) 作为黑市商品,零日漏洞是很值钱的。莫楚认为,在一次攻击中,冒着被发现的风险同时使用两个零日漏洞,似乎是种不可理喻的资源浪费。但他没有停下来。他把刚才的发现记录下来,回过头去继续分析代码。 几个小时后,他觉得自己好像又发现了一个漏洞利用程序——有迹象显示,震网正在利用Windows打印缓冲功能中的一个漏洞,实现病毒在共享打印机的各台计算机之间的传播。他再次用另一台装好最新补丁的计算机进行了测试、再次搜索漏洞利用程序档案库,再次发现没有历史记录。几周前那种令人“头发倒竖”的兴奋感再次来袭。他再次将其记录,又一头扎进代码。 到了下午三四点钟,钱哥过来看莫楚,发现他睡眼惺忪,已经累到不行了。他把分析结果交给了钱哥。钱哥拿过接力棒,然后一直干到深夜。周日继续加班一天。到周末过完的时候,他们已经发现了3个零日漏洞!!!加上之前在.lnk文件中发现的那一个,他们一共从震网这一个病毒中找到了4个零日漏洞。 他们觉得这实在太疯狂了。一次攻击中能利用一个零日漏洞已经够厉害了。两个都是浪费。4个?是谁干的?为什么这样做?你们这是在暴殄天物好不好!一个顶级的零日漏洞连同相应的漏洞利用程序,可以在黑市上卖到5万美元以上,在以政府的网络部队和间谍机构为卖家的内部灰色市场上甚至能卖到10万。要么攻击者手上拥有N多零日漏洞、根本不在乎用掉几个,要么攻击者就是孤注一掷、而且确实有足够的理由赋予病毒顶级的传播能力、确保命中最终目标。钱哥和莫楚觉得,这两种推测都有理。 钱哥向微软报告了他们新发现的几个零日漏洞利用程序,但很遗憾,俄罗斯的卡巴斯基实验室已经捷足先登了。震网的新闻甫一面世,卡巴斯基就组织了一个10人团队,开始对导弹部分代码进行分析。几天之后,他们找到了第2个病毒利用程序,几周后又找到了第3个和第4个。微软接到他们的报告后,已经开始了制作补丁的工作。但是,遵循“负责任的漏洞发布规则”,任何一方都不会在微软发布补丁之前,把这件事公开。 震网中有4个零日漏洞,令人印象深刻,但这还不是故事的结尾。在钱哥和莫楚周末的“代码分析马拉松”中,他们还发现,震网除了利用零日漏洞进行传播之外,还有一共8种不同的感染方法。震网的代码简直堪称一套专门用来侵入系统并实现传播的“瑞士军刀”。 最重要的一个发现,是它能够感染Step 7的项目文件。这些文件,是程序员用来给PLC编程的。而且,它还破掉了西门子公司“固化”(hard-code,硬编码)在Step 7软件中的用户名winccconnect和密码2WSXcder。这组用户名和密码是Step 7用来连接后台数据库的。把它破掉,就意味着可以攻击者可以把病毒注入后台数据库所在的计算机。同时,这个数据库由所有使用Step 7的程序员共享,这样病毒又可以感染所有登录数据库的Step 7程序员。这两个传播大招,极大增加了利用“程序员在染毒后,使用(带毒)笔记本或U盘连接PLC并对其编程”的机会,和最终成功“伞降”PLC的可能性。攻击者利用了Step 7系统某个模糊特征中的漏洞,感染了它的项目文件,这表明攻击者掌握着少为人知的Step 7系统相关的专业知识。这一点,是本次攻击“开挂”的另一个信号。 与传播机制并行,震网还拥有自动寻找新版本、更新旧版本的点对点传输功能。这使得震网可以通过不直接连接因特网的内网计算机,完成对自身的远程更新。为此,震网在每台被感染计算机上都安装了文件共享服务端和客户端,这样处于同一局域网的计算机就可以相互通信、并比较各自的病毒版本。只要有一台计算机上出现更高版本,就会立刻自动更新网内所有低版本的病毒。也就是说,只要将新版本病毒引进来,就能迅速实现局域网内全部病毒的更新。(待续) 从震网所运用的所有感染方法来看,攻击者的意图就是不惜一切代价传播病毒。但与多数病毒利用电子邮件或恶意网站实现对成千上万台计算机的快速、即时传播不同,震网从不利用因特网。相反,震网只是凭借某个用户用U盘从一台计算机传播到另一台计算机,或者通过局域网传播。基于此特点,可以判断攻击者知道他们的目标系统并不在因特网上。同时,对零日漏洞史无前例的运用,说明他们要寻找的目标不仅价值连城,而且防护严密。 但是,通往目标的路线迂回曲折,很难找到一个清晰、简洁的攻击方法。打个比方,这就像是打算让某种致命病毒感染本•拉登众多妻子中的一个,然后再让她去感染拉登一样。病毒只能感染与“拉登之妻”有关的人,从而导致意图遭到暴露的可能性越来越大。震网最后的结果,恰恰就是这么回事。他感染了太多“外围计算机”,这让震网迟早会由于某些不可控的问题被人发现。 当钱哥再次检视攻击者用到的感染方法和漏洞利用程序时,他发现其中蕴含着某种逻辑。每个感染方法/漏洞利用程序都有明确的任务,并能够解决攻击者为达成最终目标路上的一个特定的障碍。就像是有一个人为了完成这次攻击,列出了一个漏洞利用程序清单——有的用来提权、有的用来在目标所在内网中传播、有的将载荷送入PLC——然后,再找人按图索骥,或者从市场上买,或者自己开发。这充分表明,为了此次攻击,攻击方在组织筹划方面可谓呕心沥血。 其中,对完成整个攻击最关键的两步,一步是对.lnk中漏洞的利用,一步是对Step 7项目文件的感染。因为,这两步对于震网能否抵达最终目标——西门子的PLC至关重要。给PLC写代码的程序员一般会使用连接因特网的工作站进行编程,这些工作站与工业生产网络或工厂中的PLC之间是彼此隔离的。要把编好的程序载入PLC,必须有人用笔记本通过数据线直接连接PLC,或者用U盘把程序转存到一台用于工业控制配置与编程、装有Windows系统的笔记本——场控编程器(Field PG)上。场控编程器不连接因特网,只与生产网络和PLC相连。那么,先感染Step 7项目文件,再用U盘“摆渡”的方法翻越内外网之间的物理隔离(air gap),攻击者就能成功的将每名PLC工程技术人员变成一个潜在的武器运送者。 [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-08_5666b1769ce25.jpg)](http://www.aqniu.com/wp-content/uploads/2015/10/640.webp-26.jpg) 震网传播示意图 当钱哥和莫楚将震网用于传播的所有漏洞及其利用程序记录归档后,他们意识到,还有一些问题需要弄清楚。多数问题是他们之前知道,但没在意的。比如,Ada公司当时没有发现.lnk漏洞被利用过的迹象,但微软却发现,2008年11月,一伙网络犯罪分子正是利用了这个漏洞,将Zlob木马的一个变种植入目标计算机。虽然反病毒引擎当时发现了这个木马,但却没有挖出它里面的零日漏洞,所以直到震网出现,这个漏洞也没有得到修复。与之类似,打印机缓存漏洞之前也出现过一次——在2009年3月波兰的一个网络安全期刊上。期刊刊登了关于这个漏洞的一篇论文,其中还包括如何利用此漏洞进行攻击的代码。不过,当时这条消息并没有传到微软那里,所以微软没有为这个漏洞制作补丁。同样,西门子Step 7软件中“固化”用户名/密码泄漏的事情,有人早在2008年4月就已经在西门子客户论坛上贴出来了。 钱哥和莫楚想知道,震网攻击方是否有一个专门负责搜索黑客论坛和安全网站,并收集漏洞及漏洞利用程序的信息团队?如果确实有,那么攻击方就可以根据攻击需求,直接使用这些漏洞利用程序,或者以此为线索从市场上联系买家。 令人不解的是,在2009年上线的震网病毒第一版中,只出现了“打印机缓存”这一个漏洞。其他漏洞在2010年3月上线并快速传播、继而引发失控的版本中才露面。2009年的版本也做了通过U盘传播的功能,但利用的是Windows系统的U盘自动运行(Autorun)功能。如前所述,用户可以通过关闭这项功能来避免攻击。所以,2010年3月的版本中,攻击者用.lnk的零日漏洞利用程序替换了利用Autorun的代码。 攻击者还在2010年3月版病毒中增加了另外一项重要内容:用于标记驱动程序的瑞昱公司数字签名。 钱哥和莫楚在对比两个震网病毒版本的区别时发现,2009年的版本略带谨慎,而2010年的新版本通过增加更多的传播机制,刻意加强了侵略性。这背后,可能是想要更快到达攻击目标、或破坏更多离心机的放手一搏。利用.lnk漏洞,比利用Autorun漏洞的传播效率显然更高。但是,当这些新的手段提高震网到达目标可能性的同时,也带来增加了感染更多计算机的风险。事实上,新版本在使用多个零日漏洞之后,震网迅速感染了伊朗国内外的10万多台计算机。这些多余的感染对攻击者到达目标毫无帮助,却大大增加了被发现的机会。想必攻击者对新版本所具有的超强传播力也是心知肚明吧。不论如何,他们还是愿意冒这个险。 跟踪震网传播的确切路径上,反病毒研究员没有碰到什么麻烦。经过对每个病毒样本的分析,他们发现了一个有助于跟踪病毒从源头向目标传播路径的“宝贝”:记录每一台被感染计算机数据的日志文件。在震网病毒为抵达目标而蜿蜒前行的过程中,它记下了每一台计算机的IP地址和所在域的域名,并根据计算机内部时钟记下了每一次的感染时间。然后,它将这100字节的数据存入随病毒传播而不断增大的日志文件。由于每一份病毒样本都有这样一个日志文件,钱哥和莫楚得以顺藤摸瓜,找到最早遭感染的计算机。攻击者设计这样一个日志文件,本意是掌握震网攻击的路径,没想到这一点却被反病毒研究员给用上了。 钱哥和莫楚一共分析了多家反病毒公司提供的3280份病毒样本。根据对日志文件的分析结果,他们判断,攻击者释放病毒的起点,是最有可能接触到震网攻击目标的5家伊朗公司。每家公司都先于其他位置的计算机“率先感染”了震网2009年版、2010年3月版和2010年4月版中的一个或多个版本。这5家公司遭震网感染的计算机共有12000台。之后,以这5家公司为源头,震网实现了对100多个国家10万多台计算机的传播。 [![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-08_5666b176baa7e.jpg)](http://www.aqniu.com/wp-content/uploads/2015/10/640.webp-27.jpg) 震网“新品上市”的5个“首发目标” 根据受害者匿名的原则,赛门铁克没有在公开文档中公布这些公司的名单,而是用域A、域B……域E来代指。但是,其他看到日志内容的人却不会这么守规矩。这些公司很快被曝光,它们是:弗拉德科技(Foolad Technique)、百坡炯(Behpajooh)、卡拉(Kala)、尼达工业集团(Neda Industrial Group)和据信为高士达工控公司(Control Gostar Jahed)缩写的CGJ。其中的卡拉,就是NCRI在2002年的新闻发布会上提到的、为铀浓缩项目当幌子的伊朗卡拉扬电力公司。 虽然有些公司多次被不同版本的病毒“率先击中”,但每次被率先击中的并不总是同一台计算机。这表明,攻击者每次上线新版本时,都在努力寻找处于更有利位置的计算机,或者为了更有希望成功到达目标,寻找能够提供与上一次不同传播路径的计算机。被三个版本全部率先击中的,只有百坡炯(Behpajooh)一家。这说明这家公司最有可能提供通往目标的路径。同时,由于2010年3月的版本只击中了这家公司,它成了引起传播失控的最大源头——在伊朗5家公司共12000台遭感染计算机中,初始感染源为百坡炯的占到了69%。(待续)
';