快捷搜索:  网络  后门  CVE  渗透  木马  扫描  黑客  as

“隐蜂”来袭:金山毒霸截获环球首例Bootkit级挖矿僵尸收集(上篇)

媒介:

近两年比特币、以太币、门罗币等数字货币端庄历着环球高潮,挖矿类病毒木马的感染量也随着捏造货币的价格爬升逐步上涨,黑产团伙的商业嗅觉以及步履力使人齰舌,类似“CoinHive”这类网页挖矿变现平台层出不穷,数百万级的网站被黑产团伙行使web漏洞植入挖矿代码;在客岁我们可以看到各类挖矿木马异常活跃,从行使“永恒之蓝”漏洞传播到服务器、数据库弱口令爆破,从Struts2、Weblogic、Jboss等各大Web框架漏洞到IE/Flash 0day挂马传播,甚至包括被频仍暴光漏洞的路由器、摄像甲等嵌入式设备都被黑产团伙盯上,各类挖矿木马可以说始终活跃在环球收集安全攻击事故的最前列;在挖矿暴利的诱导驱策下,之前部分用于传播垃圾邮件、诓骗者的老牌僵尸收集都最先纷纷转型加入挖矿雄师,更有甚者,个别传统正牌软件厂商也都最先沉沦蜕化,从我们客岁挖掘暴光的“看看影音云控挖矿”、“电信天翼客户端挖矿后门”等安全事故中就可以略窥一二,不夸张地说,2017年堪称挖矿类木马病毒的爆发元年。

russia-hacking.jpg

近期金山毒霸安全实验室监控到部分用户体系存在疑似挖矿木马活动的威胁线索,经过逐层溯源阐发,一个已经成型并走向活跃的Bootkit级挖矿僵尸收集被揭开神秘面纱,Bootkit与挖矿木马的融合也将碰撞出一些不同样的火花。本次拿获的Bootkit样本从框架设计到代码细节处理上都无比完美,在隐蔽性、兼容稳定性、反阐发匹敌等各方面都达到了一个全新高度,病毒代码的复杂程度、专业程度也为近年所罕见。从样本模块的字符串信息中发现该Bootkit的内部项目代号为“Mellifera(蜜蜂)”,所以本次的Bootkit木马被命名为“隐蜂”,概括来说,“隐蜂”Bootkit木马的手艺特点首要体现在下列几个方面:

1) 匹敌阐发检测,隐蔽性很强。在隐蔽性上“隐蜂”Bootkit木马近乎极致,内核模块的挂钩地址都通过NT内核模块代码间隙的Shellcode中转完成隐躲;两套磁盘驱动挟制过滤机制互相守护;通过镜像归调检测pdb、署名特征屏蔽部分安全软件;针对PCHunter、PowerTool等常见的ARK工具,挂钩其核心驱动过滤IRP要求的返归数据,过滤掉自身注册的各类归调地址;在木马的R3层工作模块中,病毒也会通过脚本实时检测当前运行环境,一旦发现ARK工具、抓包软件或者安全软件,甚至是义务治理器,病毒都会立即结束挖矿活动,小心翼翼地藏躲起来;在C&C通讯升级方面,采用SSTP加密协定,并且使用DGA动态生成。除了内存中的shellcode几乎没有太多特征线索,即便是专业安全人员,检测阐发“隐蜂”Bootkit都是一件颇有挑战性的工作。

2) 架构设计天真,复杂度专业度很高。从我们的阐发过程中看,不论是总体框架的设计照样细节处理都无比专业,譬如内核模块基础机制设计方面,多种归调接口无比天真,而且在内核层支持扩大模块的动态加载卸载,方便随时扩充内核功能;还有效于存储病毒模块以及设置信息的MRFS自定义文件体系以及NE插件格式;再譬如R3层集成的LUA脚本机制增添了病毒天真性,病毒还会根据机器设置以及使用处景动态调整挖矿资源占用参数;最直观的感触感染,我们从“隐蜂”病毒中解压出来的各类内核模块、R3插件和设置文件多达50+,病毒代码结构的复杂程度可见一斑。

