mcpField
T
testing-mobile-applications

testing-mobile-applications

github.com/trilwuセキュリティ177106 回インストール12 週間前に更新
リポジトリ

testing-mobile-applications について

testing-mobile-applicationsは、AndroidおよびiOSアプリを評価するセキュリティスキルです。静的・実行時分析、通信の傍受、モバイル固有の攻撃面の検査に加え、フレームワークを識別して適切な手順を選ぶ方法を扱います。

主な機能

  1. 01Android APKとiOSアプリの分析
  2. 02静的・実行時の検査
  3. 03通信傍受とピンニング回避
  4. 04ディープリンクとコンポーネントの検査
  5. 05フレームワーク識別とスキル選択

活用シーン

  1. 01Android APKの評価
  2. 02iOSアプリのテスト
  3. 03アプリ通信とデータ保存の調査
  4. 04フレームワークに応じた手順の選択

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/trilwu/secskills --skill testing-mobile-applications

インストール後、Claude Code で/testing-mobile-applicationsを入力して読み込まれたか確認します。

詳細

モバイルアプリケーションのテスト

使用する場合

  • Android APK の分析とエクスプロイト
  • iOS アプリケーションのペネトレーションテスト
  • モバイルアプリのセキュリティ評価
  • セキュリティ制御の回避(SSL ピンニング、ルート検出)
  • モバイル特有の脆弱性のテスト

使用しない場合

  • バックエンド API のテスト — testing-apis を使用します
  • ネイティブバイナリの詳細なリバースエンジニアリング — analyzing-binaries を使用します
  • 悪意のあるアプリの分析 — analyzing-malware を使用します
  • ソースコードが利用できる場合 — auditing-code-for-vulnerabilities を使用します

何よりも先にフレームワークを確認する

jadx の出力がほとんどないからといって、アプリが難読化されているとは限りません。通常、ロジックが dex にまったく含まれていないことを意味します。まずこれを実行してください。どのスキルを使うべきか判断できます。

unzip -l target.apk | rg 'libflutter|libapp\.so|index\.android\.bundle|libhermes|global-metadata|libil2cpp|Assembly-CSharp'
マーカーフレームワークスキル
libflutter.so、libapp.so、flutter_assets/Flutter / Dartreversing-flutter-apps
index.android.bundle、libhermes.so、main.jsbundleReact Nativereversing-react-native-apps
global-metadata.dat、libil2cpp.so、Assembly-CSharp.dllUnityreversing-unity-il2cpp
libmonodroid.so、assemblies.blob、libxamarin-app.soXamarin / .NET MAUIreversing-xamarin-maui
実際のアプリケーションパッケージを含む classes*.dexネイティブ Androidここから続行

誤解すると特に時間を浪費するため、よくあるフレームワークの症状を 2 つ挙げておきます。Flutter アプリではプロキシにまったくトラフィックが表示されません(システムプロキシと CA ストアを無視します)。また、React Native や Unity アプリでは、すべてのロジックが assets/ にあり、dex がほとんど空です。

一般的な評価では扱いきれないほど詳しい手順が必要なため、このスキルからさらに 3 つの手順別スキルを分けています。

状況スキル
ルート化されたデバイスでアプリが終了する、または Frida のアタッチ時にクラッシュするbypassing-root-jailbreak-detection
iOS バイナリの作業:FairPlay の復号、Mach-O、class-dump、エンタイトルメントanalyzing-ios-binaries
エクスポートされたコンポーネント、ディープリンク、URL スキーム、コンテンツプロバイダーtesting-mobile-ipc

その他の理由でプロキシが失敗する場合(TLS ハンドシェイクアラートが出る場合や、プロキシを有効にするとアプリがネットワークエラーを報告する場合)は、証明書ピンニングを疑う前に bypassing-mobile-pinning に進んでください。Android 7 以降では、最もよくある原因は CA がユーザー証明書としてインストールされていることで、アプリはデフォルトではこれを信頼しません。ピンニングの回避では解決できません。

Android のペネトレーションテスト

APK 分析ツール
# Decompile APK
apktool d app.apk -o app_decompiled

# Convert DEX to JAR
d2j-dex2jar app.apk

# View JAR with JD-GUI
jd-gui app-dex2jar.jar

