iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0

經過前面一系列講解 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

檢查Manifest.xml

Package Name

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 來安裝惡意程式 等等

自訂應用程式 Classes

除了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 這裡蠻多細節的 只能之後有機會可以在討論一下


上一篇
DAY 18 Deep Link
下一篇
DAY 20 APK Disassembling - Smail Code 上
系列文
我是不可能一直學Android 絕對不會20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言