Android アプリケーション Pentesting

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

Android アプリケーションの基本

このページを最初に読むことを強くおすすめします。Android セキュリティに関連する最も重要な部分と、Android アプリケーション内で最も危険なコンポーネントについて知るためです:

Android Applications Basics

ADB (Android Debug Bridge)

これは Android デバイス(エミュレートまたは実機)に接続するための主要なツールです。
ADB はコンピュータから USB または Network 経由でデバイスを制御できます。このユーティリティは、ファイルの双方向への コピー, アプリの インストールアンインストール, シェルコマンドの 実行, データの バックアップ, ログの 読み取り などの機能を提供します。

adb の使い方を学ぶには、次の ADB Commands リストを参照してください。

Smali

場合によっては、アプリケーションのコードを変更することで 隠された情報(難読化されたパスワードやフラグなど)にアクセスすることが有益な場合があります。そのため、apk をデコンパイルしてコードを修正し、再コンパイルすることが有用なことがあります。
In this tutorial you can learn how to decompile and APK, modify Smali code and recompile the APK with the new functionality。これは、これから紹介する動的解析中のいくつかのテストに対する代替手段として非常に有用です。したがって、常にこの可能性を念頭に置いておいてください

その他の興味深いトリック

自動マルチソース APK 取得 (justapk)

pip install justapk (Python 3.11+). CLI は JSON を stdout に出力し、進行状況を stderr に出力します(パイプに優しい)。決定論的なフォールバックチェーンとして APK20 → F-Droid → APKPure (mobile API) → APKMirror (HTML scrape) → Uptodown (mobile API) → APKCombo (HTML scrape) を試みます。Cloudflare 保護されたソースでは、実際のクライアントを模倣してボット検出によるブロックを減らすために TLS フィンガープリント偽装を用いた curl_cffi を使用します。

justapk download <package>              # auto fallback
justapk download <package> -s apkpure   # pin a source / version / output dir
justapk search telegram
justapk info org.telegram.messenger
justapk convert app.xapk -o output/      # merges splits, re-signs with debug key

convert は XAPK/split APKs をマージし、debug key で署名するため、生成される APK の signature/provenance は元のものと異なります(テスト/解析用で、本番インストールには使用しないでください)。

  • デバイスから APK を抽出:
adb shell pm list packages
com.android.insecurebankv2

adb shell pm path com.android.insecurebankv2
package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk

adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
  • APKEditor を使って、すべての splits と base apks をマージする:
mkdir splits
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
java -jar ../APKEditor.jar m -i splits/ -o merged.apk

# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed

Android malware トレードクラフト (loaders, fileless DEX, persistence)

Native staging + fileless DEX loaders

一部の Android droppers はネイティブライブラリ(lib*.so)を埋め込み、第二の ELF(例: l.so)を復号して一時パスに書き込み、JNI 経由で読み込み、その後 dalvik.system.InMemoryDexClassLoader を使って実際のロジックをメモリ上のみで DEX として読み込むことがあります。これによりペイロードの静的可視性が低下し、classes*.dex をディスクに書き込むことを回避できます。

Practical triage points:

  • 非常に早い段階で dlopen したり System.loadLibrary を呼び出す native libs を探し、その後に難読化されたスタック文字列(例: スタック上で XOR 復号)経由で Java メソッドを解決しているものに注目してください。
  • logs/strings や hooks に InMemoryDexClassLoader が見られるか確認してください。これは fileless DEX 実行を示します。

Quick Frida hook to dump the in‑memory DEX buffer:

Java.perform(() => {
const IM = Java.use('dalvik.system.InMemoryDexClassLoader');
IM.$init.overload('java.nio.ByteBuffer','java.lang.ClassLoader').implementation = function(buf, parent){
const arr = Java.array('byte', buf.array());
const fos = Java.use('java.io.FileOutputStream').$new("/sdcard/memdex.dex");
fos.write(arr); fos.close();
return this.$init(buf, parent);
};
});

Anti-analysis kill-switch

Packed loadersはしばしば、emulatorやanalysis checksが失敗した場合(例: CPU_ABI の検証)に、self-terminateして次のように呼び出します:

android.os.Process.killProcess(android.os.Process.myPid());

Persistence via フォアグラウンドサービス + MediaPlayer ループ

軽量な永続化パターンとして、フォアグラウンドサービスピン留め通知 で維持し、MediaPlayer を使ってほとんど聞こえない音声ループを継続的に再生する方法がある。これによりプロセスを「アクティブ」に保ち、OSによる非アクティビティによる終了を減らせる。数秒程度の小さなアセットをループ再生する ForegroundService + MediaPlayer の使用を探せ。

Accessibility overlay + ACTION_SET_TEXT hijacking

ユーザーが Accessibility を許可すると、banking trojans は フォアグラウンドアプリ を監視し、リアルなオーバーレイ(しばしば WebView の HTML を Base64 で格納したもの)を表示し、AccessibilityNodeInfo.ACTION_SET_TEXT を使ってトランザクションのフィールドを書き換えることができる。これにより被害者がもっともらしい UI を見ている間に受取人アドレスをサイレントに差し替えられる。

Minimal text replacement example:

Bundle args = new Bundle();
args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,
"ATTACKER_USDT_ADDRESS");
node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args);

正当なプッシュインフラをC2のゲーティングとして悪用

カスタムソケットの代わりに、一部のマルウェアは Firebase Cloud Messaging (FCM) をC2チャネルとして使用する。FCMメッセージはテレメトリチェック(充電状態、バッテリ%、温度、ユーザーの非活動)をトリガーし、マイニングや不正行為などのアクションをステルスのために ゲート することができる。

