2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

削除してしまった実行ファイルを復活させる!

あなたは、コマンド実行中に謝って、そのコマンドを消してしまった事は無いですか?
このような時に、ここで紹介するTCT(The Coroner’s Toolkit) は、同サイトの直訳曰く、不正侵入の後のUNIXシステムの死後分析のためにダン・ファーマーとウェイテス・ベネマにより作られたプログラム群です。TCTは、プロセスの実行中で有れば、実行ファイルを悪人により改ざんされたり、削除されたりしても実行中のプロセスのinode番号さえ解れば、ファイルを復活させることが出来る優れものである。つまり、仮に不正侵入されて実行ファイルを削除されても、その実行ファイルを速やかに復旧させることが出来る。実は、 ここ の4項で説明した「/proc中のプロセスのexeファイルで消してしまったファイルを復活させる」でも、これと同じ事が出来る。

テスト環境:
[root@infosystem ~]# more /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 7
model name : Pentium III (Katmai)
stepping : 3
cpu MHz : 598.645
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 mtrr pge mca cmov pat pse
36 mmx fxsr sse
bogomips : 1198.39

[root@infosystem ~]# lspci
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX – 82443BX/ZX/DX Host bridge (rev 03)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX – 82443BX/ZX/DX AGP bridge (rev 03)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 02)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.2 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 02)
00:0d.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 78)
01:00.0 VGA compatible controller: nVidia Corporation NV5 [RIVA TNT2/TNT2 Pro] (rev 11)

[root@infosystem ~]# uname -a
Linux infosystem 2.6.9-55.0.12.EL #1 Fri Nov 2 10:57:39 EDT 2007 i686 i686 i386 GNU/Linux


1.インストール
1)ソースファイルのゲット

[root@infosystem ~]# cd /usr/local/src

2007年11月現在では、 tct-1.18.tar.gz が最新であった。
[root@infosystem src]# wget http://www.porcupine.org/forensics/tct-1.18.tar.gz
–17:10:11– http://www.porcupine.org/forensics/tct-1.18.tar.gz
=> `tct-1.18.tar.gz’
Resolving fifo… 192.168.0.12
Connecting to fifo|192.168.0.12|:8080… connected.
Proxy request sent, awaiting response… 200 OK
Length: 317,959 (311K) [application/x-tar]

100%[================================>] 317,959 119.44K/s

17:10:14 (119.16 KB/s) – `tct-1.18.tar.gz’ saved [317959/317959]

2)展開する
[root@infosystem src]# tar zxvf tct-1.18.tar.gz

[root@infosystem src]# chown -R root.root tct-1.18

[root@infosystem src]# cd tct-1.18

3)Maikefileでコンパイル
[root@infosystem tct-1.18]# make

checking to make sure all the target(s) are here…
Ok, trying to find perl5 now… hang on a bit…

Perl5 is in /usr/bin/perl5.8.5

changing the source in: bin/mactime bin/grave-robber lazarus/lazarus bin/strip_tct_home extras/bdf extras/ils2mac extras/realpath

So far so good…
Looking for all the commands now…

Hmmm… can’t find acctcom… moving on…

Hmmm… can’t find devinfo… moving on…

Hmmm… can’t find eeprom… moving on…

Hmmm… can’t find format… moving on…

Hmmm… can’t find modstat… moving on…

Hmmm… can’t find pkginfo… moving on…

Hmmm… can’t find pstat… moving on…

Hmmm… can’t find rusers… moving on…

Hmmm… can’t find showrev… moving on…

Hmmm… can’t find swap… moving on…

Hmmm… can’t find uudecode… moving on…

Hmmm… can’t find xhost… moving on…

Hmmm… can’t find xauth… moving on…