3) 体系兼任稳定性很好。体系兼容性始终都是衡量Bootkit手艺的重要指标,实现一款兼容度极高的Bootkit是无比有手艺挑战性的一件事情,从我们的阐发过程来看,“隐蜂”在体系引导过程中的挂钩时机选择、挂钩点特征征采以及代码细节处理上都无比完美,支持支流windows操作体系版本,同时兼容X86/X64架构。“隐蜂”Boot挟制代码中也能够看到一些Bootkit先辈的身影,堪称后辈中的集大成者。

从我们的监控数据来看,本次的“隐蜂”Bootkit木马变种从3月初最先测试传播,得益于其刁悍的隐蔽性以及匹敌阐发能力,到至今的三个多月都不曾被外界发现暴光。病毒的项目版本号也从0.1迭代至目前的1.x,在经历了几轮网页挂马以及流氓捆绑的传播小高峰后,该僵尸收集已经逐渐成形,预估目前全网的感染用户50w+。病毒母体在传播渠道以及手艺行使上也都无比有特点,通过白行使以及体系漏洞组合穿透支流安全软件的防御系统,后续有机会我们会继续放开分享。

顺便说点题外话,“隐蜂”Bootkit木马的攻击活动并不是首次被发现,在2017年活跃过一段时间,早期变种的功能模块相对于简单,首要用于挟制阅读器导航主页,友商安全团队曾经拿获到并命名为“隐魂”木马,称之为“史上反侦查力最强木马”,然则比较惋惜的是阐发讲演中没有任何IOC信息,并且抹去了几乎所有可能被外部溯源阐发的特征线索,所以在较长时间内始终没有被外界熟知,我们也是在本文发布前对近两年的Bootkit类木马进行横向对比时不测发现,出于尊重,我们延续传统将此Bootkit变种命名为“隐蜂”。匹敌收集黑产任重而道遥,单个团队的力量老是有限的,在基础安全情报的开放同享方面,希翼我们都可以做地更多一点,否则很多表露讲演就失去了它原先的意义。本次发现的“隐蜂”Bootkit样本以及相干手艺细节会对安全友商开放,可以通过官方邮箱发送邮件以及我们联系。最后还要谢谢下用户@guying195在阐发取证过程中给予的极大支持配合,如许的用户对我们来说也是一种莫大荣幸。

正文:

图片1.png

如上图,按照Bootkit类木马传统的“boot+rootkit+plugin”三层架构,我们也会分为3个章节进行讲解,上篇部分首要包含“隐蜂”木马的“Boot挟制”以及“内核Rootkit”两个症结部分。成文仓猝难免有疏漏的地方,欢迎留言指正。

1、 Boot启动挟制阶段

1. MBR引导代码挟制

“隐蜂”bootkit木马对MBR引导代码的感染处理比较有特点,与之前别的MBR类Bootkit不同的是,它通过在正常MBR启动代码基础进行Patch,挟制活动分区表项,打断原本应该跳转到PBR(Partition Boot Record)引导体系启动的正常流程,引导至磁盘末尾的病毒代码上继续执行。

图片2.png

挟制分区表后,病毒从磁盘末尾病毒代码肇始处读取1个扇区到0x7C00,校验扇区末尾是否为0xAA55,通过验证则继续下一个步的Loader代码,反之则恢复BP指针,保障体系正常引导启动。

2. BootCode解码与加载布局

如上段所诉,loader代码被拷贝到0x7C00继续执行,这部分loader代码首要负责将磁盘末尾的BootCode代码数据拷贝到内存进行解码、加载布局以及参数加添,并且恢复7C00处的MBR引导代码备用。实现这些之后病毒代码流程就进入bootkit经典核心部分,从挂钩INT13中止直到终极注入NT内核。解码以及加载布局的这部分代码不触及手艺核心部分,流程略显琐碎,再也不赘述细节,症结步骤以及内存布局以下图所示:

图片3.png

3. INT13 挂钩

挂钩INT13中止服务是bootkit使用的经典技巧之一,挂钩成功之后可以在PBR读取体系引导程序(NTLDR/BootMgr)时获得一个合适的时机进行特征搜索以及Patch。“隐蜂”在这部分的处理上并没有太大悬殊,以下图:

图片26.png

INT13的挂钩代码中搜索以及Patch特征码首要包括下列几点:

