いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.112 / 読者数:1100名

こんばんは、うすだです。

台風4号、あっという間に大暴れして過ぎ去っていきましたね。

ここ名古屋でも、台風の通過に備えていましたが、カメは大丈夫だろうと思って、 ベランダに出しっぱなしにしていました。

しかし、夜中になって、風がかなり強くなってきたので、ちょっと心配になり、 部屋の中へ水槽を入れることにしました。
すると、水槽の水位が、いつもの 1.5倍くらいになっていました。

台風というと、風にばかり注目してしまいがちですが、 雨もすごいんだなということが、よくわかりました。

まあ、カメが溺れ死ぬことはないと思いますが、 それでも早めに気づいてよかったと思います。カメは、いつも通り、 のんきにしていましたけど。

どうでもいい話が終わったところで、今週も、はりきってまいりますよ!

今週のお題 - パスワードを推測する

先週は、 shadow ファイルのパスワード・フィールドに記述される文字の作成方法について、 ご紹介しました。

Vol.111 - パスワードの暗号化について理解する
http://www.usupi.org/sysad/111.html

今週は、一歩進んで、パスワードを推測してみたいと思います。

…え? それって、システム管理とどう関係があるの…?

という疑問を持たれた貴兄も多いのではないかと思いますが、いやいや、 侵入される側としましては、侵入する側の行動を推測することで、 侵入に備えることができると思うのです。

そんなこじつけっぽい理由に納得されたかたも、 技術的に興味を持たれただけのかたも、楽しんでいただけますと幸いです。


とはいえ、あくまで初心者向けのメルマガを謳ってますから、 難しい方法をご紹介するわけにはいきません。(わたし自身詳しくありませんし。)

ですので、以降では、侵入を試みるサーバの /etc/shadow が手元にあると仮定して、 パスワード・フィールドが一致するパスワードを捜し当てるという、 地道かつ力業な方法で、パスワードを見つけてみようと思います。


まずは、前回もご紹介した、パスワード・フィールドの求め方を、 ここでおさらいしておきましょう。

ひとことで済ませてしまいますと、crypt という関数で作成できます。

  char *crypt(const char *key, const char *salt);

生のパスワードである key と、 結果が一意にならないようにするための salt を引数に指定すると、 暗号化された文字列が得られます。

salt に、先頭が $1$ ではじまる文字列(8文字まで)を指定しますと、 MD5 で暗号化してくれます。 そうでない2文字を指定しますと、DES で暗号化してくれます。

前回ご紹介した makepasswd.pl というスクリプトの実行結果を、以下に示します。 (1つ目の引数が生パスワード、2つ目が salt です。)

  % ./makepasswd.pl himitsu '$1$abcdefgh'
  $1$abcdefgh$elthZDKF7958/mgl.dsRr1
  % ./makepasswd.pl himitsu NO
  NOUXymID1zFK.

生成された文字列の先頭に、salt がそのまま入るところがミソですね。


さて、ここで、shadow ファイルが手元にある、 つまり暗号化されたものがわかっているとして、 パスワードを推測してみたいと思います。

ようは、パスワードの候補を、片っ端から crypt で変換していき、 それが暗号化された文字列と一致すれば、 それが生のパスワードだということになります。よね。