ファイル名由来キーによるネイティブペイロードの暗号化ステージング

ネイティブペイロードは暗号化されたELFブロブとして配布され、CipherInputStream() を使って復号される。キーはダウンロードされたファイル名のSHA‑1から導出される。各ファイル名/バージョンは個別のキーを生成するため、静的なIOCの再利用を妨げる。

Jezail - root化された Android pentesting ツールキット (REST API + web UI)

  • rooted device (Magisk/rootAVD) 上で動作し、tcp/8080でHTTPサーバを起動し、Flutter web UIREST API を提供する。
  • リリースAPKをパーミッション付きでインストール: adb install -g -r jezail.apk、その後アプリを起動(サーバは自動起動)。
  • エンドポイント: http://<device-ip>:8080/ (UI), http://<device-ip>:8080/api/json (API一覧), http://<device-ip>:8080/api/swagger (Swagger)。
  • エミュレータでホストからUI/APIに到達するにはポートフォワード: adb forward tcp:8080 tcp:8080 してから http://localhost:8080 をブラウズ。

Android Enterprise & Work Profile Attacks

Android Enterprise Work Profile Bypass

Case Studies & Vulnerabilities

Air Keyboard Remote Input Injection

Android Rooting Frameworks Manager Auth Bypass Syscall Hook

Abusing Android Media Pipelines Image Parsers

Firmware Level Zygote Backdoor Libandroid Runtime

静的解析

まず、APKを解析するにはデコンパイラを使って Javaコードを確認する べきである。
利用可能なデコンパイラの情報はこちらを参照

興味深い情報を探す

