KOSEN SECCON2019Write Up~Forensic編~
はじめに
参加した方はお疲れ様でした。でんしワイバーンというチーム名で参加してた六助と申します。
結果は去年と同じく5位安定でした。もう少し時間あればもう3問くらい解けたかな〜というのが感想でしょうか。
それでは本題ですが、Forensicの250点問題のメモリダンプの問題の解説(?)みたいのを書きます。
バイナリとネットワークに関してはつよつよの人がチームにいるのでまかせてた感じなので個人的にはCryptとForensicとその他お手伝いみたいなのをしていました。
最近フォレンジックを体験する機会がありなんか楽しかったので、今回はこの問題をとりあえず解説していこうと思います。正直正しい解き方とかよくわからんので、何となくこんな感じで解いたよー的なドキュメントです。
実行実行環境はMacbook pro(Catalina)です。
一部Windowsを使用しています。
Step-1
とりあえずファルが置いてあるので、それをダウンロードして展開します。
memory.zip
というファイルですね。これを展開すると
memory_win7.dmp
というファイルが出てきます。
fileコマンドでとりあえず表層解析でもしてみましょうか。
>file memory_win7.dmp memory_win7.dmp: MS Windows 64bit crash dump, full dump, 65422 pages
まぁ、ファイル名から何となく察せますが64bitのWindowsのダンプのようですね。
とりあえず何となくファイルの概要がわかったところで中身の解析をしてみましょう。
Step-2
Volatilityというソフトを使って解析していこうと思います。
まずここでは下準備をしていきます。
Pythonファイルを使う方法もありますがすぐに動かせる環境が欲しかったので今回は、スタンドアローンで実行できるものをダウンロードしました。
ダウンロードはこちらから
ダウンロードしてくると
volatility_2.6_mac64_standalone
的なファイルが出てくると思うので、パスを通すなり、直接指定するなり、エイリアスでどうこうするなり方法でコマンドラインから実行できるようにしておいてください。
とりあえず下準備はこんな感じです。
Step-3
では実際に解析していきましょう。
正直こっからはかなり勘というか察する能力が必要となってきます。ぶっちゃけ全部総当たりで解析すれば出てくるとは思いますが、あの限られた時間ではかなり勘が大事になってきます。
まぁ、何のこっちゃって感じだと思うので実際に解析しながら解説していきます。
まず、何となくファイル名から察せるとは思いますがOSの情報などを取得してみましょう。この後の詳しい解析でプロファイルを指定する必要があるので正しいOSを見極めることがここでは重要となってきます。
まぁ、結論から先に述べるとこれはあまり意味なかった。。。。まぁ、とりあえずやってみましょう。
コマンドラインで先でダウンロードしたvolatilityの実行ファイルを指定して実行していきます。僕の場合は色々ゴニョゴニョして[volatility]で実行できるようにしてあります。
- f オプション:メモリダンプのファイルを指定します。
- imageinfo:メモリダンプの情報を取得します
volatility -f memory_win7.dmp imageinfo
以下結果です。
Suggested Profile(s) : Win8SP0x64, Win81U1x64, Win10x64_14393, Win2012R2x64_18340, Win10x64, Win2016x64_14393, Win2012R2x64, Win2012x64, Win8SP1x64_18340, Win10x64_10586, Win8SP1x64 (Instantiated with Win8SP1x64) AS Layer1 : WindowsAMD64PagedMemory (Kernel AS) AS Layer2 : WindowsCrashDumpSpace64 (Unnamed AS) AS Layer3 : FileAddressSpace (/Users/****/Downloads/memory_win7.dmp) PAE type : No PAE DTB : 0x187000L KDBG : 0xf800031fd070L Number of Processors : 1 Image Type (Service Pack) : 0 KPCR for CPU 0 : 0xfffff800031fed00L KUSER_SHARED_DATA : 0xfffff78000000000L Image date and time : 2018-12-19 05:10:08 UTC+0000 Image local date and time : 2018-12-19 14:10:08 +0900
はい、Windows7がないだとぉ!!ってなってました。まぁ、実行してる環境が悪いのかもしれませんがよくわからんかったのでWindows7のプロファイルを探してくることにしました。
デフォルトで入ってるといいなーと思いつつ調べると公式にこんなページが
github.com
Win7SP1x64
というものがどうやらあるようです。まぁ、ほんとにWindows7なのかどうかはさておきとりあえずこのプロファイルを使って解析を進めていきましょう。
次は、問題文に「怪しいプログラムを開いている」的な記述があったので開いてるプロセスでもみにいきましょうか。
- pstree:プロセスの情報を表示する
- --profile=[profile_name]:プロファイルを定義する
volatility -f memory_win7.dmp --profile=Win7SP1x64 pstree
プロファイルには先ほど調べて見つけたものを使います。実行結果は以下のような感じ。
Name Pid PPid Thds Hnds Time 0xfffffa8000b0d870:csrss.exe 324 308 9 350 2018-12-19 05:08:58 UTC+0000 0xfffffa80003b3060:wininit.exe 372 308 4 81 2018-12-19 05:08:58 UTC+0000 . 0xfffffa8001360200:services.exe 464 372 12 192 2018-12-19 05:08:59 UTC+0000 .. 0xfffffa800143f710:svchost.exe 768 464 19 368 2018-12-19 05:08:59 UTC+0000 ... 0xfffffa80014a9b30:audiodg.exe 944 768 5 125 2018-12-19 05:08:59 UTC+0000 .. 0xfffffa8001571b30:svchost.exe 1156 464 25 305 2018-12-19 05:09:00 UTC+0000 .. 0xfffffa800150ab30:svchost.exe 280 464 12 232 2018-12-19 05:09:00 UTC+0000 .. 0xfffffa8001359060:svchost.exe 260 464 14 333 2018-12-19 05:09:00 UTC+0000 .. 0xfffffa80013ac630:svchost.exe 684 464 7 250 2018-12-19 05:08:59 UTC+0000 .. 0xfffffa8001465b30:svchost.exe 824 464 21 394 2018-12-19 05:08:59 UTC+0000 ... 0xfffffa80016bab30:dwm.exe 1804 824 5 73 2018-12-19 05:09:33 UTC+0000 .. 0xfffffa8001774060:SearchIndexer. 1652 464 13 640 2018-12-19 05:09:40 UTC+0000 ... 0xfffffa80017cc510:SearchFilterHo 1972 1652 5 81 2018-12-19 05:09:40 UTC+0000 ... 0xfffffa80016f5b30:SearchProtocol 1904 1652 7 225 2018-12-19 05:09:40 UTC+0000 .. 0xfffffa80013d6910:svchost.exe 576 464 12 357 2018-12-19 05:08:59 UTC+0000 ... 0xfffffa800184f060:dllhost.exe 2184 576 6 102 2018-12-19 05:10:06 UTC+0000 ... 0xfffffa8001899b30:WmiPrvSE.exe 2268 576 8 115 2018-12-19 05:10:07 UTC+0000 ... 0xfffffa80018867c0:dllhost.exe 2136 576 6 104 2018-12-19 05:10:06 UTC+0000 .. 0xfffffa8000400b30:taskhost.exe 1740 464 9 157 2018-12-19 05:09:33 UTC+0000 .. 0xfffffa80015d32a0:svchost.exe 1236 464 13 159 2018-12-19 05:09:00 UTC+0000 .. 0xfffffa8001469b30:svchost.exe 860 464 30 718 2018-12-19 05:08:59 UTC+0000 .. 0xfffffa80015469e0:spoolsv.exe 1128 464 14 293 2018-12-19 05:09:00 UTC+0000 .. 0xfffffa80013f1750:VBoxService.ex 632 464 11 114 2018-12-19 05:08:59 UTC+0000 . 0xfffffa8001376b30:lsass.exe 480 372 8 489 2018-12-19 05:08:59 UTC+0000 . 0xfffffa800135d060:lsm.exe 488 372 11 151 2018-12-19 05:08:59 UTC+0000 0xfffffa80016e4b30:explorer.exe 1832 1788 42 915 2018-12-19 05:09:33 UTC+0000 . 0xfffffa80017f9750:svch0st.exe 784 1832 5 155 2018-12-19 05:09:49 UTC+0000 . 0xfffffa8001768b30:VBoxTray.exe 2008 1832 14 154 2018-12-19 05:09:34 UTC+0000 . 0xfffffa8001859b30:DumpIt.exe 2216 1832 5 93 2018-12-19 05:10:06 UTC+0000 . 0xfffffa8000a8c8d0:taskmgr.exe 1704 1832 8 137 2018-12-19 05:09:51 UTC+0000 0xfffffa8001325060:winlogon.exe 408 364 6 117 2018-12-19 05:08:58 UTC+0000 0xfffffa80003af250:csrss.exe 380 364 8 223 2018-12-19 05:08:58 UTC+0000 . 0xfffffa8001872b30:conhost.exe 2224 380 3 97 2018-12-19 05:10:06 UTC+0000 0xfffffa8000338740:System 4 0 77 371 2018-12-19 05:08:58 UTC+0000 . 0xfffffa8000b7c7b0:smss.exe 248 4 2 29 2018-12-19 05:08:58 UTC+0000
まぁ、なんかいっぱい出てきましたね。でも実際普段使っている環境だともっといっぱいプロセス走ってると思うので問題として出すためにかなり優しくなっている感じですかね。
ここで必要なのが先ほど言った「勘」というやつです。あまり多くないとはいえ、これだけ全てを試すのは時間がかかってしまいます。なのでここから怪しいプログラムを見つけ出す必要があります。
僕の場合はここで一発で怪しいプログラムを見つけ出せましたが正直ここはなんともいえないところ。間違えたものに目をつけるとドツボにはまります。
僕が目を付けたのはこのプロセスです。
. 0xfffffa80017f9750:svch0st.exe 784 1832 5 155 2018-12-19 05:09:49 UTC+0000
根拠としてはsvchost.exeという、プログラムも存在しておりパッと見怪しそうと思ったと言ったところでしょうか。
. 0xfffffa8001859b30:DumpIt.exe 2216 1832 5 93 2018-12-19 05:10:06 UTC+0000
というのも目には着きましたが
www.aldeid.com
というものを見つけたり、volatolityにはコマンドプロンプトなどの入力履歴を見れたりするものもあるのですが、それを見た際にダンプをとるものだなと判断したのでパスしました。
一応メモ程度に
volatility -f memory_win7.dmp --profile=Win7SP1x64 consoles
実行結果は以下のような感じ
ConsoleProcess: conhost.exe Pid: 2224 Console: 0xffd96200 CommandHistorySize: 50 HistoryBufferCount: 1 HistoryBufferMax: 4 OriginalTitle: C:\Users\assafnativ\Desktop\x64\DumpIt.exe Title: C:\Users\assafnativ\Desktop\x64\DumpIt.exe AttachedProcess: DumpIt.exe Pid: 2216 Handle: 0x58 CommandHistory: 0x361670 Application: DumpIt.exe Flags: Allocated CommandCount: 0 LastAdded: -1 LastDisplayed: -1 FirstCommand: 0 CommandCountMax: 50 ProcessHandle: 0x58 Screen 0x302e80 X:80 Y:300 Dump: DumpIt 3.0.20181116.2 Copyright (C) 2007 - 2017, Matthieu Suiche http://www.msuiche.net Copyright (C) 2012 - 2014, MoonSols Limited http://www.moonsols.com Copyright (C) 2015 - 2017, Comae Technologies FZE http://www.comae.io Copyright (C) 2017 - 2018, Comae Technologies DMCC http://www.comae.io Destination path: \??\C:\Users\assafnativ\Desktop\x64\URESHINO-PC- 20181219-051007.dmp Computer name: URESHINO-PC --> Proceed with the acquisition ? [y/n] y [+] Information: Dump Type: Microsoft Crash Dump [+] Machine Information: Windows version: 6.1.7600 MachineId: 314D1AE0-E007-5142-A12B-A9EF97BE7517 TimeStamp: 131896698080253906 Cr3: 0x187000 KdDebuggerData: 0xfffff800031fd070 Current date/time: [2018-12-19 (YYYY-MM-DD) 5:10:08 (UTC)] + Processing...
何となく目星がついたところで、このファイルのあるアドレスやディレクトリなどを調査していきましょう。アドレスはこの後このファイルのダンプを取ってきて解析したかったので必要になります。
filescanというものを使うとダンプの中に含まれるファイルを探してきてくれます。grepを使って先ほどのファイルに絞って検索していきます
volatility -f memory_win7.dmp --profile=Win7SP1x64 filescan | grep svch0st
結果は以下のような感じ。
0x000000000002b860 6 0 R--r-d \Device\HarddiskVolume2\Users\assafnativ\Desktop\svch0st.exe
デスクトップにあるファイルのようですね。。。ますます怪しい。
続いてこのファイルを解析するためにダンプを取っていきたいと思います。
dunpfilesを使用すると指定したファイルのダンプをとることができます。今回は先ほどファイルのあるメモリのアドレスがわかったのでアドレスを指定していきたいと思います。
- dumpfiles:ファイルのダンプを取得
- --dump-dir [dir]:書き出す場所の指定
- -Q [address]:アドレスを指定
volatility -f memory_win7.dmp --profile=Win7SP1x64 dumpfiles --dump-dir ~/Desktop -Q 0x000000000213e680
これを実行するとデスクトップに
file.None.0xfffffa80017ebaa0.img
なるファイルが書き出されます。
Step-4
それでは先ほど書き出したファイルからsvch0st.exeのファイルを抜き出します。imgファイルで書き出されてしまうのでその中から該当部分のみを抜き出していきます。
今回はFTK Imagerを使用しました。
ですが、ここに関してはMacでやるのは少しめんどくさく手持ちに良さげな環境がなかったので、競技中はチームメイトに託しました。
何をやったかはわからないですが、後からWindows機でやってみたのは以下のような感じです。
FTK imagerを起動しFile->Add Evidence Itemを選択します。
続いてImage Fileを選択し、先ほど書き出したファイルを指定します。
指定できたらFinishを押して完了します。
正しく読み込まれるとこのような画面になると思います。
読み込めていたら次に進みます。左上にあるEvidence Treeというタブに先ほど読み込まれたファイルがあると思いますが、ファイル名の左にあるプラスマークをクリックします。
すると次のような画面になります。
unallocated spaceというのが出てきてますね。これを右クリックしてExport Filesからこれを書き出します。そうすると同じ名前のファイルが書き出されましたね。
ダンプファイルからなんかそれっぽいものが抽出できたので、さっそくこの中身を解析していきましょう。
とりあえず使うのはfileコマンドでしょうか
file unallocated_space
結果は以下のような感じ
unallocated_space: data
まぁ、そうなりますよね。。。ファイル名からなんとなく察せると思いますがうまくデータを整形できてない模様。
じゃあ、stringsコマンドでフラグのようなものを中から見つけていきたいと思います。
strings unallocated_space
かなりいっぱい出力が出てきますがパッと目に着いたのはここら辺
lSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSet PADPADP lSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSet PADPADP ーQ1RGS0lUe29pcmFfaGFfZmxhZ19qeWFuZWVlZX0=
あー、なんか公開鍵とかあるなーと思っていたところチームメイトからbase64怪しくねとの一言。確かに怪しい。。。。
Q1RGS0lUe29pcmFfaGFfZmxhZ19qeWFuZWVlZX0=
ということでこれをデコードしてみると
CTFKIT{oira_ha_flag_jyaneeee}
ん?これはフラグか?と思いつつ入力してみると正解でした。フラグ名に関してはどうなのだろう。。。と思いつつもなんとか解くことができました!
最後に
まとめになりますが、こんな感じでかなりのステップを踏んでフラグにたどり着くことができました。多分3人目だったと思うのでFTK Imagerで解析するとこでつまづかなければもっと早く解けたかな〜と少し悔しいところではあります。
ただ、とてもフォレンジックと言うテーマに相応しいいい問題だったと思うので解いていてとても楽しかったです。
今回は6時間という短い時間でしたが皆さんお疲れ様でした。
時間があればもう少しほかの問題のも書こうかなと思います。
mod_securityのログをrsyslogで転送してみた話
初めに
mod_securityのログをrsyslogで転送する方法です。
検索してもあまり出てこなかったのでメモ程度に書いておきます。
mod_securityのインストールと設定、syslogの設定はできていることを前提とします。
環境
- CentOS 7.5.1804 64bit Minimal
- mod_security.x86_64 0:2.9.2-1
- mod_security_crs.noarch 0:2.2.9-1
- Apache/2.4.6
設定-mod_security
WAFの話とかインストール方法とかは省略します。
コンフィグファイルを編集しloggerにログを渡すような設定をします。
vi /etc/httpd/conf.d/mod_security.conf
#変更前 SecAuditLog /var/log/httpd/modsec_audit.log #変更後 SecAuditLog "|/usr/bin/logger -p local1.info -t mod_security"
syslogにはlocal0~7までの比較的自由に使えるファシリティがあるので、今回はlocal1に設定しています。
これでsyslogにログを渡すことができます。
設定-syslog
syslogにログを渡せるようになったので、rsyslogでログを転送する設定を行います。
vi /etc/rsyslog.conf
#追記(local7がデフォで設定されてるので、その前くらいがわかりやすい?) local1.* @@[宛先ホスト]
@@の後に書いた宛先ホストの設定に従ってログが収集されるはずです。
CentOS 7でSSH接続する方法
環境
- クライアント:Windows 10 Home
- サーバー:CentOS 7.5.1804 64bit Minimal
サーバー側の設定
インストール
まずは、openssh-serverがインストールされているかどうか確認します。基本的にopenssh-serverはプリインストールされているのでインストールは不要ですが、念のため確認します。
# yum list installed | grep ssh
を実行しopenssh-serverがインストールされていない場合はインストールします。
# yum install openssh-server
SSHの設定
/etc/ssh/sshd_configの設定ファイルを編集します。
# vi /etc/ssh/sshd_config
#rootユーザーのログインを許可しない PermitRootLogin no #パスワード認証を許可する PasswordAuthentication #パスワードなしを許可しない PermitEmptyPasswords no
サービスの起動
サービスを起動します。
# systemctl start sshd
サービスが起動されているか確認します。
# systemctl status sshd
active (running)と表示されれば起動できています。
IPアドレスの確認
ip a show [インターフェース名]
ip a show enp0s3 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:4d:1e:46 brd ff:ff:ff:ff:ff:ff inet 192.168.12.17/24 brd 192.168.12.255 scope global noprefixroute dynamic
inetと書かれているところにあるのがIPアドレスです。
ユーザーの作成
rootユーザーのログインを禁止したので、ログインするためのユーザーを作成します。
# useradd [ユーザー名]
作成したユーザーにパスワードを設定します。
# passwd [ユーザー名]
パスワードの入力を二回求められるので入力します。
New password: パスワードを入力 Retype new password:もう一度確認のため同じパスワードを入力
クライアント側の設定
Macならばターミナル、Windowsならコマンドプロンプトを開きます。TeraTermなどのアプリケーションを用いても構いません。
コマンドプロンプトから接続していきます。
$ ssh [ユーザー名]@[IPアドレス]
切断するときは
$ exit
と入力すると切断することができます。
CentOS 7でSSHの認証を公開鍵認証で行う方法
初めに
パスワード認証でSSH接続する方法をこちらで紹介しました。しかし、第三者がアクセスできるシステムでパスワード認証するのはセキュリティ上望ましくないので、公開鍵認証を用いてSSH認証する方法を紹介します。
環境
- クライアント:Windows 10 Home
- サーバー:CentOS 7.5.1804 64bit Minimal
前提条件
- openssh-serverがインストールされていること
- sudoできるユーザーでログインしていること
クライアント側の作業
鍵ペアの作成
公開鍵と秘密鍵のペアを作成します。Macを使用している場合はターミナルから、Windowsの場合はGit bashから作成します。
秘密鍵と公開鍵はサーバー側でも作成することができますが、秘密鍵をクライアント側に転送する際に秘密鍵が漏れてしまう危険性があるためクライアント側で作成するのが望ましいです。
鍵ペアはssh-keygenコマンドで作成することができます。
公開鍵暗号方式では主にRSA暗号が使用されるため、RSA鍵を作成します。また、鍵のサイズは2048bit以上の強度を持っている鍵ならば問題ないですが、より強固な鍵を生成するために今回は4096bitで作成します。
$ ssh-keygen -t rsa -b 4096
- -tオプション:作成する鍵の種類を指定します。
- -bオプション:作成する鍵のサイズを指定します。
- -fオプション:作成した鍵の保存場所を指定します。指定しないと/c/Users/[ユーザー名]/.ssh/に作成されます。
-fオプションで保存場所を指定しない場合デフォルトのパスでいいか聞かれるので、よければEnterキーを押して次に進みます。
Enter file in which to save the key (/c/Users/[ユーザー名]/.ssh/id_rsa):
パスフレーズの入力を求められるので、パスフレーズを2回入力します。このパスフレーズは秘密鍵でSSHログインする際に必要になります。
Enter passphrase (empty for no passphrase): Enter same passphrase again:
公開鍵のアップロード
まず、秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が指定した場所に生成されているか確認します。
確認ができたらサーバへ公開鍵を転送します。転送する方法は何でも構いませんが、今回はscpを使用して/tmpフォルダにアップロードします。
$ scp ~/.ssh/id_rsa.pub [ユーザー名]@[ホスト名]:/tmp
サーバー側の作業
SSHの設定
SSHの設定ファイルを下記のように編集します。(SSHで接続して作業している場合は、先に公開鍵の登録を行ってください)
$ sudo vi /etc/ssh/sshd_config
#rootユーザのログインを許可するか PermitRootLogin no #パスワード認証を許可するか PasswordAuthentication no #パスワードなしを許可するか PermitEmptyPasswords no
設定の反映
起動している場合は再起動します。
$ sudo systemctl restart sshd
起動していない場合は起動させます。
$ sudo systemctl start sshd
起動しているか確認します。
$ sudo systemctl status sshd
active (running)と表示されていれば、起動しています。
自動起動を有効にしていない場合は自動起動を有効化します。
$ sudo systemctl enable sshd
公開鍵の登録
転送した公開鍵を登録します。公開鍵は~/.ssh/authorized_keysに書き込むことで登録することができます。
~/.ssh/が存在しない場合はまず作成します。
$ mkdir ~/.ssh
~/.ssh/authorized_keysに鍵の内容を書き込みます。鍵は複数登録することもできるのでmvではなくcatで書き込みます。
$ cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
/tmpに保存したファイルを削除します。
$ sudo rm /tmp/id_rsa.pub
鍵へのアクセス権を変更して、ログインしているユーザ以外のアクセスを禁止します。
$ chmod 700 ~/.ssh/ $ chmod 600 ~/.ssh/authorized_keys
クライアントからの接続
$ ssh -i ~/.ssh/id_rsa [ユーザー名]@[ホスト名]
- -iオプション:公開鍵とペアになっている秘密鍵を指定します。
パスフレーズの入力を求められるので、鍵の作成時に設定したパスフレーズを入力してEnterキーを押します。
Enter passphrase for key '/c/Users/[ユーザー名]/.ssh/id_rsa':
CentOSのバージョンを確認する方法
CentOSのバージョン確認
ファイルから確認
CentOSのバージョンは/etc/redhat-releaseを確認することで知ることができます。
$ cat /etc/redhat-release
$ cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)
コマンドから確認
lsb_releaseコマンドを使用することで確認することができます。
$ lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.5.1804 (Core) Release: 7.5.1804 Codename: Core
lsb_releaseコマンドを使用するためにはredhat-lsbパッケージが必要なので、入ってない場合はyumでインストールします。
# yum install redhat-lsb