1) 搜索特征码“83 C4 02 E9 00 00 E9 FD FF,首要针对XP体系的Ntldr模块,针对此处的Patch首要为了绕过代码完备性校验机制。

2) 搜索特征码 “8B F0 85 F6 74 21/22 80 3D”,首要针对XP体系的OS Loader模块,通过Hook跳转到后续维护模式代码。

3) 搜索特征码 “8A 46 ?? 98 3D 00 00 75 03 E9 03 00 E9 35 00”,首要针对VISTA+版本体系的BootMgr模块,通过Hook跳转到后续维护模式代码。

4. BOOTMGR挂钩

前段中INT13的挂钩代码中针对BootMgr(16位)的Hook对X86以及X64做了兼容处理,以Win7 X86体系为例,成功挂钩BootMgr(16位)后结果以下:

图片4.png

BootMgr(16位)的挂钩触发之后,启动流程控制权再次被病毒代码接手,随后从00400000h基址处定位代码段,通过内嵌的微型反汇编引擎对特征码进行递进搜索,继续对BootMgr(32位)的症结地位进行挂钩,首次被挂钩的函数为ImgpLoadPEImage!LdrRelocateImageWithBias,特征码搜索过程以下:

图片5.png

病毒代码对LdrRelocateImageWithBias被调用场的call地址进行Patch,将代码流程挟制到9AA7Eh;通过对BootMgr(32位)的模块功能以及挂钩点的调用堆栈阐发,就不难发现病毒选定此处作为挂钩点的缘故起因:

图片6.png

5. WINLOAD.EXE挂钩

在对winload.exe的挂钩处理上,依旧选用了ImgpLoadPEImage!LdrRelocateImageWithBias这个调用点,特征码搜索过程都是相同的,另外针对winload架构不同分别处理,保障兼容X86以及X64体系。通过此处的挂钩,病毒代码在winload.exe加载体系内核ntoskrnl.exe时可以再次截获代码执行权。此处细节再也不赘述,以下图:

图片7.png

如上图所示,当winload!LdrRelocateImageWithBias处的挂钩代码被触发时,流程被引导到病毒函数9AA8Ch处,在这里病毒代码进行二次挂钩跳转,挂钩函数保存了当前模块的镜像基址,并通过覆写当前函数栈内容,等winload!LdrRelocateImageWithBias原函数执行完再次获取触发控制,实现调用后hook。

图片8.png

6. ntoskrnl.exe挂钩

上述挂钩点触发之后,病毒代码被引导到9AA9Ah函数处,最先对NT内核模块ntoskrnl.exe进行挂钩。起首恢复winload!LdrRelocateImageWithBias调用返归地址,保障挂钩代码执行完之后返归正常流程;然后病毒代码最先寻觅ntoskrnl.exe的INIT区段,然后通过函数交叉引用以及指令参数字符串特征定位到IoInitSystem!IopInitializeBootDrivers调用指令地址,在寻觅到的区段间隙处拷贝shellcode,最后加添API表、配置参数并挂钩IoInitSystem!IopInitializeBootDrivers调用。细节过程入下图:

图片9.png

当NT内核调用IoInitSystem!IopInitializeBootDrivers时,之前区段缝隙加添的shellcode被触发,这里病毒代码起首将IopInitializeBootDrivers原地址填写到堆栈,保障原函数正常调用;然后关闭写维护恢复该处的挂钩,最后将下一阶段的hook函数地址填写堆栈,如许在BootDrivers初始化完毕之后,再次拿到内核代码控制权,最后加添原函数返归地址,加载执行后续shellcode。过程以下图:

图片10.png

从上图末尾的shellcode最先,病毒代码就最前辈入bootkit内核驱动模块的加载过程,这部分代码包括三层的shellcode跳转处理,终极从磁盘末尾的读取后续核心模块的代码数据,解密解压处理后得到自定义文件体系(Mixed ROMFS)镜像,解析出内核loader模块“/bin/i386/bootmgr”(变异PE)装载并执行。限于篇幅这里再也不赘述细节,三层shellcode跳转过程描摹以下图:

图片11.png

至此“隐蜂”病毒的“Boot启动挟制阶段”结束,病毒代码从MBR挟制一起挂钩跳转直到进入到内核“Rootkit”阶段,后续将最先加载真实的内核模块,实现Ring3插件主模块注入、病毒磁盘数据维护归写和杀软ARK匹敌等操作。