APKのstringsを確認するだけで、パスワードURLs (https://github.com/ndelphit/apkurlgrep)、apiキー暗号関連bluetooth uuidstokens など興味深い情報を探せる。コード実行の backdoors や認証backdoors(アプリにハードコードされた管理者資格情報)も確認すること。

Firebase

Firebase のURLには特に注意し、誤設定がないか確認する。Firebaseとは何かとその悪用方法はこちら。

アプリケーションの基本理解 - Manifest.xml, strings.xml

アプリケーションの Manifest.xmlstrings.xml の検査は、潜在的なセキュリティ脆弱性を明らかにすることがある。これらのファイルにはデコンパイラでアクセスするか、APKの拡張子を .zip に変更して展開することでアクセスできる。

Manifest.xml から識別される脆弱性には次のようなものがある:

  • Debuggable Applications: Manifest.xmldebuggable="true" に設定されているアプリはリスクがある。接続を許してしまい、そこからの悪用につながる可能性がある。デバイス上で debuggable アプリを見つけて悪用する方法については適切なチュートリアルを参照すること。
  • Backup Settings: android:allowBackup="false" 属性は、機密情報を扱うアプリでは明示的に設定するべきである。特にUSBデバッグが有効な場合、adb経由での不正なデータバックアップを防ぐために重要である。
  • Network Security: カスタムのネットワークセキュリティ設定(android:networkSecurityConfig="@xml/network_security_config")は、証明書ピンニングやHTTPトラフィック設定などのセキュリティ詳細を指定できる。特定ドメインに対してHTTPトラフィックを許可する例などが含まれる。
  • Exported Activities and Services: マニフェストでエクスポートされた activities や services を特定することで、悪用され得るコンポーネントを明らかにできる。動的テスト時にこれらをさらに調査して悪用方法を検証する。
  • Content Providers and FileProviders: 公開されている content provider は不正なアクセスやデータ改竄を許す可能性がある。FileProviders の設定も精査すること。
  • Broadcast Receivers and URL Schemes: これらのコンポーネントは入力に対する脆弱性がある場合に悪用され得る。特に URL スキームの取り扱いに注意すること。
  • SDK Versions: minSdkVersiontargetSDKVersionmaxSdkVersion 属性はサポートされる Android バージョンを示す。古い脆弱な Android バージョンをサポートしている場合はリスクがある。

strings.xml からは APIキー、カスタムスキーマ、その他開発者ノートのような機微情報が発見されることがあるため、これらのリソースを慎重にレビューする必要がある。

Tapjacking

Tapjacking は、maliciousapplication を起動して被害者アプリの上に 位置付ける 攻撃である。一旦被害者アプリを視覚的に覆い隠すと、攻撃者のUIはユーザーを欺いて操作させ、その操作を被害者アプリに透過させるように設計されている。
結果として、ユーザーは実際には被害者アプリ上で操作を行っていることに気付かないように盲目化される

詳細は以下を参照:

Tapjacking

Task Hijacking

launchModesingleTask に設定され、かつ taskAffinity が定義されていない activity は task Hijacking の脆弱性がある。これは、悪意ある application をインストールして、実際のアプリより先に起動すると、その 実アプリのタスクをハイジャックしてしまう 可能性がある(ユーザーは malicious application を使っていると思い込んで実際のアプリを操作していると考えてしまう)。

詳細は以下を参照:

Android Task Hijacking

不適切なデータ保存

内部ストレージ (Internal Storage)

Androidでは、internal ストレージに保存されたファイルは、それを作成したアプリだけがアクセスできるよう設計されている。このセキュリティ対策はAndroid OSによって強制され、多くのアプリケーションにとって十分である。しかし、開発者が MODE_WORLD_READABLEMODE_WORLD_WRITABLE のようなモードを使用してファイルを他のアプリ間で共有することがあり得る。これらのモードは、他のアプリ(潜在的に悪意あるもの)によるファイルアクセスを制限しない

  1. 静的解析:
  • MODE_WORLD_READABLEMODE_WORLD_WRITABLE の使用は慎重に精査すること。これらのモードはファイルを意図しない、または不正なアクセスにさらす可能性がある
  1. 動的解析:
  • アプリが作成するファイルのパーミッションを確認すること。特に、ファイルがworld readable/writable に設定されていないかをチェックする。これがあると、デバイスにインストールされたどのアプリでもそのファイルを読み書きできる重大なセキュリティリスクとなる。

外部ストレージ (External Storage)

外部ストレージ(SDカードなど)のファイルを扱う際の注意点:

  1. アクセス性:
  • 外部ストレージ上のファイルはグローバルに読み書き可能である。つまり任意のアプリやユーザーがアクセスできる。
  1. セキュリティ上の懸念:
  • その容易なアクセス性から、機密情報を外部ストレージに保存しないことが推奨される。
  • 外部ストレージは取り外し可能であり、任意のアプリからアクセスされ得るため安全性は低い。
  1. 外部ストレージから取得したデータの扱い:
  • 外部ストレージから取得したデータは信頼できないソースとみなして、常に入力検証を行うこと。
  • 外部ストレージに実行ファイルやクラスファイルを置いて動的にロードすることは強く非推奨。
  • もしアプリが外部ストレージから実行ファイルを取得する必要がある場合、それらのファイルは署名され、暗号的に検証されていることを確認してから動的にロードすること。これはアプリのセキュリティ整合性を保つために重要である。

外部ストレージは /storage/emulated/0 , /sdcard , /mnt/sdcard でアクセスできる。

Tip

Android 4.4(API 17)以降、SDカードにはディレクトリ構造が導入され、アプリはそのアプリ専用のディレクトリにのみアクセスを制限されるようになった。これにより、悪意あるアプリが他のアプリのファイルを読み書きすることを防ぐ。

平文で保存された機密データ

  • Shared preferences: Androidでは各アプリが /data/data/<packagename>/shared_prefs/ にXMLファイルを容易に保存できるため、そのフォルダ内に平文で機密情報が含まれていることがある。
  • Databases: Androidでは各アプリが /data/data/<packagename>/databases/ にsqliteデータベースを容易に保存できるため、そのフォルダ内に平文で機密情報が含まれていることがある。

Broken TLS

Accept All Certificates

なぜか開発者がすべての証明書を受け入れてしまうことがあり、例えばホスト名が一致しない場合でも以下のようなコードで許可してしまっていることがある。

SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.

暗号の脆弱性

鍵管理プロセスの不備

一部の開発者は機密データをローカルストレージに保存し、コード内でハードコーディングされている、または予測可能なキーで暗号化します。これは避けるべきで、reversing によって攻撃者が機密情報を抽出できる可能性があります。

安全でない/非推奨のアルゴリズムの使用

開発者は認可のチェック、データの保存送信非推奨アルゴリズムを使用すべきではありません。これらのアルゴリズムの例には RC4、MD4、MD5、SHA1… などがあります。例えばパスワードの保存に hashes を使う場合は、ソルトを使ったブルートフォースに対して耐性のあるハッシュを使用するべきです。

その他のチェック

  • 攻撃者のリバースエンジニアリングの労力を増やすため、APKを難読化することが推奨されます。
  • アプリが機密性の高いものであれば(銀行アプリなど)、端末がrootedかどうかを独自にチェックし、それに応じた処理を行うべきです。
  • アプリが機密性の高いものであれば(銀行アプリなど)、emulator が使われているかどうかをチェックするべきです。
  • アプリが機密性の高いものであれば(銀行アプリなど)、実行前に自身のインテグリティをチェックして改ざんされていないか確認するべきです。
  • どのコンパイラ/パッカー/難読化ツールがAPKのビルドに使われたかを確認するには、APKiD を使用してください。

React Native Application

Reactアプリケーションの javascript コードに簡単にアクセスする方法を学ぶには次のページを読んでください:

React Native Application

Xamarin Applications

Xamarinアプリケーションの C# コードへ簡単にアクセスする方法を学ぶには次のページを読んでください:

Xamarin Apps

Superpacked Applications

According to this blog post superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps… and a faster way which involves to execute the application and gather the decompressed files from the filesystem.

自動静的コード解析

ツール mariana-trench は、アプリケーションのコードスキャンして脆弱性を見つけることができます。このツールは、既知の sources(ユーザが入力を制御する場所をツールに示す)、sinks(悪意あるユーザ入力がダメージを引き起こす可能性のある危険な場所を示す)、および rules のセットを含んでいます。これらの rules は、脆弱性を示す sources と sinks の組み合わせを示します。

この知識により、mariana-trench はコードをレビューして潜在的な脆弱性を見つけます。

Secrets leaked

An application may contain secrets (API keys, passwords, hidden urls, subdomains…) inside of it that you might be able to discover. You could us a tool such as https://github.com/dwisiswant0/apkleaks

Bypass Biometric Authentication

Bypass Biometric Authentication (Android)

その他の興味深い機能

  • コード実行: Runtime.exec(), ProcessBuilder(), native code:system()
  • SMS送信: sendTextMessage, sendMultipartTestMessage
  • Native 関数 宣言(native): public native, System.loadLibrary, System.load
  • ネイティブ関数をリバースする方法を学ぶにはこれを読む
  • JNI を介したインメモリネイティブコード実行(ダウンロードした shellcode → mmap/mprotect → 呼び出し):

In Memory Jni Shellcode Execution

その他のトリック

content:// protocol



動的解析

まず、アプリケーションおよび各種環境(主に Burp CA cert、Drozer、Frida)をインストールできる環境が必要です。したがって、rooted デバイス(エミュレートされたものでも可)が強く推奨されます。

オンライン動的解析

https://appetize.io/無料アカウント を作成できます。このプラットフォームでは APK を アップロード して 実行 できるため、APK がどのように動作するかを確認するのに便利です。

ウェブ上で アプリケーションのログを見る ことや adb 経由で接続することも可能です。

ADB 接続のおかげで、エミュレータ内で DrozerFrida を使用できます。

ローカル動的解析

エミュレータを使用する場合

  • Android Studiox86arm のデバイスを作成可能で、こちら によると最新の x86 バージョンは遅い arm エミュレータを使わずとも ARM ライブラリをサポートします)。
  • セットアップ方法は次のページを参照してください:

AVD - Android Virtual Device

  • Genymotion (Free version: Personal Edition、アカウント作成が必要です。潜在的なエラーを避けるために VirtualBox 付きのバージョンをダウンロードすることを推奨します。)
  • Nox(無料。ただし Frida や Drozer はサポートされません)。

Tip

新しいエミュレータを作成する際、画面が大きいほどエミュレータは遅くなります。可能であれば小さい画面を選んでください。

Genymotion に Google サービス(例: AppStore)をインストールするには、次の画像の赤いボタンをクリックしてください:

また、Genymotion の Android VM の設定Bridge Network mode を選択できることに注意してください(ツールを入れた別の VM から Android VM に接続する場合に便利です)。

実機を使用する場合

デバッグオプションを有効にする必要があり、可能であれば root を取得しておくと良いです:

  1. Settings.
  2. (FromAndroid 8.0) Select System.
  3. Select About phone.
  4. Press Build number 7 times.
  5. Go back and you will find the Developer options.

アプリをインストールしたら、まずはそれを試して何をするか、どのように動作するかを調べ、慣れてください。
初期の動的解析は MobSF dynamic analysis + pidcat を使って行うことをお勧めします。こうすることで MobSF が後で確認できる多くの興味深いデータをキャプチャする一方で、アプリの動作を学ぶことができます。

Magisk/Zygisk クイックノート(Pixel デバイス推奨)

  • Magisk アプリで boot.img をパッチし、fastboot 経由でフラッシュして systemless root を取得
  • Zygisk と DenyList を有効にして root 隠蔽を行う。強力な隠蔽が必要な場合は LSPosed/Shamiko を検討
  • OTA から復旧するために元の boot.img を保管しておき、OTA のたびに再パッチ
  • 画面ミラーリングにはホスト上で scrcpy を使用

Unintended Data Leakage

Logging

開発者はデバッグ情報を公開してしまうことに注意すべきです。これにより機密データが leak する可能性があります。アプリケーションのログを監視して機密情報が露出していないか確認するために、ツール pidcatadb logcat の使用が推奨されます。Pidcat は使いやすさと可読性の点で好まれます。

Warning

Android 4.0 より新しいバージョン以降、アプリケーションは自分自身のログにのみアクセス可能です。他のアプリのログにはアクセスできません。
とは言え、機密情報をログに出力しないことを強く推奨します。

Copy/Paste Buffer Caching

Android のクリップボードベースのフレームワークはアプリ間でのコピー&ペーストを可能にしますが、他のアプリがクリップボードにアクセスできるため機密データの露出リスクがあります。クレジットカード情報のような機密セクションではコピー/ペースト機能を無効にすることが重要です。

Crash Logs

アプリがクラッシュしてログを保存する場合、これらのログはリバースが困難な場合でも攻撃者に助けとなる可能性があります。このリスクを軽減するには、クラッシュ時に不要なログを出力しないようにし、ネットワーク経由でログを送信する必要がある場合は必ず SSL チャネルを使用してください。

pentester として、これらのログを確認してみてください

Analytics Data Sent To 3rd Parties

アプリはしばしば Google Adsense のようなサービスを統合しており、開発者の実装ミスにより機密データが第三者へ漏洩する可能性があります。潜在的な漏洩を特定するには、アプリケーションのトラフィックをインターセプトして第三者サービスへ送信されている機密情報がないか確認することをお勧めします。

SQLite DBs

ほとんどのアプリは情報を保存するために internal SQLite databases を使用します。pentest の際は作成された databasestablescolumns の名前、保存されているすべての data を確認してください。そこに sensitive information が含まれている可能性があり、それは脆弱性となります。
データベースは通常 /data/data/the.package.name/databases にあり、例として /data/data/com.mwr.example.sieve/databases のようになります。

もしデータベースが機密情報を保存していて encrypted されていたとしても、アプリ内で password を見つけられるなら、それは依然として vulnerability です。

.tables を使ってテーブルを列挙し、.schema <table_name> でテーブルのカラムを列挙します。

Drozer (Exploit Activities, Content Providers and Services)

From Drozer Docs: Drozer allows you to assume the role of an Android app and interact with other apps. It can do anything that an installed application can do, such as make use of Android’s Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .
Drozer is s useful tool to exploit exported activities, exported services and Content Providers as you will learn in the following sections.

Exploiting exported Activities

Read this if you want to refresh what is an Android Activity.
Also remember that the code of an activity starts in the onCreate method.

認証バイパス

Activity が exported されている場合、外部アプリからその画面を呼び出すことができます。したがって、sensitive information を含む Activity が exported されている場合、認証を bypass してアクセスできる可能性があります。

Learn how to exploit exported activities with Drozer.

また、adb から exported activity を起動することもできます:

  • PackageName is com.example.demo
  • Exported ActivityName is com.example.test.MainActivity
adb shell am start -n com.example.demo/com.example.test.MainActivity

注意: MobSFはactivityのandroid:launchModeとして_singleTask/singleInstance_を使用すると悪意あるものと検出しますが、thisによると、どうやらこれは古いバージョン(API versions < 21)でのみ危険なようです。

Tip

