デジタルペンテストサービス部でスマートフォンアプリケーション診断を担当しているlac01です。本稿では、AndroidのCTFであるhpAndro Vulnerable Application (Kotlin) CTF(以降、hpAndro CTF)をご紹介します。
hpAndro CTFとは、Hiral Patel氏とRAVIKUMAR R. PAGHDAL氏によって作成されたCTF(Capture The Flag)です。OWASP Mobile Security Testing Guideをベースに作られた脆弱なAndroidアプリケーションを攻略し、ポイントを競い合います。ただし、hpAndro CTFは、一般的なCTFとは異なり、時間制限がなく勝ち負けもありません。そのため、自分のペースで進められ、問題を解くことでポイント獲得が出来るため、ゲーム感覚でセキュリティを学べます。また、全ての問題ではありませんが、各問題に解説動画が用意されているため、これからスマートフォンアプリケーションのセキュリティを学ぼうとしている人にオススメです。
それでは、試しに1問解いてみましょう。
まず、hpAndro CTFのサイトでユーザー登録し、登録したユーザーでログインします。
その後、「Challenges」をクリックすると問題一覧が確認出来ます。本稿では、「Anti-Debugging」の「isDebugger Connected (100)」を解きます。
「isDebugger Connected (100)」をクリックすると、Google Playへのリンクと問題の説明文が表示されます。
You will find task in Anti-Debugging detection catagory in above mentioned application. Your task is to atatch debugger to find a flag.
あなたは、タスクを上記アプリケーション内にあるAnti-Debugging detectionカテゴリから見つけることが出来ます。あなたのタスクは、デバッガーをアタッチしてフラグを見つけることです。
アプリケーションをインストールし、タスクを確認します。今度は、上記の説明文とはまた別の説明文を確認できます。少し長いので意訳すると、「android.os.DebugクラスのisDebuggerConnectedを使ってデバッガーが接続されているか判断しています。デバッガーをアタッチしてフラグを獲得してください。フラグは、ctf.hpandro.raviramesh.infoで確認できます。」と書いてあります。当該問題は、説明文にも記載されている通り、デバッガーをアタッチすることでフラグ獲得出来るのですが、応用が利かなくなるためFridaを使ってデバッガーをアタッチせずに問題を解きます。
最初は、デバッガーをアタッチしていない状態の動作を確認します。「CHECK DEBUGGER」を押下すると、デバッガーをアタッチしていないため、アタッチしてくださいというメッセージが表示されます。このことから、「CHECK DEBUGGER」を押下した際に、デバッガーのアタッチ有無を確認していることが分かります。
![f:id:lac_devblog:20210928132603p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/l/lac_devblog/20210928/20210928132603.png)
![f:id:lac_devblog:20210928132606p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/l/lac_devblog/20210928/20210928132606.png)
では、下記手順により「CHECK DEBUGGER」ボタンの処理を変更させることでフラグ獲得を試します。
- AndroidManifestから問題に関係ありそうなActivityを特定
- 「CHECK DEBUGGER」ボタン押下時の処理を確認
- Fridaスクリプトを作成
- Fridaスクリプトをロードし、フラグ獲得
1.AndroidManifestから問題に関係ありそうなActivityを特定
APKファイルをデコンパイルしてAndroidManifest.xmlを確認します。問題のタイトルである「isDebugger Connected」に関係ありそうな、「IsDebuggerActivity」というActivityがあることを確認できます。
2.「CHECK DEBUGGER」ボタン押下時の処理を確認
「IsDebuggerActivity」が問題に関係あるActivityであれば、「CHECK DEBUGGER」ボタン押下時の処理を定義しているはずなので確認します。
まず、Activityは起動するとライフサイクル に従い、最初にonCreateが呼ばれるため、onCreateを確認してみます。onCreateを確認すると、onCreate直下にあるinitを呼び出していることが分かります。initでは、「CHECK DEBUGGER」ボタン押下時のイベントを受信するsetOnClickListenerで「IsDebuggerActivity$init$2」のインスタンス生成していることを確認できます。では、次は「IsDebuggerActivity$init$2」クラスを確認していきましょう。
「IsDebuggerActivity$init$2」では、onClickメソッドが宣言されており、ifの条件式にdetectDebuggerがあることを確認できます。デバッガーがアタッチされるとtrueが返され、フラグが獲得できることが分かります。以上のことから、FridaによりdetectDebuggerがtrueを返すようにすることで、フラグが獲得出来ることを確認できました。
3.Fridaスクリプトを作成
Fridaスクリプトを作成する前に、detectDebuggerを確認します。引数はなく、返り値としてisDebuggerConnctedの結果を返していることを確認できます。このままでは、デバッガーをアタッチしていない場合、falseが返されてしまいます。なので、Fridaを用いてtrueが返されるようにしましょう。
作成したFridaスクリプトは、以下の通りです。
「com.hpandro.androidsecurity.utils.antiDebugging.AntiDebugging」のインスタンスを生成し、detectDebuggerが常にtrueを返すように実装しています。
4.Fridaスクリプトをロードし、フラグ獲得
最後は、Fridaスクリプトをロードしてフラグを獲得するだけです。下記コマンドにより、スクリプトをロードさせます。正しいフラグが獲得出来ていれば、hpAndro CTFのサイトでフラグを入力すると100ポイント貰えるのでもらっておきましょう!
frida -U --no-pause -l スクリプト名.js -f com.hpandro.androidsecurity
他の問題についても、上記と同様の流れで一つ一つコードを確認しながら紐解いていくことで、解けるので是非試してみてください。もし、自信がない方は、解説動画を見ながらでも少しずつ解いてみるとスマートフォンアプリケーションセキュリティへの理解が深まると思います。