二、 NT内核Rootkit阶段

在前段“Boot启动挟制阶段”结尾,我们提到了病毒代码使用了“Mixed ROMFS”自定义文件体系(下列简称MRFS)来存储设置信息以及插件模块,而且插件模块也使用了从PE格式变异而来的NE格式,从这些精心设计的体系格式也能够从侧面窥探出“隐蜂”病毒幕后团伙的专业程度。这两类文件结构对我们后续的阐发过程比较重要,在最后的Ring3层工作插件中都会多次使用到,所以在“NT内核Rootkit阶段”真正最先之前,我们先来简单了解下这两种文件格式。

1. 文件体系(Mixed ROMFS)文件结构与NE插件格式

“隐蜂”病毒使用的“MRFS”类似于linux体系下常见的ROMFS等文件体系,但目前没有找到地下资料描摹过“MRFS”,所以我们暂时认定“MRFS”是病毒作者自定义的一套文件体系格式。从病毒的文件解析代码中反推出的症结字段以及结构以下图:

图片12.png

“MRFS”的文件结构首要包括镜像头、文件信息头以及文件数据三大部分,文件信息头是一个层级结构,首要包含了文件路径层级信息以及对应文件块偏移信息。这个FS镜像包含了后续所有内核模块、设置信息以及注入R3的主模块等文件,文件目录结构解析效果以下:

图片13.png

另外的“NE”模块插件格式相对于简单,可以看作一种变异的PE文件格式,病毒作者抹去了PE文件的DOS头以及NT头标记、区段名称等信息,进行修复之后即可还原为标准PE文件。在“NE”模块插件的代码入口或者外层调用场,一般通过导入表IAT以及重定位表修复加添完成动态加载。

图片14.png

2. “bootmgr”解析加载“kernel”核心模块

“/bin/i386/bootmgr”模块是一个loader模块,首要负责解析加载真实的内核核心模块“/bin/i386/ kernel”,加添重定位表以及IAT表实现自加载过程,随后从“MRFS”镜像中解析出kernel文件,进行重定位以及导入表处理后直接调用。过程以下图:

图片15.png

3. 核心模块“kernel” 

“kernel”是“隐蜂”病毒Rookit阶段的核心模块,从模块总体的设计架构中,可以看出“隐蜂”病毒作者在Windows内核方面的具备无比丰富的开发经验。病毒作者在“kernel”模块中设计提供了镜像通知归调、磁盘过滤归调,内核扩大模块加载等一系列基础框架机制,并导出相干的服务接口,终极实现病毒磁盘数据归写维护、杀软ARK匹敌和R3插件主模块的注入等症结操作。另外内核扩大插件机制设计也无比天真,支持动态加载卸载,方便病毒随时扩大升级内核功能。“kernel”模块功能比较复杂,部分接口需要结合调用上下文去阐发说明,但核心功能可以总结为下列几个症结点:

1) IoCreateDriver创建自定义的核心驱动对象,符号链接为随机GUID,该驱动对象用于导出内核模块的核心功能给Ring3层进行调用。比较有特点的是,驱动对象的派遣函数实际上是代办署理中转函数,通过珍爱一个链表对象,指向自定义的控制派遣函数对象,如许的设计多是为了后期扩大更天真。这部分的接口功能比较繁杂,后续我们会在R3调用场结合上下文进行说明。

图片16.png

2) PsSetLoadImageNotifyRoutine注册镜像加载通知归调,与普通的镜像归调函数不同的是,病毒将一段shellcode代码拷贝到NT内核模块代码段末尾空地空闲,由这段shellcode引导真实的归调函数,如许将归调函数地址隐躲到NT内核镜像中;另外此处的归调函数一样是一个代办署理中转函数,珍爱一个镜像通知归调函数数组,如许可以在体系原有机制外完成天真扩大,导出接口给其他内核扩大模块使用;

图片17.png

最后向链表中添加了负责注入Ring3的镜像加载归调函数,在选择合适时机创建WorkerRoutine并通过APC机制注入svchost进程。病毒代码会映照目标地址空间并预加载Loader模块“stub.bin”,加添加载症结参数,包括“subsystem”(核心模块)等,终极将病毒流程引导到Ring3层工作阶段。后续Ring3层的工作模块加载以及手艺细节我们会鄙人一章中具体阐述。

