はじめに
この記事ではInterKosenCTFで出題した問題の解説を書きます。 他の問題のwriteupについては下記リンクから参照してください。
概要
Description: We seized a smartphone which one of the suspects had used. Find out the conversation they had. File: android_8.1_x86_oreo.tar.gz
Androidのディスクダンプが渡されます. 問題文からSMSなどの会話を見ればよさそうなので,そこを目標に調査します.
解説1
ディスクダンプなので今回はFTK Imagerを使って解析していきます. Linuxなどを使うかたはThe Sleuth Kitを使うと同じように解析できます. まずはSMSのチャットアプリの記録を見てみましょう. 標準で含まれる代表的な解析対象としては以下のようなディレクトリが挙げられます.
| 場所 | ファイル名 | 内容 |
|---|---|---|
| /system | build.prop | デバイス情報 |
| /data/data/com.android.providers.contacts/databases | contacts2.db | 通話履歴 |
| /data/data/com.android.providers.telephony/databases | mmssms.db | SMS/MMSの会話ログ |
| /data/data/com.android.browser | broser2.db | 標準のブラウザの閲覧履歴 |
| /data/data/com.google.android.apps.messaging/databases | bugle_db | SMS/MMSの会話ログ(新しいAndroid OS) |
他にもfacebookやwhatsappのキャッシュなど,Androidのディスクにはお宝がたくさん眠っています.
問題のディスクにはyoutubeやchromeも見られますね.
chromeなんかは履歴に加えて見ているページのhtmlや画像も一時的に保存されます.(今回の問題には含まれていません.)
また,SMSの履歴は削除してもmmssms.dbに残るのですが,bugle_dbに保存されるGoogleのSMSはSQLには残りません.
ですが,試しに削除してディスクを調査したところ一応会話のテキスト自体はバイナリエディタで見つかったので,どこかには残っているんでしょう.
こういう詳しいところを知っている方がいたら是非教えてください.
さて,上述した場所を探すとbugle_dbが見つかります. これはSQLite形式なので,抽出してSQLiteを見れるツールで開いてみましょう. テーブルがたくさんあるのですが,だいたい重要なところは以下のテーブルでしょう. (この辺は経験的なもので調べて分かったことじゃないのであまり信じないでください.)
| テーブル | 役割 | 詳細 |
|---|---|---|
| conversations | 会話相手一覧 | 相手の名前や最後に受信したメッセージの断片などが記載されています |
| conversation_participants | チャットの参加者 | 参加者のIDと,その人が参加しているチャットのIDが記載されています |
| messages | 会話のタイムスタンプ等の履歴 | 過去のすべての会話について送受信の日時,送信結果などが保存されています |
| participants | 会話相手の詳細 | 会話相手の電話番号,登録した名前などが記載されています |
| parts | 会話履歴 | 過去に送受信したデータ(ファイルも)の一覧がチャットのIDとともに保存されています |
さて,partsを見ると会話が見れます.

これだけ見ると突然話が変わっているようでよく分かりませんが,conversation_idカラムのIDと一致するconversation_participants,participantsテーブルを参照すると,前半は"Jiro Kosen"との会話,後半は"My Mom"との会話ということが分かります.
それはさておき,怪しい会話がありますね. でも"Make our conversation secret by using our app, ok?"とあり,そこから暗号化されたテキストが送られています. "our app"とあるので,暗号化に使われたアプリケーションがインストールされているのではないかと疑います.
アプリケーションのデータは/data/dataに保存されますが,apkファイル自体は/data/appに保存されます.
ということでFTK Imagerに戻ってappを見てみましょう.
ちなみにインストール済みのアプリケーションの一覧は/system/packages.listに記載されています.
問題のディスクではappにKosenCryptoなる怪しいアプリがインストールされています.
/app/com.kosenctf.kosencrypto-DQEyRCoLoNfHq4_wVFgoPA==/base.apkを取り出して逆コンパイルしましょう.
今は眠たいのでオンラインのデコンパイラに投げてみると,次のようなソースコードが見れます.
package com.kosenctf.kosencrypto;
import android.app.Activity;
import android.os.Bundle;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private String algorithm = "AES/CBC/PKCS5Padding";
private String iv = "str0ng-s3cr3t-1v";
private String key = "p4ssw0rd-t0-hid3";
/* renamed from: com.kosenctf.kosencrypto.MainActivity$1 */
class C01951 implements OnClickListener {
C01951() {
}
[省略]
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(C0196R.layout.activity_main);
((Button) findViewById(C0196R.id.btnEncrypt)).setOnClickListener(new C01951());
}
}
なんか途中でデコンパイルに失敗した部分がありましたがまあ問題ありません. (最新のd2jやjadを使えば上手くデコンパイルできるはずです.) フィールドを見るとalgorithm, iv, keyというのがあり,明らかにAES CBCで暗号化されています. ということで,あとはこのIVとパスワードを使って先ほどの会話にあった暗号文を復号化してやればフラグが現れます.
解法2
foremostにディスクイメージを投げるとSMSで送るフラグを暗号化している際の画面のスクリーンショットが出てくるそうです. いったいどの機能がどのタイミングで撮ったんだ? まだまだAndroidの奥は深いです......
あとがき
CTFでAndroidのフォレンジック見たことないなーと思って出題しました. 結構面白い分野だと思うので今回のwriteupは割と丁寧に書いたつもりですが,伝わったでしょうか. 作問した当時は,Androidの調査手法が勉強できる問題として作ったのですが,残念ながら抜け道ができてしまいました. 各問題grepとかでフラグが出ないことは確認しているのですが,binwalkとかforemostは試してませんでした. ユーザーの操作は記録されてるんだなーと実感しましたし,勉強になりました. 競技中に解けなかった方や解法2で解いた方には,是非一度想定解を試してみてほしいです.