64 KiB
Android Applications Pentesting
{{#include ../../banners/hacktricks-training.md}}
Android Applications Basics
このページを読むことを強くお勧めします。Androidのセキュリティに関連する最も重要な部分と、Androidアプリケーションの最も危険なコンポーネントについて知るためです:
{{#ref}} android-applications-basics.md {{#endref}}
ADB (Android Debug Bridge)
これは、Androidデバイス(エミュレートされたものまたは物理的なもの)に接続するために必要な主なツールです。
ADBは、コンピュータからUSBまたはネットワーク経由でデバイスを制御することを可能にします。このユーティリティは、ファイルのコピー、アプリのインストールとアンインストール、シェルコマンドの実行、データのバックアップ、ログの読み取りなど、さまざまな機能を提供します。
以下のリストのADB Commandsを確認して、adbの使い方を学んでください。
Smali
時には、隠された情報(おそらくよく難読化されたパスワードやフラグ)にアクセスするために、アプリケーションコードを修正することが興味深い場合があります。そのため、apkを逆コンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。
このチュートリアルでは、APKを逆コンパイルし、Smaliコードを修正して、新しい機能を持つAPKを再コンパイルする方法を学ぶことができます。これは、動的分析中に提示されるいくつかのテストの代替手段として非常に役立つ可能性があります。したがって、この可能性を常に念頭に置いておいてください。
Other interesting tricks
- Play Storeでの位置情報の偽装
- APKのダウンロード: https://apps.evozi.com/apk-downloader/, https://apkpure.com/es/, https://www.apkmirror.com/, https://apkcombo.com/es-es/apk-downloader/, https://github.com/kiber-io/apkd
- デバイスから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を使用して、すべてのスプリットとベースAPKをマージします:
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
静的分析
まず、APKを分析するためには、デコンパイラを使用してJavaコードを確認する必要があります。
詳細な情報については、こちらをお読みください。さまざまなデコンパイラについての情報があります。
興味深い情報の探索
APKの文字列を確認するだけで、パスワード、URL (https://github.com/ndelphit/apkurlgrep)、APIキー、暗号化、Bluetooth UUID、トークン、およびその他の興味深いものを検索できます... コード実行のバックドアや認証バックドア(アプリへのハードコーディングされた管理者資格情報)も探してください。
Firebase
FirebaseのURLに特に注意を払い、設定が不適切でないか確認してください。Firebaseとは何か、どのように悪用するかについての詳細情報はこちら。
アプリケーションの基本理解 - Manifest.xml, strings.xml
アプリケーションの**_Manifest.xml****および**strings.xml_**ファイルの検査は、潜在的なセキュリティ脆弱性を明らかにすることができます**。これらのファイルは、デコンパイラを使用するか、APKファイルの拡張子を.zipに変更してから解凍することでアクセスできます。
Manifest.xmlから特定された脆弱性には以下が含まれます:
- デバッグ可能なアプリケーション: _Manifest.xml_ファイルでデバッグ可能として設定されたアプリケーション(
debuggable="true")は、接続を許可するため、悪用のリスクがあります。デバッグ可能なアプリケーションを見つけて悪用する方法については、デバイス上のデバッグ可能なアプリケーションを見つけて悪用するチュートリアルを参照してください。 - バックアップ設定: 機密情報を扱うアプリケーションには、
android:allowBackup="false"属性を明示的に設定する必要があります。これにより、特にUSBデバッグが有効になっている場合に、adbを介した不正なデータバックアップを防ぐことができます。 - ネットワークセキュリティ: _res/xml/_内のカスタムネットワークセキュリティ構成(
android:networkSecurityConfig="@xml/network_security_config")は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可することが一例です。 - エクスポートされたアクティビティとサービス: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになる可能性があります。
- コンテンツプロバイダーとファイルプロバイダー: 公開されたコンテンツプロバイダーは、不正なアクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
- ブロードキャストレシーバーとURLスキーム: これらのコンポーネントは悪用される可能性があり、特にURLスキームが入力脆弱性に対してどのように管理されているかに注意を払う必要があります。
- SDKバージョン:
minSdkVersion、targetSDKVersion、およびmaxSdkVersion属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。
strings.xmlファイルからは、APIキー、カスタムスキーマ、およびその他の開発者ノートなどの機密情報が発見される可能性があり、これらのリソースを注意深く確認する必要があります。
タップジャッキング
タップジャッキングは、悪意のある アプリケーションが起動され、被害者アプリケーションの上に位置する攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、同時にその対話を被害者アプリに渡します。
実際には、ユーザーが被害者アプリで実際にアクションを実行していることを知らないようにしています。
詳細情報は以下を参照してください:
{{#ref}} tapjacking.md {{#endref}}
タスクハイジャック
launchModeがsingleTaskに設定され、taskAffinityが定義されていないアクティビティは、タスクハイジャックに対して脆弱です。これは、アプリケーションがインストールされ、実際のアプリケーションの前に起動されると、実際のアプリケーションのタスクをハイジャックする可能性があることを意味します(つまり、ユーザーは悪意のあるアプリケーションと対話していると思っている)。
詳細情報は以下を参照してください:
{{#ref}} android-task-hijacking.md {{#endref}}
不安定なデータストレージ
内部ストレージ
Androidでは、内部ストレージに保存されたファイルは、作成したアプリのみがアクセスできるように設計されています。このセキュリティ対策はAndroidオペレーティングシステムによって強制され、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、MODE_WORLD_READABLEやMODE_WORLD_WRITABLEのようなモードを利用して、ファイルを異なるアプリケーション間で共有できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを制限しません。
- 静的分析:
MODE_WORLD_READABLEおよびMODE_WORLD_WRITABLEの使用が注意深く検討されるべきです。これらのモードは、意図しないまたは不正なアクセスにファイルをさらす可能性があります。
- 動的分析:
- アプリによって作成されたファイルに設定された権限を確認します。特に、ファイルが全世界に対して読み取りまたは書き込み可能に設定されているかどうかを確認します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた任意のアプリケーションが、出所や意図に関係なく、これらのファイルを読み取ったり変更したりできるようになります。
外部ストレージ
外部ストレージ上のファイルを扱う際には、いくつかの注意が必要です:
- アクセス可能性:
- 外部ストレージ上のファイルは全世界に対して読み取りおよび書き込み可能です。つまり、任意のアプリケーションやユーザーがこれらのファイルにアクセスできます。
- セキュリティの懸念:
- アクセスの容易さを考慮すると、機密情報を外部ストレージに保存しないことが推奨されます。
- 外部ストレージは取り外し可能であり、任意のアプリケーションによってアクセスされる可能性があるため、セキュリティが低下します。
- 外部ストレージからのデータ処理:
- 外部ストレージから取得したデータに対しては常に入力検証を行う必要があります。これは、データが信頼できないソースからのものであるため、重要です。
- 外部ストレージに実行可能ファイルやクラスファイルを保存して動的に読み込むことは強く推奨されません。
- アプリケーションが外部ストレージから実行可能ファイルを取得する必要がある場合、これらのファイルが署名され、暗号的に検証されていることを確認してから動的に読み込む必要があります。このステップは、アプリケーションのセキュリティの整合性を維持するために重要です。
外部ストレージは、/storage/emulated/0、/sdcard、/mnt/sdcardでアクセス可能です。
Note
Android 4.4(API 17)以降、SDカードにはディレクトリ構造があり、アプリが特定のアプリ用のディレクトリにのみアクセスできるように制限されています。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。
平文で保存された機密データ
- 共有設定: Androidは各アプリケーションが
/data/data/<packagename>/shared_prefs/パスにXMLファイルを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。 - データベース: Androidは各アプリケーションが
/data/data/<packagename>/databases/パスにSQLiteデータベースを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。
壊れたTLS
すべての証明書を受け入れる
何らかの理由で、開発者がホスト名がコードの行と一致しない場合でも、すべての証明書を受け入れることがあります。
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
良いテスト方法は、デバイス内でBurp CAを承認せずにBurpのようなプロキシを使用してトラフィックをキャプチャしようとすることです。また、Burpを使用して異なるホスト名の証明書を生成し、それを使用することもできます。
壊れた暗号化
不適切なキー管理プロセス
一部の開発者は、機密データをローカルストレージに保存し、コード内にハードコーディングされた/予測可能なキーで暗号化します。これは、リバースエンジニアリングにより攻撃者が機密情報を抽出できる可能性があるため、行うべきではありません。
安全でないおよび/または廃止されたアルゴリズムの使用
開発者は、認証チェック、保存、または送信データを行うために廃止されたアルゴリズムを使用すべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。たとえば、パスワードを保存するためにハッシュが使用される場合、ソルトを使用したハッシュのブルートフォース耐性が必要です。
その他のチェック
- 攻撃者のリバースエンジニアリング作業を困難にするために、APKを難読化することを推奨します。
- アプリが機密性が高い場合(銀行アプリなど)、モバイルがルート化されているかどうかを確認する独自のチェックを実行し、結果に応じて行動する必要があります。
- アプリが機密性が高い場合(銀行アプリなど)、エミュレーターが使用されているかどうかを確認する必要があります。
- アプリが機密性が高い場合(銀行アプリなど)、実行前に自身の整合性を確認し、変更されていないかを確認する必要があります。
- APKiDを使用して、APKをビルドするために使用されたコンパイラ/パッカー/難読化ツールを確認します。
React Nativeアプリケーション
ReactアプリケーションのJavaScriptコードに簡単にアクセスする方法については、以下のページをお読みください:
{{#ref}} react-native-application.md {{#endref}}
Xamarinアプリケーション
XamarinアプリケーションのC#コードに簡単にアクセスする方法については、以下のページをお読みください:
{{#ref}} ../xamarin-apps.md {{#endref}}
スーパー圧縮アプリケーション
このブログ記事によると、スーパー圧縮はアプリケーションの内容を単一のファイルに圧縮するメタアルゴリズムです。このブログでは、これらのアプリを解凍するアプリを作成する可能性について話しています... そして、アプリケーションを実行してファイルシステムから解凍されたファイルを収集するというより速い方法についても言及しています。
自動静的コード分析
ツールmariana-trenchは、アプリケーションのコードをスキャンすることによって脆弱性を見つけることができます。このツールには、ユーザーによって制御される入力の場所を示す一連の既知のソース、悪意のあるユーザー入力が損害を引き起こす可能性のある危険な****場所を示すシンク、およびルールが含まれています。これらのルールは、脆弱性を示すソース-シンクの組み合わせを示します。
この知識をもとに、mariana-trenchはコードをレビューし、可能な脆弱性を見つけます。
漏洩した秘密
アプリケーションには、あなたが発見できるかもしれない秘密(APIキー、パスワード、隠されたURL、サブドメインなど)が含まれている可能性があります。ツールhttps://github.com/dwisiswant0/apkleaksを使用できます。
生体認証のバイパス
{{#ref}} bypass-biometric-authentication-android.md {{#endref}}
その他の興味深い機能
- コード実行:
Runtime.exec(), ProcessBuilder(), native code:system() - SMS送信:
sendTextMessage, sendMultipartTestMessage - ネイティブ関数として宣言された
native:public native, System.loadLibrary, System.load - ネイティブ関数をリバースエンジニアリングする方法を学ぶにはこちらをお読みください
その他のトリック
{{#ref}} content-protocol.md {{#endref}}
動的分析
まず、アプリケーションとすべての環境(主にBurp CA証明書、Drozer、Frida)をインストールできる環境が必要です。したがって、ルート化されたデバイス(エミュレートされたかどうかにかかわらず)が非常に推奨されます。
オンライン動的分析
https://appetize.io/で無料アカウントを作成できます。このプラットフォームでは、APKをアップロードして実行できるため、APKの動作を確認するのに便利です。
アプリケーションのログをウェブで確認し、adbを介して接続することもできます。
ADB接続のおかげで、エミュレーター内でDrozerとFridaを使用できます。
ローカル動的分析
エミュレーターを使用する
- Android Studio(x86およびarmデバイスを作成でき、これ最新のx86バージョンはARMライブラリをサポートしています。遅いarmエミュレーターは必要ありません)。
- このページで設定方法を学びます:
{{#ref}} avd-android-virtual-device.md {{#endref}}
- Genymotion (無料版: Personal Edition、アカウントを作成する必要があります。潜在的なエラーを避けるために、VirtualBoxを含むバージョンをダウンロードすることを推奨します。)
- Nox(無料ですが、FridaやDrozerはサポートしていません)。
Note
新しいエミュレーターを作成する際は、画面が大きいほどエミュレーターの動作が遅くなることを覚えておいてください。可能であれば、小さい画面を選択してください。
GenymotionにGoogleサービス(AppStoreなど)をインストールするには、以下の画像の赤でマークされたボタンをクリックする必要があります:
また、GenymotionのAndroid VMの設定でブリッジネットワークモードを選択できることに注意してください(これは、ツールを使用して異なるVMからAndroid VMに接続する場合に便利です)。
物理デバイスを使用する
デバッグオプションを有効にする必要があり、ルート化できると良いでしょう:
- 設定。
- (Android 8.0以降) システムを選択。
- 電話についてを選択。
- ビルド番号を7回押します。
- 戻ると、開発者オプションが表示されます。
アプリケーションをインストールしたら、最初に行うべきことは、それを試して、何をするのか、どのように機能するのかを調査し、快適に感じることです。
MobSF動的分析 + pidcatを使用してこの初期動的分析を実行することをお勧めします。これにより、MobSFが後でレビューできる多くの興味深いデータをキャプチャしながら、アプリケーションの動作を学ぶことができます。
意図しないデータ漏洩
ログ記録
開発者は、デバッグ情報を公開することに注意すべきです。これは、機密データの漏洩につながる可能性があります。アプリケーションのログを監視して機密情報を特定し保護するために、ツールpidcatとadb logcatを推奨します。Pidcatは、その使いやすさと可読性から好まれます。
Warning
Android 4.0以降、アプリケーションは自分のログにのみアクセスできることに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。
それでも、機密情報をログに記録しないことを推奨します。
コピー/ペーストバッファキャッシュ
Androidのクリップボードベースのフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、他のアプリケーションがクリップボードにアクセスできるため、機密データが漏洩するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションに対してコピー/ペースト機能を無効にすることが重要です。
クラッシュログ
アプリケーションがクラッシュし、ログを保存する場合、これらのログは攻撃者に役立つ可能性があります。特に、アプリケーションがリバースエンジニアリングできない場合はそうです。このリスクを軽減するために、クラッシュ時にログを記録しないようにし、ログをネットワーク経由で送信する必要がある場合は、SSLチャネルを介して送信されることを確認してください。
ペンテスターとして、これらのログを確認することをお勧めします。
第三者に送信される分析データ
アプリケーションは、Google Adsenseのようなサービスを統合することが多く、開発者による不適切な実装により、機密データが漏洩する可能性があります。潜在的なデータ漏洩を特定するために、アプリケーションのトラフィックを傍受し、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
SQLite DB
ほとんどのアプリケーションは、情報を保存するために内部SQLiteデータベースを使用します。ペンテスト中に作成されたデータベース、テーブルおよびカラムの名前、保存されたすべてのデータを確認してください。機密情報(脆弱性となる可能性があります)を見つけることができるかもしれません。
データベースは/data/data/the.package.name/databasesに位置し、例として/data/data/com.mwr.example.sieve/databasesのようになります。
データベースが機密情報を保存しており、暗号化されているが、アプリケーション内にパスワードが見つかる場合、それでも脆弱性です。
.tablesを使用してテーブルを列挙し、.schema <table_name>を実行してテーブルのカラムを列挙します。
Drozer(エクスプロイトアクティビティ、コンテンツプロバイダーおよびサービス)
Drozer Docsから:Drozerは、Androidアプリの役割を引き受け、他のアプリと対話することを可能にします。これは、インストールされたアプリケーションができることは何でも行うことができ、Androidのプロセス間通信(IPC)メカニズムを利用し、基盤となるオペレーティングシステムと対話することができます。
Drozerは、エクスポートされたアクティビティ、エクスポートされたサービス、およびコンテンツプロバイダーをエクスプロイトするための便利なツールです。次のセクションで学ぶことになります。
エクスポートされたアクティビティのエクスプロイト
Androidアクティビティとは何かをリフレッシュしたい場合は、こちらをお読みください。
また、アクティビティのコードは**onCreate**メソッドから始まることを覚えておいてください。
認証バイパス
アクティビティがエクスポートされると、外部アプリからその画面を呼び出すことができます。したがって、機密情報を含むアクティビティがエクスポートされている場合、認証メカニズムをバイパスしてアクセスすることができます。
Drozerを使用してエクスポートされたアクティビティをエクスプロイトする方法を学びます。
adbからエクスポートされたアクティビティを開始することもできます:
- パッケージ名はcom.example.demoです
- エクスポートされたアクティビティ名はcom.example.test.MainActivityです
adb shell am start -n com.example.demo/com.example.test.MainActivity
注意: MobSFは、アクティビティのandroid:launchModeにおける_singleTask/singleInstance_の使用を悪意のあるものとして検出しますが、これによると、これは古いバージョン(APIバージョン< 21)でのみ危険なようです。
Note
認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が露出しているかによります。
機密情報の漏洩
アクティビティは結果を返すこともできます。もし、**setResult**メソッドを呼び出し、機密情報を返すエクスポートされた保護されていないアクティビティを見つけることができれば、機密情報の漏洩があります。
タップジャッキング
タップジャッキングが防止されていない場合、エクスポートされたアクティビティを悪用してユーザーに予期しないアクションを実行させることができます。タップジャッキングについての詳細は、こちらのリンクを参照してください。
コンテンツプロバイダーの悪用 - 機密情報へのアクセスと操作
コンテンツプロバイダーについて復習したい場合は、こちらをお読みください。
コンテンツプロバイダーは基本的にデータを共有するために使用されます。アプリに利用可能なコンテンツプロバイダーがある場合、そこから機密データを抽出できるかもしれません。また、SQLインジェクションやパストラバーサルの可能性をテストすることも興味深いです。これらは脆弱である可能性があります。
Drozerを使用してコンテンツプロバイダーを悪用する方法を学びましょう。
サービスの悪用
サービスについて復習したい場合は、こちらをお読みください。
サービスのアクションはonStartCommandメソッドで開始されることを覚えておいてください。
サービスは基本的にデータを受信し、処理し、応答(またはしない)を返すことができるものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、コードを確認して何をしているのかを理解し、動的にテストして機密情報を抽出したり、認証手段をバイパスしたりする必要があります。
Drozerを使用してサービスを悪用する方法を学びましょう。
ブロードキャストレシーバーの悪用
ブロードキャストレシーバーについて復習したい場合は、こちらをお読みください。
ブロードキャストレシーバーのアクションはonReceiveメソッドで開始されることを覚えておいてください。
ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱性が生じる可能性があります。
Drozerを使用してブロードキャストレシーバーを悪用する方法を学びましょう。
スキーム/ディープリンクの悪用
ディープリンクを手動で探すことができ、MobSFのようなツールやこのスクリプトを使用できます。
adbやブラウザを使用して宣言されたスキームを開くことができます:
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>
実行されるコード
アプリで実行されるコードを見つけるために、ディープリンクによって呼び出されるアクティビティに移動し、関数**onNewIntent**を検索します。
機密情報
ディープリンクを見つけるたびに、URLパラメータを介して機密データ(パスワードなど)を受信していないか確認してください。他のアプリケーションがディープリンクを偽装してそのデータを盗む可能性があります!
パス内のパラメータ
URLのパス内でパラメータを使用しているディープリンクがあるかどうかも確認する必要があります。例えば、https://api.example.com/v1/users/{username} のように。この場合、example://app/users?username=../../unwanted-endpoint%3fparam=value のようにパスのトラバーサルを強制することができます。
アプリケーション内で正しいエンドポイントを見つけた場合、オープンリダイレクト(パスの一部がドメイン名として使用される場合)、アカウント乗っ取り(CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合)、およびその他の脆弱性を引き起こす可能性があります。詳細についてはこちらを参照してください。
さらなる例
リンクに関する興味深いバグバウンティレポート (/.well-known/assetlinks.json)。
トランスポート層の検査と検証の失敗
- 証明書はAndroidアプリケーションによって常に適切に検査されるわけではありません。これらのアプリケーションは警告を見落とし、自己署名証明書を受け入れたり、場合によってはHTTP接続に戻ったりすることが一般的です。
- SSL/TLSハンドシェイク中の交渉は時々弱く、安全でない暗号スイートを使用しています。この脆弱性により、接続が中間者攻撃(MITM)に対して脆弱になり、攻撃者がデータを復号化できるようになります。
- プライベート情報の漏洩は、アプリケーションが安全なチャネルを使用して認証するが、他のトランザクションのために非安全なチャネルで通信する場合にリスクがあります。このアプローチは、セッションクッキーやユーザーの詳細などの機密データを悪意のあるエンティティによる傍受から保護できません。
証明書の検証
証明書の検証に焦点を当てます。サーバーの証明書の整合性を確認することは、セキュリティを強化するために重要です。これは、安全でないTLS構成や暗号化されていないチャネルを介して機密データを送信することが重大なリスクをもたらすため、重要です。サーバー証明書の検証と脆弱性への対処に関する詳細な手順については、このリソースが包括的なガイダンスを提供します。
SSLピンニング
SSLピンニングは、アプリケーションがサーバーの証明書をアプリケーション内に保存された既知のコピーと照合するセキュリティ対策です。この方法は、MITM攻撃を防ぐために不可欠です。機密情報を扱うアプリケーションには、SSLピンニングの実装が強く推奨されます。
トラフィックの検査
HTTPトラフィックを検査するには、プロキシツールの証明書をインストールする必要があります(例:Burp)。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドについては、こちらをクリックしてください。
APIレベル24以上をターゲットとするアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示については、このチュートリアルを参照してください。
SSLピンニングのバイパス
SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります:
- 自動的にapkを修正してSSLピンニングをバイパスするには、apk-mitmを使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにrootが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
- Fridaを使用してこの保護をバイパスすることもできます(以下で説明)。Burp+Frida+Genymotionを使用するためのガイドはこちらです:https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/
- objectionを使用してSSLピンニングを自動的にバイパスすることも試みることができます:
objection --gadget com.package.app explore --startup-command "android sslpinning disable" - MobSF動的分析を使用してSSLピンニングを自動的にバイパスすることも試みることができます(以下で説明)。
- まだキャプチャしていないトラフィックがあると思われる場合は、iptablesを使用してトラフィックをburpに転送することを試みることができます。このブログを読んでください:https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62
一般的なWeb脆弱性の検索
アプリケーション内で一般的なWeb脆弱性を検索することも重要です。これらの脆弱性を特定し、軽減するための詳細な情報はこの要約の範囲を超えていますが、他の場所で広範にカバーされています。
Frida
Fridaは、開発者、リバースエンジニア、セキュリティ研究者のための動的インスツルメンテーションツールキットです。
実行中のアプリケーションにアクセスし、実行時にメソッドをフックして動作を変更したり、値を変更したり、値を抽出したり、異なるコードを実行したりできます...
Androidアプリケーションをペンテストするには、Fridaの使い方を知っておく必要があります。
- Fridaの使い方を学ぶ:Fridaチュートリアル
- Fridaでのアクション用の「GUI」:https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security
- OjectionはFridaの使用を自動化するのに最適です:https://github.com/sensepost/objection , https://github.com/dpnishant/appmon
- ここで素晴らしいFridaスクリプトを見つけることができます:https://codeshare.frida.re/
- https://erfur.github.io/blog/dev/code-injection-without-ptraceに示されているようにFridaを読み込んで、アンチデバッグ/アンチFridaメカニズムをバイパスしてみてください(ツールlinjector)。
メモリダンプ - Fridump
アプリケーションがパスワードやニーモニックのような機密情報を保存していないか確認してください。
Fridump3を使用して、アプリのメモリをダンプできます:
# With PID
python3 fridump3.py -u <PID>
# With name
frida-ps -Uai
python3 fridump3.py -u "<Name>"
これは、./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は機密データを保存するのに最適な場所ですが、十分な権限があればアクセスすることが可能です。アプリケーションはここに平文で機密データを保存する傾向があるため、ペンテストはそれを確認する必要があります。ルートユーザーやデバイスへの物理的アクセスを持つ誰かがこのデータを盗むことができるかもしれません。
アプリがKeystoreにデータを保存していても、データは暗号化されているべきです。
Keystore内のデータにアクセスするには、このFridaスクリプトを使用できます: 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
指紋/生体認証バイパス
次のFridaスクリプトを使用することで、Androidアプリケーションが特定の機密領域を保護するために実行している指紋認証をバイパスすることが可能になるかもしれません:
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
バックグラウンド画像
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションのスナップショットを保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
しかし、このスナップショットに機密情報が含まれている場合、スナップショットにアクセスできる誰かがその情報を盗む可能性があります(アクセスするにはルート権限が必要です)。
スナップショットは通常、次の場所に保存されます: /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
開発者は、これらのインテントを処理し、startActivity(...)やsendBroadcast(...)などのメソッドに渡すプロキシコンポーネント(アクティビティ、サービス、ブロードキャストレシーバーなど)を作成することがよくありますが、これはリスクを伴います。
危険は、攻撃者がこれらのインテントを誤って誘導することによって、非エクスポートアプリコンポーネントをトリガーしたり、機密コンテンツプロバイダーにアクセスしたりできることにあります。注目すべき例は、WebViewコンポーネントがURLをIntentオブジェクトに変換し、Intent.parseUri(...)を介して実行することで、悪意のあるインテント注入につながる可能性があります。
Essential Takeaways
- Intent Injectionは、ウェブのオープンリダイレクト問題に似ています。
- 脆弱性は、
Intentオブジェクトをエクストラとして渡すことに関与し、これが不安全な操作を実行するためにリダイレクトされる可能性があります。 - 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。
WebViewのURLからIntentへの変換は、意図しないアクションを促進する可能性があります。
Android Client Side Injections and others
おそらく、あなたはウェブからこの種の脆弱性について知っているでしょう。Androidアプリケーションにおいては、これらの脆弱性に特に注意する必要があります:
- SQL Injection: 動的クエリやコンテンツプロバイダーを扱う際は、パラメータ化されたクエリを使用していることを確認してください。
- JavaScript Injection (XSS): すべてのWebViewに対してJavaScriptとプラグインのサポートが無効になっていることを確認してください(デフォルトで無効)。 More info here.
- Local File Inclusion: WebViewはファイルシステムへのアクセスを無効にする必要があります(デフォルトで有効) -
(webview.getSettings().setAllowFileAccess(false);)。 More info here. - Eternal cookies: Androidアプリケーションがセッションを終了するとき、クッキーが取り消されない場合や、ディスクに保存されることがあります。
- Secure Flag in cookies
Automatic Analysis
MobSF
Static analysis
アプリケーションの脆弱性評価を行うための素晴らしいウェブベースのフロントエンドを使用します。動的分析も実行できますが、環境を準備する必要があります。
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
MobSFはAndroid(apk)、IOS(ipa) およびWindows(apx)アプリケーションを分析できます(WindowsアプリケーションはWindowsホストにインストールされたMobSFから分析する必要があります)。
また、AndroidまたはIOSアプリのソースコードでZIPファイルを作成すると(アプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成)、それも分析できます。
MobSFはdiff/Compare分析を行い、VirusTotalを統合することもできます(_MobSF/settings.py_にAPIキーを設定し、VT_ENABLED = TRUE VT_API_KEY = <Your API key> VT_UPLOAD = TRUEを有効にする必要があります)。VT_UPLOADをFalseに設定すると、ハッシュがファイルの代わりにアップロードされます。
MobSFによる支援された動的分析
MobSFはAndroidにおける動的分析にも非常に役立ちますが、その場合はホストにMobSFとgenymotionをインストールする必要があります(VMやDockerでは動作しません)。注:最初にgenymotionでVMを起動し、その後MobSFを起動する必要があります。
MobSF動的アナライザーは以下を行うことができます:
- アプリケーションデータをダンプ(URL、ログ、クリップボード、あなたが作成したスクリーンショット、"Exported Activity Tester"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル)。これらはすべて自動的に行われますが、スクリーンショットは、取得したいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するには"Exported Activity Tester"を押す必要があります。
- HTTPSトラフィックをキャプチャ
- Fridaを使用してランタイムの情報を取得
Androidのバージョン > 5では、Fridaが自動的に起動し、トラフィックをキャプチャするためのグローバルプロキシ設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
Frida
デフォルトでは、SSLピンニング、ルート検出、デバッガ検出をバイパスし、興味深いAPIを監視するためにいくつかのFridaスクリプトを使用します。
MobSFはまた、エクスポートされたアクティビティを呼び出し、それらのスクリーンショットを取得し、レポート用に保存することもできます。
動的テストを開始するには、緑のボタン"Start Instrumentation"を押します。"Frida Live Logs"を押すと、Fridaスクリプトによって生成されたログを見ることができ、"Live API Monitor"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値を見ることができます(これは"Start Instrumentation"を押した後に表示されます)。
MobSFは、独自のFridaスクリプトを読み込むこともできます(Fridaスクリプトの結果をMobSFに送信するには、send()関数を使用します)。また、読み込むことができるいくつかの事前に書かれたスクリプトもあります(MobSF/DynamicAnalyzer/tools/frida_scripts/others/に追加できます)。ただし、それらを選択し、"Load"を押し、"Start Instrumentation"を押す必要があります(そのスクリプトのログは"Frida Live Logs"内で見ることができます)。
さらに、いくつかの補助的なFrida機能があります:
- 読み込まれたクラスを列挙:すべての読み込まれたクラスを印刷します
- 文字列をキャプチャ:アプリケーションを使用中にキャプチャされたすべての文字列を印刷します(非常に騒がしい)
- 文字列比較をキャプチャ:非常に便利です。比較されている2つの文字列と結果がTrueかFalseかを表示します。
- クラスメソッドを列挙:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドを印刷します。
- クラスパターンを検索:パターンでクラスを検索
- クラスメソッドをトレース:クラス全体をトレース(そのクラスのすべてのメソッドの入力と出力を確認)。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
使用したい補助モジュールを選択したら、"Start Intrumentation"を押す必要があり、すべての出力は"Frida Live Logs"に表示されます。
Shell
Mobsfは、動的分析ページの下部にいくつかのadbコマンド、MobSFコマンド、および一般的なシェルコマンドを持つシェルも提供します。いくつかの興味深いコマンド:
help
shell ls
activities
exported_activities
services
receivers
HTTPツール
HTTPトラフィックがキャプチャされると、"HTTP(S) Traffic"の下にキャプチャされたトラフィックの醜いビューが表示されるか、"Start HTTPTools"の緑のボタンでより良いビューが表示されます。2番目のオプションから、キャプチャされたリクエストをプロキシ(BurpやOwasp ZAPなど)に送信できます。
そのためには、Burpを起動 --> インターセプトをオフにする --> MobSB HTTPToolsでリクエストを選択 --> "Send to Fuzzer"を押す --> プロキシアドレスを選択 (http://127.0.0.1:8080\)。
MobSFで動的分析を終えたら、"Start Web API Fuzzer"を押してHTTPリクエストをファズし、脆弱性を探すことができます。
Note
MobSFで動的分析を実行した後、プロキシ設定が誤って構成される可能性があり、GUIから修正できなくなることがあります。プロキシ設定を修正するには、次のコマンドを実行します:
adb shell settings put global http_proxy :0
Inspeckageによる支援動的分析
ツールはInspeckageから入手できます。
このツールは、動的分析を実行している間にアプリケーションで何が起こっているかを知らせるためにいくつかのフックを使用します。
Yaazhini
これはGUIを使用した静的分析を実行するための優れたツールです。
Qark
このツールは、ソースコードまたはパッケージ化されたAPKのいずれかで、いくつかのセキュリティ関連のAndroidアプリケーションの脆弱性を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための**"Proof-of-Concept"デプロイ可能APKとADBコマンドを作成することも可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
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ファイルに集中しており、各企業やテスターは自分たちのニーズに応じて分析するための独自のルールを作成できます。
最新のバイナリはダウンロードページからダウンロードしてください。
super-analyzer {apk_file}
StaCoAn
StaCoAnは、開発者、バグバウンティハンター、倫理的ハッカーがモバイルアプリケーションに対して静的コード分析を行うのを支援するクロスプラットフォームツールです。
このコンセプトは、モバイルアプリケーションファイル(.apkまたは.ipaファイル)をStaCoAnアプリケーションにドラッグアンドドロップすると、視覚的でポータブルなレポートが生成されるというものです。設定やワードリストを調整して、カスタマイズされた体験を得ることができます。
ダウンロード最新リリース:
./stacoan
AndroBugs
AndroBugs Frameworkは、開発者やハッカーがAndroidアプリケーションの潜在的なセキュリティ脆弱性を見つけるのを助けるAndroid脆弱性分析システムです。
Windowsリリース
python androbugs.py -f [APK file]
androbugs.exe -f [APK file]
Androwarn
Androwarnは、Androidアプリケーションによって開発された潜在的な悪意のある動作を検出し、ユーザーに警告することを主な目的としたツールです。
検出は、アプリケーションのDalvikバイトコードの静的分析を使用して行われ、Smaliとして表現されます。androguardライブラリを使用しています。
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します:電話識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
MARA Framework
MARAはモバイルアプリケーションの逆コンパイルおよび分析フレームワークです。これは、OWASPのモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆コンパイルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
以下のことが可能です:
- 異なるツールを使用してJavaおよびSmaliコードを抽出する
- smalisca、ClassyShark、androbugs、androwarn、APKiDを使用してAPKを分析する
- 正規表現を使用してAPKからプライベート情報を抽出する
- マニフェストを分析する
- pyssltest、testssl、およびwhatwebを使用して見つかったドメインを分析する
- apk-deguard.comを介してAPKをデオブフスケートする
Koodous
マルウェアを検出するのに役立ちます: https://koodous.com/
コードの難読化/デオブフスケート
使用するサービスと設定によって、コードを難読化する際に秘密が難読化される場合とされない場合があります。
ProGuard
[Wikipedia](https://en.wikipedia.org/wiki/ProGuard_(software)より): ProGuardは、Javaコードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
ProGuardはAndroid SDKの一部として配布され、リリースモードでアプリケーションをビルドする際に実行されます。
DexGuard
APKをデオブフスケートするためのステップバイステップガイドはhttps://blog.lexfo.fr/dexguard.htmlで見つけることができます。
(そのガイドから)最後に確認したとき、Dexguardの動作モードは次のとおりでした:
- リソースをInputStreamとして読み込む;
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う;
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
- 最後に、
loadDexメソッドを使用して結果のDEXをリソースとして読み込む。
DeGuard
DeGuardは、Androidの難読化ツールによって行われた難読化プロセスを逆転させます。これにより、コード検査やライブラリの予測など、数多くのセキュリティ分析が可能になります。
難読化されたAPKを彼らのプラットフォームにアップロードできます。
Deobfuscate android App
これは、Androidアプリの潜在的なセキュリティ脆弱性を見つけ、AndroidアプリのコードをデオブフスケートするためのLLMツールです。GoogleのGeminiパブリックAPIを使用します。
Simplify
これは一般的なAndroidデオブフスケーターです。Simplifyはアプリを仮想的に実行してその動作を理解し、その後コードを最適化しようとします。各最適化タイプはシンプルで一般的であるため、使用される特定の難読化のタイプは関係ありません。
APKiD
APKiDはAPKがどのように作成されたかに関する情報を提供します。多くのコンパイラ、パッカー、難読化ツール、およびその他の奇妙なものを特定します。これはAndroid用のPEiDです。
マニュアル
カスタム難読化を逆コンパイルする方法についてのいくつかのトリックを学ぶためにこのチュートリアルを読んでください
ラボ
Androl4b
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングやマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
参考文献
- https://owasp.org/www-project-mobile-app-security/
- https://appsecwiki.com/#/ これは素晴らしいリソースのリストです
- https://maddiestone.github.io/AndroidAppRE/ Androidのクイックコース
- https://manifestsecurity.com/android-application-security/
- https://github.com/Ralireza/Android-Security-Teryaagh
- https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec
まだ試していない
{{#include ../../banners/hacktricks-training.md}}







