親記事 → CTFにおけるフォレンジック入門とまとめ - はまやんはまやんはまやん
メモリフォレンジック
- メモリダンプが与えられて解析をする問題
- Volatility Foundation
- メモリダンプ解析のスタンダード。これ以外で解析している記事を見たことが無い。(Redlineとか昔はあったぽいが)
- Volatility2(無印)とVolatility3があるが、全くの別物。今から学習を始めるなら、絶対にVolatility 3から始めること
- コマンド実行は結構時間かかるので、プロファイルの特定までは手動でやって、コマンド実行についてはよく使うコマンドを適当なシェルスクリプトで一括で持ってくるといい(その間にご飯)
- Volatility使わなくてもバイナリ解析でやるようなことをやれば時間はかかるけど、使える情報が抜ける可能性は大いにある
- 例えばFile Carvingを使ってファイルを抜き出したり、stringsでそこそこ有益な情報が得られたりもする
解く流れ
- メモリダンプがどのOSのものかを特定する
- volatilityの解析機能ですぐに特定できるかも
- できなければ、
strings -n 10 mem.bin | grep "ubuntu"
みたいに根性で種類とビルドバージョン(カーネルバージョン)を特定する
- シンボルテーブルがなければ作る(メモリのどこに何があるかをまとめたもの…だと思っているが)
- なければ作るしかないが、想像よりも大変ではない
- 頑張って解析する
- これは頑張る。メモリ解析は時間がかかるのでよく使うコマンドをシェルスクリプトにまとめて一括実行するのがおすすめ
Volatility 3(ちょっと情報薄い。ドキュメント見るといい)
- https://qiita.com/ninja400/items/f3dd1e6eb80fd5b39ba9
- windows
python3 /opt/volatility3/vol.py -f image.raw windows.info.Info
WindowsInfoが読み取れるNTBuildLab 7601.17514.amd64fre.win7sp1_rtm.
-> win7sp1が入ってるIs64Bit True
-> 64bits
python3 /opt/volatility3/vol.py -f image.raw windows.pstree.PsTree
プロセスツリーが見られるcmd.exe
が実行されているなら、コマンド系を深堀りしてみる
python3 /opt/volatility3/vol.py -f image.raw windows.netscan.NetScan
ネットワークコネクションが見られる- 怪しいIPを見つけたらVirusTotalで確認
python vol.py -f image.raw windows.cmdline.CmdLine
現在実行中のプロセスがどのような引数で実行されたかが見られるpython vol.py -f image.raw windows.dumpfiles --pid="1676"
メモリ上にあるpidが1676の関連ファイルをdumpしてくれるpython vol.py -f image.raw windows.mutantscan.MutantScan
使用されているミューテックスを出力する- 通常、悪意のあるプログラムの作成者は、そのプログラムが二重起動するを避けるためミューテックスを使用する
python3 /opt/volatility3/vol.py -f image.raw windows.filescan
files scanningpython3 /opt/volatility3/vol.py -f image.raw windows.dumpfiles --pid="2760"
Dump Filespython3 /opt/volatility3/vol.py -f physmemraw windows.hashdump.Hashdump
hashdump- Volatility 3のWindows symbolic table
- Linux
- OS特定
python3 /opt/volatility3/vol.py -f dump.mem banner
- シンボルテーブルの作成 Volatility 3のシンボルテーブルを手動で作成する - NFLabs. エンジニアブログ
- コマンド
python3 /opt/volatility3/vol.py -f dump.memの後に
- OS特定
Volatility2
本当は載せるべきではないんだろうけど、こっちじゃないとたまーに動かなくて未だに動かす。
今から始める人は絶対にVolatility3から始めること。
- 情報セキュリティ技術のスキルアップ・イベント 仙台CTF 2017
- よい日本語資料
- 解析前にprofileを特定、または、用意する必要がある
python2 /opt/volatility/vol.py -f memory.raw imageinfo
でひたすら待てば可能性のあるprofileが提案されてくる- 得られない場合は、デフォルトでないということなので、何とか調べてプロファイルを作って解析する
- profileを自分で作るとき
module.dwarf
(Kernel Data Structures)とSystem.map
(Debug Symbols)があれば、profileを自分で作れるzip _phillip.zip module.dwarf System.map
でzipを作る- できたzipを
volatility/plugins/overlays/linux/
に置く vol2 --info | grep Profile
をすると追加されているので、その名前で使える
- CTFtime.org / HTB Business CTF 2021 / Compromised / Writeup
- GitHub - volatilityfoundation/profiles: Volatility profiles for Linux and Mac OS Xにあるかも
python2 /opt/volatility/vol.py -f memory.raw --profile=Win7SP1x64 [command]
みたいにプロファイルをつけてコマンド実行する- windows
- プロセスを確認してみよう
pslist -P
実行中のプロセスリストが得られるpstree
実行中のプロセスツリーが得られるcmdline
動いているコマンドを一覧表示できるcmdline -p [pid]
で実行時のコマンドラインが得られる
- 怪しいプロセスのpidが得られたら…
dumpfiles --pid="[pid]" --dump-dir=./
で関連ファイルを抜き出してみる- stringsしてから関連キーワードでgrepしてやれば何か出てくるかも
procdump -p [pid] -D output
pidのプロセスのexeを出力するmemdump --pid=[pid] -D .
指定pidのメモリダンプ
cmdscan
cmd.exeで使用したコマンドが見られる(パスワードとか抜けたりするかも)consoles
よくわかってないけど、cmdscan使っておけばいいと思う
envars
環境変数が見られるfilescan
現在開かれているファイル一覧が得られる- grepをうまく使うといい
もろもろ filescan | grep hosts
みたいに dumpfiles -D . --name -Q [offset]
offsetのファイルをdumpする- offsetはfilescanで得られたオフセットを入れる ex.
0x000000004fa23f0
- offsetはfilescanで得られたオフセットを入れる ex.
- grepをうまく使うといい
hashdump
ユーザーアカウントのパスワードハッシュを取得するclipboard
クリップボードを取得するnotepad
ノートパッドにある文字列を抜き出してくるscreenshot -D screens/
スクリーンショットを持ってくることができる?- 通信系
iehistory
IEの履歴を取得するyarascan -Y "[keyword]"
yaraを使ってキーワードスキャンする- レジストリ系
lsadump
LSAメモリをダンプしてくる
- プロセスを確認してみよう
- linux Linux Command Reference · volatilityfoundation/volatility Wiki
linux_bash
bashの実行履歴を確認するlinux_enumerate_files
ファイル列挙ができる- ここでメモリアドレスも一緒に得られるので
linux_find_file -i [address] -O [output filename]
で取り出せる
- ここでメモリアドレスも一緒に得られるので
- linuxのバージョンを把握するとき
grep -a "Linux version" mem.lime
のように関連ワードで直接grepWelcome to Ubuntu 20.04.1 LTS
- TAMU CTF 2021だと、ISOダウンロードしてきてvolatilityツールでdwarfとmapを取得してきて使っている。
linux_lsof
lsofコマンドと同等の結果が得られる- すべてのプロセスがオープンしているディスク上のファイル、名前付きパイプ、ネットワークソケット、デバイスが含まれる
- オープンしているものとしては
/dev/pts/0
ファイルか名前付きパイプ(?)socket:[xxx]
ネットワークソケット xxxにある数字はなんだろうanon_inode:[xxx]
わからんpipe:[xxx]
pipe?:[xxx]
anonymous file createdらしい- ctf-writeups/2022-HTB-Business at master · Zarkrosh/ctf-writeups
- 何かが書き込まれた可能性があるので、プロセスが使っていたinodeを検索して、片っ端からダンプしてみる
- pidからメモリマップを取得
linux_proc_maps -p [pid]
0xffff911935415b00 9260 bash 0x00005574f0196000 0x00005574f02a2000 rw- 0x0 0 0 0 [heap]
0xffff911935415b00 9260 bash 0x00007ffc9446d000 0x00007ffc9448e000 rw- 0x0 0 0 0 [stack]
- こんな感じでheap領域やらstack領域やらも表示してくれるので持ってきてstringsとかすると面白いデータが転がってるかも
linux_dump_map -p [pid] -s 0x00007ffc9446d000 -D .
のような感じでstack領域をダンプしてこれる- 指定しているのは仮想アドレスみたいで物理アドレスに変換する必要があるが、Volatilityがうまくやってくれる
- 理論は19: Intro to Memory Forensics | COMPSCI 590F | Advanced Digital Forensics (Spring 2019)
- メモリマップから使っているライブラリを推定して、そこで使われている構造体が分かれば、stack領域とかから構造体を引っ張ってこれるかも
linux_volshell
pythonコンソールを起動して、色々やるcc(pid=[pid])
でコンテキストを指定pidに移す(色々やる前にやる)- 使用されている(いた?)inodeを抜き出す
for filp, fd in self._proc.lsof():
としてprint("{}: {} (INODE: {})".format(fd, filp, filp.f_inode))
として更に改行0: 18446622369272764928 (INODE: 18446622369302465544)
という感じで色々出てくる。先頭の0:部分はファイルディスクリプタでlsofした結果と紐づくlinux_find_file -i [inode] -O out.bin
としてファイルをダンプしてくる
- OpenSSHのカギを取得するためのプラグインがある
- windows