行動應用安全解析實作 - Melvin

課程Android 反組繹工具分析:

  • Apktool
  • Dex2jar
  • DJ-Decompiler+ JD-GUI

 

課程Android 封包截取工具:

  • Wireshark(封包側錄)
  • Burp Suite(封包截取、修改)

 

虛擬機的前置設定與實作:
 
     1. 控制台 -> 進階系統設定 -> 環境變數
        [新增使用者變數]
        變數名稱: JAVA_HOME
        變數值: C:\Program Files\Java\jdk1.7.0_79
        [編輯系統變數 Path]
        加入 "C:\Users\User\Desktop\Mobile Security\adt-bundle-windows-x86-20140702\sdk\tools"
        及 "C:\Users\User\Desktop\Mobile Security\adt-bundle-windows-x86-20140702\sdk\platform-tools"
        並以分號(;)隔開路徑
 
    2. [打開 Android SDK Manager]
        開啟 cmd 輸入 android.bat (會呼叫 SDK Manager)
        
 
    3. [安裝 Android 4.2.2 (API 17)]
        只勾選 Android 4.2.2 (API 17),其他取消勾選,然後 install。
        
 
    4. [Burp Suite: 新增 Proxy Listener]
        允許模擬機可以連到 Burp Suite,讓 Burp Suite 能夠攔截到模擬機傳送的封包。
        Burp Suite -> Proxy -> Options -> Proxy Listeners -> Add
        
        Bind to port: 8080
        Bind to address: All interfaces
        
        
 
    5. [下載憑證]
        Firefox 設定 -> 進階 -> 網路 -> 設定 ->「手動設定Proxy」
        HTTP Proxy: 127.0.0.1
        Port: 8080
 
        網址輸入 127.0.0.1:8080 -> 下載 CA
        
        將附檔名 .der 改成 .crt (.der 在 Android 是不會識別的)
 
    6. [新增一個模擬機]
        開啟 cmd 輸入 android.bat avd (會跳出 AVD Manager) -> Create a new AVD
        
 
    7. [打開模擬機]
       在 cmd 輸入 emulator -avd GoatDroid -scale 0.8 -http-proxy http://127.0.0.1:8080
 
    8. [在模擬機上安裝憑證]
        在 cmd 輸入 adb devices,可顯示 Android 連接狀況。
        
        
        可以看到目前連接了一台模擬機叫作 emulator-5554,我們要將憑證安裝到此台裝置上。
        首先在 cmd 中進入憑證所在的資料夾,再輸入 adb -s emulator-5554 push cacert.crt /sdcard/
        
 
        (切換到模擬機) Setting -> Security -> Install from SD card -> OK
        
 
        接著會跳出 "cacert is installed." 代表憑證安裝完成囉!
        
 
    9. 暫時關掉防火牆 (為了確保之後 Start Web Service 不會被擋)
 
    10. 開啟 OWASP GoatDroid -> Configure -> Edit Configuration
        請依下圖做設定,然後 Update Settings。
        
 
    11. FourGoats -> Push App To Device -> Start Web Service
         (先前已打開模擬器,不需要再開啟)
         
 
    12. (切換到模擬機) FourGoats -> Menu -> Destination Info
         
         依下圖設定,Host 是自己電腦的 IP 位址。
         
 
 
   13. 完成以上設定後,就可開始分析囉!
 
(靜態分析)
cd到apktool資料夾
>java -jar apktool.jar d -f "C:\Users\CS2013\Desktop\goatdroid.apk" -o "C:\Users\CS2013\Desktop\goatdroid"
cd到dex2jar資料夾
>d2j-dex2jar.bat -f -o "C:\Users\CS2013\Desktop\goatdroid\goatdroid.jar" "C:\Users\CS2013\Desktop\goatdroid.apk"
apktool 轉中介語言
 
Android 四大元件 
1.activity(class) 2.receiver 3.service 4.content provider
 
有了 Source Code 可以植入後門
找安全機制
 
作業提示:
Proxy只有一個漏洞
按login之後的Request(去burp)
看reponse isadmin為false -> 換成true可以看到多的Button (這是M1 因為server沒有控管好)
 
"adminhome" "activity" -> isadmin = true
"SharedPreferences"  (/data/data/org.owasp.goatDroid.fourgoats/shared-prefs/credentials.xml) {M2}
 

 

OWASP Top 10 Mobile Risks:

整理來源: http://squaremax.pixnet.net/blog/post/86780972-淺談owasp-top-10-mobile-risks

M1. 不安全的資料儲存(Insecure Data Storage)