图片18.png

3) 另外一个重要功能就是磁盘对象挟制相干匹敌机制,首要用于维护病毒MBR以及存放病毒代码数据的磁盘扇区,并在关机时机进行归写感染。病毒作者在这里奇奥地设计了两套挟制过滤机制,并且在这两套挟制的派遣函数中互相守护,摘除掉一方的挟制挂钩会被另外一处挟制重新恢复。

图片19.png

一类是“磁盘对象挟制”手艺,申请内存组织虚假设备/驱动对象并加添症结字段结构,征采磁盘上层设备对象扩大,再将其保存下层对象的成员加添为前面组织的虚假设备对象,如许就可以过滤磁盘驱动发送的所有IRP要求,挟制派遣函数中除了对“IRP_MJ_SCSI”要求进行过滤处理外,还有针对“IRP_MJ_POWER”(关机通知)的处理,这里主若是提供接口给其他内核扩大模块以及R3,方便对病毒MBR相干代码进行关机归写;

图片20.png

另外一类,挟制磁盘端口驱动(ATAPI)的“IRP_MJ_SCSI”派遣函数,与镜像加载通知归调的机制类似,这里一样将挟制函数的shellcode头拷贝到NT内核代码段末尾完成隐躲,并且也是通过代办署理函数中转链表完成天真扩大。

图片21.png

4) 加载内核扩大模块“guard.kext”以及“mprot.kext”实现内查匹敌扩大功能。这里需要起首说明的是,在内核扩大模块加载机制中,“kernel”模块导出了一个比较重要的功能扩大接口“mpsi.dll”。这个接口首要封装了前面“kernel”模块完成的镜像归调、磁盘过滤等机制,一共22个导出功能函数,内核扩大模块kext以序号导入的情势引入“mpsi.dll”,在动态加载kext扩大模块处理IAT的时辰进行了特殊处理,将所有“mpsi.dll”的导入函数引导到“kernel”模块的一个代办署理中转函数上。

图片22.png

“guard.kext” 内核扩大模块对应的设置文件为”/etc/register.js”,数据库黑客,该模块通过前面“kernel”模块提供的接口注册镜像加载通知归调,对加载的驱动镜像进行PDB名称、数字署名、Hash等特征过滤,餍足特征的则patch驱动文件入口点,直接返归错误状态码STATUS_INSUFFICIENT_RESOURCES,完成匹敌安全软件与ARK工具类软件。

图片23.png

除了上述直接匹敌安全软件以及ARK工具驱动加载外,病毒还会对加载镜像的PDB、原始文件名等特征计算Hash匹配,我们阐发认为主若是针对支流的ARK工具,病毒会挂钩ARK工具驱动中IofCompleteRequest等症结函数,对ARK工具交互的IRP要求进行过滤,挟制隐躲之前“kernel”模块注册的镜像加载归调以及磁盘驱动派遣挟制等函数地址,防止专业安全人员通过PcHunter、PowerTool等常见的ARK工具检测发现异常挂钩。

图片27.png

另外一个症结的内核扩大模块是“mprot.kext”,其对应的设置文件为”/etc/sandbox.js”,该模块首要负责维护病毒MBR以及磁盘末尾BootCode,通过“kernel”模块提供的“IRP_MJ_POWER”过滤归调接口注册维护函数,在体系关机时重新检查归写病毒MBR以及BootCode。这里病毒注册了两套关机归调函数,一套用于内核扩大自身,一套用于Ring3层触发维护。

图片25.png

上篇的阐发到此暂告一段落,下篇中我们会针对Ring3层的挖矿模块工作机制放开阐发,敬请期待。

附录(IOC):

升级URL:

sstp://*.gatedailymirror.info/upd.pkg

sstp:// *.redteamshop.info/upd.pkg

sstp:// *.wefoundsome.xyz/upd.pkg

sstp:// *.foundrosysquad.info/upd.pkg

sstp://ask.thesupporthelp.com:443/mlf_plug.zip.sig

矿池地址:

stratum+tcp://data.supportithelp.com:8080

*

您可能还会对下面的文章感兴趣: