阿里聚安全攻防挑战赛第三题Android PwnMe解题思路

简介: 大家在聚安全挑战赛正式赛第三题中,遇到Android App 远程控制的题目。我们今天带你一探究竟,如何攻破这道题目。

阿里聚安全攻防挑战赛第三题Android PwnMe解题思路


大家在聚安全挑战赛正式赛第三题中,遇到android app 远程控制的题目。我们今天带你一探究竟,如何攻破这道题目。


一、题目

购物应用pwn (6分)

环境:

- 要求在ARM 64位Android手机上攻击成功,也可在模拟器(运行Google官方Android SDK提供的Google APIs ARM64 Android 7.0镜像)中攻击成功,其中镜像会打包提供,参见题目下载链接。模拟器执行命令参考如下:(qemu-system-aarch64 -sysdir . -datadir . -kernel kernel-qemu -system system.img -ramdisk ramdisk.img -data userdata.img)

- 包含bug的apk一个

- 必须在非root环境


攻击过程:

- 将apk装入模拟器中。

- 打开chrome浏览器,访问选手的恶意网页的地址。(web服务由选手自己搭建)

- 通过选手的恶意网页,即可获取此app的shell。

- apk显示“购买成功”


目标:Chrome浏览器点击链接,导致远程触发app的购买逻辑,app界面上显示“购买成功”。


评分标准:通过浏览器访问网页即达到控制app远程任意代码执行得6分,其中:

1. 反弹shell控制app ,5分。

2. 能够进一步让app界面显示“购买成功”分数进一步得1分 。

3. 需提供远程任意代码执行的利用程序源代码。

二、解题思路

攻击流程如下:



1. Android Intents with Chrome 

其中题目中要求“Chrome浏览器点击链接”,Chrome的官方文档规定了如何从链接发intent启功app,官方文档链接:https://developer.chrome.com/multidevice/android/intents 。反汇编ExamPwn.apk文件发现AndroidManifest.xml中果然有接受相关intent的内容。如图:




类LoginActivity先接受这个intent解析出帐号密码并匹配,帐号密码直接以明文硬编码在类LoginActivity中,反汇编直接可以看见。匹配正确后将intent中的url丢给类MainActivity。也就是说攻击者的网页至少如下:

2.info leak

反汇编类MainActivity发现,它会把url指向的文件当作特定格式的json解析。根据json内容,它会执行上传文件和下载解析显示图片的任务。不难发现上传文件的路径是攻击者提供的,app没有检查是否合法,造成任意文件上传,信息泄漏的漏洞。此时构造如下json可以泄漏app的内存地址

3. code exec

想要拿到Android app远程代码执行权限,漏洞基本只能存在于Dex动态加载逻辑、访问远程数据的native代码中。用工具androguard扫描发现,没有dex动态加载问题,漏洞只可能在native代码中。App有native代码libHt5g.so用于解析和播放gif图片。漏洞很可能就在其中,反汇编libHt5g.so发现有很多函数都有FrameSequence关键词。实际上就是Google自己的gif显示库,2016年12月和2017年1月都曝出过漏洞。


详情见:

https://source.android.com/intl/us_ALL/security/bulletin/2016-12-01.html

https://source.android.com/intl/us_ALL/security/bulletin/2017-01-01.html


但光看源代码基本不能利用。所以说出题者应该放了其他漏洞在里面。

反汇编看到private static native long nativeGetFrame(long j, int i, Bitmap bitmap, int i2);的时候可以发现,当gif一帧的大小小于等于1024字节的时候,buffer是分配在stack上然后再memcpy到原来的bitmap buffer中。不仅多此一举而且跟源代码不一致,基本确定出题者准备的是栈溢出。

到此为止如果还没有发现有源代码可以自己编译然后binary diff的话,可以自己构造小于1024字节的gif,然后逐个字节替换为0xff,最快几十字节改就会发现crash,分析后发现Gif格式中,一帧图片的Left变量被当成负数处理了,无符号整数被当作有符号整数处理。而知道用binary diff的同学基本直接可以定位到出题者修改的所有地方,包括解析Left出错的地方。



