2>/dev/null

ふぉれんじっくやさんになりたいです

【Forensics 1.0.0】zer0ptsCTF WriteUp

初めてDiscordで顔の見えない相手とお話をするという快挙を成し遂げた。緊張した。
ヘッドセット買いたい!

公式writeup様
hackmd.io

参考writeup様
aokakes.hatenablog.com


LOCKED KITKAT

必要かもしれない事前知識

最低限のファイル構造

方針

ロック画面を管理するファイルを探そうとする

やったこと

www.online-tech-tips.com

方法がよくわからんので、ググラビリティに頼る。
android pattern lockscreen
これで出てくるからびっくりだよね

なにやらgesture.keyで管理しているらしい。
しかもそれはsha1でできているらしい。

  • autopsyを使うやり方

f:id:taikohaijin44:20200311234914p:plain
autopsy

ここから総当たりでありそうな場所に検討つけながらやりました。
system->data->gesture.key

  • the sluth kitを使うやり方

The Sleuth Kit | Forensicistwww.kazamiya.net

これのsleuth kit以下のページを調べたいコマンドに書き換えながら調べるのが激熱。
これすごい便利(怠惰)

qiita.com
↑これも纏まってて便利

  1. img_stat android.4.4.x86.img

img_stat [-i imgtype] [-b dev_sector_size] [-tvV] image [images]

指定したイメージファイルのtype(raw,aff,afd等)とサイズが出力されます。

IMAGE FILE INFORMATION

                                                                                      • -

Image Type: raw

Size in bytes: 536870912

  1. fsstat android.4.4.x86.img

fsstat [-f fstype ] [-i imgtype] [-o imgoffset] [-b dev_sector_size] [-tvV] image [images]

fsstat - ファイルシステムの一般的な詳細情報を表示する

FILE SYSTEM INFORMATION

                                                                                      • -

File System Type: Ext4
Volume Name:
Volume ID: 5bf2f9c06f9467bf5f65f4abbcf4f857

Last Written at: 2020-03-05 10:06:53 (JST)
Last Checked at: empty

Last Mounted at: 2020-03-05 10:06:53 (JST)
Unmounted properly
Last mounted on: /data

Source OS: Linux
Dynamic Structure
Compat Features: Journal, Ext Attributes, Resize Inode,
InCompat Features: Filetype, Needs Recovery, Extents,
Read Only Compat Features: Sparse Super, Large File,

Journal ID: 00
Journal Inode: 8

METADATA INFORMATION

                                                                                      • -

Inode Range: 1 - 32769
Root Directory: 2
Free Inodes: 32733
Inode Size: 256

CONTENT INFORMATION

                                                                                      • -

Block Groups Per Flex Group: 1
Block Range: 0 - 131071
Block Size: 4096
Free Blocks: 118486

BLOCK GROUP INFORMATION

                                                                                      • -

Number of Block Groups: 4
Inodes per group: 8192
Blocks per group: 32768

Group: 0:
Inode Range: 1 - 8192
Block Range: 0 - 32767
Layout:
Super Block: 0 - 0
Group Descriptor Table: 1 - 1
Group Descriptor Growth Blocks: 2 - 128
Data bitmap: 129 - 129
Inode bitmap: 130 - 130
Inode Table: 131 - 642
Data Blocks: 643 - 32767
Free Inodes: 8155 (99%)
Free Blocks: 17203 (52%)
Total Directories: 8

Group: 1:
Inode Range: 8193 - 16384
Block Range: 32768 - 65535
Layout:
Super Block: 32768 - 32768
Group Descriptor Table: 32769 - 32769
Group Descriptor Growth Blocks: 32770 - 32896
Data bitmap: 32897 - 32897
Inode bitmap: 32898 - 32898
Inode Table: 32899 - 33410
Data Blocks: 33411 - 65535
Free Inodes: 7884 (96%)
Free Blocks: 31845 (97%)
Total Directories: 136

Group: 2:
Inode Range: 16385 - 24576
Block Range: 65536 - 98303
Layout:
Data bitmap: 65536 - 65536
Inode bitmap: 65537 - 65537
Inode Table: 65538 - 66049
Data Blocks: 65538 - 65537, 66050 - 98303
Free Inodes: 8169 (99%)
Free Blocks: 32232 (98%)
Total Directories: 17

Group: 3:
Inode Range: 24577 - 32768
Block Range: 98304 - 131071
Layout:
Super Block: 98304 - 98304
Group Descriptor Table: 98305 - 98305
Group Descriptor Growth Blocks: 98306 - 98432
Data bitmap: 98433 - 98433
Inode bitmap: 98434 - 98434
Inode Table: 98435 - 98946
Data Blocks: 98947 - 131071
Free Inodes: 8133 (99%)
Free Blocks: 31882 (97%)
Total Directories: 17