authorisation bypass は必ずしも脆弱性ではありません。回避方法の仕組みや露出する情報によります。

Sensitive information leakage

Activities can also return results. If you manage to find an exported and unprotected activity calling the setResult method and returning sensitive information, there is a Sensitive information leakage.

Tapjacking

If tapjacking isn’t prevented, you could abuse the exported activity to make the user perform unexpected actions. For more info about what is Tapjacking follow the link.

Exploiting Content Providers - Accessing and manipulating sensitive information

Read this if you want to refresh what is a Content Provider.
Content providers are basically used to share data. If an app has available content providers you may be able to extract sensitive data from them. It also interesting to test possible SQL injections and Path Traversals as they could be vulnerable.

Learn how to exploit Content Providers with Drozer.

Exploiting Services

Read this if you want to refresh what is a Service.
Remember that a the actions of a Service start in the method onStartCommand.

As service is basically something that can receive data, process it and returns (or not) a response. Then, if an application is exporting some services you should check the code to understand what is it doing and test it dynamically for extracting confidential info, bypassing authentication measures…
Learn how to exploit Services with Drozer.

Exploiting Broadcast Receivers

Read this if you want to refresh what is a Broadcast Receiver.
Remember that a the actions of a Broadcast Receiver start in the method onReceive.

A broadcast receiver will be waiting for a type of message. Depending on how the receiver handles the message it could be vulnerable.
Learn how to exploit Broadcast Receivers with Drozer.

You can look for deep links manually, using tools like MobSF or scripts like this one.
You can open a declared scheme using adb or a browser:

adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]

注意: パッケージ名を省略すると、モバイルがそのリンクを開くべきアプリを自動的に呼び出します.

<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>

Code executed

アプリで実行されるコードを見つけるには、deeplink によって呼ばれる Activity に移動し、関数 onNewIntent を探します。

Sensitive info

deep link を見つけたら毎回、URL パラメータ経由で機密データ(パスワードなど)を受け取っていないかを確認してください。そうでないと、他のどんなアプリでも deep link を偽装してそのデータを盗む 可能性があります。

Parameters in path

URL のパス内でパラメータを使っている deep link がないかも必ず確認してください。例えば https://api.example.com/v1/users/{username} のような場合、パス・トラバーサルを強制して example://app/users?username=../../unwanted-endpoint%3fparam=value のようにアクセスできる可能性があります。
アプリ内で正しいエンドポイントが見つかれば、パスの一部がドメイン名として使われている場合は Open Redirect を引き起こせるかもしれませんし、CSRF トークンなしでユーザーの詳細を変更できる場合は account takeover や他の脆弱性につながる可能性があります。詳しくは http://dphoeniixx.com/2020/12/13-2/ を参照してください。

More examples

リンク(/.well-known/assetlinks.json)に関する interesting bug bounty report

Transport Layer Inspection and Verification Failures

  • Certificates are not always inspected properly。Android アプリでは証明書の警告を見落としてセルフサイン証明書を受け入れたり、場合によっては HTTP にフォールバックすることがよくあります。
  • Negotiations during the SSL/TLS handshake are sometimes weak。脆弱な cipher suites を使っていることがあり、これにより man-in-the-middle (MITM) 攻撃に対して脆弱になり、攻撃者にデータを復号される可能性があります。
  • Leakage of private information は、アプリが認証のために安全なチャネルを使いつつ、その他のトランザクションで非安全なチャネルを使う場合に発生するリスクです。このような実装は、セッション cookie やユーザー情報などの機密データを悪意ある第三者による傍受から保護できません。

Certificate Verification

ここでは certificate verification に焦点を当てます。サーバー証明書の整合性を検証することはセキュリティ上重要です。安全でない TLS 構成や暗号化されていないチャネルでの機密データ送信は重大なリスクとなります。サーバー証明書の検証と脆弱性対応に関する詳細な手順については、this resource を参照してください。

SSL Pinning

SSL Pinning は、アプリがサーバー証明書をアプリ内に保存された既知のコピーと照合するセキュリティ手法です。これは MITM 攻撃を防ぐために重要であり、機密情報を扱うアプリケーションでは SSL Pinning の実装が強く推奨されます。

Traffic Inspection

HTTP トラフィックを検査するには、プロキシツールの証明書(例: Burp)をインストールする必要があります。この証明書をインストールしないと、暗号化されたトラフィックはプロキシ経由で見えないことがあります。カスタム CA 証明書のインストール方法については click here を参照してください。

API Level 24 and above をターゲットにしているアプリケーションでは、プロキシの CA 証明書を受け入れるように Network Security Config の変更が必要です。暗号化されたトラフィックを検査するための Network Security Config の変更方法については refer to this tutorial を参照してください。

もし Flutter を使用している場合は this page の手順に従う必要があります。単に証明書をストアに追加するだけでは機能しないことがあり、Flutter は独自の有効な CA のリストを持っているためです。

Static detection of SSL/TLS pinning

ランタイムでのバイパスを試みる前に、まず APK 内でピニングがどこに適用されているかを静的にマッピングしてください。静的検出はフックやパッチを計画し、適切なコードパスにフォーカスするのに役立ちます。

Tool: SSLPinDetect

  • APK を Smali にデコンパイル(apktool を利用)して、SSL/TLS pinning 実装のためにキュレーションされた正規表現パターンをスキャンするオープンソースの静的解析ユーティリティです。
  • マッチごとに正確なファイルパス、行番号、およびコードスニペットを報告します。
  • OkHttp CertificatePinner、カスタム javax.net.ssl.X509TrustManager.checkServerTrusted、SSLContext.init とカスタム TrustManagers/KeyManagers、Network Security Config XML pins など、一般的なフレームワークやカスタムコードパスをカバーします。

