已知漏洞的再利用——在网络攻击中也能老树开新花?

  • A+
所属分类:安全文章

原文作者:Michael Gorelik 

原文地址:http://blog.morphisec.com/recycling-exploits-cyber-security


本文由inn0team的核心成员(Jeremy,xyzzhangfan)联合编译


     在进行研究的过程中,我们经常遇到这个简单而又残酷的事实,那就是恶意软件的作者能够通过对代码做一些小改动就能轻易地摆脱主流安全产品对其的检测。在这篇技术分析中, 我们展示了一些这类攻击手段的内在细节。这些特定的攻击手段早在几年前就被发现,并且厂商也发布了安全补丁。但作者通过对代码进行修改,能使几乎所有的安全产品对它们视而不见。


       造成这种现象的原因源于安全产品的工作方式。当然,一般而言,还有恶意软件作者的思考方式。安全产品总会搜索一些特定的东西。这种搜索既巧妙,又智能,还模糊,但他们仍旧使用从先前被发现的特定攻击中获取的知识来搜索一些特定的对象。恶意软件的作者则通过了解安全产品到底在寻找什么,同时对代码进行少许修改来克服安全软件的这种能力。随后,作者会满意的发现,恶意软件无法被检测到了。尽管对扫描机制倾注了了大量精力,但是一个一个人只要有一台笔记本电脑,足够的毅力,一份咖啡,便能使它失效。


       CVE-2012-0158是一个早在2012年就被微软修复的ActiveX漏洞,但它仍是最最流行的用于文档攻击的CVE之一。就在几天前,uanalysis.com网站发现了一份通过Excel传输的,几乎能躲避所有流行的安全解决方案检测的版本。


(这一段广告就不翻译了QAQ)


攻击分析


这份分析不包括漏洞利用过程以及漏洞本身,因为这两者已经被透彻的探讨过了。相反,我们深入shellcode之中,揭示这个漏洞利用程序如何逃脱安全解决方案的检测的。

shellcode的大致的这些步骤如下(下一章节有相关的技术细节):

1.shellcode在MSCOMCTL(Microsoft Windows Common Controls )的gadget激活之后进行初始化

-> JMP ESP (RET);

2.shellcode有两轮按序的解密流程,以激活第二阶段的shellcode和一些复杂的反调试技术;

3.第二阶段的shellcode通过遍历PEB和kernel32模块来定位函数,通过迭代遍历所有句柄来定位xls文件的句柄,然后读取它,并定位其magic number,并解密其第三阶段的主要的shellcode;

4.第三阶段的shellcode再次从PEB中定位更多的函数,但此时它使得指针偏移很小的距离(0x5)来绕过钩子函数;

5.它的下一步操作是加载MSVBVM60.dll文件,这是VB6在32位环境的运行组件,虽然加载这个组件的原因有所不同;

6.接下来它从这个模块定位到PutMemVar这个函数然后将其替换为一个自制的,能够接受任何函数指针作为参数并从代码中将其激活的函数(绕过控制流分析);

7.接下来shellcode通过从xls文件中解密新的片段来大量的使用PutMemVar这一函数。这一片段实际上是一个有传染性的密码盗窃恶意软件;

8.为了避免任何白名单策略和对可执行文件进行扫描的杀软,该shellcode在挂起状态创建了一个Excel子进程的副本,用可执行部分重载其内存部分,然后恢复进程。


总结


这段恶意代码的作者进行了大量的工作来躲避现有的高级保护技术。


这一点可以从该shellcode中使用的高级手段中看出。(替换现有dll文件的函数来欺骗控制流分析;通过偏移很小的距离(0x5)来调用目标函数从而绕过钩子;保持无实体文件状态来绕过白名单策略和反病毒软件;仅通过检查模块名的长度来加载Kernel32这类主模块;通过散列化文件名来定位函数,这一般用来欺骗静态分析;对于文件句柄的处理也是如此)。


