testing-mobile-applications について
testing-mobile-applicationsは、AndroidおよびiOSアプリを評価するセキュリティスキルです。静的・実行時分析、通信の傍受、モバイル固有の攻撃面の検査に加え、フレームワークを識別して適切な手順を選ぶ方法を扱います。
主な機能
- 01Android APKとiOSアプリの分析
- 02静的・実行時の検査
- 03通信傍受とピンニング回避
- 04ディープリンクとコンポーネントの検査
- 05フレームワーク識別とスキル選択
活用シーン
- 01Android APKの評価
- 02iOSアプリのテスト
- 03アプリ通信とデータ保存の調査
- 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 / Dart | reversing-flutter-apps |
index.android.bundle、libhermes.so、main.jsbundle | React Native | reversing-react-native-apps |
global-metadata.dat、libil2cpp.so、Assembly-CSharp.dll | Unity | reversing-unity-il2cpp |
libmonodroid.so、assemblies.blob、libxamarin-app.so | Xamarin / .NET MAUI | reversing-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 - ポートを転送
簡易テストワークフロー
- 静的解析 - 逆コンパイルし、文字列を検索して、マニフェスト/Info.plist を解析します
- インストール - エミュレーター/デバイスにインストールします
- トラフィックの傍受 - Burp/mitmproxy を設定し、SSL ピンニングを回避します
- 動的解析 - Frida を使って関数にフックし、保護機能を回避します
- コンポーネントのテスト - エクスポートされたコンポーネント、ディープリンク、インテントをテストします
- データストレージ - ファイル/DB/キーチェーン内の安全でないデータ保存を確認します
- 再パッケージ化 - 追加のシナリオをテストするため、変更して再コンパイルします