Install

  • Prereqs: Python >= 3.8, Java on PATH, apktool
git clone https://github.com/aancw/SSLPinDetect
cd SSLPinDetect
pip install -r requirements.txt

使用方法

# Basic
python sslpindetect.py -f app.apk -a apktool.jar

# Verbose (timings + per-match path:line + snippet)
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v

パターンルールの例 (JSON) signatures を使用または拡張して、独自/カスタムの pinning styles を検出します。独自の JSON をロードして、大規模に scan できます。

{
"OkHttp Certificate Pinning": [
"Lcom/squareup/okhttp/CertificatePinner;",
"Lokhttp3/CertificatePinner;",
"setCertificatePinner"
],
"TrustManager Override": [
"Ljavax/net/ssl/X509TrustManager;",
"checkServerTrusted"
]
}

ノートとヒント

  • 大規模なアプリをマルチスレッドとメモリマップドI/Oで高速スキャンする。事前コンパイルした正規表現はオーバーヘッドと誤検知を減らす。
  • Pattern collection: https://github.com/aancw/smali-sslpin-patterns
  • 次にトリアージすべき典型的な検出対象:
  • OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references
  • Custom TrustManagers: javax.net.ssl.X509TrustManager、checkServerTrusted のオーバーライド
  • Custom SSL contexts: SSLContext.getInstance + SSLContext.init をカスタムマネージャで呼ぶ箇所
  • res/xml の network security config と manifest で宣言されているピン
  • 一致した箇所を使って、動的テストの前に Frida hooks、静的パッチ、または設定レビューを計画する。

SSL Pinning のバイパス

SSL Pinning が実装されている場合、HTTPS トラフィックを調査するためにそれをバイパスする必要がある。目的のために利用できる方法はいくつかある:

  • 自動的に apk-mitm を使って apk修正 して SSLPinningバイパス する。 このオプションの最大の利点は、SSLPinning をバイパスするのに root が不要な点だが、アプリを削除して新しいものを再インストールする必要があり、常に動作するわけではない。
  • この保護をバイパスするために Frida を使うこともできる(下で解説)。Burp+Frida+Genymotion を使うガイド: https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/
  • また、objection: を使用して 自動的に SSL Pinning をバイパス することも試せる: objection --gadget com.package.app explore --startup-command "android sslpinning disable"
  • また MobSF dynamic analysis を使って 自動的に SSL Pinning をバイパス することも試せる(下で説明)
  • まだ取得できていないトラフィックがあると思う場合は、iptables を使ってトラフィックを Burp にフォワード してみる。ブログを読む: https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62

共通のWeb脆弱性の探索

アプリ内で一般的な Web 脆弱性を探すことも重要だ。これらの脆弱性の特定や緩和に関する詳細はこの要約の範囲外だが、他所で詳しく扱われている。

Frida

Frida は開発者、リバースエンジニア、セキュリティ研究者向けの動的インストルメンテーションツールキットである。
実行中のアプリにアクセスしてランタイムでメソッドを hook し、挙動や値を変更したり、値を抽出したり、別のコードを実行したりできる。
Android アプリを pentest するなら、Frida の使い方を知る必要がある。

Anti-instrumentation & SSL pinning バイパス ワークフロー

Android Anti Instrumentation And Ssl Pinning Bypass

メモリのダンプ - Fridump

アプリがパスワードやニーモニックなど、本来メモリに保持すべきでない機密情報をメモリ内に保存していないか確認する。

Using Fridump3 you can dump the memory of the app with:

# With PID
python3 fridump3.py -u <PID>

# With name
frida-ps -Uai
python3 fridump3.py -u "<Name>"

これによりメモリが ./dump フォルダに dump され、そこで次のように grep できます:

strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"

Keystore内の機密データ

AndroidではKeystoreは機密データを保存する最適な場所ですが、十分な権限があればそれでもアクセスされる可能性があります。アプリケーションはここにsensitive data in clear textを保存しがちなため、pentestsではroot userとしてチェックするべきです。さもなければ物理的にデバイスにアクセスできる者がこのデータを盗む可能性があります。

たとえアプリがkeystoreにデータを保存していても、そのデータは暗号化されているべきです。

keystore内のデータにアクセスするには、次のFrida scriptを使用できます: https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js

frida -U -f com.example.app -l frida-scripts/tracer-cipher.js

Fingerprint/Biometrics Bypass

以下のFridaスクリプトを使用すると、Androidアプリが特定の機密領域を保護するために実行している可能性のあるbypass fingerprint authenticationを回避できる場合があります:

frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>

バックグラウンド画像

アプリをバックグラウンドに移すと、Android はアプリのスナップショットを保存します。アプリがフォアグラウンドに復帰したとき、そのスナップショットの画像を先に読み込むことで、アプリがより速く起動したように見えます。

しかし、このスナップショットに機密情報が含まれていると、スナップショットにアクセスできる人がその情報を盗む可能性があります(アクセスにはrootが必要な点に注意)。

スナップショットは通常次の場所に保存されています: /data/system_ce/0/snapshots

Android はレイアウトパラメータによりFLAG_SECURE を設定してスクリーンショットの取得を防ぐ方法を提供します。このフラグを使用すると、ウィンドウの内容はセキュアとして扱われ、スクリーンショットに表示されたり、非セキュアなディスプレイで表示されたりするのを防げます。

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

Android Application Analyzer

このツールは動的解析中に様々なツールを管理するのに役立ちます: https://github.com/NotSoSecure/android_application_analyzer

Intent Injection

