================================================================================ Unix Hacking Command ================================================================================ chown chgrp ===========  ユーザによって所有されるファイルの構築はもっともよく使われるコマンドの一つだ。 そしてそこに楽しさがある。セキュリティの弱いシステムの99 %はUnixである。打破する のは簡単だ。CHOWN コマンドは誰かが所有するファイルをあなたのものとすることができ る。書式は以下の通り CHOWN 所有者名 ファイル名  所有者名は新しい所有者名へ、ファイルリストは変更するファイルリスト、変更される であろうファイルはあなたが所有しなければならない。だが、これは自分自身がスーパー ユーザであればの話である。仮にそうなら、すべて変更できる。  CHGRP はファイルの所有者、グループを変更する等が行えるコマンドである。CHOWN と CHGRP の両方をファイルに実行するつもりなら、まずCHGRP を実行しなければならない。 一度誰かがファイルを所有すれば、それに関してすべての変更か効かなくなる。 who ===  あるシステム上で、who isを実行する事は、その「誰」かに挑戦する事でもある。一番 良い方法は、C言語で自分自身のwho isプログラムを作ってしまう事である。もし無理な ら、ヘルプをみてみると良い。 who -スイッチ -b システムの一番最後に起動した時間を表示する -H 入出力のヘッダを先んずる -l ログイン待ちのユーザを表示する -q ログインしたユーザの番号を表示する -t システム時間を最後に変更した時間を表示する -T 状態を表示する(a+はターミナルへ送る事が可能 である事を意味し、a-は不可能である事を意味する) -u ログインが成功した人のリスト 普通のユーザは、who -HTuを使用するだろう 仮にC言語で自作who を作りたいのであればここを見れば分かるだろう (メモ)別の方法としてログインしているユーザのリストを/etc/utmp に記録しておくも     のがある terminal ========  ユーザの状態(who コマンドで-Tオプション)"User has their message function" と 表示されたとき、それは実際スクリーンの出力をとることが可能である事を意味する。基 本的にほとんどのターミナルはそれに良く似たファイルを持つ。/devにあるそのファイル は見ることができる。EGにアクセスするまでそう長くはかからないだろう。そのファイル は読み、書くことができるが、サイズが変更できない。それらをCharacterSpecific File と呼ぶ。システムとターミナルをリンクするものだ。 不幸な事に、ほとんどのシステムでは、ユーザがログインした時"MESG N"コマンドはター ミナルへの書き込みアクセスが出来ない状態にある。しかし、仮にシステムが"MESG N"コ マンドを吐き出す前にターミナルを編集したら、ターミナルの出力を奪い続ける事が可能 になるだろう。奪った出力には様々な使い方がある。  ターミナルか、ターミナルに使われているソフトウェアを調べてみよう。別のユーザの ターミナルからリモートプログラムを走らせることも可能なはずだ。単純な例としてユー ザのスクリーンに"String"という文字列を表示させる事が出来る。バッファをセットアッ プする。これで、タイプされたすべての情報を捕らえることが出来る。腹が立ったら、ユ ーザへのメッセージをターミナルへ送ることが出来る。(ある時、ユーザがログインする 際、適当なメッセージをそのユーザに送った。ユーザは何が起こっているのか理解できず、 諦めた。ひょっとしたらアカウントをいただけるかも知れない)  いくつかのターミナルもまた、トランスミットスクリーンと呼ばれるコマンドを持って いる。それはユーザがタイプしたすべてのコードをスクリーンに送ることが出来る。ユー ザをログオフさせたいなら、そのユーザに対してクリアスクリーンコマンド(CTRL-I)を 送るだろう。それを"Exit"とする。ユーザがトイレかそれ以外の何かの用事で端末を離れ る事があるだろう。するとこうタイプする。 chmod 777 $home chmod 777 $mail ユーザが見てないうちにスクリーンをクリアし、そうタイプするといい。カモのメールを 見ることも出来る。また、それを置き換えることも出来る。(ただし、そこにあるメール と同じ形式でだ)次にカモがログインした時にはシステムログには自動的にメールがある ことが知らされる。  別の方法としては、メールサーバで使える偽メールを送ることが出来る。少し標準と異 なる為か、Unixユーザの誰かがこれらのメールを受信した時は少し疑わしいと思うはずだ。 しかし、一般のユーザというのは愚かなものだ… Telnetとタイプする、プロンプトは以下のようになる。 Telnet > 以下のようにタイプする。 open localhost 25 クライアントはメールサーバに接続される。以下のようにタイプする mail from: XXXXXXXXX rcpt to: XXXXXXXXXXX メールを受け取る相手の名前を入力 data 本文 . quitとタイプすれば終了 削除することが出来ないファイル ==============================  ここに一つの実現されたものがある。  スタンダードなシェルからでは、単純には削除できないファイルを構築することが出来 る。これを行うには、スクリプトファイル及び、Cプログラムファイル作ることが必要と なる。そして、Ctrlキャラクタのみで構成されるファイルを使う必要がある。これらのフ ァイルはシェルからは入力できない。まず、Ctrl_H(この場合は削除キー)試してくれ。 Ctrl_Hを含んだファイル名のファイルはシェルからは削除できなくなるだろう。(ただし ワイルドカードを使わなければの話だが)こういったコントロール文字の連続でファイル を作り、それをユーザが削除しようと試みる。しかし、選択することが出来ない。しかし それぞれのファイルは複写できる。ユーザはディレクトリをすべて削除してしまう。一方 こちらはユーザのファイルを手に入れる。これは私のお気に入りの方法だ。いつでもEMを 手に入れる事が出来る。  Ctrl_hで形成されたスクリプトファイルの例を取り上げてみよう。このファイルはviか similor を用いて作る(もしviについてあまり詳しくないなら"man vi"といれてマニュア ルを見てみよう。使用法が詳しく書いてある) viではこんな風に編集する echo " > 'a^h' (viでは^h(Ctrl_hのキー入力を受け取ることが出来る)) ctrl v ctrl h Login,,Password =============== Unixは国と国を通信する際の標準的なシステムとなった。それらのセキュリティはほぼ同 じような形をしているように感じられる。 Login: Password: Unixをハックするなら、小文字を使うことが必要だ。Unixのコマンドはすべて小文字で表 示される。「Login」には1〜8文字の文字を入力する(Jones、Wilsonなどの)ログイン 名は、ダイアルアップ等の場所やコンピュータの周辺を探せば見つかるだろう。1〜8文 字のパスワードはユーザが決める。 ディフォルトログイン名、パスワードは以下の通り ログイン名      パスワード root root,system sys sys,system daemon daemon uucp uucp tty tyy test test unix unix bin bin adm adm who who learn learn uuhost uuhost nuucp nuucp もしログイン名憶測しパスワードを問いたださないでシステムにアクセスしたなら、たい して使えないようなアカウントを手にした事になる。正しいログイン名とパスワードを憶 測したならユーザアカウントを手に入れたこととなる。ルートパスワードを手に入れたな らスーパーユーザのアカウントを手に入れたことになる。インストールしたUnixシステム において、何らかのアカウントでシステムに入ったとする、そしてプロンプトが表示され る。このような感じだ。 # $ % ls -a カレントディレクトリのファイルをリストする du -a アマウントをチェックする cd \name nameは選択されたサブディレクトリの名前 cd \ 現在のディレクトリからホームディレクトリへ移動する cat name nameはプログラムやドキュメントのファイル名 UnixのプログラムはCかPascalで作られる。プログラマがUnixを使いはじめてから早いう ちにシステム上で動作させるものの一つとして、すべてのユーザ名やアカウントなどが記 載されたファイルを表示するものがある。これは以下のようのすると見える。 cat /etc/passwd システム上のアカウントリストのファイルを見るのがうまく行けばこんな風に表示される はずだ。 root:nwvnsdcf:0:0:root:dir:/: joe:majahnfds:1:1:joe cool:/bin:/bin/joe: hal::1:2:hal smith:/bin:/bin/hal: この表の見方は以下の通り ログイン名 : root nwvnsdcf : 暗号化されたパスワード 0 : ユーザグループ名 0 : ユーザ番号 rootdir : ユーザ名 ディレクトリ : / joe のログインでは終わりの部分"/bin/joe"は彼のホームディレクトリはどれか?を示し ている。hal の例ではログイン名が2つのコロンで囲まれている。これは彼の名前を使う 際パスワードは必要ないことを意味する。  近頃、OSやソフトウェアのセキュリティに多くの興味を抱く人がいる。本などは情報の 正確さを妨げる可能性がある。とあるテキストではセキュリティの改良方法やFAQ を載せ たり、システムにどの程度のセキュリティが必要か論議している。最初に討論すべき事実 は「unixのセキュリティは発達していない」だといえる。事実、多くのセキュリティホー ルがある事が判っている。 Resource ========  "セキュリティホール"とは理論的に弱い部分がシステムの制御をクリップしたりクラッ シュを防いでいたりする事を言う。システムコールに対してでたらめなパラメータを渡し たとえそれをシステムが受け入れたとしてもたいして大きな危険はない。これは問題の中 心ではない。(バグがあるのは判っているが、直されていない)  しかし、リソースが極端に不足しているのか否かを確かめる事はあまり行われない。恐 ろしい事に、ディスクにデータを置く場合、確保される合計、ディレクトリ数、ファイル 数の制限が無い。下記の様なシェルはシステムをハングアップしかねない。 while(0) { mkdir(argv[1]); chdir(argv[1]); }  デバイス上のディレクトリツリーが使用不可になりパニックが起きるか、ディスクの消 費される事だろう。この様に、誰かがデバイスにファイルを書き込む事で運営上妨げとな る。  現在のシステムのバージョンでは同時に起こるような処理をブロックし、ユーザがそれ 以上ファイルを作成するのを妨げる。システムはファイルを作成する場合も、CPU を使用 する場合も、別の事に利用するためディスクの一部をリソースとして残しておく。そのた めいくつものジョブを同時に実行するとスワップが限界に達してパニックを引き起こす。  事実、プロセスやスワップの過剰な消費はプログラムやコマンドラインなどのバグと同 様にアクシデントを引き起こす。これに関してのセキュリティは意外と簡単な結論でかた ずけられた。結論とは現実にシステムを使う上で整備が必要だと言う事だ。 UID GID =======  unixのファイルはユーザIDとユーザグループの収められた8 ビットの保護された情報に アクセスする。8 ビットの保護された情報は、その所有者、グループの人間、または他の グループの人間がファイルを読み書き実行を行うために独立した許可を持って扱われる。  ファイルが実行され、有効なGID ビット一覧を持っていたとする。その時、プロセス上 にある類似したGID は実行されたファイルと関連付けられたGID に変更される。だが実際 プロセス上のUID やGID はファイルが実行されている間は変更不可能である。しかし、シ ステムコールの応答にのみ応じ、変更される。  UID 一覧とGID 一覧の持つ意味は「他のプログラムを実行可能で、そのプログラムから のみ他のプログラムへアクセス可能なファイルを維持する」事を意味する。  古典的な例としてゲームにおけるプレーヤーのスコア更新が言える。ゲームのプログラ ム自身読み書き可能なスコアファイルを持つ。しかしゲームのスポンサーやゲームを開発 した会社などではアクセスを許していない。これはゲームの改造を行って不正な利益を得 ようと考える連中が勝手にファイルをいじらないようにするためだ。これはどんな事を内 部で行っているのであろうか。  種明かしをすると、これはゲームを実行中にはUID をオンにしている。ゲームのプレー ヤーがゲームを実行しているとスコアは更新されるが、プレーヤー以外の人間が実行した 平凡なプログラムからではスコアファイルにアクセスできない。これはアクセス許可を決 定する特殊なケースである。  UID とGID 一覧に関しては論議は慎重に行わなければならない。幾つかのセキュリティ で中心になるものとしたら最初に考えなければならないものがある。書き込み可能なUID 一覧ファイルにはその中に別の場所からコピーしてきたファイルを書き込む事が出来ると 言う事である。  その例として、スーパーユーザの命令によって書き込みが出来る場合、UID 一覧の中に シェルをコピーでき、そのバージョンのシェルを持つUnixのパスワードファイルを自由に 手に入れる事が出来る。注意深くUID 設定プログラムを調べておかないと腐った連中に食 べ物を与える事が出来る。  ここに腐った出来事が起こっている。Mailコマンドの以前のバージョンはUID 設定一覧 はスーパーユーザの所有だった。このバージョンは受け取り人のディレクトリにメールを 送る。この場合、例えユーザがディレクトリを書き込み禁止にしていてもそれらのディレ クトリにメールを送る事が出来た。理由はもう御分かりのはずである。そして悪い事に、 メールはバイナリを含めて送れる事が出来たのである。そのディレクトの所有者の知らな いうちにディレクトリにメールを送り、ファイルを書き込む事が出来たのである。こうし てより一層重大なトラブルを引き起こす事になったのである。 Execute at Directory ====================  以前、プログラムのディレクトリでの実行はたいした意味のない動作だった。ディレク トリでファイルを探す間はそのディレクトリでの実行許可はディレクトリでの検索の許可 の代わりとして受け取られる。このようにディレクトリでの実行許可はあったとしても、 読み込みの許可は与えられない。ユーザは名前を知っているファイルにアクセスを試みる だろうが、実際ディレクトリでのファイルリストを知ることは出来ない。  一方、ディレクトリでの書き込み許可とはユーザがファイルを作成し、削除することを 意味する。セキュリティの点から考えてもユーザが別のユーザのディレクトリにファイル を作成することは不可能である。特殊な例としてはディレクトリに無条件で読み書き出来 るスーパーユーザの存在がある。スーパーユーザはファイルの所有者のUID 、GID パーテ ーションを変更することが出来る。そしてシステムコールの使用権をユーザに与える事が 出来る。そのため、システム管理者のふとした考えが、「理論的」であり、「よく使われ 汎用性を持ち」、「時として、システムのプロテクトを傷つけるもの」だということを、 ユーザは認めなければならない。 Secure System =============  完全なシステムに最初に求められることは、すべてのファイルとディレクトリにおいて の最適なプロテクトモードを整えることである。昔からよく言われていることだが、Unix のソフトウェアの間には厳しい許可の関係がある。その中で、全ての人々に読み書き可能 なファイルを作り出す命令は最低限必要とされる。このバージョンのUnixにおいてはユー ザの調節を簡単にすることが出来る。プロセス間の連絡やプロセスから生成されるプロセ スは隠され眼には見えないが、それらの隠されたものの中にはファイルやディレクトリの 有効なモードがある。この「モード」を使うことによってユーザのプロセスやファイルを 調節することが出来る。ファイルにおいては全てのファイルはユーザが望むようにはアク セス出来ない。一般的にはログイン時にマスクが設定され、ユーザはユーザ自身とグルー プに対しての許可を得る。だが、他のユーザからはマスクを設定できない。  秘密とされるデータと公開されるデータの二つに共通に言えることは、その二つは必要 だということだ。他のユーザがアクセスする事が出来ないファイルを作り出すことは大い に重要である。それに対して不必要な事はユーザが作成したUID 設定プログラムが使用可 能だと言う事だ。そしてそのことは討論の内容の一つであるシステムのセキュリティだ。 Protect =======  「プロテクト」を施す上で良い方法とされているものとして暗号化がある。以前まで、 エディタで暗号化を施す事が出来た。そして暗号化の命令は別のエディタのドキュメント との間でパイプを使う事が出来た。また必要とされるテキストのバージョン情報を削除す る間、厳密には制限がある。暗号化において現在使われているものはあまりいいものが無 い。しかし、ユーザは暗号化には無関心で適当に暗号化の方法を選んでいるのが現状だ。  ある意味においては、暗号解読の際に一つ一つ根気良く試すよりも、一気に読み込む方 が有効だ。例としてはファイルの内容が行き来するデバイスにアクセスする方法だ。  パスワードのセキュリティに関する出版物の中では、おそらくUnixのセキュリティに関 するものが他のシステムに比べ最も良いものだと言える。パスワードは何らかの方法で暗 号化され格納される。その手の専門家が注意を払わなければセキュリティは安っぽい物だ 何故なら、パスワードには幾つかの制限が与えられているからである。現在のバージョン では連邦政府のDES と呼ばれる不完全な暗号化技術を基本にしている。暗号化が不完全で あると完全なキーサーチを行う上では良く使われるハードウェアは暗号解読には使われな い。  暗号化のアルゴリズムと暗号化されたパスワードは二つとも利用される。元から存在す るパスワードをサーチするのはある点においては実行できる。ユーザがパスワードを選択 するのをじっと待つ。あとは憶測するのは簡単な事だ。なぜならそれは短く制限がありア ルファベットと特殊な文字を含んだわずか8文字の長さの文字列だからだ。それらもまた パスワードを見つける上で解読する事ができる。  ある一例としては「Login:」と出力するプログラムがある。そのプログラムではキーボ ードから入力されたものをファイルに書き出す。そしてあなたは生け贄が来るのをじっと 待つだけで良い。 番外編「unix の歴史」 =====================  ほんの6年前、MIT おける第3世代コンピュータへの発展の間、プログラマはコンピュ ータの可能性を研究していた。そしてベル研究所において、一つまたははそれ以上のタス クを同時に実行する性質を発見された。その発見を切っ掛けに多くの資金が投与され、科 学者がその境地を調査することになる。2年ほど調査が行われ"Unix"と呼ばれるOSが誕生 した。  6年の月日が流れた。その頃ベルシステムズではマルチタスクの能力をもったシステム 「Unix」を導入し、より一層大きな効率をもたらした。システムの中には"Elmos" と呼ば れるUnixのシステムもあった。"Elmos" には多くの(大体一億ぐらいの)タスクを実行し 同じメインフレーム内で複数のユーザが使用できる能力があった。(Cosmos はElmosのシ ステムを通してアクセスされる)  現在、マイクロコンピュータのへと発展して以前と同様なマルチタスクがスケールの小 さいUnixでも実現されている(スケールは小さいが能力は以前のものより上である)一方 マイクロソフトはこの発展を観察してた。そして、Unixと似たシステム IBM Line of PC/ XT'sを発表した。これらは"Xenix"と呼ばれた(ジーニックスと発音する)UnixとXenixは どちらもIBM 機に搭載でき同じ命令を実行できる。当然異なるUnixも多く存在した(Berk ley unix、Bell System3、SystemV 等はよく知られている)"Xenix"は多くの命令のうち、 実行できないものもある。システムに関してはUnixやXenix などは独立したシステムと考 えられた。 翻訳 :: しえら