大土豆安全笔记 | OPPO的移动安全团队很不错

我最近学习到一个新姿势,在Android应用里进行XSS攻击

《Finding an XSS in an HTML-based Android application》

  • https://labs.detectify.com/2015/02/20/finding-an-xss-in-an-html-based-android-application/

有的时候我在想,我做的这个方向在目前来看,也就这样了

不研究新的攻击点,迟早凉凉

我真怀念三年前的360,那会儿大楼顶层的牌子在,一起搞技术的好基友们在,安全团队和业务的地位是平等的,指导我工作的领导是懂技术的,提的需求都是合理的,我们可以站在同一个领域的技术栈上讨论问题

Android 11出Beta 2了,有多少读者还没有摸过Android 10?

  • https://android-developers.googleblog.com/2020/07/android-11-beta-2-and-platform-stability.html

新版本即是机会,大佬求带!!!

我接下来想买一些国产手机,多玩玩一些新功能,挖一些国产手机厂商定制系统功能引入的漏洞

偶然间发现OPPO的移动安全团队很不错,推荐他们写的三篇文章,我学习完也是有不少收获

《Android中的特殊攻击面(一)—— 邪恶的对话框》

  • https://mp.weixin.qq.com/s/mN5M9-P0g6x_4NqTKbO2Sg

《Android中的特殊攻击面(二)—— 危险的deeplink》

  • https://mp.weixin.qq.com/s/81Lq-JwASnkSS2wg62HSvA

《Android中的特殊攻击面(三)—— 隐蔽的call函数》

  • https://mp.weixin.qq.com/s/SAhXsCHvAct_2SxCXd2w0Q

他们和港中大,SMU一起搞的一篇Paper:《Understanding Android VoIP Security : A System-level Vulnerability Assessment》

  • https://daoyuan14.github.io/papers/TR19_VoIPFuzzing.pdf
  • https://www.youtube.com/watch?v=GFGUJiUTFtE

我这周粗读了一下,收获颇丰,还有待精读以及跟进代码实践,论文写的很实在,没有那种加入祖传秘制老卤之类的文字,完全可以上手操作

作者首先描述了Android VoIP的协议栈以及攻击面,然后介绍了所使用的Fuzz方法,本地API和Intent,远程通过修改数据包的字段,再结合代码审计

整体产出还是很不错的

IMAGE

国产的手机定制这么深入,可以搞一波了,墙裂推荐有兴趣的读者朋友学习这篇Paper!

检测应用是否运行在虚拟容器里,这个虚拟容器不是沙箱的意思,是指多开助手之类的软件,模拟Android系统环境让应用在其内部运行

  • https://github.com/su-vikas/conbeerlib/blob/master/android_virtual_containers_slides.pdf
  • https://github.com/su-vikas/conbeerlib

一个类似OLLVM的东西,但有一些新功能,有点意思

  • https://github.com/emc2314/YANSOllvm

搜索APK所有导出且没有权限的组件,这个其实搜的不全面,使用registerReceiver()动态注册的广播接收器默认是导出的

  • https://github.com/mzfr/slicer

MX Player路径穿越漏洞导致的代码执行,这个漏洞我觉得很有启发,它并非单纯的解压缩导致的文件路径穿越,而是通过远程数据交互来实现的

  • https://medium.com/tenable-techblog/android-mx-player-path-traversal-to-code-execution-9134b623eb34

简单来说,MX Player有一个文件分享的功能,正常的数据包格式如下

mx\x00\x01\x00\x02\x00\x00\x00\xb5
{
    "hash":"FA730A013D17D705CAF504B5CA560501",
    "id":0,
    "name":"cool_video",
    "suffix":"mp4",
    "size":5976,
    "type":0
}

在处理数据包的时候,会直接获取包里的"name"字段进行路径拼接生成文件

IMAGE

所以构造如下数据包,就会造成路径穿越

mx\x00\x01\x00\x02\x00\x00\x00\xb5
{
    "hash":"FA730A013D17D705CAF504B5CA560501",
    "id":0,
    "name":"../cool_video",
    "suffix":"mp4",
    "size":5976,
    "type":0
}

如何通过路径穿越实现代码执行呢?

常见情况下就是覆盖一个可执行文件,尤其是那种应用启动的时候会自动运行的那种,但是这个漏洞只能创建,不能覆写,所以需要想一个新方法

