奇淫技巧:用图像来打包文件

0x00 借问酒家

有什么东西想拿却拿不出来?不妨开开脑洞。

缘起是2014年底的时候看到金山做的在线恶意代码分析系统“Fire eye”(https://fireeye.ijinshan.com/)。感觉很新鲜,丢了自己攒的几个样本丢了上去,分析的结果还算可以。从分析报告来看,它也是一类沙箱检测工具,把样本丢到虚拟机里跑,再在虚拟机内外布控,监测样本的各种行为,最后生成分析报告并给出判断是否恶意样本,分析报告里还包含样本运行时的截图。

0x01 柳暗

于是我开始有点好奇,这个沙箱大概是个什么样的,于是自己写了一些小的检测程序丢进去,把环境变量、系统信息、网络配置、进程列表、服务和驱动什么的读出来显示在窗体上,这样从分析报告里的样本截图就能读到这些信息了。

嘛,这里先说一下,本人并不会挖漏洞和逆向,说来惭愧,大学时候的汇编都是补考才过的。就是个小小的.net码农而已。

然后我在系统环境变量里发现一个别的地方没有的玩意:%FEKERNEL%,指向c:\mon\文件夹,想来应该是“FIRE EYE KERNEL”,即包含沙箱内部监控程序的核心文件夹。

有了这个发现自然不会放过,另外专门编写了程序去枚举和读取FEKERNEL里的东西,然而发现只要碰了那个文件夹,样本分析报告就会被隐去大部分 内容,和FEKERNEL文件夹直接和间接(比如复制出来之后再读取复制的文件)相关的内容都被删掉了,想来应该是做了某种自我保护。只有读取文件夹大小 的操作没被拦截。

0x02 花明

不过既然有了目标,路就好找了。试了几次找到了绕过保护的办法,成功读取到了FEKERNEL里的文件并把详细信息。下一步当然就是如何拿到里面的东西咯。

里面是大概几十MB的二进制文件,有EXE有DLL有SYS甚至还有PDB,估计是开发人员方便调试直接把符号文件也一起扔里面了。这么多东西怎么拿出来呢?最初的想法是通过网络传出来,然而沙箱的网络和互联网是不通的,对用户的唯一输出仅限样本分析报告。

然后我发现早几年前有人通过编写样本在注册表里写入HTML代码内容的键值在分析报告页面成功实施了XSS,觉得这个思路是可行的。然而几十MB的 东西即便压缩成十几MB再按BASE64编码,写到一个监控程序会监控的地方,仍然没法全部拿出来,因为太多了。就算画在窗体上也…………

……慢着,画在窗体上?

脑袋灵光一闪,这办法可以啊!我先想到的是把BASE64串按能分辨的最小字号写在窗体上,然后进一步想到干脆利用窗体上的像素,一个像素表示一个 字节,然后直接想到干脆一个像素用RGB分量存储三个字节,这样可输出的数据量就成几何级数上升。稍微计算了一下,按最高密度的数据传输方案,一个窗体能 被截图下来的最大面积足够“画下”压缩过的完整目标数据。

思路有了,东西直接就搞出来了。由于FE只能上传单个可执行文件样本,于是把所有用到的东西打包成一个自解压RAR,并附带解压后执行脚本,先绕过 保护读取到FEKERNEL里的所有内容并复制到另外的位置,然后用自带的WINRAR.EXE通过命令行将其压缩,最后把压缩包以二进制打开,把内容 “画”在自己窗体上。

这样我就顺利拿到了FEKERNEL里的所有东西。当然这还得感谢FE在处理样本截图的时候没有做任何有损压缩,虽然是JPEG格式。

这个漏洞我已在去年提交给乌云:火眼恶意代码分析系统自保机制绕过导致二进制泄露

0x03 又一村

总结:如果有什么东西你知道在哪,但没法直接拿到,不妨冷静分析一下:

  1. 你能控制的输入因素有哪些;
  2. 阻拦你拿到数据的限制因素有什么,有没有绕过的办法;
  3. 你能拿到的输出数据有哪些,其中哪些可以通过输入数据直接或间接控制,哪些输出数据包含的信息量最大。

综合考虑这三方面因素,并仔细分析,就不难达成目标了。

作者补充:当时把各种拷贝复制的方式都试过了,直接读取都会被BLOCK,最后是通过设置共享文件夹的方式绕过保护的。嘛,绕过保护的方法并不是本文重点,把东西拿出来才是。我估计开发人员也只是考虑到即便绕过保护也不容易把数据带出来才没做太完善的防护。

这种数据传递方式的优势在于可以绕开目前绝大多数检测手段,将数据转为图片、视频和音频之后还可以再用这些媒体数据特有的处理方式进行再加工(图像处理、音频调制等),使其更难以发现和追踪。而且也不局限于传递数据,传点儿别的呢?试试其他不常用的方式:创建符号连接,NTFS流文件,创建网络共享,借道第三方等。这次用的就是其中一种。以前用过一个文件保护工具,可以在资源管理器和控制台隐藏目标文件夹的内容,绕过方式也很有趣:用winrar压缩目标文件夹,压缩包里就是被隐藏的内容了。

【via@wooyun drops】 本文系授权转载,未经授权请勿转载本文。