光看源代码基本不能利用是因为bitmap是RGBA格式,RGB可以控制,而Alpha在源代码里直接被0xff填充,意为不透明。这样的话溢出的数据基本很难控制。所以作为出题者的我们按照gif格式添加了tag为0x77的ExtentionBlock,里面存放的数据作为Alpha值。这样就能完全控制溢出的数据了。

由于Left变成了负数,造成了向低地址的任意数据的栈溢出。

受影响汇编代码




可以看到此函数在栈上申请了0x480大小的字节。其中处于高地址的0x400(1024)个字节是将被溢出的buffer,处于低地址的0x80个字节是可以作为掩盖目标。到此可以任意代码执行了。

4.rop

由于之前拿到/proc/self/maps,内存地址都泄露了,这里说一下我们的rop方法。

溢出后控制memcpy的dst参数,将准备好的数据拷贝到从/proc/self/maps里找到的暂时不用的一块内存。我们在linker64里找到两个gadget



1、修改sp地址到新地址

2、把所在内存修改为可执行

3、跳转到自定义的可执行内存


作者:蚂蚁金服巴斯光年实验室,更多关于阿里的安全技术文章,请访问阿里聚安全博客

相关文章
|
算法 JavaScript Java
一道Android逆向题的取巧解题思路
一道Android逆向题的取巧解题思路
|
机器学习/深度学习 人工智能 安全
|
安全 大数据 Android开发
|
机器学习/深度学习 安全 算法
【阿里聚安全·安全周刊】一种秘密窃取数据的新型 Android 木马|iOS 11相机惊现BUG
阿里安全周刊第九十期,分享本周移动安全热点和技术知识。
1855 0
|
3天前
|
存储 Java 数据库连接
Android Java开发异步
【6月更文挑战第15天】
|
2天前
|
安全 Java Android开发
安卓开发中的新趋势:Kotlin与Jetpack的完美结合
【6月更文挑战第20天】在不断进化的移动应用开发领域,Android平台以其开放性和灵活性赢得了全球开发者的青睐。然而,随着技术的迭代,传统Java语言在Android开发中逐渐显露出局限性。Kotlin,一种现代的静态类型编程语言,以其简洁、安全和高效的特性成为了Android开发中的新宠。同时,Jetpack作为一套支持库、工具和指南,旨在帮助开发者更快地打造优秀的Android应用。本文将探讨Kotlin与Jetpack如何共同推动Android开发进入一个新的时代,以及这对开发者意味着什么。
|
2天前
|
Java 开发工具 Android开发
探索安卓与iOS开发的核心差异
【6月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文将深入探讨这两大操作系统在开发过程中的主要区别,包括编程语言、开发工具、用户界面设计哲学、系统架构以及市场分布等方面。通过对这些关键差异的分析,旨在为开发者提供一份实用的指南,帮助他们在面对项目决策时,能够更加明智地选择合适的平台,并针对特定平台优化他们的应用。
|
2天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:从工具到用户体验
【6月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计以及性能优化等方面的关键差异。我们将通过比较分析,揭示各自平台的独特优势和面临的挑战,为开发者提供决策参考,并为最终用户提供更深层次的用户体验洞察。
|
4天前
|
Java Android开发 Swift
探索Android与iOS开发的差异:平台选择对项目成功的影响
【6月更文挑战第18天】在移动应用开发的广阔天地中,Android和iOS两大平台各据一方,它们在市场份额、用户群体及开发环境上各有千秋。本文将深入分析这两个操作系统的开发差异,探讨如何根据项目需求选择合适的平台,并讨论跨平台解决方案的可行性与挑战。我们将通过实际案例,揭示平台选择对项目成功的关键性影响,为开发者提供决策支持。
|
5天前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。