2done.org

Linuxメインなメモ書き。二度寝してから書く。(ご意見は Twitter あたりで。そのうちコメント欄つけます。)

困ったときのMACtime

はじめに

あるファイルに対してどのようなファイル操作が行われたか調べる手段の一つに MACTime を見る方法があります。

MACTime を見ることであるファイルへの 最終修正日時, 最終アクセス時間, 最終状態変更時間 がわかります。

これを追うことでどのタイミングで何をしたか/されたがわかります。

mtime Modify Time 最終修正時間 ファイルの実データが変更された時刻
atime Access Time 最終アクセス時間 ァイルの実データにアクセスした時刻
ctime Change Time 最終状態更新時間 inodeを変更した時刻

そう、ctime は create じゃなくて、change なんです。

http://cast-a-spell.at.webry.info/200901/article_2.html

MACTime の確認

単に MACTime が見たいのであれば、stat コマンドで確認できます。

ファイル新規作成

ファイルを新規作成し、MACTime をみてみましょう。新規作成なので MAC はどれも一致しています。

$ touch a.c
$ stat a.c
  File: `a.c'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 804h/2052d      Inode: 65          Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ishikawa)   Gid: ( 1000/ishikawa)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2012-05-08 12:09:32.045120217 +0900
Modify: 2012-05-08 12:09:32.045120217 +0900
Change: 2012-05-08 12:09:32.045120217 +0900
 Birth: -

ファイル内容の変更

a.c に変更を加えます。mtime と ctime が変更されました。(ctime 更新されていいんだっけ)

$ echo a > a.c
$ stat a.c
  File: `a.c'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 804h/2052d      Inode: 65          Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ishikawa)   Gid: ( 1000/ishikawa)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2012-05-08 12:09:32.045120217 +0900
Modify: 2012-05-08 12:12:27.291125807 +0900
Change: 2012-05-08 12:12:27.291125807 +0900
 Birth: -

ファイルの属性変更

i-node にだけ作用するよう、所有者権限を変更します。ctime だけが変わりました。

$ chmod 777 a.c
$ stat a.c
  File: `a.c'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 804h/2052d      Inode: 65          Links: 1
Access: (0777/-rwxrwxrwx)  Uid: ( 1000/ishikawa)   Gid: ( 1000/ishikawa)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2012-05-08 12:09:32.045120217 +0900
Modify: 2012-05-08 12:12:27.291125807 +0900
Change: 2012-05-08 12:32:40.284218488 +0900
 Birth: -


ファイルの内容を参照する

次はファイルを cat 開きます。ファイルの実データにアクセスをしたので atime だけが更新されています。

$ cat a.txt
a
$ stat a.c
  File: `a.c'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 804h/2052d      Inode: 65          Links: 1
Access: (0777/-rwxrwxrwx)  Uid: ( 1000/ishikawa)   Gid: ( 1000/ishikawa)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2012-05-08 12:38:21.516235436 +0900
Modify: 2012-05-08 12:12:27.291125807 +0900
Change: 2012-05-08 12:32:40.284218488 +0900
 Birth: -

MACTime を連続で見る

次にこんなことを考えてみましょう。

ある日突然、ls の調子がおかしくなっている事に気づきました。
find では全てのファイルが見れるのに ls では特定のファイルが見えない。
rpm -qV をするとどうも改ざんされているみたいだぞ。いつどこでやられたか。

# !rpm
rpm -qV coreutils
SM5....T.    /bin/ls

mac-robber

mac-robber は指定したディレクトリ配下の MACTime を一括で収集してくれる素敵ツールです。

インストール方法は以下のとおりです。

$ wget http://cdnetworks-kr-2.dl.sourceforge.net/project/mac-robber/mac-robber/1.02/mac-robber-1.02.tar.gz
$ tar zxf mac-robber-1.02.tar.gz
$ cd mac-robber-1.02
$ make
# cp mac-robber /usr/local/bin

RHEL6以上で以下のエラーが出た場合、ひとつパッケージをインストールしてください。

$ make
gcc -O3 -Wall -static  -o mac-robber mac-robber.c
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status
make: *** [all] Error 1

# yum -y install glibc-static

インストールができたら早速、ディレクトリを指定して MACTime を取得します。

