SECCON 令和CTF Writeup
SECCON 令和CTF について
平成最後のCTFとして、http://score-reiwa.seccon.jp/が開催されました。
平成31年4月30日(火)23:00(JST)~令和元年5月1日(水)01:00 (JST) (2時間)
※ 開始直後にサーバトラブルがあり、結局2時まで開催されていました。
私もいろいろ準備して参加しましたが、 結局チュートリアルも含めて、4問しか解くことができませんでした。 結果は、310点で78/858位でした。
SECCON 令和CTF Writeup(4問)
Misc フラグの例は?
平成最後の最後、令和最初のSECCON CTFにようこそ。 フラグはSECCON{reiwa}です。
Misc bREInWAck
問題
元号が変わる。記号も変わる。
参考: https://ja.wikipedia.org/wiki/Brainfuck
添付ファイル(flag.bw)
令和和和和和和和和和和和和和和和和「令和 和和和和令和和和和令和和和和和和和令和和 和和和和令和和平平平平平成」令和和和。令 和和和和和。成成。。平成成成成。成。令令 和和和和和和和和和和和。令和和。平平平和 和和和。令和和。和和和和。令令和和和和和 和和和和和和和。平平平和和和和和和和和和 和和和和。成成成成成成成成。令成成成成成 成成成。令令。成成成成成。成成成成成成。 令和。平平和和。令令令和和和和和和和和和 和。
解答例
令和平成「」。
の文字をBrainfuckの記号( >+<-[].
)に置き換えて、
Brainfuckのインタプリタで実行するとフラグが取得できます。
cat flag.bw | sed -e 's/令/>/g' | sed -e 's/和/+/g' | sed -e 's/平/</g' | sed -e 's/成/-/g' | sed -e 's/「/[/g' | sed -e 's/」/]/g' | sed -e 's/。/./g'
変換すると、下記のようになります。
$ sh reiwa_ctf_misc2.sh >++++++++++++++++[>+ ++++>++++>+++++++>++ ++++>++<<<<<-]>+++.> +++++.--..<----.-.>> +++++++++++.>++.<<<+ +++.>++.++++.>>+++++ +++++++.<<<+++++++++ ++++.--------.>----- ---.>>.-----.------. >+.<<++.>>>+++++++++ +.
今回は、下記のBrainfuckのインタプリタを使用しました。
Misc 零は?
問題
nc zerois-o-reiwa.seccon.jp 23615
解答例
netcatで接続すると、計算問題が表示されます。
右辺の計算結果が0になるような?を見つけていく問題のようです。
$ nc zerois-o-reiwa.seccon.jp 23615 [1/100] 0=71-? ?=71 [2/100] 0=91*71-? ?=
後半になると問題も長くなり、タイムアウト時間もあるので手動では解けそうにありません。 今回は、Pythonを使って100問解くようにプログラムを書きました。
- pwntoolsで接続して、問題を取得する。
- ?を総当たりで割り当てて、evalで計算する。
- 計算結果が0になったら、回答する。
- 上記を繰り返す。
from pwn import * p = remote('zerois-o-reiwa.seccon.jp', 23615) for count in range(100): print '--- ' + str(count) + ' ---' # get question p.readuntil('0=') question = p.readuntil('?=').split('\n')[0] print question # brute force answer = 0 while True: tmp = question result = eval(tmp.replace('?', str(answer))) if result == 0: break answer += 1 # send answer p.sendline(str(answer)); print '?=' + str(answer) p.interactive()
実行すると、下記のようになります。
$ python reiwa_ctf_misc3.py [+] Opening connection to zerois-o-reiwa.seccon.jp on port 23615: Done --- 0 --- ?-43 ?=43 --- 1 --- 60+23-? ?=83 (省略) --- 98 --- 71-92+76*30*15+56-84*68+47-65-10+79*10*61+27-94*40+34-1+36*96-29-71*73+25*89+91-52*62-52+33-6*43+9*8+62-22-45+36*13-18+52*60+16-59*57-63+83*65*64-85+48+6*56-32+57*29-74-88*90+58-42+7*86*52+58-25-57*18+22+98*90-97+89-69*29*8+51-97-63*67+20+19-54*95*18+19-52+89*55-13*33+80-54-77+?*0+39-92-340391 ?=0 --- 99 --- 55+56*0-68+32-47*78*59+59-85+45-71*73+91*90-21*25+93-15+98-27*82*99+49-48+77*73-78*80+44-13*89-67+24-60+14*31-97*75+87+30*88-33-23*28+19*35-93+29*30-22+71+75*65-33+56*54-20+59-68*81-54+9*32+16-50*5*80-34+75*15-40+51+31-90*43*18-57+46+99-59*19-80+93*89*24-33+97-39*89+40-99*72+72-14+67*88+0*?-10+330814 ?=0 [*] Switching to interactive mode Congratulations! The flag is SECCON{REIWA_is_not_ZERO_IS}. (Enter RETURN key if connection is not disconnected) [*] Got EOF while reading in interactive $
Forensic 新元号発表
問題
newera.pdfを開くと下記の画像が表示されます。
解答例
PDFをよく見ると、QRコードが隠れているように見えます。
下記のサービスを使用してPDFから画像を抽出してみました。
smallpdf.com
抽出すると、2つの画像を取得することができました。
後は適当に重ねてQRコードを読み込むとフラグが取得できます。 私は、PowerPointの機能で白を透過させて2つの画像を重ねました。
実際にQRコードを重ねてみると、以下のようになります。
Ghidraの使い方(調査まとめ)
はじめに
しばらくGhidraについて調べていたので、見つけた機能をいろいろ紹介していきます。 インストール方法やプロジェクトの共有については、別の記事を参考にしてください。
tsalvia.hatenablog.com tsalvia.hatenablog.com
公式サイトからチートシートも用意されているので、こちらも参考になります。
Ghidra Cheat Sheet
検証環境
下記の環境で検証を行いました。
- Windows 10 バージョン 1809
- OpenJDK 11.02
- Ghidra v9.0.2
解析用のサンプルプログラム
紹介するにあたって、解析サンプルとなるようなプログラムを用意しました。 このプログラムをベースに説明していきます。 正しいパスワードを入力したら、flagが取得できるようなCTF形式の簡単なプログラムを用意しました。
- 実行例
$ ./HelloGhidra Usage: ./HelloGhidra <password> $ ./HelloGhidra aaaaaaaa Incorrect password. $ ./HelloGhidra Hello_Ghidra! Congratulations! flag{Hello_Ghidra!}
コンパイル方法(今回はシンボル情報も削除しました)
$ gcc -o HelloGhidra HelloGhidra.c $ strip ./HelloGhidra
Ghidraの機能紹介
ウィンドウのレイアウト変更
各ウィンドウの青いバーをドラッグアンドドロップすることで、レイアウトを自由に変更できる。
- で別ウィンドウで表示する。
- で間に挿入する。
- でウィンドウを重ねる。
アセンブラ表示のレイアウト変更
Listingウィンドウのレイアウトは、細かく修正することができます。
Listingウィンドウの右上のをクリックすると、レイアウト編集モードに入れます。
スタックの深さを表示する
- Listingウィンドウの右上のをクリックすると、レイアウト編集モードに入ります。
- 「挿入したい場所を右クリック」→「Add Field」→「Stack Depth」をクリックする。
- 左端に「Stack Depth」が追加されました。
コードグラフの表示
「Window」→「Function Graph」もしくはをクリックすると表示されます。
スナップショットの作成
現在見ている場所をスナップショットとして別ウィンドウに保持することができます。
各ウィンドウの右上にあるをクリックすると、スナップショットを作成することができます。
関数名や型の書換え
関数名や返り値の型などを修正することができます。
「関数名を右クリック」→「Edit Function Signature」で編集ウィンドウが表示されます。
変更前
変更後
変数名の変更
ループカウンタ変数である「local_c」を「i」に書き換えてみます。
「変数(local_c)を右クリックする」→「Rename Variable」で変更できます。
変更前
変更後
数値の表示形式を変更する(例:16進数→10進数)
「Listingウィンドウの数値を右クリックする」→「Convert」で様々な形式に変換できます。
Listingウィンドウで変換した内容は、Decompileウィンドウにも反映されます。
文字列の検索(Defined Strings)
「Window」→「Defined Strings」で表示できます。
文字列の参照先にジャンプする
- 「対象の文字列をダブルクリック」すると、文字列が格納されている場所にジャンプします。
- 「ジャンプ先の文字列を右クリック」→「References」→「Show References to Address」をクリックする。
- 参照先のアドレス一覧が表示されるので、ジャンプしたい項目をダブルクリックする。
オーバービューやエントロピーの表示
「どこに何が格納されているのか」や「どういう形式なのか」を色で確認することができます。
Listingウィンドウの右上にある「Toggles overview margin displays.」をクリックする。 「Show Overview」や「Show Entropy」にチェックを入れる。
Overview
Entropy
マウスオーバーで参照先を表示する
関数名やラベルにマウスカーソルを当てると、参照先がどうなっているのかを確認することができます。
マウスオーバー機能の無効化
Listingウィンドウの右上にあるをクリックすると、 に変わり、マウスオーバーで表示する機能を無効化できる。
関数呼び出しをツリーグラフで確認する
「Window」→「Function Call Graph」で表示できます。
コメントの挿入
「コメントを挿入したい個所を右クリック」→「Comments」→「Set Pre Comment...」をクリックします。
コメント挿入用のウィンドウが表示されるのでコメントを書き込んで、「Apply」をクリックする。
コメントは、DecompileウィンドウやListingウィンドウに反映されます。
バイナリ表示(Bytes)
「Window」→「Bytes」 もしくは ボタンをクリックすると表示されます。
アスキー文字列の表示
Bytesウィンドウの右上のボタンをクリックし、 「Ascii」にチェックを入れる。
スクリプトマネージャ
Ghidraにはさまざまなスクリプトが用意されています。
「Window」→「Script Manager」もしくはで開くことができます。
Script Managerの右上のをクリックすると、ソースコードを表示することができます。
XOR変換(XorMemoryScript.java)
- XOR変換したい個所を「Bytes」ウィンドウで指定する。 マウスでドラッグすると、緑色にハイライトされます。
- 「Script Manager」を開いて、「XorMemoryScript.java」にチェックを入れます。
- 「Run Script」ボタンを押すと、スクリプトが起動します。
- 今回は、0x15でxorされていることが、Decompile結果から分かっているので、「15」と入力します。
- 「OK」を押すと、ハイライトされた箇所が「]pyyzJR}|qgt4」から「Hello_Ghidra!」に変換されていることが分かります。
ダークモード
「Edit」→「Tool Options...」→「Tool」→「Use Inverted Colors」にチェックを入れる。
※ CodeBrowserではなく、プロジェクト管理のEditメニューから設定する。
参考にしたサイト
Ghidra プロジェクトの共有方法
はじめに
Ghidraには、プロジェクトの共有機能が実装されています。 複数人で解析する場合は、この機能を使うと便利です。 ちなみにIDA Proには、デフォルトでプロジェクト共有機能がありません。 IDArlingのようなプラグインを別途導入する必要があります。
Ghidraサーバの詳細については、<Ghidraのディレクトリ>/server/svrREADME.htmlを参照してください。
また、Ghidraのインストール方法は、こちらを確認してください。
プロジェクトの共有手順
プロジェクトの共有は、下記の手順で行えます。 各項目について説明していきます。
- Ghidraサーバをインストールする
- Ghidraサーバにアクセスできるユーザを追加する
- リポジトリとプロジェクトを作成する
- 解析したファイルをリポジトリに追加する
- 別のPCからリポジトリにアクセスする
検証した環境
今回は、Linux(Debian 9)環境で試しました。Windowsの場合は、「~.bat」を実行すれば同様の動作になるはずです。
$ uname -a Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3 (2019-02-02) x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 9.8 (stretch) Release: 9.8 Codename: stretch $ java -version openjdk version "11.0.2" 2019-01-15 OpenJDK Runtime Environment 18.9 (build 11.0.2+9) OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
1. Ghidra サーバをインストールする
プロジェクトを共有するためには、Ghidraサーバを立てる必要があります。
サーバのインストールは、<Ghidraのディレクトリ>/server/svrInstallで行えます。 これを実行すると、Ghidraサーバがインストールされ、サーバが起動します。出力の最後に「Service ghidraSvr started」と表示されれば成功です。
$ ./server/svrInstall alice password: : 省略 : Service ghidraSvr started
Ghidraサーバは、デフォルトで13100番ポートで待ち受けています。
$ ss -l | grep 13100 tcp LISTEN 0 50 *:13100 *:*
2. Ghidraサーバにアクセスできるユーザを追加する
Ghidraサーバが起動したら、次にユーザの追加を行います。 追加したユーザだけが、Gidoraサーバにアクセスすることができます。
ユーザの追加は、<Ghidraのディレクトリ>/server/svrAdmin で行えます。 デフォルトのパスワードは、「changeme」となっています。
$ ./svrAdmin -add <SID>
ユーザ追加例:
$ whoami alice $ sudo ./server/svrAdmin -add alice Using server directory: /home/alice/ghidra_9.0/repositories 1 command(s) queued.
3. リポジトリとプロジェクトを作成する
「File」→「New Project...」から新しいプロジェクトを作成します。 今回は、プロジェクトを共有したいので「Shared Project」を選択して「Next >>」をクリックします。
「Server Name:」にGhidraサーバを立てたPCのIPアドレスもしくはドメイン名を指定して、「Next >>」をクリックします。 今回は、下記の通りに設定しました。
- Server Name: → 「localhost」
- Port Number: → 「13100」(デフォルトのGidoraサーバのポート番号)
svrAdminで作成したユーザのパスワードを入力して「OK」をクリックします。 デフォルトパスワードは、「changeme」となっています。
パスワードの変更を要求されるので、「OK」をクリックします。
新しいパスワードを入力して、「OK」をクリックします。
パスワードの変更が完了しました。「OK」をクリックして次に進みます。
リポジトリ名を指定して「Next >>」をクリックします。 今回は、「mySharedProject」という名前にしました。
共有プロジェクトにアクセスできるユーザを指定して、「Next >>」をクリックします。 今回の例では、「alice」というユーザしかいないので、「Admin」権限以外選択できません。
共有プロジェクトのローカルの保存先を指定して、「Finish」をクリックします。 今回は、下記の通りに設定しました。
- Project Directory: → 「/home/alice/GhidraProjects」
- Project Name: → 「mySharedProject」
「mySharedProject」という共有プロジェクトが作成できました。
4. 解析したファイルをリポジトリに追加する
「File」→「Import File...」で解析したいファイルをインポートする。
インポートしたファイルを右クリックし、「Add to Version Control...」をクリックする。
コメントの入力欄が出てくるので、コメントを書いて「OK」をクリックする。
リポジトリにAddすると、ファイルのアイコンに緑のチェックマークが付きます。 上記の手順でリポジトリにAddしたファイルのみが共有されます。
5. 別のPCからリポジトリにアクセスする
アクセス権の割当て(ユーザ名か異なる場合のみ)
手順2で追加したユーザ以外を使ってGhidraサーバにアクセスしたい場合は、新たにユーザを追加する必要があります。
- Ghidraサーバを起動しているPCで「svrAdmin」を使用してユーザを追加します。 今回は、「bob」というユーザを追加しました。
$ sudo ./server/svrAdmin -add bob Using server directory: /home/alice/ghidra_9.0/repositories 1 command(s) queued.
「Project」→「Edit Project Access List...」をクリックします。
「bob」を選択して「Add >>」をクリックします。 次に右にある「bob」の「Read/Write」チェックボックスにチェックを入れて、「OK」をクリックします。
上記の作業により、「bob」ユーザに読書き権限を割り当てることができました。
リポジトリにアクセスする
手順3と同様に新しいプロジェクトを作成します。 今回も「Shared Project」を選択します。
「Server Name:」にGhidraサーバのIPアドレスもしくはドメイン名を指定して、「Next >>」をクリックします。 今回は、下記の通りに設定しました。
- Server Name: → 「172.16.0.2」(GhidraサーバのIPアドレス)
- Port Number: → 「13100」(デフォルトのGidoraサーバのポート番号)
bobユーザでログインすると、リポジトリ選択画面に遷移します。
手順3で作成したプロジェクト「mySharedProject」が確認できるので、選択して「Next >>」をクリックします。手順3と同様にプロジェクトのローカルの保存先を指定して「Finish」をクリックします。
手順3で追加したファイルが共有されていることが分かります。
トラブルシューティング
サポートされているJavaランタイムが見つかりませんでした。
下記のようなエラーが出る場合は、support/launch.propertiesの JAVA_HOME_OVERRIDEプロパティにJDKのディレクトリを指定してみてください。
Failed to find a supported Java runtime. Please refer to the Ghidra Installation Guide's Troubleshooting section. Failed to install Ghidra Server!
<Ghidraのディレクトリ>/support/launch.propertiesの JAVA_HOME_OVERRIDEプロパティ(5行目)の設定例
JAVA_HOME_OVERRIDE=/opt/java/jdk-11.0.2
ed: コマンドが見つかりません
下記のようなエラーが出る場合は、edコマンドをインストールしてください。
/home/analyst/ghidra_9.0/server/ghidraSvr: 行 85: ed: コマンドが見つかりません ERROR: failed to install fork_hack in server.conf
インストール方法
$ sudo apt-get install ed
svrAdminでユーザの追加ができない
下記のようなエラーが出る場合は、root権限で実行できていません。
$ ./svrAdmin -add alice Using server directory: /home/alice/ghidra_9.0/repositories Invalid Ghidra server directory specified: /home/alice/ghidra_9.0/repositories
sudoを先頭につけてコマンドを実行してください。
$ sudo ./svrAdmin -add alice Using server directory: /home/alice/ghidra_9.0/repositories 1 command(s) queued.
参考にしたサイト
Ghidra インストールガイド
Ghidraについて
2019年3月5日にNSAがOSSのリバースエンジニアリングツール「Ghidra(ギドラ)」を公開しました。 有料の「IDA Pro」と違い無料でデコンパイルまでしてくれるので、非常に魅力的なツールです。
今回は、Ghidra の公式サイトを参考にインストール手順を紹介します。 特に下記の2つが参考になりました。
他にも、Ghidraの使い方やプロジェクト共有機能などについてまとめていますので、こちらの記事も参考にしてください。
最小要件
ハードウェア
- 4 GBのRAM
- 1 GBの空き容量(Ghidraのインストール用)
- (デュアルモニター推奨)
ソフトウェア
- Java Development Kit 11(JDK 11)
※ JDK Builds from Oracle が配布しているOpenJDK 推奨
- Java Development Kit 11(JDK 11)
Ghidraのインストール
OpenJDK 11のインストール
- Windows10の場合 (OpenJDK11のインストール方法メモ - Qiitaを参考)
- JDK Builds from Oracle にアクセスする。
- Windows/x64と書いてあるzipファイルをダウンロードする。
- ダウンロードしたzipファイルを展開する。
- C:\ProgramFiles\Java\ に展開したファイルを移動する。
- 環境変数を設定する。
- Linux(Debian 9)の場合
$ wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz $ tar xvf openjdk-11.0.2_linux-x64_bin.tar.gz $ sudo mkdir /opt/java/ $ sudo mv jdk-11.0.2 /opt/java/ $ echo 'JAVA_HOME=/opt/java/jdk-11.0.2' >> ~/.bashrc $ echo 'PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc $ source ~/.bashrc
Ghidraのインストール
Ghidra公式サイトにアクセスし、「Download Ghidra」からダウンロードする。
ダウンロードしたzipファイルを展開する(7-Zipやunzipなど)。
※ Ghidraにインストーラはありません。好きな場所に保存してください。
Ghidraの起動
Ghidraの起動用スクリプトを実行します。
利用規約が表示されるので、「I Agree」ボタンを押す。
「Ghidra: NO ACTIVE PROJECT」、「Ghidra Help」、「Tip of the Day」の3つのウインドウが表示される。 「Ghidra Help」と「Tip of the Day」は使わないので、閉じてください。
新しいプロジェクトを作成します。「File」→「New Project..」から作成できます。
プロジェクトを共有するかどうかを選択します。今回は共有しないので、「Non-Shared Project」を選択して「Next >>」をクリックします。
プロジェクトを管理するディレクトリとプロジェクト名を設定します。今回は、下記の通りに設定しました。
- Project Directory →「/home/test/GhidraProjects」
※ この画面でディレクトリを新しく作成することができないので、あらかじめ作成しておいてください。 - Project Name →「myProject」
- Project Directory →「/home/test/GhidraProjects」
「Finish」をクリックすると、プロジェクトが作成されます。
をクリックすると、「CodeBrowser」が起動します。ここで解析作業が行えます。
解析したいファイルをインポートします。「File」→「Import File...」からインポートできます。
解析したいファイルを選択します。今回は、サンプルとして下記のファイルをコンパイルしたものを指定しました。 gist.github.com
「Format」や「Language」などを確認し、「OK」をクリックする。
解析するかどうかを聞かれるので、「Yes」をクリックします。
「Analyze」をクリックすると、解析が開始されます。
指定したファイルのサマリも表示されています。「OK」をクリックすると、閉じることができます。
Ghidraデバッグモードにおける注意点
※ こちらの内容は、Ghidra v9.0.1で修正されました。
Ghidra: Release Notes より
Basic Infrastructure. Running Ghidra in debug mode no longer opens remotely accessible ports by default. (Issue #6)
Ghidraをデバッグモードで起動すると、JDWP用のデバッグポート(18001番)が開かれます。 ただし、デフォルトでローカルだけでなく、インターネットにも公開状態となってしまいます。 通常、インターネットに公開する必要はないので、閉じておきましょう。 既にJDWPのデバッグポートを利用したPoCも公開されています。
Ghidra opens up JDWP in debug mode listening on port 18001, you can use it to execute code remotely 🤦♂️.. to fix change line 150 of support/launch.sh from * to 127.0.0.1 https://t.co/J3E8q5edC7
— Hacker Fantastic (@hackerfantastic) 2019年3月6日
修正方法
- Windows系の場合
ghidra_9.0\support\launch.bat 140行目
set VMARG_LIST=!VMARG_LIST! -Xrunjdwp:transport=dt_socket,server=y,suspend=!SUSPEND!,address=*:!DEBUG_PORT!
↓ 下記のように書き換える
set VMARG_LIST=!VMARG_LIST! -Xrunjdwp:transport=dt_socket,server=y,suspend=!SUSPEND!,address=127.0.0.1:!DEBUG_PORT!
- Linux系の場合
ghidra_9.0\support\launch.sh 150行目
VMARG_LIST+=" -Xrunjdwp:transport=dt_socket,server=y,suspend=${SUSPEND},address=*:${DEBUG_PORT}"
↓ 下記のように書き換える
VMARG_LIST+=" -Xrunjdwp:transport=dt_socket,server=y,suspend=${SUSPEND},address=127.0.0.1:${DEBUG_PORT}"
参考になるサイト
Ghidraの使い方をまとめた記事
JDWPのデバッグポートがインターネットに公開されている件について
NTFSFileExtractor - NTFSボリュームから特定のファイルを抽出する
NTFSFileExtractor について
このツールを使用すると、NTFSボリュームを解析してファイルを抽出することができます。 例えば、下記のようなファイルを抽出することができます。
- 削除されたファイル
- 今使用されているファイル
- 指定したMFT IDのファイル
今回は、特定のファイルを抽出する方法について紹介します。
MFT IDを指定してファイルを抽出する
今回は、通常の操作で抽出することができない$UsnJrnlファイルの抽出を行ってみます。 ちなみに、このファイルをNTFS Log Trackerに解析させると、ファイルの操作履歴が確認できます。
事前準備(MFT IDを特定する)
NTFSFileExtractorは、特定のファイルを抽出したい場合、MFT IDを指定する必要があります。 fteで$MFTを解析することで、MFT IDを特定できます。
- 「Run」ボタンを押すと、解析が始まります。
- 「File」→「Export」で解析結果をテキスト形式で出力することができます。
ファイル名が分かっている場合は、PowerShellなどで検索すると便利です。 今回の場合、3つ目のエントリ(78509)が$UsnJrnlのMFT IDになります。
> type .\fte_result.txt | Select-String "UsnJrnl" $UsnJrnl|2137|78509|11|Unknown|POSIX|1|FILETIME|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.913806 8| cr = m = c = a = fcr = fm = fc = fa
特定のファイルを抽出する
- 「User Selec」を選択して、「Start Extraction」を実行する。
- 「User Selected File Set」のウインドウが表示されたら、78509($UsnJrnlのMFT ID)を指定して「OK」を押す。
- NTFSFileExtractorを実行した場所に「C」というディレクトリが作成されています。余計なファイルも出力されていますが、「$Extend」以下に目的のファイルが抽出されています。
参考情報
PECmd - Windows Prefetchの解析
Windows Prefetch について
Windows Prefetchは、アプリケーションの起動の高速化のために導入された機能です。 Prefetchファイルには、下記のような情報が含まれています。
- 実行ファイル名(最大29文字)
- アプリケーションの実行回数
- ボリュームパスやボリュームシリアル番号などのボリューム関連情報
- アプリケーションの起動に使用されたファイルとディレクトリ
- アプリケーションが最後に実行された時刻
Prefetchファイルには、上記の情報が含まれているので、 解析することでプログラムの実行痕跡などが得られる可能性があります。
なお、Prefetchファイルは、下記のディレクトリに「~.pf」という拡張子で格納されています。
C:\Windows\Prefetch
PECmd(Prefetchファイルの解析ツール)
Prefetchファイルの解析ツールは、色々とありますが、今回はPECmdというコマンドラインのツールを紹介します。 PECmdは、Prefetchファイルをパースすることで、下記の項目を抽出することができます。
PECmdは、こちら(Eric Zimmerman's tools)のページでダウンロードできます。
※ ただし、Windows 8以下のバージョンでは、Windows 10のPrefetchファイルを解析できないので、注意してください。
使い方
基本
- Prefetchファイルを直接指定する(-f オプション)
PECmd.exe -f "NOTEPAD.EXE-B28CC291.pf"
PECmd.exe -d "C:\Windows\Prefetch"
実行例(Prefetchファイルを直接指定する)
今回は、例として C:\Users\TEST\Desktop\test.txt を notepad.exe で開いたときに生成されたPrefetchファイルを解析してみます。下記が解析結果より、実行時間や参照したファイルなどが確認できます。
C:\Windows\Prefetch>PECmd.exe -f NOTEPAD.EXE-B28CC291.pf PECmd version 1.3.0.0 Author: Eric Zimmerman (saericzimmerman@gmail.com) https://github.com/EricZimmerman/PECmd Command line: -f NOTEPAD.EXE-B28CC291.pf Keywords: temp, tmp Processing 'NOTEPAD.EXE-B28CC291.pf' Created on: 2019-02-24 04:55:17 Modified on: 2019-02-24 04:54:06 Last accessed on: 2019-02-24 05:02:51 Executable name: NOTEPAD.EXE Hash: B28CC291 File size (bytes): 50,472 Version: Windows 10 Run count: 2 Last run: 2019-02-24 04:54:03 Other run times: 2019-02-24 04:11:39 Volume information: #0: Name: \VOLUME{01d4cbf353a8246d-f25451a4} Serial: F25451A4 Created: 2019-02-24 03:45:04 Directories: 17 File references: 103 Directories referenced: 17 00: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA 01: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT 02: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS 03: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS\CACHES 04: \VOLUME{01d4cbf353a8246d-f25451a4}\USERS 05: \VOLUME{01d4cbf353a8246d-f25451a4}\USERS\TEST 06: \VOLUME{01d4cbf353a8246d-f25451a4}\USERS\TEST\DESKTOP 07: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS 08: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\FONTS 09: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\GLOBALIZATION 10: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\GLOBALIZATION\SORTING 11: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32 12: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME 13: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\IMEJP 14: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED 15: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\JA-JP 16: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\WINSXS\AMD64_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.17763.107_NONE_05B63884071E656E Files referenced: 81 00: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\NTDLL.DLL 01: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\NOTEPAD.EXE 02: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\KERNEL32.DLL 03: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\KERNELBASE.DLL 04: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\LOCALE.NLS 05: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\ADVAPI32.DLL 06: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSVCRT.DLL 07: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\SECHOST.DLL 08: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\RPCRT4.DLL 09: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\GDI32.DLL 10: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\GDI32FULL.DLL 11: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSVCP_WIN.DLL 12: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\UCRTBASE.DLL 13: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\USER32.DLL 14: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WIN32U.DLL 15: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\COMBASE.DLL 16: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\BCRYPTPRIMITIVES.DLL 17: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\COMDLG32.DLL 18: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\SHCORE.DLL 19: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\SHLWAPI.DLL 20: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\SHELL32.DLL 21: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CFGMGR32.DLL 22: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WINDOWS.STORAGE.DLL 23: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\PROFAPI.DLL 24: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\POWRPROF.DLL 25: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\KERNEL.APPCORE.DLL 26: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CRYPTSP.DLL 27: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\WINSXS\AMD64_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.17763.107_NONE_05B63884071E656E\COMCTL32.DLL 28: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\PROPSYS.DLL 29: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\OLEAUT32.DLL 30: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WINSPOOL.DRV 31: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\BCRYPT.DLL 32: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\URLMON.DLL 33: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IPHLPAPI.DLL 34: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IERTUTIL.DLL 35: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CRYPTBASE.DLL 36: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IMM32.DLL 37: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\JA-JP\NOTEPAD.EXE.MUI 38: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\WINDOWSSHELL.MANIFEST 39: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\OLE32.DLL 40: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\RPCSS.DLL 41: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\UXTHEME.DLL 42: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CLBCATQ.DLL 43: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MRMCORER.DLL 44: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSCTF.DLL 45: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\DWMAPI.DLL 46: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CRYPT32.DLL 47: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSASN1.DLL 48: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\FONTS\STATICCACHE.DAT 49: \VOLUME{01d4cbf353a8246d-f25451a4}\$MFT 50: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\EFSWRT.DLL 51: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MPR.DLL 52: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WINTYPES.DLL 53: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\TWINAPI.APPCORE.DLL 54: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\RMCLIENT.DLL 55: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\GLOBALIZATION\SORTING\SORTDEFAULT.NLS 56: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\OLEACC.DLL 57: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\OLEACCRC.DLL 58: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\C_1252.NLS 59: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\TEXTINPUTFRAMEWORK.DLL 60: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\COREUICOMPONENTS.DLL 61: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\COREMESSAGING.DLL 62: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\NTMARTA.DLL 63: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\IMEJP\IMJPTIP.DLL 64: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\VERSION.DLL 65: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\IMEJP\IMJPAPI.DLL 66: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED\IMJKAPI.DLL 67: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\POLICYMANAGER.DLL 68: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSVCP110_WIN.DLL 69: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\IMEJP\IMJPPRED.DLL 70: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED\IMETIP.DLL 71: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\DUI70.DLL 72: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED\IMECFM.DLL 73: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WER.DLL 74: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\JA-JP\MSCTF.DLL.MUI 75: \VOLUME{01d4cbf353a8246d-f25451a4}\USERS\TEST\DESKTOP\TEST.TXT 76: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS\CACHES\CVERSIONS.2.DB 77: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS\CACHES\{6AF0698E-D558-4F6E-9B3C-3716689AF493}.2.VER0X0000000000000001.DB 78: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS\CACHES\{DDF571F2-BE98-426D-8288-1A9A39C3FDA2}.2.VER0X0000000000000001.DB 79: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\JA-JP\PROPSYS.DLL.MUI 80: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED\IMESEARCHDLL.DLL ---------- Processed 'NOTEPAD.EXE-B28CC291.pf' in 0.02787400 seconds ----------
追加オプション
出力先指定
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --json "jsonOutput"
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --json "jsonOutput" --pretty
PECmd.exe -d "C:\Windows\Prefetch" --csv "csvOutput"
PECmd.exe -d "C:\Windows\Prefetch" --html "C:\Users\TEST\Desktop\htmlOutput"
日時表示形式の指定
- 時刻表示を現地時刻にする(--local オプション)
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --local
- 日時表示形式を変更する(--dt オプション)
- カスタム日時書式指定文字列を指定することができます。
- 形式は、カスタム日時書式指定文字列 | Microsoft Docsを参照してください。
- デフォルトでは、"yyyy-MM-dd HH:mm:ss" が設定されています。
- カスタム日時書式指定文字列を指定することができます。
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --dt "yyyy/MM/dd HH:mm:ss"
- 時刻表示の精度を上げる(--mp オプション)
- 0.1マイクロ秒まで表示する。
(例:2019-02-24 04:54:03 → 2019-02-24 04:54:03.3462456)
- 0.1マイクロ秒まで表示する。
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --mp
その他
- 特定のキーワードをハイライトする(-k オプション)
- 指定したキーワードに該当する行が赤字でハイライトされます。
- デフォルトのキーワードとして、tempとtmpが設定されています。
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf -k "USERS"
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --json "jsonOutput" -q
参考情報
Windows Prefetchについて
PECmd関連
CyberChefの使い方
CyberChefとは
Base64、URLエンコード、AES復号など200以上の変換が行える万能ツールです。
また、変換処理はすべてクライアントサイドで行われるので、入力したデータがどこかに送信される心配もありません。
※ ダウンロード版もあるので、心配な人はオフラインで実行してみてください。
CTFとかにも使えるので、かなり重宝してます。
ただ、ドメインにgchqと書かれているのが少し気になりますね
使い方
基本操作
- 「Input」に変換したいものを入力する。
- 「Operations」から操作方法を選択し、「Recipe」にドラッグアンドドロップする。
Base64デコード例
- 「Input」に変換したいBase64文字列を入力する。
- 「Operations」から「From Base64」を選択し、「Recipe」にドラッグアンドドロップする。
応用 - 多重変換
AESで復号→Base64デコード→画像変換
- 「Open file as input」で変換したいファイルを選択する。
- 「Operations」から「AES Decrypt」を「Recipe」にドラッグアンドドロップする。
- 「Operations」から「From Base64」を「Recipe」にドラッグアンドドロップする。
- 「Output」の「Render Image ~」アイコンをクリックする。