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. 你能拿到的输出数据有哪些,其中哪些可以通过输入数据直接或间接控制,哪些输出数据包含的信息量最大。

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