# mac-robber / > /tmp/mactime`date '+%Y%m%d%H%M'`.log
# head -20 /tmp/mactime201205081300.log
class|host|start_time
body|bigben|1336449653
MD5|name|inode|mode_as_string|UID|GID|size|atime|mtime|ctime|crtime
0|/sys|0|drwxr-xr-x|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs|0|drwxr-xr-x|0|0|0|1336478780|1336478780|1336478780|0
0|/sys/fs/cgroup|0|drwxr-xr-x|0|0|260|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/perf_event|0|drwxr-xr-x|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/perf_event/release_agent|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/perf_event/cgroup.clone_children|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/perf_event/cgroup.event_control|0|--w--w--w-|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/perf_event/notify_on_release|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/perf_event/cgroup.procs|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/perf_event/tasks|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/blkio|0|drwxr-xr-x|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/blkio/blkio.throttle.io_serviced|0|-r--r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/blkio/blkio.throttle.io_service_bytes|0|-r--r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/blkio/blkio.throttle.write_iops_device|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/blkio/blkio.throttle.read_iops_device|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/blkio/blkio.throttle.write_bps_device|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0
0|/sys/fs/cgroup/blkio/blkio.throttle.read_bps_device|0|-rw-r--r--|0|0|0|1336446382|1336446382|1336446382|0

素晴らしい。これを読み解いていけばどこで何がされたかわかるんですね!・・・わかるか!!

と、言うわけでこれを時系列順に並べてくれる素敵なツールがあります。

The Sleuth Kit

The Sleuth Kit はmac-robber で生成したリストを時系列順に並べるツールです。

インストール方法は以下の通りです。

$ wget http://jaist.dl.sourceforge.net/project/sleuthkit/sleuthkit/3.2.3/sleuthkit-3.2.3.tar.gz
$ tar zxf sleuthkit-3.2.3.tar.gz
$ cd sleuthkit-3.2.3
$ ./configure
$ make
# make install

インストールができたら早速、解析をします。

$ mactime -b /tmp/mactime201205081300.log -p /etc/passwd > /tmp/result.log
$ head -20 /tmp/result.log
Thu Jan 01 1970 09:00:00     4096 ...b dr-xr-xr-x root     0        0        /bin          ←あれ?時間が…。オプション間違いっぽい。
                            27064 ...b -rwxr-xr-x root     0        0        /bin/arch
                                4 ...b lrwxrwxrwx -> gawk root     0        0        /bin/awk
                            27072 ...b -rwxr-xr-x root     0        0        /bin/basename
                           930568 ...b -rwxr-xr-x root     0        0        /bin/bash
                            47816 ...b -rwxr-xr-x root     0        0        /bin/cat
                            55944 ...b -rwxr-xr-x root     0        0        /bin/chgrp
                            51784 ...b -rwxr-xr-x root     0        0        /bin/chmod
                            55960 ...b -rwxr-xr-x root     0        0        /bin/chown
                           126120 ...b -rwxr-xr-x root     0        0        /bin/cp
                           137832 ...b -rwxr-xr-x root     0        0        /bin/cpio
                            43608 ...b -rwxr-xr-x root     0        0        /bin/cut
                           110040 ...b -rwxr-xr-x root     0        0        /bin/dash
                            60008 ...b -rwxr-xr-x root     0        0        /bin/date
                            10456 ...b -rwxr-xr-x root     0        0        /bin/dbus-cleanup-sockets
                           343304 ...b -rwxr-xr-x root     0        0        /bin/dbus-daemon
                            14656 ...b -rwxr-xr-x root     0        0        /bin/dbus-monitor
                            18888 ...b -rwxr-xr-x root     0        0        /bin/dbus-send
                            10376 ...b -rwxr-xr-x root     0        0        /bin/dbus-uuidgen
                            51944 ...b -rwxr-xr-x root     0        0        /bin/dd

目的の /bin/ls を確認します。(捏造しました!)

Tue May 08 2012 13:06:22   105881 m... -rwxr-xr-x root     0        0        /bin/ls

/bin/ls の mtime が更新されている。この時間になにかされてるっ"ぽい"。ということがわかります。

これを取っ掛かりにさらに他のファイルの MACTime を舐めたり、ログ追ってみたり、と長い戦いが待っています。

終わりに

書いている最中にこんな記事を見つけました。こちらを是非!

JPCERT/CC、MACtimeを分析するための技術資料を公開 - ITmedia エンタープライズ