そんな力業を行うスクリプトを、Perl でちゃちゃっと書いてみました。

  #!/usr/bin/perl
  if($#ARGV < 0 || $#ARGV > 2) {
      print STDERR "Usage: $0 username [encrypted_passwd]\n";
      exit 1;
  }
  my $name = shift;
  my $crypted = ($#ARGV < 0) ? (getpwnam($name))[1]:shift;
  if($crypted eq "x") {
      print STDERR "Cannot get password.\n";
      exit 2;
  }
  while(<>) {
      chop;
      if(crypt($_, $crypted) eq $crypted) {
          print "${name}'s password: $_\n";
          exit 0;
      }
  }
  print "Cannot found...\n";
  3;

引数に、ユーザ名だけを指定すると、そのマシンのユーザのパスワードを推測します。 ユーザ名だけでなく、暗号化されたパスワードも引数に指定すると、 暗号化されたパスワードの元になる生パスワードを推測します。

ユーザ名は、$name という変数に、 暗号化されたパスワードは $crypted という変数に格納します。
引数がユーザ名だけの場合は、getpwnam という関数を使って、 システムに登録されている暗号化されたパスワードを入手します。
(当り前ですが、入手するには root の権限が必要です。)

あとは、標準入力からパスワードの候補を得て、順番に crypt で試していくだけです。 見つかったら、生パスワードを出力して終了します。

 

なにはともあれ、実行してみましょう。
まず、上記のスクリプトを searchpasswd.pl という名前で保存します。
そして、test ユーザのパスワードが chestnut だった場合、 root で以下のように実行しますと…

  # ./searchpasswd.pl test < /usr/share/dict/words
  test's password: chestnut

ああ、簡単にばれてしまいました。
ちなみに、ここでは、パスワードの候補として、 /usr/share/dict/words を使用しています。

root の権限を得られないひとは、自作自演で我慢しましょう。

  % ./makepasswd.pl architect '$1$01234567'
  $1$01234567$WT4E.pY2L4lgi6WRUi6j1
  % ./searchpasswd.pl test '$1$01234567$WT4E.pY2L4lgi6WRUi6j1' \
  < /usr/share/dict/words
  test's password: architect

もちろん、/usr/share/dict/words にないパスワードは、さすがに見つけられません。

  % grep himitsu /usr/share/dict/words
  % ./makepasswd.pl himitsu NO
  NOUXymID1zFK.
  % ./searchpasswd.pl test 'NOUXymID1zFK.' < /usr/share/dict/words
  Cannot found...

以上、パスワードを推測するための、超簡単な方法をご紹介しました。

ご紹介したスクリプトは、ものすごくたいしたことないですが、それでもやっぱり、 悪いことには使わないようにしていただきたいと存じます。

実際には、辞書にある言葉をそのままパスワードにしている、 なんてことはないはずですので、力業で見つけるには、 もうちょいひねる必要があると思います。(この話題は、宿題へと続きます。)

宿題の答え

先週の宿題は、

  /etc/shadow を直接書き換えて、パスワードを変更してみましょう。

でした。

まず、vi 等のエディタで直接変更する際に、注意することがあります。
それは、同時に複数の管理者が直接編集したときに、 おかしくなる可能性があることです。

それを回避するためのコマンドに、vipw なるものがあります。
vipw コマンドを使用すると、下記のようにロックがかかります。 これのおかげで、複数の管理者が同時に変更するおそれがなくなります。

  # vipw &
  # vipw
  vipw: そのファイル password は使用中です (現在は /etc/ptmp)

さて、vipw を起動しますと、/etc/passwd の編集画面になるのですが、 変更したふりをすると(1文字消して同じ文字を書く等)、 /etc/shadow も編集を行うか聞いてきます。 そこですかさず y と答えてください。
(ちなみに、お好みのエディタがある場合は、環境変数 EDITOR に指定をしましょう。 vipw コマンド実行時に、それが立ち上がります。)

管理者はわしひとりじゃい! とか、 お試し環境なのでどうなってもいいよという場合は、 普通のエディタでやっちゃってください。

 

…おっと、前置きが長くなりました。本題に入りましょう。

まずは、先週の Perl スクリプトを使用して、 パスワード・フィールドに書くものを求めます。

  % ./makepasswd.pl test1 '$1$abcdefgh$'
  $1$abcdefgh$m0INEKWW1jrRTfpNdto3a/

パスワードは test1 です。
そして、設定したいユーザのパスワード・フィールドに書きます。
たとえば test ユーザに設定するには、/etc/shadow の、

  test:!!:13476::::::

などとなっている行を、以下のように書き換えます。

  test:$1$abcdefgh$m0INEKWW1jrRTfpNdto3a/:13476::::::

…それだけです。
書き換えたら、su や ssh などのコマンドで、確認してみましょう。

 

ちなみに、上記パスワードは、/etc/passwd に直接書いても、有効です。

  test:x:101:99::/home/test:/bin/sh

などとなっている行を、以下のように書き換えます。

  test:$1$abcdefgh$m0INEKWW1jrRTfpNdto3a/:101:99::/home/test:/bin/sh

/etc/passwd のほうが有効であることを確認するために、 /etc/shadow のパスワード・フィールドを x にしておくと、はっきりわかります。

 

さらにちなみに、パスワード・フィールドの先頭に、 * などの関係のない文字を挿入しますと、ログイン等ができなくなります。

  test:*$1$abcdefgh$m0INEKWW1jrRTfpNdto3a/:101:99::/home/test:/bin/sh

一時的に使えなくしたいとき(あとで復活させたいとき)などに、便利かもしれません。

今週の宿題

今週の宿題は、

  パスワードの推測を、もっと複雑にしてみましょう。

です。

/usr/share/dict/words の言葉だけでは、ほとんど一致しないはずです。
そこで、候補に数字や記号を挿入するなどして、試してみましょう。

悪用するなと言っておきながら、この宿題はいかがなものか、という気もしますので、 あくまでも、技術的な観点のみで考えてくださいませ。

あとがき

前々から、情報過多と言われているこの世の中ですが、それでも、 情報は多いほうがいいと思い、いろんなメルマガを購読していました。

ですが、ここのところ、あまりにも斜めな斜め読みをしているなと思い、 思い切って、ごっそり減らしてみることにしました。

しかし、言うはやすしとかなんとかで、実際やってみると、けっこう大変でした。

まぐまぐから発行されているメルマガは、一括解除できるから楽なのですが、 独自配信しているところは、ひとつずつ解除しないといけません。

しかも、メールアドレスを書いてぽちっと解除ボタンを押すだけ、 にしてくれればいいのに、ログインが必要だったり、 パスワードが必要だったりしたのには、ああもうって感じでした。

これからは、このサイトにメールアドレスを教えてもいいか、 本当にこのメルマガは読むに値するか、といったことをじっくり考えてから、 登録をしようと思います。

結局、流行りの技術やキーワードを知っていても、自らの手で実践して、 自分のモノにしない限りは、あまり意味がないですよね。
また、ほんとうに大事なことは、何年たっても色褪せないはずです。
まわりのノイズに惑わされることなく、どっしり腰を落ち着けて、 技術をモノにしていくべきだと、あらためて思いました。

というわけで、みなさんもこれを機会に、 購読しているメルマガの整理をしてみてはいかがでしょうか。
このメルマガが購読に値しないと思った場合は、 それもまたしかたのないことだと思います。 ばっさりと切り捨ててくださいまし。(TεT)

 

今週も、ここまで読んでいただき、ありがとうございました。
それでは、また来週に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−栗の絵しか描いていません。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本