fsstatはファイルシステムに関連する詳細情報を表示する。このコマンドの出力はファイルシステム依存となる。少なくともメタデータの値(iノード番号)の範囲とブロックやクラスタのコンテンツ用ユニットの情報が与えられる。スーパーブロックから得られるマウント時刻や独自機能などの詳細情報も与えられる。FFSやExt2などのグループに分割するファイルシステムでは、各グループの配置がリストされる。 FATファイルシステムではFATテーブルが簡略化されたフォーマットで表示される。このデータはセクタ内にあり、クラスタ内にはない。

  1. fls android.4.4.x86.img

fls [-adDFlpruvV] [-m mnt ] [-z zone ] [-f fstype ] [-s seconds ] [-i imgtype ] [-o imgoffset ] [-b dev_sector_size ] image [images] [ inode ]

fls - ディスクイメージからファイル、ディレクトリ名を表示する

flsはimage内のファイル、ディレクトリ名を表示する。また、inodeで指定されたiノードを使っているディレクトリの最近削除されたファイル名を表示する。inodeが指定されなければ、ルートディレクトリのiノードの値となる。例えば、NTFSでは5となり、Ext3では2となる。 指定可能な引数は以下は以下の通りである。

d/d 11: lost+found
d/d 12: app
d/d 27: nativebenchmark
d/d 29: nativetest
d/d 8193: dontpanic
d/d 16385: misc
d/d 24577: local
d/d 8194: data
d/d 24579: app-private
d/d 8195: app-asec
d/d 24580: app-lib
d/d 8196: property
d/d 8197: ssh
d/d 24581: dalvik-cache
d/d 24582: resource-cache
d/d 24583: drm
d/d 8199: mediadrm
l/l 36: bugreports
d/d 24584: security
d/d 8200: user
d/d 24585: media
d/d 8204: system
d/d 16402: backup
r/r 37: .layout_version
d/d 32769: $OrphanFiles

ここまでは一通り調査。ファイルタイプとファイルシステムカテゴリの判別。
ここからはだいたいの目星をつけてファイルの深堀をしていく
systemのinode番号は8204なので…

  1. fls -i raw -f ext4 android.4.4.x86.img 8204

上記のように-i でimagetype、-fでファイルの種類を指定。深堀したいinode番号を最後に記述して完成。

r/r 8207: batterystats.bin
d/d 8206: procstats
d/d 8205: ifw
d/d 8210: users
d/d 8208: usagestats
r/r 8214: uiderrors.txt
r/r 8385: packages.xml
r/r 8361: packages.list
r/r 8346: entropy.dat
d/d 8354: sync
d/d 8359: inputmethod
r/r 8363: locksettings.db
d/d 8362: netstats
r/r 8364: locksettings.db-wal
r/r 8365: locksettings.db-shm
r/r 8366: framework_atlas.config
r/r 8383: called_pre_boots.dat
s/h 8384: ndebugsocket
d/d 8414: dropbox
r/r 8396: appops.xml
d/d 8421: registered_services
r/r 8495: gesture.key
r/r 8497: device_policies.xml
r/r * 8497(realloc): device_policies.xml.tmp


これでsystemの中身を表示することができるようになった
gesture.keyを取得したいから、icat

  1. icat -i raw -f ext4 android.4.4.x86.img 8495 > gesture.key

icat [-hrsvV] [-f fstype ] [-i imgtype ] [-o imgoffset ] [-b dev_sector_size ] image [images] inode

icatはimage(s)を開きinode番号で指定されたファイルをコピーして標準出力に出力する。
gesture.keyを取得できたから、ここから何とかしてpatternの取得に励む。

gesture.keyを調べると、なにやら

https://tutorialsoverflow.com/cracking-pattern-lock-protection-android-forensics/tutorialsoverflow.com

に以下のような文章が
Due to the fact that android does not use a salted hash and we have very finite possible pattern combinations it does not take a lot to generate a dictionary containing all possible hashes of sequences from 0123 to 876543210. We are using the brute forcing technique because the hash is a SHA-1 hash. Therefore we cannot get the plain text from the hashed one. While I was searching for an algorithm to brute force this SHA-1 hash on google I found this (https://github.com/sch3m4/androidpatternlock) python script.

~~~まだ未完ですがとりあえず出します。~~~~~~~~~~~~~~~~~~~~~~~~~~~

以下はshredderの参考URL
th0x4c.github.io

qiita.com







How to Bypass Pattern Locks in Android? -


tsalvia.hatenablog.com