開発者はしばしば、activities、services、broadcast receivers のようなプロキシコンポーネントを作成し、これらの Intents を処理して startActivity(...)sendBroadcast(...) のようなメソッドに渡しますが、これは危険を伴う場合があります。

危険なのは、攻撃者がこれらの Intents を誤誘導することで non-exported なアプリコンポーネントをトリガーしたり、機密性の高い content providers へアクセスさせたりできる点です。顕著な例として、WebView コンポーネントが URL を Intent.parseUri(...) を使って Intent オブジェクトに変換し、それを実行することで悪意ある Intent の注入を引き起こす可能性があります。

Essential Takeaways

  • Intent Injection は web の Open Redirect 問題に似ています。
  • エクスプロイトでは Intent オブジェクトを extras として渡し、それらがリダイレクトされて危険な操作を実行させる可能性があります。
  • 非エクスポートのコンポーネントや content providers が攻撃者にさらされる可能性があります。
  • WebView の URL から Intent への変換は意図しない動作を引き起こすことがあります。

Android Client Side Injections and others

おそらく Web でこの種の脆弱性について知っているでしょう。Android アプリケーションでは次の脆弱性に特に注意する必要があります:

  • SQL Injection: 動的クエリや Content-Providers を扱う際は、パラメータ化クエリを使用していることを確認してください。
  • JavaScript Injection (XSS): すべての WebViews で JavaScript と Plugin サポートが無効になっていることを確認してください(デフォルトでは無効)。 More info here.
  • Local File Inclusion: WebViews はファイルシステムへのアクセスを無効にするべきです(デフォルトでは有効)。 - (webview.getSettings().setAllowFileAccess(false);). More info here.
  • Eternal cookies: 多くの場合、android application がセッションを終了しても cookie が取り消されなかったり、ディスクに保存されることがあります
  • Secure Flag in cookies

Automatic Analysis

MobSF

Static analysis

Vulnerability assessment of the application を使いやすい web ベースのフロントエンドで行えます。動的解析も実行できます(ただし環境の準備が必要です)。

docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest

Notice that MobSF can analyse Android(apk), IOS(ipa) and Windows(apx) applications (Windows applications must be analyzed from a MobSF installed in a Windows host).
Also, if you create a ZIP file with the source code if an Android or an IOS app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also.

MobSF also allows you to diff/Compare analysis and to integrate VirusTotal (you will need to set your API key in MobSF/settings.py and enable it: VT_ENABLED = TRUE VT_API_KEY = <Your API key> VT_UPLOAD = TRUE). You can also set VT_UPLOAD to False, then the hash will be upload instead of the file.

Assisted Dynamic analysis with MobSF

MobSFAndroiddynamic analysisにも非常に役立ちますが、その場合はホストにMobSFとgenymotionをインストールする必要があります(VMやDockerでは動作しません)。注: まずgenymotionでVMを起動し、次にMobSFを起動する必要があります.
The MobSF dynamic analyser can:

  • Dump application data (URLs, logs, clipboard, screenshots made by you, screenshots made by “Exported Activity Tester”, emails, SQLite databases, XML files, and other created files). All of this is done automatically except for the screenshots, you need to press when you want a screenshot or you need to press “Exported Activity Tester” to obtain screenshots of all the exported activities.
  • HTTPS trafficをキャプチャする
  • Fridaを使ってruntime informationを取得する

From android versions > 5, it will automatically start Frida and will set global proxy settings to capture traffic. It will only capture traffic from the tested application.

Frida

By default, it will also use some Frida Scripts to bypass SSL pinning, root detection and debugger detection and to monitor interesting APIs.
MobSF can also invoke exported activities, grab screenshots of them and save them for the report.

To start the dynamic testing press the green bottom: “Start Instrumentation”. Press the “Frida Live Logs” to see the logs generated by the Frida scripts and “Live API Monitor” to see all the invocation to hooked methods, arguments passed and returned values (this will appear after pressing “Start Instrumentation”).
MobSF also allows you to load your own Frida scripts (to send the results of your Frida scripts to MobSF use the function send()). It also has several pre-written scripts you can load (you can add more in MobSF/DynamicAnalyzer/tools/frida_scripts/others/), just select them, press “Load” and press “Start Instrumentation” (you will be able to see the logs of that scripts inside “Frida Live Logs”).

Moreover, you have some Auxiliary Frida functionalities:

  • Enumerate Loaded Classes: 読み込まれているすべてのクラスを表示します
  • Capture Strings: アプリ使用中に検出されたすべてのcapture stringsを表示します(非常にノイジー)
  • Capture String Comparisons: 非常に有用です。比較されている2つの文字列を表示し、その比較結果がTrueかFalseかを示します。
  • Enumerate Class Methods: クラス名(例: “java.io.File”)を入力すると、そのクラスのすべてのメソッドを表示します。
  • Search Class Pattern: パターンでクラスを検索します
  • Trace Class Methods: クラス全体をTraceします(そのクラスの全メソッドの入力と出力を確認できます)。デフォルトでMobSFは複数の興味深いAndroid APIメソッドをトレースします。

Once you have selected the auxiliary module you want to use you need to press “Start Intrumentation” and you will see all the outputs in “Frida Live Logs”.

Shell

Mobsf also brings you a shell with some adb commands, MobSF commands, and common shell commands at the bottom of the dynamic analysis page. Some interesting commands:

help
shell ls
activities
exported_activities
services
receivers

HTTP ツール

