Exploiting a debuggeable application
デバッグ可能なアプリケーションの悪用
ルートおよびデバッグ可能なチェックをバイパスする
この投稿のこのセクションは、https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0からの要約です。
Androidアプリをデバッグ可能にし、チェックをバイパスする手順
アプリをデバッグ可能にする
https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0に基づくコンテンツ
APKを逆コンパイルする:
APKを逆コンパイルするためにAPK-GUIツールを使用します。
_android-manifest_ファイルに
android:debuggable=true
を挿入してデバッグモードを有効にします。修正されたアプリケーションを再コンパイル、署名、およびzipalignします。
修正されたアプリケーションをインストールする:
コマンドを使用します:
adb install <application_name>
。
パッケージ名を取得する:
サードパーティアプリケーションをリストアップし、パッケージ名を見つけるために
adb shell pm list packages –3
を実行します。
アプリをデバッガー接続を待機するように設定する:
コマンド:
adb shell am setup-debug-app –w <package_name>
。注意: このコマンドは、アプリケーションを起動する前に毎回実行する必要があり、デバッガーを待機させることを確認します。
永続化するには、
adb shell am setup-debug-app –w -–persistent <package_name>
を使用します。すべてのフラグを削除するには、
adb shell am clear-debug-app <package_name>
を使用します。
Android Studioでデバッグの準備をする:
Android Studioで、_File -> Open Profile or APK_に移動します。
再コンパイルされたAPKを開きます。
主要なJavaファイルにブレークポイントを設定する:
MainActivity.java
(特にonCreate
メソッド)、b.java
、およびContextWrapper.java
にブレークポイントを設定します。
チェックをバイパスする
アプリケーションは、特定のポイントでデバッグ可能かどうかを確認し、ルート化されたデバイスを示すバイナリをチェックします。デバッガーを使用して、アプリ情報を変更し、デバッグ可能なビットを解除し、検索されるバイナリの名前を変更してこれらのチェックをバイパスできます。
デバッグ可能なチェックの場合:
フラグ設定を変更する:
デバッガーコンソールの変数セクションで、
this mLoadedAPK -> mApplicationInfo -> flags = 814267974
に移動します。注意:
flags = 814267974
のバイナリ表現は11000011100111011110
であり、「Flag_debuggable」がアクティブであることを示します。
これらの手順は、アプリケーションをデバッグできるようにし、デバッガーを使用して特定のセキュリティチェックをバイパスできるようにすることで、アプリケーションの動作をより詳細に分析または変更するのを容易にします。
ステップ2では、バイナリ表現で814267972にフラグ値を変更する必要があります。これはバイナリ表現で110000101101000000100010100として表されます。
脆弱性の悪用
ボタンとテキストビューを含む脆弱なアプリケーションを使用してデモが提供されました。最初に、アプリケーションは「Crack Me」と表示されます。ソースコードを変更せずに、ランタイムでメッセージを「Try Again」から「Hacked」に変更することを目指します。
脆弱性のチェック
apktool
を使用してアプリケーションを逆コンパイルしてAndroidManifest.xml
ファイルにアクセスしました。AndroidManifest.xmlに
android_debuggable="true"
が存在すると、アプリケーションがデバッグ可能であり、悪用の可能性があることを示します。apktool
はコードを変更せずにデバッグ可能な状態を確認するためにのみ使用されることに注意してください。
セットアップの準備
デバイスエミュレータを起動し、脆弱なアプリケーションをインストールし、Dalvik VMポートをリッスンしているポートを特定するために
adb jdwp
を使用しました。JDWP(Java Debug Wire Protocol)は、VMで実行中のアプリケーションのデバッグを可能にするために一意のポートを公開することで、VM内のアプリケーションのデバッグを可能にします。
リモートデバッグのためにポートフォワーディングが必要であり、その後、JDBをターゲットアプリケーションにアタッチしました。
ランタイムでコードを注入する
ブレークポイントを設定し、アプリケーションのフローを制御して悪用を行いました。
classes
やmethods <class_name>
などのコマンドを使用してアプリケーションの構造を明らかにしました。onClick
メソッドでブレークポイントを設定し、その実行を制御しました。locals
、next
、set
コマンドを使用してローカル変数を検査および変更し、特に「Try Again」メッセージを「Hacked」に変更しました。修正されたコードを
run
コマンドを使用して実行し、アプリケーションの出力をリアルタイムで変更しました。
この例は、デバッグ可能なアプリケーションの動作を操作する方法を示し、アプリケーションのコンテキストでデバイス上でシェルアクセスを取得するなどのより複雑な悪用の可能性を示しています。
参考文献
Last updated