意指敏感性資料未受到適當的保護,一般常見如敏感性資料未加密,或是一些不常用到的暫存資料可能含有

敏感訊息(例如:登入帳號與密碼),可能會造成機密性資料損失、憑證外洩、侵犯隱私權等衝擊。

【發生原因】

未對隱私資料做加密

【建議防護措施】

只儲存必要資訊,不將敏感資料存放於開放式的儲存媒體(例如:SD卡),採用安全

的檔案加密應用程式介面,設定檔案的讀取與寫入設定權限等。

【常見資料儲存位置】

 

  1. SQLite databases
  2. Log Files
  3. Plist Files
  4. XML Data Stores or Manifest Files
  5. Binary data stores
  6. Cookie stores
  7. SD Card
  8. Cloud synced

 

M2. 弱伺服器端的控制(Weak Server Side Controls)

主要是說明Mobile的弱點並不只單存在於Mobile端,所開發的APP應用程式或雲端系統的程式亦有可能存

在弱點,例如:OWASP Cloud Top 10。

【發生原因】

1.急於上市

2.缺乏對於新的語言的安全知識

3.較低安全運算用於App

【建議防護措施】

人員於伺服器端開發應用程式時,應避免產生OWASP Web Top 10

OWASP Cloud Top 10相關弱點,詳細內容可參考OWASP官方網站

 

M3. 傳輸層保護不足(Insufficient Transport Layer Protection)

可攜式行動裝置於傳輸機敏性資料時,很常發生未加密情況,例如:瀏覽器本身不支援HTTPS功能,或是

使用的APP應用程式未採用加密方式進行資料的傳輸(如:登入系統、交易資料等),因此可能會造成駭客使

用中間人攻擊(Man-in-the middle attacks),從中竄改或竊取封包資料,進而造成機敏資料的洩漏。

【發生原因】

1.瀏覽器本身不支援HTTPS

2.APP未以加密方式進行資料傳輸

【建議防護措施】

程式開發者應確保所有敏感性資料有採用加密方式進行傳輸,傳輸媒介可包含網路

連線、Wifi連線,甚至是近場通訊(Near Field Communication, NFC)連線等,若只採用明文方式

傳遞,攻擊者可輕易透過網路監聽方式(Sniffer)竊取機敏性資料。

【常見的攻擊方式】

封包攔截,修改參數

 

M4. 客戶端注入(Client Side Injection)

Injection攻擊一直都是相當好用的攻擊手法,即使移到了可攜式行動裝置的網頁應用程式,若網頁應用程式

存有Injection弱點,攻擊者仍可利用SQL Injection或XSS攻擊手法來提升可攜式行動裝置的權限,或是利

用網路盜打市話(Toll Fraud)的情況發生。

【建議防護措施】

網頁應用程式傳遞參數給雲端資料庫的內容,需過濾不受信任或不應該接受的內容

,例如:SQL執行語法、特殊字元等,同樣可採用prepared statement功能進行過濾。

【常見的攻擊方式】

SQL執行語法、特殊字元等

 

M5. 粗糙的授權與認證(Poor Authorization and Authentication)

部分可攜式行動裝置的網頁應用程式僅採用永不變的數值來執行身分驗證與授權階段,例如:國際移動設備

識別碼(International Mobile Equipment Identify Number, IMEI)、國際移動用戶識別碼(International

Mobile Susscriber Identify, IMSI)或通用唯一識別碼(Universally Unique Identifier, UUID)。

【建議防護措施】

使用嚴謹的身分驗證與授權(例如:雙因素認證),避免使用可攜式行動裝置的硬體

ID標籤或永不變的ID識別碼做為身分驗證的因素。

【常見的攻擊方式】

Root手機後可以繞過大多數的客戶端保護

 

M6. 不適當的會話處理(Improper Session Handling)

可攜式行動裝置的應用程式session過期時間,一般而言會設定的比較長,原因是對使用者方便存取或使

用,通常這些session經由HTTP Cookies、Oauth Token、Single Sign-on等方式來進行維護,建議避免

使用裝置的硬體識別碼來當作session值,很容易讓攻擊者猜到session內的機密性內容(例如:帳號或密碼)

,進而造成提升攻擊者於可攜式行動裝置的權限,進行非授權的存取。

【建議防護措施】

若需要提高安全性,相對其軟硬體設計(演算法或操作方式)的複雜度亦會增高,只

要session值的過期時間應設定在一個可接受範圍內,就無需擔心讓使用者太頻繁的重新驗證;另外

可攜式行動裝置遭遺失或竊取時,應有能夠快速撤銷Token的機制,使裝置無法更近一步遭受到濫用

情況。

【常見的攻擊方式】

駭客是利用SessionID會當成Cookie存到用戶端電腦的特性,竊取存在用戶端電腦的SessionID,再冒用網頁使用者的身份進入該使用者所使用的的網站竊取重要的個人資料(例如:金融資訊) ,再進行危害網頁使用者的動作。

 

M7. 安全決策是經由不受信任的輸入(Security Decisions Via Untrusted Inputs)

在各種可攜式行動裝置的平台均會發生(例如:iOS、Andriod),應用程式可能經由惡意攻擊者精心設計,或

是應用程式遭攻擊者透過Client Side Injection攻擊方式來消耗可攜式行動裝置的硬體資源或提升權限情形

。舉例來說,假設Skype應用程式具有HTML或Script Injection弱點,攻擊者只要事先把具有惡意連結的

iframe寫入某個特定網頁:

<iframe src="skype:17031234567?call"></iframe>

一但可攜式行動裝置的瀏覽器讀取到此iframe程式碼時,Skype應用程式將無需使用者授權,自動開始播號

給指定的電話號碼。

【建議防護措施】

每個應用程式在設計時均應注意身分認證與授權的問題,以確保可攜式行動裝置需

經過使用者的身分驗證後才允許執行特殊的行為或功能。

 

M8. 側通道資料洩漏(Side Channel Data Leakage)

這邊的Side Channel比較像是可攜式行動裝置中的第三方應用程式,這些應用程式可能會自動幫使用者儲

存一些敏感性資訊,例如:網頁暫存(Web Cache)、按鍵側錄(Keystorke Logging)、擷取畫面

(Screenshots)、日誌檔(Logs)或暫存目錄(Temp Directories)等,一但攻擊者成功取得可攜式行動裝置

權限時,將會侵犯使用者隱私,甚至導致資料洩漏情形。

【建議防護措施】

一些較敏感性的資料應避免自動儲存於可攜式行動裝置內(例如:憑證資訊、帳

號、密碼等),檢查部分應用程式是否會儲存敏感性資訊,建議加以手動移除,或是選擇不自動儲存

功能。

 

M9. 加密失效(Broken Cryptography)

所謂加密失效分為兩種情況,一種是使用強健的加密演算法卻遭到破解,另一種為使用過於簡單的加密演算

法遭到破解。前者要實現的困難度較高,後者則是相當常見。OWASP提出幾個對於加密方法的謬誤,例如

:編碼(Encoding)、混淆(Obfuscation)、序列化(Serialization),上述嚴格說起來,並非為嚴謹加密方

式,攻擊者能輕易破解簡單的加密演算法後,取得可攜式行動裝置的完整資訊,同樣也可做到提升權限或機

敏資料遭洩漏等情況。

【建議防護措施】

開發應用程式建議使用強健的加密演算法,並不斷進行反覆測試,直到應用程式

開發完成時,仍需執行嚴格的挑戰測試(Battle-Tested)。

【不安全的加密法】

  1. RC2
  2. MD4
  3. MD5
  4. SHA1

 

M10. 敏感資訊洩漏(Sensitive Informaiton Disclosure)

此弱點的洩漏方式,乃是指應用程式原始碼中,把輸入或輸出的相關參數直接寫入在程式碼當中,因此只要

攻擊者能夠取得應用程式的原始碼(例如:透過逆向工程手法),若原始程式碼內容含有敏感資訊,像是API

金鑰、帳號或密碼等,可能會造成企業內部的智慧財產暴露或各人憑證洩漏等情況。

【建議防護措施】

程式開發者應避免將敏感資訊寫入於原始程式碼中。

 

作業實做:
1. 在 Login activity 中有寫死的帳號密碼,註冊該帳號密碼後登入,即可以管理員身份登入。
 
2. 在 SharedPreferences 以 MODE_WORLD_READABLE (=the constant 1) 儲存 User Credentials,其他 App 可以存取到。
[Note]: MODE_WORLD_READABLE(1) –  File creation mode: allow all other applications to have read access to the created file.
 
3. 在 CustomSSLSocketFactory.getNewHttpClient 這個函式裡設定 HostNameVerifier 為 ALLOWALLHOSTNAME_VERIFIER。
 
4. Intent Spoofing: 如果 Android 元件(activity, service, receiver)是導出(exported=true)的話,惡意程式可以使用 Explicit Intent 像這個元件發送 Intent,Android 無法識別這個 Intent 是誰發送的,將會正常的執行請求動作。