經過前面一系列講解 Andorid 基本東西 接下來我跟大家介紹APP靜態分析 在不把APP跑起來情況下 去了解內部的工作與邏輯
靜態上弱點分析常見的有
基本上 Disassemble APK 方法 可以透過apktools 來Unpack APK 把byte Code 轉成smali Code 來方便閱讀 順帶一堤 Resource 也會被 Decode 成可讀格式
Linux 下載
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
Unpack APK 指令
apktool d <Target_APK>
拆完的第一步可以先看Manifest 裡的東西
例如 Package name, Permission, Application Class, Component, Resource ,Network Configurations
Package Name 會放在 manifest 元素中 例如 package="com.example.application"
Permmision 形式如下
<uses-permission android:name="android.permission.<Permissions>"/>
Permission 中 有些APP 會請求過多不必要的權限 例如 READ_SMS, SEND_SMS, RECEIVE_SMS 會導致惡意APP 可以去讀SMS訊息 攔截讀取驗證碼(One-Time-Passwords) 或是 INSTALL_PACKAGES 與 REQUEST_INSTALL_PACKAGES 來透過System installer 來安裝惡意程式 等等
除了Permission 以外 也會去注意最初始化的classes 因為這裡通常會初始化第3方library 如果有已知漏洞或是不安全配置 可能會引入安全問題 以上自訂的classes 可以在 Application 這個element中去找 android:name=""
在組件中需要注意的是 組件的 Export 是否等於True 因為如果像是一些Activity 或是 Content provider 如果export = true 攻擊者可以透過ADB 或是 惡意程式 傳送自訂的 intent 來觸發意外行為 讀取任意資料等等
我們也可以在Manifest 中找一下 android.intent.action.MAIN 這表示 這個元件是個APP的入口 也就是得了 APP圖標後 第一個啟動的程序
基本上找到入口 後可以看一下 有沒有ContentProvider 與 Services 如果有 可以去檢查一下 Main Classes 裡面邏輯 並檢查 他的classes 是否有 Initalize 的classes 拓展 並進行檢查
Resource 這邊蠻適合找 硬編碼的東西 其中String.xml 會在res 這個資料夾底下裡面會放layout 變數的值 會呈現key-value 形式 這裡有時候會有硬編碼問題
例如
<string name="api_key">API_meowKEY</string>
我們可以注意 android:networkSecurityConfig="@xml/network_security_config" 會在 /res/xml/network_security_config.xml 中 這裡的網路設定會跟安全有關 例如是否允許明文流量 或是自訂相信的CA (Certificate Authorities)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">192.168.1.1</domain>
<trust-anchors>
<certificates src="@raw/certificate" />
</trust-anchors>
</domain-config>
</network-security-config>
cleartextTrafficPermitted="false" 表示 不接受明文流量 並且自訂的.crt 放在 @raw/certificate
也就是 /res/raw 下
這個設定在APP 中稱為SLL Pin 技術 可以防止流量被攻擊者攔截 例如開BurpSuite 去攔截流量
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<pin-set expiration="2030-12-31">
<pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
</pin-set>
</domain-config>
</network-security-config>
不過這裡還是有機會被攻擊者繞過 也就是 Patch 應用程式 .crt 與 Hash 換掉 換成burp .crt 與 Hash 值來讓APP 信任我們的burp 這裡蠻多細節的 只能之後有機會可以在討論一下