Ok, now doing substitutions on the shell scripts…
Changing paths in conf/paths.pl…
Putting in $TCT_HOME into lazarus/lazarus
Putting in $TCT_HOME into conf/coroner.cf
Putting in $TCT_HOME into conf/grave-robber.cf
Putting in $TCT_HOME into bin/grave-robber
Putting in $TCT_HOME into bin/mactime
Putting in $TCT_HOME into extras/bdf
Putting in $TCT_HOME into extras/ils2mac
Putting in $TCT_HOME into extras/realpath
chmod 700 .
cd src/aux; make “CC=gcc” MAKELEVEL=
gcc -DLINUX2 -O -g -c -o mymalloc.o mymalloc.c
gcc -DLINUX2 -O -g -c -o error.o error.c
gcc -DLINUX2 -O -g -c -o strerror.o strerror.c
gcc -DLINUX2 -O -g -c -o split_at.o split_at.c
ar rv aux_lib.a mymalloc.o error.o strerror.o split_at.o
ar: creating aux_lib.a
a – mymalloc.o
a – error.o
a – strerror.o
a – split_at.o
ranlib aux_lib.a
cd src/misc; make “CC=gcc” MAKELEVEL=
gcc -O -g -I. -DLINUX2 -c -o md5.o md5.c
gcc -O -g -I. -DLINUX2 -c -o md5c.o md5c.c
gcc -O -g -I. -DLINUX2 -o ../../bin/md5 md5.o md5c.o
gcc -O -g -I. -DLINUX2 -c -o timeout.o timeout.c
gcc -O -g -I. -DLINUX2 -o ../../bin/timeout timeout.o
cd src/fstools; make “CC=gcc” MAKELEVEL=
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o fs_buf.o fs_buf.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o fs_inode.o fs_inode.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o fs_io.o fs_io.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o fs_copy_file.o fs_copy_file.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o fs_open.o fs_open.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o ffs.o ffs.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o ffs2.o ffs2.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o ext2fs.o ext2fs.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o mylseek.o mylseek.c
ar rv fs_lib.a fs_buf.o fs_inode.o fs_io.o fs_copy_file.o fs_open.o ffs.o ffs2.o ext2fs.o mylseek.o
ar: creating fs_lib.a
a – fs_buf.o
a – fs_inode.o
a – fs_io.o
a – fs_copy_file.o
a – fs_open.o
a – ffs.o
a – ffs2.o
a – ext2fs.o
a – mylseek.o
ranlib fs_lib.a
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o ils.o ils.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -o ../../bin/ils ils.o fs_lib.a ../aux/aux_lib.a
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o unrm.o unrm.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -o ../../bin/unrm unrm.o fs_lib.a ../aux/aux_lib.a
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -c -o icat.o icat.c
gcc -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../aux -O -g -o ../../bin/icat icat.o fs_lib.a ../aux/aux_lib.a
cd src/pcat; make “CC=gcc” MAKELEVEL=
gcc -I../aux -DLINUX2 -O -g -c -o pcat.o pcat.c
gcc -I../aux -DLINUX2 -O -g -o ../../bin/pcat pcat.o ../aux/aux_lib.a
cd src/file; make “CC=gcc” MAKELEVEL=
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o file.o file.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o apprentice.o apprentice.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o fsmagic.o fsmagic.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o softmagic.o softmagic.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o ascmagic.o ascmagic.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o compress.o compress.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o is_tar.o is_tar.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o print.o print.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -c -o international.o international.c
gcc -O -g -DLINUX2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DNEED_ERRNO_H -DMAGIC=”\”`cd ../../etc; pwd`/magic\”” -o ../../bin/file file.o apprentice.o fsmagic.o softmagic.o ascmagic.o compress.o is_tar.o print.o international.o
cat Magdir/Header Magdir/Localstuff Magdir/[a-z]* > ../../etc/magic
cd src/lastcomm; make “CC=gcc” MAKELEVEL=
gcc -I. -DLINUX2 -I. -O -g -c -o lastcomm.o lastcomm.c
gcc -o ../../bin/lastcomm lastcomm.o
cd src/major_minor; make “CC=gcc” MAKELEVEL=
gcc -DLINUX2 -O -g -c -o major_minor.o major_minor.c
gcc -DLINUX2 -O -g -o ../../bin/major_minor major_minor.o
cd extras/entropy; make “CC=gcc” MAKELEVEL=
gcc -DLINUX2 -I../../src/aux -O -g -o entropy entropy.c ../../src/aux/aux_lib.a -lm
cd extras/findkey; make “CC=gcc” MAKELEVEL=
gcc -DLINUX2 -I../../src/aux -O -g -o findkey findkey.c ../../src/aux/aux_lib.a
bin/major_minor > lib/major_minor.pl
rm -f bin/lazarus
ln -s `pwd`/lazarus/lazarus bin/lazarus