HTTP トラフィックをキャプチャすると、下部の “HTTP(S) Traffic” ボタンで荒い表示、または緑の “Start HTTPTools” ボタンでより見やすい表示が確認できます。後者のオプションから、captured requests を Burp や Owasp ZAP のような proxiessend できます。
その手順は、power on Burp –> turn off Intercept –> in MobSB HTTPTools select the request –> press “Send to Fuzzer” –> select the proxy address (http://127.0.0.1:8080\)。

MobSF で動的解析を終えたら、“Start Web API Fuzzer” を押して fuzz http requests し脆弱性を探すことができます。

Tip

After performing a dynamic analysis with MobSF the proxy settings me be misconfigured and you won’t be able to fix them from the GUI. You can fix the proxy settings by doing:

adb shell settings put global http_proxy :0

Assisted Dynamic Analysis with Inspeckage

ツールは Inspeckage から入手できます。
このツールはいくつかの Hooks を利用して、動的解析中にアプリケーション内で what is happening in the application を把握できるようにします。

Yaazhini

GUI での 静的解析 (static analysis) に適した優れたツールです。

Qark

このツールは security related Android application vulnerabilities を、source code または packaged APKs の両方で検出するよう設計されています。さらに、見つかった脆弱性(Exposed activities, intents, tapjacking…)を悪用するための “Proof-of-Concept” deployable APKADB commands を作成することも可能です。Drozer と同様に、テストデバイスを root にする必要はありません。

pip3 install --user qark  # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
qark --java path/to/parent/java/folder
qark --java path/to/specific/java/file.java

ReverseAPK

  • すべての抽出ファイルを参照しやすい形で表示する
  • APKファイルを自動的にJavaおよびSmali形式にデコンパイルする
  • AndroidManifest.xmlを解析して一般的な脆弱性や挙動を検出する
  • 静的ソースコード解析により一般的な脆弱性や挙動を検出する
  • デバイス情報
  • その他
reverse-apk relative/path/to/APP.apk

SUPER Android Analyzer

SUPERはWindows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、_.apk_ファイルを解析して脆弱性を検出します。これにはAPKを展開し、一連のルールを適用して脆弱性を検出する手法が使われます。

すべてのルールはrules.jsonファイルにまとめられており、各社や各テスターは必要に応じて独自のルールを作成できます。

最新のバイナリはdownload pageからダウンロードしてください。

super-analyzer {apk_file}

StaCoAn

StaCoAnは、モバイルアプリケーションのstatic code analysisを行う開発者、bugbounty hunters、ethical hackersを支援するクロスプラットフォームツールです。

概念としては、モバイルアプリケーションファイル(.apk または .ipa ファイル)を StaCoAn アプリにドラッグアンドドロップすると、視覚的で持ち運び可能なレポートを生成します。設定や wordlists を調整してカスタマイズされた体験を得ることができます。

ダウンロード latest release:

./stacoan

AndroBugs

AndroBugs Frameworkは、開発者やhackersがAndroidアプリケーションの潜在的なセキュリティ脆弱性を発見するのを支援するAndroid脆弱性解析システムです。
Windows releases

python androbugs.py -f [APK file]
androbugs.exe -f [APK file]

Androwarn

Androwarn は、Android アプリケーションによって開発される潜在的な悪意のある振る舞いを検出し、ユーザに警告することを主な目的としたツールです。

検出は、アプリケーションの Dalvik バイトコード(Smali として表現)に対する static analysis を、androguard ライブラリを用いて行います。

このツールは、「悪質な」アプリケーションの一般的な動作(例:Telephony identifiers exfiltration、Audio/video flow interception、PIM data modification、Arbitrary code execution…)を検出します。

python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3

MARA Framework

MARA はモバイルアプリケーションのリバースエンジニアリングおよび解析フレームワークです。一般的に使用されるモバイルアプリのリバースエンジニアリングおよび解析ツールをまとめ、OWASP のモバイルセキュリティ脅威に対するテストを支援します。目的はこの作業をモバイルアプリ開発者およびセキュリティ専門家にとってより簡単で扱いやすくすることです。

It is able to:

Koodous

Useful to detect malware: https://koodous.com/

Obfuscating/Deobfuscating code

使用するサービスや設定によって、シークレットが難読化される場合とされない場合があることに注意してください。秘密情報は難読化されることもあればされないこともあります。

ProGuard

From Wikipedia: ProGuard is an open source command-line tool that shrinks, optimizes and obfuscates Java code. It is able to optimize bytecode as well as detect and remove unused instructions. ProGuard is free software and is distributed under the GNU General Public License, version 2.

ProGuard is distributed as part of the Android SDK and runs when building the application in release mode.

DexGuard

Find a step-by-step guide to deobfuscate the apk in https://blog.lexfo.fr/dexguard.html

(From that guide) Last time we checked, the Dexguard mode of operation was:

  • load a resource as an InputStream;
  • feed the result to a class inheriting from FilterInputStream to decrypt it;
  • do some useless obfuscation to waste a few minutes of time from a reverser;
  • feed the decrypted result to a ZipInputStream to get a DEX file;
  • finally load the resulting DEX as a Resource using the loadDex method.

DeGuard

DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.

You can upload an obfuscated APK to their platform.

[Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app

This is a LLM tool to find any potential security vulnerabilities in android apps and deobfuscate android app code. Uses Google’s Gemini public API.

Simplify

It is a generic android deobfuscator. Simplify virtually executes an app to understand its behavior and then tries to optimize the code so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesn’t matter what the specific type of obfuscation is used.

APKiD

APKiD gives you information about how an APK was made. It identifies many compilers, packers, obfuscators, and other weird stuff. It’s PEiD for Android.

Manual

Read this tutorial to learn some tricks on how to reverse custom obfuscation

Labs

Androl4b

AndroL4b is an Android security virtual machine based on ubuntu-mate includes the collection of latest framework, tutorials and labs from different security geeks and researchers for reverse engineering and malware analysis.

References

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする