ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

CTFでスマホアプリのセキュリティを学んでみよう

デジタルペンテストサービス部でスマートフォンアプリケーション診断を担当している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のサイトでユーザー登録し、登録したユーザーでログインします。

f:id:lac_devblog:20210928132026p:plain

hpAndro Vulnerable Application


  その後、「Challenges」をクリックすると問題一覧が確認出来ます。本稿では、「Anti-Debugging」の「isDebugger Connected (100)」を解きます。

f:id:lac_devblog:20210928132228p:plain

isDebugger Connectedの説明

「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を使ってデバッガーをアタッチせずに問題を解きます。

 

f:id:lac_devblog:20210928132356p:plain

アプリケーションの問題説明画面

最初は、デバッガーをアタッチしていない状態の動作を確認します。「CHECK DEBUGGER」を押下すると、デバッガーをアタッチしていないため、アタッチしてくださいというメッセージが表示されます。このことから、「CHECK DEBUGGER」を押下した際に、デバッガーのアタッチ有無を確認していることが分かります。

f:id:lac_devblog:20210928132603p:plain
f:id:lac_devblog:20210928132606p:plain
デバッガーアタッチ前の動作確認

では、下記手順により「CHECK DEBUGGER」ボタンの処理を変更させることでフラグ獲得を試します。

  1. AndroidManifestから問題に関係ありそうなActivityを特定
  2. 「CHECK DEBUGGER」ボタン押下時の処理を確認
  3. Fridaスクリプトを作成
  4. Fridaスクリプトをロードし、フラグ獲得

1.AndroidManifestから問題に関係ありそうなActivityを特定

APKファイルをデコンパイルしてAndroidManifest.xmlを確認します。問題のタイトルである「isDebugger Connected」に関係ありそうな、「IsDebuggerActivity」というActivityがあることを確認できます。

f:id:lac_devblog:20210928132958p:plain

AndroidManifest.xml

 

2.「CHECK DEBUGGER」ボタン押下時の処理を確認

「IsDebuggerActivity」が問題に関係あるActivityであれば、「CHECK DEBUGGER」ボタン押下時の処理を定義しているはずなので確認します。

まず、Activityは起動するとライフサイクル に従い、最初にonCreateが呼ばれるため、onCreateを確認してみます。onCreateを確認すると、onCreate直下にあるinitを呼び出していることが分かります。initでは、「CHECK DEBUGGER」ボタン押下時のイベントを受信するsetOnClickListenerで「IsDebuggerActivity$init$2」のインスタンス生成していることを確認できます。では、次は「IsDebuggerActivity$init$2」クラスを確認していきましょう。

f:id:lac_devblog:20210928140838p:plain

IsDebuggerActivity

「IsDebuggerActivity$init$2」では、onClickメソッドが宣言されており、ifの条件式にdetectDebuggerがあることを確認できます。デバッガーがアタッチされるとtrueが返され、フラグが獲得できることが分かります。以上のことから、FridaによりdetectDebuggerがtrueを返すようにすることで、フラグが獲得出来ることを確認できました。

f:id:lac_devblog:20210928141004p:plain

IsDebuggerActivity$init$2

 

3.Fridaスクリプトを作成

Fridaスクリプトを作成する前に、detectDebuggerを確認します。引数はなく、返り値としてisDebuggerConnctedの結果を返していることを確認できます。このままでは、デバッガーをアタッチしていない場合、falseが返されてしまいます。なので、Fridaを用いてtrueが返されるようにしましょう。

f:id:lac_devblog:20210928141209p:plain

detectDebugger

作成したFridaスクリプトは、以下の通りです。

「com.hpandro.androidsecurity.utils.antiDebugging.AntiDebugging」のインスタンスを生成し、detectDebuggerが常にtrueを返すように実装しています。

f:id:lac_devblog:20210928141253p:plain

Fridaスクリプト

 

4.Fridaスクリプトをロードし、フラグ獲得

最後は、Fridaスクリプトをロードしてフラグを獲得するだけです。下記コマンドにより、スクリプトをロードさせます。正しいフラグが獲得出来ていれば、hpAndro CTFのサイトでフラグを入力すると100ポイント貰えるのでもらっておきましょう!

frida -U --no-pause -l スクリプト名.js -f com.hpandro.androidsecurity

f:id:lac_devblog:20210928142756p:plain

Fridaスクリプトロード後に「CHECK DEBUGGER」押下

 

他の問題についても、上記と同様の流れで一つ一つコードを確認しながら紐解いていくことで、解けるので是非試してみてください。もし、自信がない方は、解説動画を見ながらでも少しずつ解いてみるとスマートフォンアプリケーションセキュリティへの理解が深まると思います。