セキュリティコミュニティ「WEST-SEC」

セキュリティ初心者の方でも参加できる「わかりやすい」セキュリティイベント、8割解けるCTFを開催しています。

ログおよびフォレンジック解析

0.はじめに

0.1 このサイトで想定する解析シーン

PCがマルウェアに感染しました。情報漏えいがしていないか、社内の他の端末に不正通信などをしていないか、ADサーバが乗っ取られていないかなどを確認したいとします。
この前提で、解析に関して整理していきます。

1 ログ解析の全体像

基本としたのは、フォレンジック解析をせず、情報システム部のメンバー実施できるログ解析の内容です。※一部、フォレンジックで実施する内容も含まれています。

1.1 PCの基本的なログ調査

・以下のようなログがあるが、マルウェア感染を確認するためのたいした情報は得られない。
・イベントログでは、いつ、誰か、何をしたかが記録される。デフォルト20MBしかなく、古いログはどんどん消されていく。→保全も大事。

項目 内容
Windowsイベントログ(アプリケーション) Powershellの起動やcmdの起動などは残らない。 
Windowsイベントログ(セキュリティログ) ID 4624(ログオン)などはわかるが、あまり深いことはわからない。監査ポリシーを設定するなどすれば、Powershellの起動なども残せるようだが、デフォルトでは残らない。
タスクマネージャ プロセス確認をしても、すでにプロセスが終了しているかもしれない
ネットワーク接続確認 それほど有効な情報は無い
ブラウザのログ ・接続先のログが残っているが、たいした情報は残らない。
C&Cサーバへの通信は、ブラウザを使って通信するわけではないので、そのログも残らない
Prefetchファイル exeファイルの実行ログが残る。詳細はこちら

・以下は、Windows11のイベントビューワー。アプリケーションのログを表示しているが、Powershellを実行したり、CMDを実行したとしても、デフォルトではログに残らない。

1.2 ウイルス対策ソフトやEDRなどのログ

マルウェアに関するログが確認できる。

1.3 資産管理ツールのログ

・たとえば、Lanscopeの場合、以下のように、OSでは取得できないログを独自に取得する。ファイルの操作ログが取れるが、Web アクセスログはブラウザ経由での通信しか取れないと思う。

(出典:https://www.lanscope.jp/endpoint-manager/product/operation_log.html
・Powershellの起動などは取れると思う。ただ、Powershellでどんなコマンドを実行したかまではわからないはず。

1.4 ネットワーク機器

項目 内容 備考
ファイアウォールログ 感染端末が外部IPとどのポートで通信していたかを確認(C2通信など) IPアドレスベース
プロキシサーバのログ C2通信やマルウェアダウンロードの痕跡の確認 URLベース
DNSサーバのログ 不審なFQDNへの名前解決の調査  

・以下は、FortiGateでのトラフィックログ

1.5 ADサーバ

項目 内容
ログオンイベント(4624) 感染PCからのログオン履歴、誰がいつ認証したか(成功が4624/失敗が4625)。セキュリティイベントに記録される。
グループ変更イベント(4728, 4732 など) ADの管理者権限が勝手に付与されていないか確認
GPOの変更(4739) グループポリシーの改ざんチェック
サービス作成(7045) リモートサービスによる不正常駐を検出

1.6 その他のサーバ(ファイル/DB/社内Webなど)

・ログオン履歴を見て、感染PCやそのユーザーから不正なログオンがないか(ローカルログ、RDP)

2.実際のログ解析

2.1 Prefetchファイル

(1)概要

拡張子 .exe の実行ファイルの実行履歴がわかる

項目 内容 備考
ファイルの保存場所 C:\Windows\Prefetch 隠しファイルなので、表示することを有効にしないと表示されない可能性があり
ファイル名 実行ファイル名-ハッシュ値.pf
(例)NOTEPAD.EXE-DE15EE03.pf
メモ帳などでは開けない
作成タイミング プログラムが初回起動から約10秒後  
ファイルに含まれる情報 実行ファイルのパス、実行回数、最終実行日時、など
対応OS Windows XP以降 サーバOSでは残らない
(2)Prefetchで何がわかるか

・実行ファイルのファイル名、そのパス、過去8回分の実行日時。
・実行ファイルがアクセスしたファイル名およびパス。フルパス(例:E:\MALWARE.EXE)から、USBデバイス経由の実行履歴も確認可能。

(3)Prefetchファイルの開き方

・メモ帳などでは開けないので、winprefetchviewなどのツールを活用する。
・以下のサイトにアクセスしてダウンロードする。
https://www.nirsoft.net/utils/win_prefetch_view.html#google_vignette
 a)「Download WinPrefetchView (64-bit)」からダウンロード
 
 b)「winprefetchview-x64.zip」がダウンロードされるので解凍
 c)WinPrefetchView.exeを実行 
・実行した結果は以下。たとえばExcelであれば、下の欄に、開いたExcelのファイルのファイル名(malware.xlsx)およびパスが記載されている。

(4)注意点

・.pfファイルが削除される可能性がある
・8回を超える履歴は、記録が上書きされる。
・.bat や .cmd、.ps1(PowerShell)、.vbs などのスクリプトファイルは直接は対象外
・サーバOSでは残らない。

2.2 LinuxのWebサーバのアクセスログ

(1)アクセスログについて

・LinuxによるWebサーバのログがアクセスログである。
・ファイルのパスは、デフォルトでは以下

OS パス
CentOS /var/log/httpd/access_log
Ubuntu var/log/apache2/access.log