虽然所有的这些技术都是知名且并非新的,但这让的组合还是很少见。类似的shellcode技术在较新的CVE-2015-2545恶意EPS Word文档样本能找到(sha256值: - 9c6dc1c2ea5b2370b58b0ac11fde8287cd49aee3e089dbdf589cc8d51c1f7a9e),虽然在这个例子中,其中的“远程管理工具”并不是无实体文件状态的。

技术细节


1.shellcode在MSCOMCTL(Microsoft Windows Common Controls )的gadget激活之后进行初始化

-> JMP ESP (RET);

已知漏洞的再利用——在网络攻击中也能老树开新花?


2.shellcode有两轮按序的解密流程,以激活第二阶段的shellcode和一些复杂的反调试技术(异或解密);

已知漏洞的再利用——在网络攻击中也能老树开新花?


3.仅通过检测模块名的长度加载Kernel32(没有对比任何散列或名称);

已知漏洞的再利用——在网络攻击中也能老树开新花?


4.第二阶段的shellcode通过遍历PEB和kernel32模块来定位函数(计算函数名称的ROR 7散列,并对比已有的散列结果);


已知漏洞的再利用——在网络攻击中也能老树开新花?

已知漏洞的再利用——在网络攻击中也能老树开新花?

5.通过迭代遍历所有句柄来定位xls文件的句柄,然后读取它,并定位其magic number,随后异或“0xE3”解密第三阶段主要的shellcode。

已知漏洞的再利用——在网络攻击中也能老树开新花?

6.解密后的第3阶段的shellcode;

已知漏洞的再利用——在网络攻击中也能老树开新花?

7.第三阶段的shellcode再次从PEB中定位更多的函数,但此时它使得指针偏移很小的距离(0x5)来绕过钩子函数;

已知漏洞的再利用——在网络攻击中也能老树开新花?

已知漏洞的再利用——在网络攻击中也能老树开新花?

8.它的下一步操作是加载MSVBVM60.dll文件,这是VB6在32位环境的运行组件,虽然加载这个组件的原因有所不同;

9.接下来它从这个模块定位到PutMemVar这个函数然后将其替换为一个自制的,能够接受任何函数指针作为参数并从代码中将其激活的函数(绕过控制流分析);

已知漏洞的再利用——在网络攻击中也能老树开新花?

10.接下来shellcode通过从xls文件中解密新的片段来大量的使用PutMemVar这一函数。这一片段实际上是一个有传染性的密码盗窃恶意软件;

已知漏洞的再利用——在网络攻击中也能老树开新花?

11.为了避免任何白名单策略和对可执行文件进行扫描的杀软,该shellcode在挂起状态创建了一个Excel子进程的副本,用可执行部分重载其内存部分,然后恢复进程。

已知漏洞的再利用——在网络攻击中也能老树开新花?

已知漏洞的再利用——在网络攻击中也能老树开新花?

12.作为这次调查的结束,我上传了这个嵌入木马的样本(将内存转储存至一个可执行文件)到VirusTotal上。当然在这种情况下很多反病毒软件发挥了作用。糟糕的是现在作者已经意识到了这点,并且现在使用了上述的新的隐藏手段。

已知漏洞的再利用——在网络攻击中也能老树开新花?


对样本调试的建议


如果你使用的是Windbg,执行“childdbg 1”并将下图中的“ja” (JMP ABOVE)操作码改为“jb”(JMP BELOW),或者,仅处理指针EIP,使得那里的JMP不执行。

已知漏洞的再利用——在网络攻击中也能老树开新花?


欢迎在评论中跟我们交流翻译不到位的地方


已知漏洞的再利用——在网络攻击中也能老树开新花?

inn0team只是一个正在成长的小的安全团队
微信号:inn0team
已知漏洞的再利用——在网络攻击中也能老树开新花?
长按便可关注我们
点击下方“阅读原文”即可查看原文
↓↓↓ 

本文始发于微信公众号(inn0team):已知漏洞的再利用——在网络攻击中也能老树开新花?

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: