阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 2323阅读
  • 0回复

[云安全技术和产品专区 ]阿里聚安全攻防挑战赛第三题Android PwnMe解题思路

发帖
107
云币
373
大家在聚安全挑战赛正式赛第三题中,遇到android app 远程控制的题目。我们今天带你一探究竟,如何攻破这道题目。 &s8<6P7  
  WK==j1  
一、题目 IP ,.+:i  
,?(ciO)  
;7Okyj6EP  
Y5Z!og  
购物应用pwn (6分) Uw)=WImz[  
6+3$:?  
ORBxD"J&  
环境: c -B/~&  
- 要求在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) ,mKObMu  
- 包含bug的apk一个 aSL6zye ,  
- 必须在非root环境 68e[:wf  
P!e=b-T  
fu4!t31  
攻击过程: 8(lR!!=q  
- 将apk装入模拟器中。 m`}{V5;  
- 打开chrome浏览器,访问选手的恶意网页的地址。(web服务由选手己搭建) ,T|x)"uA`  
- 通过选手的恶意网页,即可获取此app的shell。 C:i|-te  
- apk显示“购买成功” BStk&b  
#xT!E:W '  
->gZ)?Fqy  
目标:Chrome浏览器点击链接,导致远程触发app的购买逻辑,app界面上显示“购买成功”。 a]B[`^`z  
`1+F,&e  
O0hu qF$K  
评分标准:通过浏览器访问网页即达到控制app远程任意代码执行得6分,其中: y1pu R7  
1. 反弹shell控制app ,5分。 wK!~tYxP  
2. 能够进一步让app界面显示“购买成功”分数进一步得1分 。 BKIjNV3  
3. 需提供远程任意代码执行的利用程序源代码。 s_Wyh !@M  
L0NA*C   
z|N3G E(.@  
二、解题思路 nxo+?:**  
)uheV,ZnY  
)rm4cW_  
攻击流程如下:
f_=~H<j!  
 L,LNv  
_[h8P9YI4  
_Z Y\,_  
 5@!st  
1. Android Intents with Chrome $}o b,i^W  
iG<Som  
ej(ikj~j  
其中题目中要求“Chrome浏览器点击链接”,Chrome的官方文档规定了如何从链接发intent启功app,官方文档链接:https://developer.chrome.com/multidevice/android/intents 。反汇编ExamPwn.apk文件发现AndroidManifest.xml中果然有接受相关intent的内容。如图:
@n+=vC.xO  
J n&7C  
类LoginActivity先接受这个intent解析出帐号密码并匹配,帐号密码直接以明文硬编码在类LoginActivity中,反汇编直接可以看见。匹配正确后将intent中的url丢给类MainActivity。也就是说攻击者的网页至少如下:
z rfUQO  
e'9r"<>i  
DN] v_u+}  
2.info leak c&nh>oN  
vVxD!EL  
tJ0NPI56yP  
反汇编类MainActivity发现,它会把url指向的文件当作特定格式的json解析。根据json内容,它会执行上传文件和下载解析显示图片的任务。不难发现上传文件的路径是攻击者提供的,app没有检查是否合法,造成任意文件上传,信息泄漏的漏洞。此时构造如下json可以泄漏app的内存地址
+^|iZbZKx  
f 2YLk  
{*m?Kc7k  
3. code exec j+IrqPKC^  
EHf\L  
} ^kL|qmjR  
想要拿到Android app远程代码执行权限,漏洞基本只能存在于Dex动态加载逻辑、访问远程数据的native代码中。用工具androguard扫描发现,没有dex动态加载问题,漏洞只可能在native代码中。App有native代码libHt5g.so用于解析和播放gif图片。漏洞很可能就在其中,反汇编libHt5g.so发现有很多函数都有FrameSequence关键词。实际上就是Google自己的gif显示库,2016年12月和2017年1月都曝出过漏洞。 na+d;h*~y  
详情见: jeUUa-zR3  
https://source.android.com/intl/us_ALL/security/bulletin/2016-12-01.html .ic:`1  
https://source.android.com/intl/us_ALL/security/bulletin/2017-01-01.html RP4Ku9hk  
但光看源代码基本不能利用。所以说出题者应该放了其他漏洞在里面。 1GCzyBSbb  
反汇编看到private static native long nativeGetFrame(long j, int i, Bitmap bitmap, int i2);的时候可以发现,当gif一帧的大小小于等于1024字节的时候,buffer是分配在stack上然后再memcpy到原来的bitmap buffer中。不仅多此一举而且跟源代码不一致,基本确定出题者准备的是栈溢出。 Fr2N[\>s  
到此为止如果还没有发现有源代码可以自己编译然后binary diff的话,可以自己构造小于1024字节的gif,然后逐个字节替换为0xff,最快几十字节改就会发现crash,分析后发现Gif格式中,一帧图片的Left变量被当成负数处理了,无符号整数被当作有符号整数处理。而知道用binary diff的同学基本直接可以定位到出题者修改的所有地方,包括解析Left出错的地方。
|I;$M;'r&  
GEUg]nw  
WYcA8 X/  
~a9W3b4j  
光看源代码基本不能利用是因为bitmap是RGBA格式,RGB可以控制,而Alpha在源代码里直接被0xff填充,意为不透明。这样的话溢出的数据基本很难控制。所以作为出题者的我们按照gif格式添加了tag为0x77的ExtentionBlock,里面存放的数据作为Alpha值。这样就能完全控制溢出的数据了。 5 `D-  
由于Left变成了负数,造成了向低地址的任意数据的栈溢出。 yR5XJ;Tct  
$.%rAa_H  
BqK(DH^9N  
受影响汇编代码
pKG<Nvgz&  
+ kK  
Q,T"ZdQ  
R"v 3!P  
$tqJ/:I  
可以看到此函数在栈上申请了0x480大小的字节。其中处于高地址的0x400(1024)个字节是将被溢出的buffer,处于低地址的0x80个字节是可以作为掩盖目标。到此可以任意代码执行了。 !A3-0zN!  
"UFs~S|e  
4.rop >R,'5:Rw  
I?#85l{>  
4bVO9aUG{  
由于之前拿到/proc/self/maps,内存地址都泄露了,这里说一下我们的rop方法。 5Z/7kU= I  
溢出后控制memcpy的dst参数,将准备好的数据拷贝到从/proc/self/maps里找到的暂时不用的一块内存。我们在linker64里找到两个gadget
w'4AJ Q|;  
g]~h(mI  
y m,H@~  
G.Vu KsP]  
1、修改sp地址到新地址 uQ$^;Pr  
2、把所在内存修改为可执行 eDI= nSo  
3、跳转到自定义的可执行内存 m><w0k?t  
.jw}JJ  
N;oQ^B'  
作者:蚂蚁金服巴斯光年实验室,更多关于阿里的安全技术文章,请访问阿里聚安全博客
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)