・設定によって取得するログ内容は変わるが、デフォルトでわかることは、たとえば以下

項目 内容
送信元IPアドレス  
時刻  
メソッド POSTやGETなど
パス アクセスするURLのFQDN以降の部分
ステータスコード 200 OKや301 リダイレクト、など
レスポンスサイズ サーバからの応答のサイズ。設定によっては「-」になる
リファラ 参照元URL
ユーザエージェント アクセス元のOSやブラウザの種類・バージョンなど
(2)アクセスログからわかる攻撃の例

・このログには、Webサーバに届いたHTTP/HTTPSリクエストが記録されているため、主にアプリケーション層(L7)の攻撃兆候がわかります。
・ポートスキャンなどのネットワーク層の攻撃は残りません。
・以下に、発見できるであろう攻撃の例を紹介します。

攻撃種別 概要 特徴的なログパターン例
ブルートフォース攻撃 ログイン画面に対する短時間の大量POST /login, /wp-login.php への連続POST
SQLインジェクション(SQLi) クエリパラメータにSQL文を埋め込む /index.php?id=1'or'1'='1, UNION`,`--, sleep()等
コマンドインジェクション OSコマンドをパラメータに埋め込む /ping?host=8.8.8.8;cat/etc/passwd
ディレクトリトラバーサル サーバ上のファイルを不正に参照 /../../../../etc/passwd
ファイルアップロード攻撃 悪意ある`.php`などのスクリプトをアップロード POSTでファイルアップロード → .php ファイルへのアクセス
LFI/パストラバーサル ファイル読み込み系の脆弱性を狙う /index.php?page=../../../../etc/passwd
Webシェルアクセス すでに設置された`.php`などを呼び出す /shell.php, /cmd.php, cmd=ls など
古いCMS脆弱性の探索 脆弱なパスを片っ端から探索 /wp-admin/, /xmlrpc.php, /vendor/phpunit/
スキャニング(調査行為) 攻撃前の調査フェーズ 多数のGET,HEADリクエスト、User-Agent:sqlmap, Nikto 等
(3)実際のログ

以下は、実際に攻撃をしかけたログです。
パスワードをブルートフォースで順次ログインの攻撃を仕掛け、一番最後は200 OKでログインが成功してしまっている。

153.w.z.128 - - [26/Jan/2023:16:48:26 +0900] "POST /login.php HTTP/1.1" 301 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:48:26 +0900] "GET /kaiin.html HTTP/1.1" 304 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:48:32 +0900] "POST /login.php HTTP/1.1" 301 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:48:32 +0900] "GET /kaiin.html HTTP/1.1" 304 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:48:41 +0900] "POST /login.php HTTP/1.1" 301 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:48:42 +0900] "GET /kaiin.html HTTP/1.1" 304 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:49:06 +0900] "POST /login.php HTTP/1.1" 301 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:49:07 +0900] "GET /kaiin.html HTTP/1.1" 304 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
195.154.77.190 - - [26/Jan/2023:16:49:33 +0900] "POST /boaform/admin/formLogin HTTP/1.1" 404 196 "http://34.x.y.205:80/admin/login.asp" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0"
153.w.z.128 - - [26/Jan/2023:16:49:43 +0900] "POST /login.php HTTP/1.1" 301 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:49:43 +0900] "GET /kaiin.html HTTP/1.1" 304 - "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
153.w.z.128 - - [26/Jan/2023:16:51:31 +0900] "POST /login.php HTTP/1.1" 200 160 "http://34.x.y.205/kaiin.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"

2.3 LinuxのSSHのログ

(1)概要

・/var/log/secureに保存される。
・項目は以下

項目 説明
日時
ホスト名
サービス名 ログを出力したプロセス
プロセスID 該当するプロセスのID
ログメッセージ本文
(2)ログからわかること

・/var/log/secureからわかる攻撃・不審行動の例