# Automated analysis
mobsf  # Mobile Security Framework
jadx app.apk  # APK to Java decompiler
ADB(Android Debug Bridge)
# List devices
adb devices

# Connect over network
adb connect 192.168.1.100:5555

# Install APK
adb install app.apk

# Uninstall
adb uninstall com.package.name

# List packages
adb shell pm list packages
adb shell pm list packages | grep -i "keyword"

# Get APK path
adb shell pm path com.package.name

# Pull APK from device
adb pull /data/app/com.package.name-xxx/base.apk

# Start activity
adb shell am start -n com.package.name/.MainActivity

# View logs
adb logcat

# Shell access
adb shell
静的解析

機密データを検索する:

# Extract strings
strings app.apk | grep -i password
strings app.apk | grep -i api
strings app.apk | grep -i token
strings app.apk | grep -i key

# Search in decompiled code
grep -r "password" app_decompiled/
grep -r "http://" app_decompiled/
grep -r "api_key" app_decompiled/

AndroidManifest.xml を確認する:

# Decompile and view
apktool d app.apk
cat app_decompiled/AndroidManifest.xml

# Look for:
# - android:debuggable="true"
# - android:allowBackup="true"
# - Exported activities/services
# - Custom permissions
# - URL schemes
動的解析

Frida(実行時インストルメンテーション):

# List running apps
frida-ps -U

# Attach to app
frida -U -n "App Name"
frida -U -f com.package.name

# Load script
frida -U -f com.package.name -l script.js

# Common scripts
# - Bypass SSL pinning
# - Bypass root detection
# - Hook functions
# - Dump memory

SSL ピンニングの回避:

// Frida script - Universal SSL pinning bypass
Java.perform(function() {
    var TrustManager = Java.use('javax.net.ssl.X509TrustManager');
    TrustManager.checkServerTrusted.implementation = function() {};

    var SSLContext = Java.use('javax.net.ssl.SSLContext');
    SSLContext.init.overload('[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;', 'java.security.SecureRandom').implementation = function(a,b,c) {
        this.init.overload('[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;', 'java.security.SecureRandom').call(this, a, null, c);
    };
});

ルート検出の回避:

// Frida - Bypass root detection
Java.perform(function() {
    var RootClass = Java.use('com.package.name.RootDetection');
    RootClass.isRooted.implementation = function() {
        return false;
    };
});
トラフィックの傍受

Burp Suite のセットアップ:

# 1. Install Burp CA certificate
# Download from http://burp:8080 on device
# Install in Settings -> Security -> Install from storage

# 2. Configure proxy
adb shell settings put global http_proxy 192.168.1.100:8080

# 3. For apps with SSL pinning, use Frida bypass

# 4. Clear proxy when done
adb shell settings put global http_proxy :0

mitmproxy:

# Start mitmproxy
mitmproxy --listen-port 8080

# Install certificate on device
# http://mitm.it

# Set device proxy to attacker IP:8080
APK の変更と再パッケージ化
# 1. Decompile
apktool d app.apk -o app_mod

# 2. Modify smali code
# Edit files in app_mod/smali/

# 3. Recompile
apktool b app_mod -o app_modified.apk

# 4. Sign APK
# Generate keystore (first time only)
keytool -genkey -v -keystore my-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

# Sign
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-key.keystore app_modified.apk alias_name

# Or use uber-apk-signer
java -jar uber-apk-signer.jar -a app_modified.apk

# 5. Install
adb install app_modified.apk
よくある脆弱性

安全でないデータ保存:

# Check shared preferences
adb shell
cd /data/data/com.package.name/shared_prefs/
cat *.xml

# Check databases
cd /data/data/com.package.name/databases/
sqlite3 database.db
.tables
SELECT * FROM users;

# Check files
cd /data/data/com.package.name/files/
ls -la
cat *

エクスポートされたコンポーネント:

# List exported activities
adb shell dumpsys package com.package.name | grep -A 20 "Activity"

# Start exported activity
adb shell am start -n com.package.name/.ExportedActivity

# Call exported service
adb shell am startservice -n com.package.name/.ExportedService

# Broadcast to receiver
adb shell am broadcast -a com.package.name.ACTION

安全でない WebView:

# Check for JavaScript enabled
# Look in code for:
webView.getSettings().setJavaScriptEnabled(true);

# Check for addJavascriptInterface
# Can lead to RCE if exposed

iOS のペネトレーションテスト

セットアップ

ジェイルブレイクツール:

  • checkra1n(iOS 12-14)
  • unc0ver(iOS 11-14.8)
  • Taurine(iOS 14-14.3)

SSH アクセス:

# Default credentials
ssh root@<device-ip>
# password: alpine

# Change default password!
passwd
IPA 分析
# Extract IPA
unzip app.ipa

# View binary
otool -L Payload/App.app/App
strings Payload/App.app/App

# Class dump
class-dump Payload/App.app/App > classes.txt

# Decrypt binary (on jailbroken device)
frida-ios-dump -u App

# Static analysis with Hopper/Ghidra
実行時解析

iOS での Frida:

# List apps
frida-ps -Ua

# Attach
frida -U -n "App Name"
frida -U -f com.company.app

# SSL pinning bypass (iOS)
objection -g "App Name" explore
ios sslpinning disable

Objection:

# Launch objection
objection -g com.company.app explore

# Common commands
ios info binary
ios hooking list classes
ios hooking search methods MainActivity
ios sslpinning disable
ios jailbreak disable
ios keychain dump
ios nsuserdefaults get
ファイルシステムへのアクセス
# Connect via SSH
ssh root@device-ip

# App data location
cd /var/mobile/Containers/Data/Application/<UUID>/

# Find app UUID
ipainstaller -l  # List apps
ls /var/mobile/Containers/Data/Application/

# Common paths
Documents/
Library/
Library/Preferences/  # plist files
Library/Caches/
tmp/
キーチェーンへのアクセス
# Using objection
ios keychain dump

# Manual (requires keychain-dumper on device)
./keychain_dumper

# Specific item
security find-generic-password -s "ServiceName"
よくある iOS の脆弱性

安全でないデータ保存:

# Check plist files
plutil -p Info.plist

# Check UserDefaults
ios nsuserdefaults get

# Check SQLite databases
sqlite3 database.db
.tables
SELECT * FROM sensitive_table;

バイナリ保護:

# Check for PIE
otool -hv App | grep PIE

# Check for stack canaries
otool -I App | grep stack_chk

# Check for ARC
otool -I App | grep objc_release

モバイル特有の攻撃

ディープリンクのエクスプロイト:

# Android
adb shell am start -a android.intent.action.VIEW -d "app://open?param=value"

# iOS
xcrun simctl openurl booted "app://open?param=value"

インテントインジェクション:

# Send malicious intent
adb shell am start -n com.package/.Activity --es "extra_key" "malicious_value"

バックアップの抽出:

# Android backup
adb backup -f backup.ab com.package.name
# Extract
java -jar abe.jar unpack backup.ab backup.tar

# iOS backup
idevicebackup2 backup --full backup_directory

ツール

Android:

  • APKTool - APK の逆コンパイル/再コンパイル
  • dex2jar - DEX を JAR に変換
  • JADX - APK から Java への逆コンパイラー
  • Frida - 動的インストルメンテーション
  • Objection - Frida ベースのツールキット
  • MobSF - 自動解析
  • Drozer - Android セキュリティフレームワーク

iOS:

  • Frida - 動的インストルメンテーション
  • Objection - Frida ツールキット
  • class-dump - クラス情報を抽出
  • Hopper/Ghidra - 逆アセンブラー
  • frida-ios-dump - バイナリを復号
  • iproxy - ポートを転送

簡易テストワークフロー

  1. 静的解析 - 逆コンパイルし、文字列を検索して、マニフェスト/Info.plist を解析します
  2. インストール - エミュレーター/デバイスにインストールします
  3. トラフィックの傍受 - Burp/mitmproxy を設定し、SSL ピンニングを回避します
  4. 動的解析 - Frida を使って関数にフックし、保護機能を回避します
  5. コンポーネントのテスト - エクスポートされたコンポーネント、ディープリンク、インテントをテストします
  6. データストレージ - ファイル/DB/キーチェーン内の安全でないデータ保存を確認します
  7. 再パッケージ化 - 追加のシナリオをテストするため、変更して再コンパイルします

参考資料

コメント