Find My Pass - HackTM CTF 2020 Forensic writeup
引き続きHackTM2020 Forensics Writeupをお届け。
前回記事
zarat.hatenablog.com
Find My Pass
問題文
I managed to forget my password for my KeePass Database but luckily I had it still open and managed to get a dump of the system's memory. Can you please help me recover my password?
Author: Legacy
https://mega.nz/#!IdUVwY6I!uJWGZ932xab44H4EJ-zVAqu6_UWNJcCVA4_PPXdqCyc
https://drive.google.com/open?id=1hUlGqJZYgbWaEu7w0JnPMqgYdFr8qVJe
password: eD99mLkU
リンクがいつまで生きているか分からない。
まず、与えられたファイル「HackTM.zip」でzipファイルだと思うので解凍する。
$ unzip HackTM.zip Archive: HackTM.zip skipping: HackTM.vmem need PK compat. v5.1 (can do v4.6)
何故か解凍できなかった。zipファイルのフォーマット確認して直すところから始まるのかぁと思ったが、調べてみるとzipのフォーマットにバージョンがあって、unzipでサポート外のバージョンもあるらしい。
unzip で "need PK compat. v5.1 (can do v4.5)" と言われて解凍できない件 - CUBE SUGAR CONTAINER
ならば7zipを使えばいい。
$ 7za x HackTM.zip 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz (806E9),ASM,AES-NI) Scanning the drive for archives: 1 file, 374180992 bytes (357 MiB) Extracting archive: HackTM.zip -- Path = HackTM.zip Type = zip Physical Size = 374180992 Enter password (will not be echoed): Everything is Ok Size: 2147483648 Compressed: 374180992
解凍して出てきたのはメモリダンプファイルなので、volatilityで解析していく。
$ volatility -f HackTM.vmem imageinfo Volatility Foundation Volatility Framework 2.6 INFO : volatility.debug : Determining profile based on KDBG search... Suggested Profile(s) : Win7SP1x86_23418, Win7SP0x86, Win7SP1x86_24000, Win7SP1x86 AS Layer1 : IA32PagedMemoryPae (Kernel AS) AS Layer2 : FileAddressSpace (/root/CTF/HackTMCTF2020/Find_Mypassword/writeup/HackTM.vmem) PAE type : PAE DTB : 0x185000L KDBG : 0x82b7cb78L Number of Processors : 2 Image Type (Service Pack) : 1 KPCR for CPU 0 : 0x80b96000L KPCR for CPU 1 : 0x807ca000L KUSER_SHARED_DATA : 0xffdf0000L Image date and time : 2019-11-11 20:50:09 UTC+0000 Image local date and time : 2019-11-11 12:50:09 -0800
とりあえず、pstreeを見る。
$ volatility --profile=Win7SP1x86_23418 -f HackTM.vmem pstree Volatility Foundation Volatility Framework 2.6 Name Pid PPid Thds Hnds Time -------------------------------------------------- ------ ------ ------ ------ ---- 0x85fff1e0:wininit.exe 432 360 7 92 2019-11-11 20:49:22 UTC+0000 . 0x86513a70:lsm.exe 512 432 12 166 2019-11-11 20:49:22 UTC+0000 . 0x86438c00:services.exe 484 432 25 270 2019-11-11 20:49:22 UTC+0000 .. 0x864e8030:dllhost.exe 1820 484 21 205 2019-11-11 20:49:26 UTC+0000 .. 0x8670f030:svchost.exe 876 484 36 587 2019-11-11 20:49:23 UTC+0000 ... 0x86b3ad20:dwm.exe 1956 876 5 77 2019-11-11 20:49:25 UTC+0000 .. 0x86abf1a0:vmtoolsd.exe 1676 484 11 199 2019-11-11 20:49:25 UTC+0000 ... 0x86a8f030:cmd.exe 3372 1676 0 ------ 2019-11-11 20:50:09 UTC+0000 .... 0x86611870:ipconfig.exe 3472 3372 0 ------ 2019-11-11 20:50:09 UTC+0000 .. 0x86606030:svchost.exe 664 484 16 379 2019-11-11 20:49:23 UTC+0000 ... 0x86dccc08:WmiPrvSE.exe 3228 664 14 330 2019-11-11 20:49:34 UTC+0000 ... 0x85ee9a38:WmiPrvSE.exe 1748 664 9 145 2019-11-11 20:49:26 UTC+0000 ... 0x85861678:mobsync.exe 2260 664 8 163 2019-11-11 20:49:55 UTC+0000 .. 0x86bc6978:svchost.exe 388 484 7 97 2019-11-11 20:49:26 UTC+0000 .. 0x86a4ed20:VGAuthService. 1600 484 4 87 2019-11-11 20:49:25 UTC+0000 .. 0x8673ea38:svchost.exe 928 484 34 804 2019-11-11 20:49:23 UTC+0000 .. 0x867b1aa0:svchost.exe 1064 484 7 124 2019-11-11 20:49:23 UTC+0000 .. 0x869f87d8:spoolsv.exe 1308 484 16 300 2019-11-11 20:49:24 UTC+0000 .. 0x866d5d20:svchost.exe 812 484 27 577 2019-11-11 20:49:23 UTC+0000 ... 0x86763d20:audiodg.exe 1024 812 6 133 2019-11-11 20:49:23 UTC+0000 .. 0x86c47030:msdtc.exe 2292 484 15 160 2019-11-11 20:49:27 UTC+0000 .. 0x86a58360:svchost.exe 1468 484 34 352 2019-11-11 20:49:24 UTC+0000 .. 0x86a0cac0:svchost.exe 1344 484 24 338 2019-11-11 20:49:24 UTC+0000 .. 0x86869030:svchost.exe 1184 484 23 437 2019-11-11 20:49:23 UTC+0000 .. 0x8672f7f8:svchost.exe 968 484 50 860 2019-11-11 20:49:23 UTC+0000 .. 0x86caf6f8:SearchIndexer. 2636 484 14 612 2019-11-11 20:49:32 UTC+0000 ... 0x86d1fd20:SearchProtocol 2904 2636 7 265 2019-11-11 20:49:33 UTC+0000 ... 0x86d4d030:SearchFilterHo 2928 2636 5 89 2019-11-11 20:49:33 UTC+0000 .. 0x86c77030:VSSVC.exe 2428 484 7 125 2019-11-11 20:49:27 UTC+0000 .. 0x86da3030:svchost.exe 3076 484 11 360 2019-11-11 20:49:33 UTC+0000 .. 0x86a8cc38:taskhost.exe 1580 484 11 223 2019-11-11 20:49:25 UTC+0000 .. 0x860e3030:dllhost.exe 2108 484 18 216 2019-11-11 20:49:26 UTC+0000 .. 0x86661ad0:svchost.exe 748 484 12 337 2019-11-11 20:49:23 UTC+0000 .. 0x86cf7030:wmpnetwk.exe 2728 484 20 473 2019-11-11 20:49:32 UTC+0000 .. 0x86e844f0:WmiApSrv.exe 3716 484 7 122 2019-11-11 20:49:47 UTC+0000 . 0x864b4d20:lsass.exe 504 432 12 811 2019-11-11 20:49:22 UTC+0000 0x863c5d20:csrss.exe 380 360 9 632 2019-11-11 20:49:22 UTC+0000 . 0x86ec7588:conhost.exe 2520 380 0 30 2019-11-11 20:50:09 UTC+0000 0x84a41800:System 4 0 97 410 2019-11-11 20:49:19 UTC+0000 . 0x8625aa30:smss.exe 280 4 5 30 2019-11-11 20:49:19 UTC+0000 0x86b468c0:explorer.exe 1988 1908 33 727 2019-11-11 20:49:25 UTC+0000 . 0x86ae4400:vmtoolsd.exe 1428 1988 10 217 2019-11-11 20:49:26 UTC+0000 . 0x86e1b810:KeePass.exe 3620 1988 10 251 2019-11-11 20:49:46 UTC+0000 . 0x86ae4710:vm3dservice.ex 1396 1988 5 43 2019-11-11 20:49:26 UTC+0000 0x86556030:winlogon.exe 540 424 6 127 2019-11-11 20:49:22 UTC+0000 0x85fffd20:csrss.exe 440 424 10 220 2019-11-11 20:49:22 UTC+0000
ここで気になったのは「Keepass.exe」
今回の問題文からKeepassのデータベースを使って何かするような気がする。ここで、「Keepass.exe」とは何か参考資料をどぞ。
KeePassツールでパスワードを安全・確実に管理する − @IT
次に「Keepass.exe」がどうやって使われたか見たいのでcmdlineでチェック
$ volatility --profile=Win7SP1x86_23418 -f HackTM.vmem cmdline | grep KeePass.exe Volatility Foundation Volatility Framework 2.6 KeePass.exe pid: 3620 Command line : "C:\Program Files\KeePass Password Safe 2\KeePass.exe" "C:\Users\HackTM\Desktop\Database.kdbx"
どうやら、「Database.kdbx」をデータベースファイルとして利用しているらしい。なので、「Database.kdbx」を取り出せるか試す。
$ volatility --profile=Win7SP1x86_23418 -f HackTM.vmem filescan | grep Database.kdbx Volatility Foundation Volatility Framework 2.6 0x000000007da1a248 2 0 RW-rw- \Device\HarddiskVolume2\Users\HackTM\AppData\Roaming\Microsoft\Windows\Recent\Database.kdbx.lnk 0x000000007df37c88 2 0 R--r-- \Device\HarddiskVolume2\Users\HackTM\Desktop\Database.kdbx $ volatility --profile=Win7SP1x86_23418 -f HackTM.vmem dumpfiles -Q 0x000000007df37c88 -D ./ Volatility Foundation Volatility Framework 2.6 DataSectionObject 0x7df37c88 None \Device\HarddiskVolume2\Users\HackTM\Desktop\Database.kdbx $ ls HackTM.vmem file.None.0x86551160.dat $ mv file.None.0x86551160.dat Database.kdbx $ file Database.kdbx Database.kdbx: Keepass password database 2.x KDBX
「Database.kdbx.lnk」はショートカットファイルなので無視。「Database.kdbx」を取り出すことができた。
ここで、このデータベースをチェックするには「master password」が必要である。次はこの「master password」の捜索をする。
どこにあるのかよく分からなかったので、とにかく色々volatilityコマンドを試したところclipboardに何らかの文字列を見つけた。
$ volatility --profile=Win7SP1x86_23418 -f HackTM.vmem clipboard -v Volatility Foundation Volatility Framework 2.6 Session WindowStation Format Handle Object Data ---------- ------------- ------------------ ---------- ---------- -------------------------------------------------- 1 WinSta0 0xc009L 0x7017b 0xfe9a05a8 0xfe9a05b4 1c 00 02 00 .... 1 WinSta0 CF_TEXT 0xd ---------- 1 WinSta0 0x2000L 0x0 ---------- 1 WinSta0 CF_TEXT 0x2000 ---------- 1 WinSta0 0xd0095L 0x0 ---------- 1 WinSta0 CF_TEXT 0x1 ---------- 1 ------------- ------------------ 0xe00cb 0xffbb46b0 0xffbb46bc 64 00 6d 00 56 00 5a 00 51 00 6d 00 64 00 7a 00 d.m.V.Z.Q.m.d.z. 0xffbb46cc 4f 00 6c 00 55 00 72 00 63 00 45 00 42 00 6c 00 O.l.U.r.c.E.B.l. 0xffbb46dc 52 00 6a 00 38 00 37 00 64 00 48 00 51 00 33 00 R.j.8.7.d.H.Q.3. 0xffbb46ec 55 00 53 00 56 00 42 00 49 00 6e 00 00 00 U.S.V.B.I.n... 1 ------------- ------------------ 0xd0095 0xfddf5300 0xfddf530c 09 04 00 00 .... 1 ------------- ------------------ 0xb0137 0xfd4b47b0 0xfd4b47bc 00 00 00 00 78 00 00 00 01 00 00 00 01 00 00 00 ....x........... 0xfd4b47cc 00 00 00 00 00 00 00 00 0d 00 37 71 00 00 00 00 ..........7q.... 0xfd4b47dc 01 00 00 00 ff ff ff ff 01 00 00 00 01 00 00 00 ................ 0xfd4b47ec 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfd4b47fc 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfd4b480c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfd4b481c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfd4b482c 00 00 00 00 00 00 00 00 ........
なんとなく、これがパスワードのような気がしなくもない。
$ strings HackTM.vmem | grep -20 dmVZQ (snip) %XPOIo OOIo LOPI "F?N> %% N W;>- !#7>" 444K91/ O8!YHn 40.&`? 40.&0 pA)0 1J_'" ];NS+ (&-.HTA a,+-$ #"#6 vspscc [~ZV copypaste.transport dmVZQmdzOlUrcEBlRj87dHQ3USVBIn or.lnk ons%29.lnk p~ZV ~ZV mpleSock: Couldn't bind on source port 1023, error 10013, An attempt was made to access a socket in a way forbidden by its access permissions powershell/windows%20powershell.lnk". lnk". .~ZV ~ZVo IPlatformGetExecInfoHash: Getting exec info hash for URL "file:///c:/programdata/microsoft/windows/start%20menu/programs/accessories/windows%20powershell/windows%20powershell%20ise.lnk". IPlatformGetExecInfoHash: Getting exec info hash for URL "file:///c:/programdata/microsoft/windows/start%20menu/programs/accessories/windows%20powershell/windows%20powershell%20ise.lnk". KEEPAS~1 KeePass.exe /C:\ PROGRA~1 KEEPAS~1 KeePass.exe /C:\ PROGRA~1 KEEPAS~1
他にも2回ほど使用しているようだが、「Keepass.exe」でも使用しているように思える。ということでこれが「master password」だと仮定して進めていく。
次に、データベースを開くのだが「keepass2」が必要なのでインストールの参考にしたリンクを貼っておく。
Linux Mint 18: パスワード一元管理ツール「KeePass2」の使い方 | 221B Baker Street
インストールが完了したならばデータベースを開いてみる。
$ keepass2 Database.kdbx
これで、GUIが出てくるので「master password」だと思われる「dmVZQmdzOlUrcEBlRj87dHQ3USVBIn」を入力して「OK」を押すとデータベースが確認できる。 このようにデータベースを開くと、「Jason」のところにAttachmentがあるので、右クリックで「Save Attached File(s) To」を選択してファイルを抽出する。抽出したファイルを確認する。
$ file nothinghere.7z nothinghere.7z: 7-zip archive data, version 0.4
取り出した7zファイルはパスワードが必要だが、先ほど「dmVZQmdzOlUrcEBlRj87dHQ3USVBIn」は何回か使い回されているのを確認したので、7zにも使用してみる。
$ 7za x nothinghere.7z 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz (806E9),ASM,AES-NI) Scanning the drive for archives: 1 file, 234 bytes (1 KiB) Extracting archive: nothinghere.7z -- Path = nothinghere.7z Type = 7z Physical Size = 234 Headers Size = 154 Method = LZMA2:12 7zAES Solid = - Blocks = 1 Enter password (will not be echoed): Everything is Ok Size: 72 Compressed: 234 $ ls Database.kdbx HackTM.vmem nothinghere.7z nothinghere.txt $ cat nothinghere.txt HackTM{d14c02244b17f4f9dfc0f71ce7ab10e276a5880a05fca64d39a716bab92cda90}
flag: HackTM{d14c02244b17f4f9dfc0f71ce7ab10e276a5880a05fca64d39a716bab92cda90}
教訓
暗号化しても、メモリダンプ取っちゃえば関係ねぇ。
他の人のwriteupを読んでみて
人によってはkdbxファイルの仕組みをしっかりと理解した上で、Keepassデータベースがロードされているところを探しパスワードをを発見するなどもありました。Keepassデータベースのロード部分から、「master password」やファイル名を探し、実体を「KeePass」プロセスのメモリダンプからカービングすることもあるかもしれないので色々と資料を残しておきます。
kdbxに関する資料
Keepass file format explained · GitHub
KDBX v2 File Format · Stoom/KeePass Wiki · GitHub
他のwriteupと過去のKeePass問
CTFtime.org / HackTM CTF Quals 2020 / Find My Pass / Writeup