攻撃・不審行動の種類 概要・意図 特徴的なログメッセージ例 補足・分析ポイント
SSHブルートフォース攻撃 パスワード認証で総当たりを試行 Failed password for invalid user admin from 192.0.2.1 port 45678 短時間に多数の失敗ログ、ユーザ名に特徴あり
辞書攻撃(既存ユーザ宛) 既知のユーザに対してパスワード総当たり Failed password for root from 192.0.2.1 port 45678 `for root`, `for ec2-user` など実在ユーザ
不正なユーザ名の試行 存在しないユーザ名での認証試行 Invalid user oracle from 192.0.2.1 `Invalid user`が続く場合は注意
公開鍵認証の失敗 鍵認証の不正使用や鍵盗用の試み Authentication refused: bad ownership or modes for directory 鍵ファイルのパーミッション不備や悪用
rootでの直接ログイン試行 禁止されているrootログインを試行 Failed password for root from ... `/etc/ssh/sshd_config`で禁止が望ましい
多数の異常なポート番号 通常とは異なるポートからの試行 Failed password for ... port 59234 ssh2 攻撃ツールによる試行に多い
異常な地理的IPアドレス 国内運用環境で海外からの試行 Failed password for ... from 203.0.113.1 GeoIP分析や国別ブロックで対処可能
成功した不審なログイン 意図しない時間・IP・ユーザでの成功ログイン Accepted password for user1 from 192.0.2.2 port 34567 ssh2 成功ログでも注意が必要
PAM関連のエラー 認証モジュールに対する干渉・障害 pam_unix(sshd:auth): authentication failure 不正なログイン試行や設定不備
sudoやsuの不審な使用 一般ユーザからの特権昇格の試行 `/var/log/secure` に `su: pam_unix(su:auth):などのログあり 不自然な時間・回数に注目
(3)ログの例

・Invalid user や Did not receive identification string などのログが多数あり、ブルートフォースによる不正アクセス試行が多数行われている
・ec2-user による公開鍵ログイン、user1 によるパスワードログインが成功している。user1に関しては、不正ログインの可能性も否定できない。

Jul 18 23:29:56 ip-172-31-41-230 sshd[11448]: Received disconnect from 205.x.y.109 port 57026:11: Normal Shutdown, Thank you for playing [preauth]
Jul 18 23:29:56 ip-172-31-41-230 sshd[11448]: Disconnected from 205.x.y.109 port 57026 [preauth]
Jul 18 23:30:22 ip-172-31-41-230 sshd[11458]: Invalid user user from 205.x.y.109 port 35098
Jul 18 23:30:22 ip-172-31-41-230 sshd[11458]: input_userauth_request: invalid user user [preauth]
Jul 18 23:30:22 ip-172-31-41-230 sshd[11458]: Received disconnect from 205.x.y.109 port 35098:11: Normal Shutdown, Thank you for playing [preauth]
Jul 18 23:30:22 ip-172-31-41-230 sshd[11458]: Disconnected from 205.x.y.109 port 35098 [preauth]
Jul 18 23:30:48 ip-172-31-41-230 sshd[11460]: Invalid user user from 205.x.y.109 port 41564
Jul 18 23:30:48 ip-172-31-41-230 sshd[11460]: input_userauth_request: invalid user user [preauth]
Jul 18 23:30:48 ip-172-31-41-230 sshd[11460]: Received disconnect from 205.x.y.109 port 41564:11: Normal Shutdown, Thank you for playing [preauth]
Jul 18 23:30:48 ip-172-31-41-230 sshd[11460]: Disconnected from 205.x.y.109 port 41564 [preauth]
Jul 18 23:31:12 ip-172-31-41-230 sshd[11463]: Invalid user user from 205.x.y.109 port 47982
Jul 18 23:31:12 ip-172-31-41-230 sshd[11463]: input_userauth_request: invalid user user [preauth]
Jul 18 23:31:13 ip-172-31-41-230 sshd[11463]: Received disconnect from 205.x.y.109 port 47982:11: Normal Shutdown, Thank you for playing [preauth]
Jul 18 23:31:13 ip-172-31-41-230 sshd[11463]: Disconnected from 205.x.y.109 port 47982 [preauth]
Jul 18 23:31:37 ip-172-31-41-230 sshd[11465]: Invalid user user from 205.x.y.109 port 54424
Jul 18 23:31:37 ip-172-31-41-230 sshd[11465]: input_userauth_request: invalid user user [preauth]
Jul 18 23:31:37 ip-172-31-41-230 sshd[11465]: Received disconnect from 205.x.y.109 port 54424:11: Normal Shutdown, Thank you for playing [preauth]
Jul 18 23:31:37 ip-172-31-41-230 sshd[11465]: Disconnected from 205.x.y.109 port 54424 [preauth]
Jul 18 23:34:07 ip-172-31-41-230 sshd[11469]: Did not receive identification string from 195.w.x.2 port 60136
Jul 18 23:51:02 ip-172-31-41-230 sshd[11560]: Invalid user user from 195.w.x.2 port 51846
Jul 18 23:51:02 ip-172-31-41-230 sshd[11560]: input_userauth_request: invalid user user [preauth]
Jul 18 23:51:02 ip-172-31-41-230 sshd[11560]: Received disconnect from 195.w.x.2 port 51846:11: Normal Shutdown, Thank you for playing [preauth]
Jul 18 23:51:02 ip-172-31-41-230 sshd[11560]: Disconnected from 195.w.x.2 port 51846 [preauth]
Jul 18 23:52:35 ip-172-31-41-230 sshd[11564]: Received disconnect from 222.x.y.213 port 46871:11:  [preauth]
Jul 18 23:52:35 ip-172-31-41-230 sshd[11564]: Disconnected from 222.x.y.213 port 46871 [preauth]
Jul 19 00:09:00 ip-172-31-41-230 sshd[11655]: Connection reset by 222.x.y.13 port 35130 [preauth]
Jul 19 00:18:22 ip-172-31-41-230 sshd[11677]: Did not receive identification string from 81.161.63.100 port 7138
Jul 19 00:34:44 ip-172-31-41-230 sshd[11748]: Connection reset by 222.x.y.137 port 12811 [preauth]
Jul 19 00:52:31 ip-172-31-41-230 sshd[11787]: error: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys ec2-user SHA256:I8Bm/A5QOXttRd8PyI52Lbfd8SX8TaOTl+r1sS3TG7I failed, status 22
Jul 19 00:52:31 ip-172-31-41-230 sshd[11787]: Accepted publickey for ec2-user from 114.x.y.150 port 58118 ssh2: RSA SHA256:I8Bm/A5QOXttRd8PyI52Lbfd8SX8TaOTl+r1sS3TG7I
Jul 19 00:52:31 ip-172-31-41-230 sshd[11787]: pam_unix(sshd:session): session opened for user ec2-user by (uid=0)
Jul 19 00:52:34 ip-172-31-41-230 sudo: ec2-user : TTY=pts/0 ; PWD=/home/ec2-user ; USER=root ; COMMAND=/bin/bash
Jul 19 00:52:34 ip-172-31-41-230 sudo: pam_unix(sudo-i:session): session opened for user root by ec2-user(uid=0)
Jul 19 10:12:47 ip-172-31-41-230 sshd[12229]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=i114-184-195-150.s41.a027.ap.plala.or.jp  user=user1
Jul 19 10:12:49 ip-172-31-41-230 sshd[12229]: Failed password for user1 from 114.x.y.150 port 61101 ssh2
Jul 19 10:12:53 ip-172-31-41-230 sshd[12229]: Accepted password for user1 from 114.x.y.150 port 61101 ssh2

2.4 ブラウザの履歴

(1)概要

・インターネット接続の履歴が分かる
・履歴はどこで見るかというと、Chrome右上「︙」→「履歴」→「履歴」
・表示される情報は、アクセス日時、ページタイトル、URLのみである。
・保存期間の上限であるが、明確な制限なしだと思われる。消すまで残る?

(2)ローカルにある履歴ファイルを操作

・履歴ファイルの場所(Windows)
C:\Users\<ユーザ名>\AppData\Local\Google\Chrome\User Data\Default\History
・履歴ファイルの形式
SQLite3 データベースファイル
・取得可能な情報(SQL抽出)
 タイトル、URL、訪問回数、最終訪問時刻、トランジションタイプ(遷移方法)など
・アクセス方法(例)
sqlite3 History によりコマンドライン操作可

2.5 Sysmonログ

(1)Sysmonログとは

・正式名称は、System Monitor(Sysmon)
・提供元は、Microsoft(Sysinternals Suiteの一部)
・イベントログとは違い、高精度なログが取得できる。(プロセス生成、ネットワーク通信、ファイル作成など)
・イベント記録先は、Windowsイベントログ → Applications and Services Logs
・標準では搭載されておらず、Sysinternalsから別途インストールが必要
・利用は無料
・インストールしている企業はそれほど多くないと思われる。

(2)Sysmonの主なログ内容
イベントID イベント内容 説明・用途例
1 プロセス作成 実行されたプロセスのパス、引数、親プロセス、ユーザ、ハッシュを記録。
2 ファイル作成タイムスタンプ変更 攻撃者がファイルの作成日時を改ざんした場合に検出。Timestomping対策。
3 ネットワーク接続(IPv4/IPv6) 接続元プロセスとリモートIP、ポート番号、プロトコルを記録。C2通信の特定などに有効。
5 プロセス終了 プロセスが終了したタイミング。短命プロセスやマルウェアの終了検知に利用。
7 イメージロード(ドライバ) カーネルドライバの読み込み。未署名ドライバの読み込み検知などに活用。
8 イメージロード(DLLなど) 実行中プロセスに読み込まれたDLLファイルを記録。DLLインジェクションの検出等。
10 プロセス間アクセス 他のプロセスへのメモリ操作、読み取り、コード挿入などを記録。
11 ファイル作成 作成されたファイルのパス、拡張子、ハッシュ等を記録。ドロッパーなどの解析に。
13 レジストリ値の書き込み レジストリキーの変更操作を検出。Runキーやサービス改ざんの検出に有効。
22 DNSクエリ 実行プロセスからのDNS名前解決の記録。不審なドメインへの問い合わせ検知。
23 ファイル削除 削除されたファイルの記録(※Sysmonv13以降でサポート、構成に依存)。
(3)参考資料

Sysmonログを可視化して端末の不審な挙動を調査~SysmonSearch~
https://blogs.jpcert.or.jp/ja/2018/09/SysmonSearch.html

2.6 Windowsのイベントログ

VPN装置が乗っ取られた場合、VPN装置経由で、Windowsにブルートフォースでログインしようとして場合、イベントログ 4624で、以下のようなログが残る。

項目 内容
イベントID 4624(アカウントの正常なログオン)
TargetUserName 攻撃者がログインを試みたユーザー名(例:Administrator など)
Logon Type 3(ネットワーク経由のログオン)
Workstation Name 空欄または「-」の場合あり(VPN装置からのアクセスでは情報が送られないことがある)
Source Network Address VPN装置の内部IPアドレス(例:192.168.x.x)や、攻撃元のIPが記録される

※VPN装置を乗っ取ってWindowsに対してブルートフォース攻撃をしているがまだ成功していない段階では、4625の失敗ログだけが残る

3.フォレンジック解析

外注が必須と言えるフォレンジック解析。

3.1 フォレンジック解析とは

(1)言葉の定義

・コンピュータフォレンジクスとは、「不正アクセスなどコンピュータに関する犯罪の法的な証拠性を明らかにするために、原因究明に必要な情報を収集・分析すること」(情報処理技術者試験SV平成18年午前問44)と定義されています。
・フォレンジック(Forensic)は、本来「法廷の」「法医学的な」という意味ですが、コンピュータフォレンジクスでは、法的証拠として扱える形での収集・分析すると考えればいいと思います。

(2)ログ解析とフォレンジックの違い

定義とは全く違うので、この説明は間違っているのですが、こういう説明をするとわかりやすいと感じる人もいるかもしれません。

ログファイルととして明確に残るものを解析するのがログ分析で、ログファイルに残っていないものまで解析するのがフォレンジック解析
(3)フォレンジック解析の流れ


(4)参考文献

・参考1:NIST SP800-86
https://www.ipa.go.jp/security/reports/oversea/nist/ug65p90000019cp4-att/begoj9000000bd3p.pdf

・参考2:インシデント対応へのフォレンジック技法の統合に関するガイド
IPAがNISTの資料を解説
https://www.ipa.go.jp/security/reports/oversea/nist/ug65p90000019cp4-att/begoj9000000bf0q.pdf

3.2 ファストフォレンジック

・簡易なフォレンジックだが、短時間で結果がでる。
・やばいかやばくないかを判断するような感じ。やばい(=情報漏えいが起こったことが確実)のであれば、さらに調査をするなど。

3.3 証拠保全(データ保全)

・証拠を保全しないと、解析ができない。非常に重要な工程である。
・「証拠保全ガイドライン 第9版」が参考になるでしょう。
https://digitalforensic.jp/wp-content/uploads/2018/07/guideline_7th.pdf

3.4 契約関係

・手続き方法
 チケットサービスとして、事前に契約があった方がスムーズだと思います。インシデントが発生してから依頼してからでも対応してもらえますが、契約などに時間がかかりそうです。
・料金
・所要日数
・フォレンジックの流れ
 1)事前打ち合わせ(目的や調査対象、台数の確認など)
 2)データ保全
  ・オンサイトおよびオフサイトでも可能
  ・仮想の場合はイメージをエクスポート。
 3)解析
 4)報告(3日程度で速報、2~3週間程度で調査結果の報告。必要に応じて報告会)

4.フォレンジック関連のツール

・フォレンジック解析では、イベントログやレジストリなどを地道に見るのは大変です。 有料のものもありますが、無料のツールもあり、それらを使うことで解析のサポートができます。
Nir Sofer氏のNirSoft(ニルソフト)が有名で、以下にたくさんのツールが紹介されています。
http://www.nirsoft.net/utils/
・ポスター
https://www.nri-secure.co.jp/hubfs/SANS/download/DFPS_FOR500_v4.7_1-19_JP.pdf
いくつか紹介します。

❶USBdeview
 このツールを使うと、USBの接続情報や、抜き差しの記録がわかります。
http://www.nirsoft.net/utils/usb_devices_view.html
USBによるデータ持出しなどの履歴を確認することに利用できるでしょう。ただし、接続履歴は分かりますが、ファイルのコピーは分かりません。

❷fulleventlogview
 このツールを使うと、イベントログが整理されて表示されます。
http://www.nirsoft.net/utils/full_event_log_view.html

❸winprefetchview
 http://www.nirsoft.net/utils/win_prefetch_view.html
exeファイルを実行すると、C:\Windows\Prefetch にPrefetchファイルが作成されます。そのファイルをリスト化してくれます。結果、どんなアプリケーションを実行したかがわかります。

❹JumpList Explorer
ダウンロードして起動してみたが、イマイチ使い方がわからなかった。
https://ericzimmerman.github.io/#!index.md

・商用サービスだと、以下を使うと想定される。

ツール名 主な用途 対象データ 特徴・備考
Log Parser Windowsイベントログの解析 `.evtx`ログ、IISログなど Microsoft製。SQL風クエリで柔軟な検索が可能。CLIベース。
JumpList Explorer ファイルアクセス履歴の抽出 `.automaticDestinations-ms`等 最近使ったファイルやピン留め情報の確認に使用。GUIツールもあり。アプリケーションやファイルのアクセスログがJumpListに保存され、それを解析することができる。
AXIOM(Magnet)
アクシオムと読みます。
総合デジタルフォレンジック ディスク全体、RAM、クラウド等 商用。GUIベースで扱いやすく、スマホやクラウドにも対応。
Regripper Windowsレジストリの解析 `NTUSER.DAT`, `SYSTEM`など プラグイン形式のCLIツール。無料で軽量。
FTK Imager ディスクのイメージ作成・閲覧
メモリダンプのフリーツール
物理/論理ディスク 無償でディスクの内容を確認・取得できるツール。
http://www.atmarkit.co.jp/ait/articles/1610/12/news001.html
Autopsy オープンソースの総合解析 ディスク、ファイル、ログなど GUIあり。Sleuth Kitをベースにした使いやすい分析ツール。
Sleuth Kit ディスクイメージの解析 ディスクイメージ Autopsyのバックエンド。CLI中心。
Volatility メモリイメージの解析 メモリダンプ(.raw) プロセス、DLL、ネットワーク接続などを抽出可能。
KAPE ログ・証拠の収集および整形 各種Windowsアーティファクト Rapid Response向け。柔軟な収集・整形が可能。
Chainsaw Windowsイベントログの高速解析 `.evtx`ログ Sigmaルール対応。EDRログの迅速な解析に適する。
X-Ways Forensics 高機能な商用フォレンジックツール ディスク、メモリ、レジストリなど 高速・高機能なプロフェッショナル向け。商用。

5.ディスクフォレンジック詳細

5.1 ログ解析の限界とディスクフォレンジック

(1)ログ解析の限界

・攻撃者によって消去されることがある
・取得するログの情報が、そもそも不十分な場合がある(必要な情報が取得されていない)
・ログの保存期間は一般的にはそれほど長くなく、欲しい情報が消える可能性

(2)フォレンジック解析で分析できること

・上記(1)のログ解析の限界の上2つへの対応ができる可能性がある。
・具体的には、消去された痕跡を復元できる場合がある
・ログには残らなかった痕跡を確認できることがある。
・具体的にわかることとして、ファイル操作履歴、プログラムの実行履歴、外部デバイスの接続履歴、ファイルなどの削除履歴などがある

Q.ファイルの変更履歴は改ざんできない?
A.改ざんされる可能性があるが、ファイルシステムによっては、2か所にタイムスタンプを持っていることもあり、それが気づくこともある

(3)ログ解析とディスクフォレンジックの詳細対比(主にWindows)
項目 ログ解析で
取得可
どのログで? ディスクフォレンジックで取得可 フォレンジックでの
取得方法・対象
インターネット接続履歴 PC上ではDNSキャッシュ、ブラウザ履歴だが、それほど取れない。FWログが有効 〇可能 ブラウザキャッシュ、履歴DB、レジストリ、URL履歴ファイル
C&Cサーバへの通信履歴 FWログ × 難しいだろう
ダウンロードファイル名・サイズ(送信ファイル含む) 標準の設定だと基本的には残らない 〇可能 ファイル実体、$LogFile、$MFTからファイル属性を復元
実行したアプリケーション △一部可能 イベントログ(ID:4688) 〇可能 Prefetch、ShimCache(レジストリ)などから実行履歴を取得
開いたファイル 最近使ったファイル、Officeログもあるが、マルウェアが直接操作すると残らない 〇可能 RecentItems、ShellBags、$MFTのアクセス日時、JumpListなど
ファイルのコピー(PC内) 〇判明する可能性あり コピー先の属性比較、$LogFile、ファイルIDなどの変化
ファイルのコピー(USBなど外部) 〇高確度で可能 USNジャーナル、$LogFile、USBStorレジストリとの照合
ファイルの新規作成 標準の設定だと基本的には残らない(イベントログで監査ポリシーの設定等が必要) 〇可能 $MFTの作成日時、ファイルIDなど
ファイルの削除 〇検出・一部復元可能 削除済み領域、$MFT残骸、$LogFile、シャドウコピー
USBメモリの接続履歴 難しいと思う 〇可能 レジストリ(USBStor,MountedDevices)、同上+アクセス履歴との相関解析
新規ユーザの作成 〇記録される セキュリティログ(ID:4720) 〇確認可能 SAMレジストリのオフライン解析
ファイルの改ざん(内容・日時) ✖不可 〇検出可能 $MFTの$SIと$FNのタイムスタンプ差異、Diff解析など
ログ削除の痕跡 ✖ログ消失で不可 △検出可能 $LogFileや$MFTの不整合、USNジャーナルの分析

5.2 (参考)ディスクフォレンジック関連の用語

用語 説明 主なファイル/レジストリパス例
`$MFT` MasterFileTable。NTFSで管理される全ファイルのメタ情報を保持。削除・改名・作成日時など。 `\\.\C:`(ディスク全体のRAWアクセス)
`$LogFile` ファイル操作のトランザクションログ。削除や移動の操作痕跡を保持。 `C:\$LogFile`(直接アクセス不可。RAW取得が必要)
`USNJournal` ファイルの変更・作成・削除の履歴を記録するNTFSのジャーナル。 `C:\$Extend\$UsnJrnl`(直接アクセス不可)
`Prefetch` アプリケーションの実行履歴(.pf)。起動された実行ファイルとタイムスタンプを保持。 `C:\Windows\Prefetch\*.pf`
`ShimCache` AppCompatCache。過去に実行されたファイルの情報がレジストリに記録される。 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\AppCompatCache`
`ShellBags` エクスプローラでアクセスしたフォルダの履歴(表示位置や設定も含む)。 `HKEY_USERS\\Software\Microsoft\Windows\Shell\BagMRU`
`ThumbCache` 画像・文書などのサムネイル画像キャッシュ。削除済みファイルの存在確認に有効。 `C:\Users\<ユーザ名>\AppData\Local\Microsoft\Windows\Explorer\thumbcache_*.db`
`ADS` AlternateDataStreams。NTFSの隠しデータ格納領域。マルウェアの隠蔽にも使われる。 `C:\path\file.txt:streamname`(例:`notepadfile.txt:malicious`)
`VolumeShadowCopy` システムのスナップショット。過去のファイル状態を復元可能。 `\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyX\`(Xは番号)
`SAM` Windowsユーザアカウント情報(ハッシュ含む)。 `C:\Windows\System32\config\SAM`

5.3 Linuxサーバでのディスクフォレンジックの有用性

・WindowsOSの場合、不正操作痕跡、実行履歴、削除ファイル、USB接続履歴など、ログに残らない操作が多く、ディスクフォレンジは有効。
・一方、LinuxOSはどうか。そもそもLinuxサーバの場合、取得できるログは豊富で、フォレンジックで新たにわかるログは少ない。だが、ファイルの改ざんや削除されたものも確認したり、フォレンジック解析だからってことはないが、タイムラインで解析したり、Cronで永続化されたものが無いかも調べようと思うと、フォレンジック解析の意味はもちろんある。
・ただ、Windowsのフォレンジック解析に比べ、Linuxのフォレンジックの件数は非常に少ない。

5.4 ディスクフォレンジックの流れ

・まず、FTK Imager 等を使ってデータの保全を行う。ファイルをコピーするのではなく、ディスクイメージ(ビット単位の完全コピー)を取得する。
・フォレンジック調査は、取得したイメージファイル上で実施する。これにより、元データの損失を防ぐことができる。

5.5 HDDとSSDの違いがフォレンジックに与える影響

・解析そのものに大きな影響はないが、ファイルが削除されてしまうと、ほぼ痕跡が残らないと考えた方がいいい。

観点 HDD SSD
保存方式 磁気ディスクにセクタ単位で記録 NANDフラッシュにページ/ブロック単位で記録
ファイル削除の挙動 削除しても物理セクタにデータが残る(通常) TRIMコマンドによりデータ領域が即座に消去される可能性
フォレンジックツール対応 多くの既存ツールで対応可能(Autopsy, FTK, EnCase等) 同様に可能だが削除データの痕跡は少ない可能性が高い

※TRIMとは?
SSDの空きブロック管理機構。OSが削除済みブロックをSSDコントローラに通知し、内部的に消去処理を促進する。これにより、パフォーマンスは向上するが痕跡も消える。

6.メモリフォレンジック詳細

6.1 概要

・メモリフォレンジックでわかること(通常のログ解析やディスクフォレンジックではわからないこと)として、IPAの資料の言葉を使うと、「現在のネットワーク接続、プロセス、ログインセッション、オープンされているファイル、ネットワークインタフェースの設定、メモリーの内容などが含まれる。このデータに、アタッカーの身元や使用された攻撃方法の手がかりが含まれていることがある。」
・感覚的には、9割以上がディスクフォレンジックで、メモリフォレンジックをするのは1割以下であろう。なぜなら、PCの場合、原則は再起動したらメモリデータが消えるので、そうするとメモリフォレンジックはできない。また、最近ではEDRが多く導入され、EDRで解析した方がわかりやすいと思われる。
・サーバであれば、再起動の頻度が低いため、障害発生からそれほど時間が経過していなければ、メモリ上の情報がまだ保持されている可能性があり、調査が可能な場合もある。
・また、たとえ再起動されたとしても、ハイバネーションファイル(hiberfil.sys)が存在すれば、休止状態に入る前のメモリ内容が保存されている。そのため、完全ではないにせよ、再起動後でも一部のメモリフォレンジックが可能となる場合がある。

6.2 メモリフォレンジックの流れ

・メモリのフォレンジック。まずはメモリの保全が必要。
・メモリダンプ(RAWデータ)して、それを解析

6.3 メモリ保全

6.4 メモリフォレンジックの実施

・ツール:Volatility3など
・目的:ランタイム中にのみ存在するマルウェア、不審なネットワーク接続などの検出
・分析ポイント

コマンド 内容
pslist, pstree プロセスツリーの可視化
netscan TCP/UDPセッションとリモートIPの把握
cmdline 実行されたコマンドの確認
dlllist ロードされたDLLの確認
 ・・・  

6.5 ディスクフォレンジックではわからず、メモリフォレンジックでわかること

(1)一般的

メモリフォレンジックで把握可能な情報(ディスクフォレンジックでは困難または不可能)

メモリで取得可能な内容 ディスクフォレンジックで取得困難な理由・備考
実行中のプロセス情報 終了すると痕跡が消える。パスや引数、親子関係などはディスクに残らない
現在のネットワーク接続状況 一時的なコネクション情報(IP/ポート)は揮発的であり、ログにも残らない場合がある
ログインセッション情報 現在ログイン中のユーザやリモート接続情報はメモリ上にのみ存在
オープンされているファイル 一時ファイルや削除済ファイルを含む開かれているファイル情報はメモリにしか存在
メモリ上のマルウェア本体 ファイルレスマルウェアなど、ディスクに書き込まれないため発見が困難
DLLインジェクションの内容 不正に挿入されたコードやDLLは、プロセス空間にしか存在しない
ネットワークインタフェースの設定 一時的な設定変更(IP/ルーティング/ARPなど)はメモリにしか存在しない
一時的なコマンド履歴 PowerShellなどの一部コマンド履歴がメモリに一時的に残ることがある
認証情報(パスワードやトークン等) 認証トークン、平文パスワード、Cookie等がメモリに残存する場合がある
RAMディスク上のデータ RAMディスクに格納されたツールやファイルは再起動で消失し、ディスクには残らない
(2)マルウェアの挙動関連
検知対象項目 メモリで検出可能な内容 ディスク・ログでは困難な理由
メモリ上に展開されたマルウェア本体 ファイルレスマルウェアや、DLLインジェクションによる不正コードの検出
復号後のコードも確認可能
永続ファイルを残さないため、ディスクには存在せずAV回避も容易
C&C通信の接続先情報(IP/ドメイン) プロセス単位での通信相手IP/ポート、C2通信中のセッション内容も確認可能 通信ログは残らないことが多く、DNS over HTTPSなどの秘匿通信は検出困難
ダウンロード済み一時ファイル 実行中の一時ファイルや自己削除された攻撃用ツールがそのままメモリ上に展開されている 実行後に削除された場合、ディスクには物理的痕跡が残らない
不正なDLLやコードセクション プロセス空間に不審なDLLや、PE形式でないコードセグメントが注入されている 通常のDLLロード履歴やファイル情報では確認できない
平文の認証情報・セッショントークン パスワード、クッキー、JWT、Kerberosチケットなどが平文またはbase64で残存している ログイン履歴はあっても、資格情報自体はログやディスクに残らない
実行中のコマンド/スクリプト PowerShell、cmd、JS/VBSなどの実行中コードや引数を含むバッファが確認可能 ログが無効化されていたり記録対象外だと復元不可能
リバースシェルのセッション情報 攻撃者の接続元IP、セッションのプロセス、標準入出力の内容までメモリから取得可能 通信終了後は完全に消失し、ディスクにも記録されないことが多い
RAMディスク上の攻撃ツール RAM上に展開されているMimikatzやnetcat等の実行ファイルやスクリプトが検出可能 RAMディスクに保存されたデータは揮発性で、電源断や再起動で消失

7.スマホのフォレンジック

・スマホに関するニーズが少ない。最新のOSなどでは、解析しようにもデータがそもそも抜けないし、本当にデータを保全すうならJailBreakしないと見えない。なので、現実的にはなかなかフォレンジックは難しい。
・AndroidOSの解析は、Linuxベースなので多少はできるかも。iOSは少し難しい気がする。
・LINEなどのアプリのログを確認したりすることになるのではないか。

Q.なぜIoSのメモリフォレンジックが難しい?
Appleの仕様もコロコロ変わり、保全ツールも追いつかない。

8.WEST-SEC

8.1 イベント概要

・2025/07/24(木)19:00 〜 21:00に実施させていただきました。
https://west-sec.connpass.com/event/354439/
・1000人というたくさんのお申し込みをいただきました。ありがとうございます。

・実際の参加者もかなり多かったです。

8.2 アンケート結果

・Q1. 年代を教えてください

・Q2. 今日は何県からご参加ですか?都道府県をお答えください。

→東京が圧倒的に多いですね。

・Q3. フォレンジック解析を過去に実施したことはありますか?

・上記で「ある(外部に委託)」と回答された方、差し支えなければ、どういう事案で、いくら支払ったか費用を教えてください。

グループ会社のマルウェア感染事案
300万円
ディスクフォレンジック等で3百万
マルウエア解析
年間700万円ぐらい支払ってベンダーさんの稼働をリザーブして、侵害を受けたLinuxサーバー2、3台のログフォレンジック
マルウェア被害 費用不明
ランサムウェア
ランサムウェア、800万
外部からの侵入の痕跡を3台のサーバで調査。1500万程度
開発環境のインターネットアクセス設定が緩い箇所を突かれて開発サーバに侵入された。そのサーバ及び周知のいくつかのサーバのフォレンジック調査を依頼した。正確な数字は把握していないが百万円以上だったはず。
マルウェア感染被疑、100万円

・Q4. フォレンジック調査にかけられる予算感として、1案件あたり最大いくらいだと想定できますか?

・Q5. フォレンジック解析を外部に依頼する際、どのような点が障壁になりそうですか?

→その他として、守秘義務の点が多かったようです。

9.解析をやってみよう

9.1 gdbでプログラムの解析をしてみよう。

(1)解析するプログラム
Cで書かれた以下のプログラム(ping.c)があります。 ※拡張子は.cにすること
これは、ping 8.8.8.8 をバックグラウンドで実行するものです。

#include<stdio.h>
int main () {
    system ( "ping 8.8.8.8 >/dev/null 2>&1 &" );
}

では、コンパイルして、ping.exeという実行ファイルを作ります。

gcc -o ping.exe ping.c

※警告が出ますが、無視しましょう。

(2)静的解析
マルウェアを実行すれば、その挙動はわかります。しかし感染したり不正な行為を行うので得策とは言えません。そこで、静的解析として、gdb(The GNU Project Debugger)というLinux用の解析ツールを使います。
❶gdbのインストール

# yum -y install gdb

❷gdbの起動

# gdb ping.exe
GNU gdb (GDB) Red Hat Enterprise Linux 8.0.1-36.amzn2.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
・・・
Reading symbols from ping.exe...(no debugging symbols found)...done.
(gdb)

❸使用されている関数の確認
main関数の存在があることがわかる。

(gdb) info functions
All defined functions:

Non-debugging symbols:
0x00000000004003c8  _init
0x00000000004003f0  system@plt
0x0000000000400400  _start
0x0000000000400430  deregister_tm_clones
0x0000000000400460  register_tm_clones
0x00000000004004a0  __do_global_dtors_aux
0x00000000004004c0  frame_dummy
0x00000000004004c7  main
0x00000000004004f0  __libc_csu_init
0x0000000000400550  __libc_csu_fini
0x0000000000400554  _fini
(gdb)

❹main関数の解析

(gdb) disas main
Dump of assembler code for function main:
   0x00000000004004c7 <+0>:     push   %rbp
   0x00000000004004c8 <+1>:     mov    %rsp,%rbp
   0x00000000004004cb <+4>:     mov    $0x400570,%edi
   0x00000000004004d0 <+9>:     mov    $0x0,%eax
   0x00000000004004d5 <+14>:    callq  0x4003f0 <system@plt>
   0x00000000004004da <+19>:    mov    $0x0,%eax
   0x00000000004004df <+24>:    pop    %rbp
   0x00000000004004e0 <+25>:    retq
End of assembler dump.
(gdb)
  1. <+19> --> 関数呼び出し:外部コマンドを実行するsystem関数の呼び出し
  2. <+4> --> 引数の準備:外部コマンドに渡す引数を設定

❺メモリ空間を確認
引数が格納されたアドレスを確認する。そして、4ずつ数字を増やしながら実行。

(gdb) x 0x400570
0x400570:       0x676e6970
(gdb) x 0x400574
0x400574:       0x382e3820
(gdb) x 0x400578
0x400578:       0x382e382e
(gdb) x 0x40057c
0x40057c:       0x642f3e20
(gdb) x 0x400580
0x400580:       0x6e2f7665

1つ目として、メモリの0x400570 には、0x676e6970という値が入っている。
これはリトルエンディアンなので、メモリ上には逆に並んで配置されている。
元に戻すと 70696e67
これをテキストにすると、pingとなる。
※たとえばCyberChef(https://gchq.github.io/CyberChef/)にて、Swap endiannessを使って、ビッグエンディアンからリトルエンディアン(またはその逆)を実行し、From Hexを使って、
16進数をテキストに変換するのが楽です。

同様に
382e3820 --> 20382e38 --> 8.8
382e382e --> 2e382e38 --> .8.8
642f3e20 --> 203e2f64 --> >/d
6e2f7665 --> 65762f6e --> ev/n

こうして、ping 8.8.8.8 を実行していることがわかります。