4)手動でリンクする
[root@infosystem tct-1.18]# cp bin/ils /usr/bin/

[root@infosystem tct-1.18]# cp bin/icat /usr/bin/


2.TCTを使う
1)/etc/passwdファイルの中身をinode番号を使って参照する。
[root@infosystem tct-1.18]# cd /etc/

passwdファイルのinode番号を確認する。
[root@infosystem etc]# ls -il passwd
552785 -rw-r–r– 1 root root 3619 Nov 28 16:27 passwd

passwdファイルが有るディスク領域を確認する。
[root@infosystem etc]# df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/hda2 5722 4631 800 86% /
/dev/hda1 76 31 42 43% /boot
none 189 0 189 0% /dev/shm
/dev/hdb1 6054 2945 2802 52% /usr

inode番号を指定してpasswdファイルの中身を参照する。
[root@infosystem etc]# icat /dev/hda2 552785
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
省略

inodeとは、ディスク領域にあるファイルに対しての情報(ファイルの最終アクセス、作成日付、更新日付、アクセス権限、ファイルのデータ)でinode番号とは、この情報には番号が付いていて管理されている。したがって、ディスク領域とinode番号を指定すればそれに対するファイルの情報を見ることが可能となる。

2)消してしまったファイルを復活させる(例としてsshdファイルの場合)
sshサービスの実行中にsshdのメインファイルを消してしまった場合の対策。
[root@infosystem etc]# cd /usr/sbin/

念のため、sshdの実行ファイルのバックアップを取っておく。
[root@infosystem sbin]# cp sshd sshd.bak

sshdの実行ファイルをわざと消す。
[root@infosystem sbin]# rm sshd
rm: remove regular file `sshd’? y

lsofでsshdのinode番号を確認する。
[root@infosystem sbin]# lsof -c ssh | more
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 2141 root cwd DIR 3,2 4096 2 /
sshd 2141 root rtd DIR 3,2 4096 2 /
sshd 2141 root txt REG 3,65 313008 33487 /usr/sbin/sshd (deleted)
sshd 2141 root mem REG 3,2 941024 356284 /lib/libcrypto.so.0.9.7a
sshd 2141 root mem REG 3,65 63624 694619 /usr/lib/libz.so.1.2.1.2
sshd 2141 root mem REG 3,2 97120 356320 /lib/libnsl-2.3.4.so
sshd 2141 root mem REG 3,2 1529204 356252 /lib/tls/libc-2.3.4.so
sshd 2141 root mem REG 3,2 81120 356317 /lib/libresolv-2.3.4.so
sshd 2141 root mem REG 3,2 112168 356238 /lib/ld-2.3.4.so
sshd 2141 root mem REG 3,65 136016 694631 /usr/lib/libk5crypto.so.3.0
sshd 2141 root mem REG 3,65 82944 694883 /usr/lib/libgssapi_krb5.so.2.2
sshd 2141 root mem REG 3,2 7004 356333 /lib/libcom_err.so.2.1

icatでinode番号をパラメータにしてsshdバイナリを復活させる。
[root@infosystem sbin]# icat /dev/hdb1 33487 > sshd.recovered

ファイルがカレントディレクトリに出来ているか確認する。
[root@infosystem sbin]# ls -al sshd.recovered
-rw-r–r– 1 root root 313008 Nov 29 11:47 sshd.recovered

sshd実行ファイルにリネームしてパーミッションを変更する。
[root@infosystem sbin]# cp sshd.recovered sshd

[root@infosystem sbin]# chmod 755 sshd

念のため、sshdのバックアップとファイルサイズを比較する。
[root@infosystem sbin]# ls -al sshd
-rwxr-xr-x 1 root root 313008 Nov 29 11:48 sshd

[root@infosystem sbin]# ls -al sshd.bak
-rwxr-xr-x 1 root root 313008 Nov 29 11:47 sshd.bak

結果として、同じサイズであり見事に成功!

注:くれぐれも言っておくが、謝って削除してしまったファイルを復活できるのは、そのプロセスが実行中であるときのみ可能であることを覚えておいて欲しい。

以上

コメント