我最近学习到一个新姿势,在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,远程通过修改数据包的字段,再结合代码审计
整体产出还是很不错的
国产的手机定制这么深入,可以搞一波了,墙裂推荐有兴趣的读者朋友学习这篇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"
字段进行路径拼接生成文件
所以构造如下数据包,就会造成路径穿越
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
文件加载
基本的原理是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,一直跑的那种
别的人有钱之后都是会所嫩模,我想好了,我要是赚够了钱,我就可以不上班,天天在家里研究技术
可惜了,我现在做着业务安全,离安全研究的道路越来越远,可能再也回不去了
也可能,我下个月就去搞技术研究了呢?
Alpha Team发现了UOS两个漏洞,官方给了致谢,很强!
侧面可以看出来数字公司的某些业务方向,我想搜一下这个SRC,一直搜不出来,奇了怪了
最后介绍一个工具,Android和iOS双平台渗透虚拟机
- https://mobexler.com/
一共有两个版本,官方推荐使用MobexlerLite
- MobexlerLite
- Linux Lite
- (OVA) File Size: 7 GB
- Mobexler
- Elementary OS
- (OVA) File Size: 17 GB
官方的使用图片很酷炫,颇有技术大佬的感觉
我运行看了看,配备了一些常见的工具,部分工具和我日常工作有交集,但是我偏向JEB更多,极其少直接使用baksmali这样的工具,起码也是做了一层封装更加可视化,enjarify和jadx我觉得应该放到AndroidZone里,毕竟都是Android工具
不好用,我打算自己定制一个顺手的