作者使用的是监控应用启动时所有文件加载操作,最后监控到了一个不存在的audience_network.odex文件加载

IMAGE

基本的原理是ART虚拟机运行时会加载如下路径的文件

<appPath>/files/oat/<arch>/*.odex

所以往这个路径下写audience_network.odex即可

多年以前,海豚浏览器也被爆出类似的漏洞,同样是路径穿越,同样导致代码执行

漏洞发生的功能是还原备份

private void c(File file, String arg8) throws myException {
    CipherInputStream cipherInputStream_1;
    ZipInputStream zipInputStream;  // 解密后的数据类型转为ZipInputStream
    BufferedInputStream bufferedInputStream_1;
    CipherInputStream cipherInputStream_2;  // 解密传入的数据流
    BufferedInputStream bufferedInputStream_2;  // 将文件读入缓冲区流
    Closeable closeable = null;
    try {
        if(!file.exists()) {
            throw new e();
        }
        this.a();  // cipher = "AES/ECB/PKCS5PADDING"
        bufferedInputStream_2 = new BufferedInputStream(new FileInputStream(file));  // 将文件读入缓冲区流
    }
    try {
        if(TextUtils.isEmpty(((CharSequence)arg8))) {
            arg8 = "3d6b27465424597a55443e7532";  // 加密秘钥,可以由用户传入,若用户不传入,则由默认秘钥加密
        }
        this.cipher.init(2, this.b(arg8));  // 用秘钥初始化cipher,秘钥为b("3d6b27465424597a55443e7532")的值
        b.a(((InputStream)bufferedInputStream_2), this.cipher);  // 仿佛在做CRC32校验
        cipherInputStream_2 = new CipherInputStream(((InputStream)bufferedInputStream_2), this.cipher);  // 解密传入的数据流
    }
    try {
        zipInputStream = new ZipInputStream(((InputStream)cipherInputStream_2));  // 解密后的数据类型转为ZipInputStream
    }
    try {
        File selfMainFile = new File(this.context.getApplicationInfo().dataDir);  // 获取程序主目录
        while(true) {
            ZipEntry zipEntry = zipInputStream.getNextEntry();
            if(zipEntry == null) {
                break;
            }
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File(selfMainFile + File.separator + zipEntry.getName())));  // 拼接解压目录,此处校验文件名,可造成路径穿越漏洞
            IOUtilities.copy(((InputStream)zipInputStream), ((OutputStream)bufferedOutputStream));  // 拷贝数据
            bufferedOutputStream.flush();  // 刷新缓冲区,将数据写出到文件
            bufferedOutputStream.close();
            zipInputStream.closeEntry();
        }
    }
    try {
        IOUtilities.closeStream(((Closeable)zipInputStream));
    }
    return;
}

利用方式比较常规,覆写了一个应用启动时自动加载的二进制文件watch_server,当应用重启即可造成代码执行

这两个漏洞单独写分析跟大家分享其中的代码细节,其中的漏洞模型完全可复用

今年MOSEC有一个我很感兴趣的议题,想去听一听,还是那个老想法,想自己搞一个Fuzzer,一直跑的那种

IMAGE

别的人有钱之后都是会所嫩模,我想好了,我要是赚够了钱,我就可以不上班,天天在家里研究技术

可惜了,我现在做着业务安全,离安全研究的道路越来越远,可能再也回不去了

也可能,我下个月就去搞技术研究了呢?

Alpha Team发现了UOS两个漏洞,官方给了致谢,很强!

侧面可以看出来数字公司的某些业务方向,我想搜一下这个SRC,一直搜不出来,奇了怪了

最后介绍一个工具,Android和iOS双平台渗透虚拟机

  • https://mobexler.com/

一共有两个版本,官方推荐使用MobexlerLite

  1. MobexlerLite
    1. Linux Lite
    2. (OVA) File Size: 7 GB
  2. Mobexler
    1. Elementary OS
    2. (OVA) File Size: 17 GB

官方的使用图片很酷炫,颇有技术大佬的感觉

IMAGE

我运行看了看,配备了一些常见的工具,部分工具和我日常工作有交集,但是我偏向JEB更多,极其少直接使用baksmali这样的工具,起码也是做了一层封装更加可视化,enjarify和jadx我觉得应该放到AndroidZone里,毕竟都是Android工具

IMAGE

不好用,我打算自己定制一个顺手的