John the Ripper を使って、パスワードクラック

John the Ripper(通称john)は、強力なパスワード探索プログラムです。対応アルゴリズムは、DES、BSDI、MD5(FreeBSD)、Blowfish(OpenBSD)、Kerberos AFS、RC4(Windows2000)と多岐にわたります。そして、非常に高速です。8文字程度のパスワードは容易に探索することが可能です。


こういうツールの存在、その性能を知り、脅威と感じるならば十分な対策を練るようにしましょう。そのためにもまず、知ることが大切です。



環境

インストール
RPMforgeにはJohn the RipperRPMパッケージが用意されています。

# yum --enablerepo=rpmforge search john
(略)
john.i386 : John the Ripper password cracker

だから、インストールは簡単。yumで一発。

# yum --enablerepo=rpmforge install john

確認。

# which john
/usr/bin/john
# john
John the Ripper password cracker, ver: 1.7.9-jumbo-5 [linux-x86-sse2]
Copyright (c) 1996-2011 by Solar Designer and others
Homepage: http://www.openwall.com/john/

Usage: john [OPTIONS] [PASSWORD-FILES]
--config=FILE             use FILE instead of john.conf or john.ini
--single[=SECTION]        "single crack" mode
--wordlist=FILE --stdin   wordlist mode, read words from FILE or stdin
                --pipe    like --stdin, but bulk reads, and allows rules
--encoding=NAME           the input data is in a 'non-standard' character.
                          encoding. NAME = utf-8, koi8-r, and others. For a
                          full list, use --encoding=LIST
--rules[=SECTION]         enable word mangling rules for wordlist mode
--incremental[=MODE]      "incremental" mode [using section MODE]
--markov[=LEVEL[:opts]]   "Markov" mode (see documentation)
--external=MODE           external mode or word filter
--stdout[=LENGTH]         just output candidate passwords [cut at LENGTH]
--restore[=NAME]          restore an interrupted session [called NAME]
--session=NAME            give a new session the NAME
--status[=NAME]           print status of a session [called NAME]
--make-charset=FILE       make a charset file. It will be overwritten
--show[=LEFT]             show cracked passwords [if =LEFT, then uncracked]
--test[=TIME]             run tests and benchmarks for TIME seconds each
--users=[-]LOGIN|UID[,..] [do not] load this (these) user(s) only
--groups=[-]GID[,..]      load users [not] of this (these) group(s) only
--shells=[-]SHELL[,..]    load users with[out] this (these) shell(s) only
--salts=[-]COUNT[:MAX]    load salts with[out] COUNT [to MAX] hashes
--pot=NAME                pot file to use
--format=NAME             force hash type NAME: des/bsdi/md5/bf/afs/lm/
                          dynamic_n/bfegg/dmd5/dominosec/epi/hdaa/ipb2/krb4/
                          krb5/mschapv2/mysql-fast/mysql/netlm/netlmv2/netntlm/
                          netntlmv2/nethalflm/md5ns/nt/phps/po/xsha/crc32/
                          hmac-md5/lotus5/md4-gen/mediawiki/mscash/mscash2/
                          mskrb5/mssql/mssql05/mysql-sha1/nsldap/nt2/oracle11/
                          oracle/phpass-md5/pix-md5/pkzip/raw-md4/raw-md5thick/
                          raw-md5/raw-sha1/raw-sha/raw-md5u/salted-sha1/sapb/
                          sapg/sha1-gen/raw-sha224/raw-sha256/raw-sha384/
                          raw-sha512/xsha512/hmailserver/sybasease/crypt/trip/
                          ssh/pdf/rar/zip/dummy
--subformat=LIST          get a listing of all 'dynamic_n' formats
--save-memory=LEVEL       enable memory saving, at LEVEL 1..3
--mem-file-size=SIZE      size threshold for wordlist preload (default 5 MB)
--field-separator-char=C  use 'C' instead of the ':' in input and pot files
--fix-state-delay=N       performance tweak, see documentation
--nolog                   disables creation and writing to john.log file
--crack-status            emit a status line whenever a password is cracked
--plugin=NAME[,..]        load this (these) dynamic plugin(s)

テストユーザを準備
ユーザID: testuser1、パスワード: testuser1123というテストユーザを作成します。

# useradd testuser1
# passwd testuser1
Changing password for user testuser1.
New UNIX password: testuser1123
Retype new UNIX password: testuser1123

/etc/passwordと/etc/shadowから、解析するパスワードファイルを生成します。

# unshadow /etc/passwd /etc/shadow > /tmp/password.txt

忘れないうちにテストユーザを削除しておきましょう。うっかり削除を忘れるとセキュリティリスクとなります。

# userdel -r testuser1

設定ファイルjohn.confを用意する
さっそく実行!

# john -users:testuser1 password.txt
fopen: $JOHN/dynamic.conf: No such file or directory

あれ!?
標準の設定ファイル /etc/john.conf の最後の行

.include 

これが原因のようなので...。これが何なのか理解していないのだけど...、
設定ファイルをコピーして、

# cp /etc/john.conf  /tmp/john.conf

最後の行をコメントアウトする。

#.include <dynamic.conf>

以降、実行時には、--config=/tmp/john.conf オプションをつけて、修正済み設定ファイルを使うようにしましょう。



パスワード探索開始!
上で用意したテストユーザ、こんな簡単なパスワード(ユーザID+"123")だと、パスワードは一瞬で発見されます。

# cd /tmp
# john --config=john.conf -users:testuser1 password.txt
Loaded 1 password hash (FreeBSD MD5 [32/32])
testuser1123     (testuser1)
guesses: 1  time: 0:00:00:00 DONE (Wed Jul  4 22:13:58 2012)  c/s: 1896  trying: testuser1123
Use the "--show" option to display all of the cracked passwords reliably

最後の行にある通り、--showオプションで結果表示ってことなので実行。
見事に、パスワードがtestuser1123だということが表示されます。

# john --config=john.conf --show password.txt
testuser1:testuser1123:502:502::/home/testuser1:/bin/bash

1 password hash cracked, 2 left

オプション
最も簡単な実行は、単にパスワードファイルを指定するだけです。

$ john password.txt

こうすると、パスワードファイルに含まれるすべてのユーザを対象にすべての方法で探索を実行します。これは非常に時間が掛かるので、オプションを有効に活用しましょう。


探索対象ユーザを指定する

$ john --users:testuser1,grgrjnjn,hogeuser,foouser,baruser password.txt

暗号アルゴリズムを指定する
オプション --format を使います。指定可能なアルゴリズムは、上記のjohn実行結果(ヘルプ)を参照してください。

Linuxの場合、/etc/shadowのパスワードを見ると、先頭が$1$となっているだろう。これは、MD5が使われていることを示してる。だから、--format=MD5 を使用すると探索が早くなるんじゃないかなぁと思う。

先頭の$1$がない(古いLinuxの)場合は、DESが使われている。



モード
シングルル・ラックモード --single
ユーザ名をもとにパスワードを推測。今回試したような安易なパスワードはこのモードで一瞬で探索されてしまいます。

ワードリストモード --wordfile:mydictionary.txt
辞書攻撃を行います。標準で用意された辞書もあります(/usr/share/john/password.lst)が、貧弱(3500件程度)なので、別途用意したほうが良いでしょう。

インクリメンタルモード --incremental:All
すべての組み合わせのパスワードを総当りで試します。
ルールは指定することも可能です。--incremental:Alpha --incremental:LenMan



その他
実行中に何かキー入力すると、進捗状況が表示されます。

# john --config=john.conf -users:root password.txt
Loaded 1 password hash (FreeBSD MD5 [32/32])
guesses: 0  time: 0:00:00:07 8.00% (2) (ETA: Wed Jul  4 22:44:24 2012)  c/s: 1808  trying: single1
guesses: 0  time: 0:00:00:19 20.93% (2) (ETA: Wed Jul  4 22:44:27 2012)  c/s: 1811  trying: geronimo!
...

以上

ホスト上でのデーモンの確認

psコマンドで、プロセスを確認できる。

確認の視点

  • 正しいユーザ権限で実行されているか
  • PIDが、/var/run/.pid のpidと一致しているか
  • 余分な関連プロセスやスレッドが起動していないか


netstatコマンドで、LISTENしているポートがわかる。
詳しくは、こちら
netstatでネットワークの統計情報を得る - ギリギリギリギリジンジン ギリギリギリジンジンジン


lsofコマンドで、もっと詳細に利用しているポートを調査できる。
稼働中のデーモンを、ポートから調査したい場合は、-iオプションでIPアドレスとポート番号を指定します。アドレスは省略可能。

# lsof -i :80
COMMAND    PID   USER   FD   TYPE DEVICE SIZE NODE NAME
httpd.wor  764   root    3u  IPv6 741373       TCP *:http (LISTEN)
httpd.wor 9948 apache    3u  IPv6 741373       TCP *:http (LISTEN)





参考

Amazon URL
タイトル 萌えるシリーズ 萌え萌えうにっくす! UNIXネットワーク管理ガイド  PC UNIXネットワーク管理日々の疑問に萌えの一手
著者 プロジェクトタイムマシン
価格 3,780円
ISBN 978-4839909550
発売日 2003/03
正誤表 -

オンデマンド(注文を受けてからの個別印刷)で購入できます。

netstatでネットワークの統計情報を得る

table of contents

  • none: 現在確立されている接続情報
  • -a: 全ての情報
  • -i: インタフェース情報
  • -s: プロトコル別統計情報
  • -r: ルーティング情報


ネットワーク接続状況の確認
netstatをオプション無しで実行すると、現在確立されている接続の一覧が表示されます。"ESTABLISHED"は接続が確立された状態を示しています。
また、-aオプションをつけて実行することで、全ての情報を表示させて、不要なサービスが動いていないかなども確認することができます。

# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 v-183-181-170-206.ub-f:http softbank219195034012.:58587 TIME_WAIT
tcp        0    232 v-183-181-170-2:quest-agent softbank219195034012.:52489 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ]         DGRAM                    699968 @/org/kernel/udev/udevd
unix  9      [ ]         DGRAM                    709629 /dev/log
unix  2      [ ]         DGRAM                    688315424
unix  3      [ ]         STREAM     CONNECTED     688313973
unix  3      [ ]         STREAM     CONNECTED     688313972
unix  2      [ ]         DGRAM                    688313966
unix  3      [ ]         STREAM     CONNECTED     664162443
unix  3      [ ]         STREAM     CONNECTED     664162442
unix  3      [ ]         STREAM     CONNECTED     664162441
unix  3      [ ]         STREAM     CONNECTED     664162440
unix  3      [ ]         STREAM     CONNECTED     664162282
unix  3      [ ]         STREAM     CONNECTED     664162281
unix  3      [ ]         STREAM     CONNECTED     664162023
unix  3      [ ]         STREAM     CONNECTED     664162022
unix  2      [ ]         DGRAM                    749313
unix  2      [ ]         DGRAM                    747263
unix  2      [ ]         DGRAM                    733710
unix  2      [ ]         DGRAM                    733483
unix  2      [ ]         DGRAM                    728012
# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 localhost.localdo:oa-system *:*                         LISTEN
tcp        0      0 localhost.localdomain:smtp  *:*                         LISTEN
tcp        0      0 *:https                     *:*                         LISTEN
tcp        0      0 *:quest-agent               *:*                         LISTEN
tcp        0      0 *:http                      *:*                         LISTEN
tcp        0      0 v-183-181-170-206.ub-f:http softbank219195034012.:58587 TIME_WAIT
tcp        0    476 v-183-181-170-2:quest-agent softbank219195034012.:52489 ESTABLISHED
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     664162433 /tmp/passenger.1.0.764/generation-5/socket
unix  2      [ ACC ]     STREAM     LISTENING     664162438 /tmp/passenger.1.0.764/generation-5/spawn-server/socket.9936.160331056
unix  2      [ ACC ]     STREAM     LISTENING     749314 /var/run/saslauthd/mux
unix  2      [ ]         DGRAM                    699968 @/org/kernel/udev/udevd
unix  2      [ ACC ]     STREAM     LISTENING     664162722 /tmp/passenger.1.0.764/generation-5/logging.socket
unix  2      [ ACC ]     STREAM     LISTENING     749201 /tmp/.font-unix/fs7100
unix  9      [ ]         DGRAM                    709629 /dev/log
unix  2      [ ]         DGRAM                    688315424
unix  3      [ ]         STREAM     CONNECTED     688313973
unix  3      [ ]         STREAM     CONNECTED     688313972
unix  2      [ ]         DGRAM                    688313966
unix  3      [ ]         STREAM     CONNECTED     664162443
unix  3      [ ]         STREAM     CONNECTED     664162442
unix  3      [ ]         STREAM     CONNECTED     664162441
unix  3      [ ]         STREAM     CONNECTED     664162440
unix  3      [ ]         STREAM     CONNECTED     664162282
unix  3      [ ]         STREAM     CONNECTED     664162281
unix  3      [ ]         STREAM     CONNECTED     664162023
unix  3      [ ]         STREAM     CONNECTED     664162022
unix  2      [ ]         DGRAM                    749313
unix  2      [ ]         DGRAM                    747263
unix  2      [ ]         DGRAM                    733710
unix  2      [ ]         DGRAM                    733483
unix  2      [ ]         DGRAM                    728012


インタフェース別の統計情報の確認
netstatでは、-iオプションを用いることで、指定したインタフェースの情報を得ることができます。取得できる情報は、MTU(最大転送単位)や、RX(受信)及びTX(送信)のパケット情報などです。

# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
lo        16436   0        0      0      0      0        0      0      0      0 LRU
venet0     1500   0    51095      0      0      0    39750      0      0      0 BOPRU
venet0:0   1500   0      - no statistics available -                            BOPRU


プロトコル別の統計情報の確認
netstatでは、-sオプションを利用することでプロトコル別の統計情報を一覧することができます。確認できるプロトコルは、IP、ICMP、TCPUDPとなります。これにより各種エラー、受診したパケット数、破棄されたパケット数などが分かるので、ネットワークの負荷の状況や、障害発生時の原因究明に役立てることができます。

# netstat -s
Ip:
    49920 total packets received
    0 forwarded
    0 incoming packets discarded
    49920 incoming packets delivered
    38914 requests sent out
Icmp:
    419 ICMP messages received
    303 input ICMP message failed.
    ICMP input histogram:
        destination unreachable: 300
        timeout in transit: 27
        echo requests: 72
        echo replies: 20
    859 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 785
        echo request: 2
        echo replies: 72
IcmpMsg:
        InType0: 20
        InType3: 300
        InType8: 72
        InType11: 27
        OutType0: 72
        OutType3: 785
        OutType8: 2
Tcp:
    922 active connections openings
    1184 passive connection openings
    45 failed connection attempts
    6 connection resets received
    1 connections established
    38230 segments received
    37498 segments send out
    306 segments retransmited
    48 bad segments received.
    3137 resets sent
Udp:
    1096 packets received
    11364 packets to unknown port received.
    0 packet receive errors
    1096 packets sent
UdpLite:
error parsing /proc/net/netstat: No such file or directory


ルーティングテーブルの確認
netstatでルーティングテーブルを確認するには-rオプションを使用します。-nオプションは、ホスト名を逆引きせずにIPアドレスのみを出力するもので、必要に応じて使用すると良いでしょう。
ルーティングのフラグ

U ルーティングが有効
G ゲートウェイへのルーティング
H ホストへのルーティング
S 手動で作成
C 新しい経路を生成する
D リダイレクトによる動的な生成
M リダイレクトによる動的な変更
W Cloneの経路に基づいて自動的に生成された経路
# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.0.2.0       0.0.0.0         255.255.255.0   U         0 0          0 venet0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 venet0
0.0.0.0         192.0.2.1       0.0.0.0         UG        0 0          0 venet0

参考

Amazon URL
タイトル 萌えるシリーズ 萌え萌えうにっくす! UNIXネットワーク管理ガイド  PC UNIXネットワーク管理日々の疑問に萌えの一手
著者 プロジェクトタイムマシン
価格 3,780円
ISBN 978-4839909550
発売日 2003/03
正誤表 -

オンデマンド(注文を受けてからの個別印刷)で購入できます。

CentOS6.2で、SSH接続が遅いときの解決方法

「login as: 」と表示され、ログインIDを入力したあと、パスワードを聞かれるまで長い時間待たされる。そんな症状に出くわすことがある。動作は微妙に異なるかもしれないが、要するにssh接続/sshログインに時間がかかる場合の解決策。


環境

  • CentOS6.2
  • OpenSSH_5.3p1


/etc/ssh/sshd_config
修正前:

#GSSAPIAuthentication no
GSSAPIAuthentication yes

修正後:

GSSAPIAuthentication no
#GSSAPIAuthentication yes

設定反映

$ sudo /sbin/service sshd reload
sshd を再読み込み中:                                       [  OK  ]


同じ設定ファイルのこちらの設定を指摘しているサイトが多いけど、CentOS6.2に関して言えば、デフォルトで「GSSAPIAuthentication yes」なので、上記のほうが原因。こっちの「UseDNS」は、変更しなくても症状は改善した。

#UseDNS yes
↓
UseDNS no


参考
IPv6が原因」という別の原因もあげており、参考になる。
sshの接続確立が遅い場合の対処方法 - yuyarinの日記

ユーザ、アクセス元IPアドレスでsshの接続制限をする

プログラムからsshを使うために、認証なしでsshを使いたいことがある。そういうときは、公開鍵認証を使い、パスワードなし、パスフレーズなしでログイン可能となるように設定する。しかし、ここで一抹の不安を感じる。もし、この秘密鍵が漏洩したら・・・。簡単にサーバーへのログインを許してしまう。これはセキュリティ上問題ではないだろうか・・・?


そこで、公開鍵認証に加えて、ログインを許可するアクセス元IPアドレスを制限する

例えば、サーバー間接続に使用しているプライベートアドレスからだけログインを許可するように設定する。そうすれば、万が一、公開鍵が漏洩しても、インターネット越しに直接ログインを許すことはない。



以下の設定は、Red Hat Enterprise Linux 6 (RHEL6)とCentOS6で動作確認している。


設定する箇所を3つ。

/etc/pam.d/ssh

以下の箇所に追記する。

account    required     pam_nologin.so
account    required     pam_access.so
account    include      system-auth

/etc/ssh/sshd_config

UsePAMがnoならばyesにする。

UsePAM yes

/etc/security/access.conf

例)grgrjnjnユーザのログインを、10.9.40.1からのみ許可して、それ以外からのログインは拒否する設定。

- : grgrjnjn : ALL EXCEPT 10.9.40.1

設定の反映

$ sudo /sbin/service sshd reload


以上

『実用Git』Jon Loeliger (著)

購入 URL
タイトル 実用Git
著者 Jon Loeliger
価格 2,940円
ISBN 978-4873114408
発売日 2010/2/19
判型 大型本: 372ページ
正誤表 -


さすが、オライリー本。充実した内容、丁寧で明瞭な説明。しっかりgitを習得したいなら、この本。

Amazonの「Product Advertising API」をRubyで使うには

Amazonの「Product Advertising API」は、2011年10月26日にAPI仕様が変更されています。ググると、古い情報がヒットするので注意して、2011年10月26日以降の情報を得るようにしましょう


参考: Product Advertising API の仕様変更について
参考: 開発者ガイド(日本語参考訳)
参考: Amazonの商品広告をサイトに表示しましょう!


アカウント作成
アカウントを作成して、アクセスキーとシークレットアクセスキーを得る必要があります。
こちらからアカウントを作成します。
https://affiliate-program.amazon.com/gp/flex/advertising/api/sign-in-jp.html


ライブラリ
こちらで様々な言語向けライブラリが紹介されている。
http://aws.amazon.com/code/Product%20Advertising%20API?_encoding=UTF8&jiveRedirect=1


ruby-aaws 0.7.0 を使ってみる
ruby-aawsは、2010年3月にバージョン0.8.1で更新が止まっている。gemでインストールされるのは、バージョン0.7.0。こんな状況なので、どうかと思うが。。。とりあえず、インストールしてみる。

$ sudo gem install ruby-aaws
Fetching: ruby-aaws-0.7.0.gem (100%)
Successfully installed ruby-aaws-0.7.0
1 gem installed
Installing ri documentation for ruby-aaws-0.7.0...
Installing RDoc documentation for ruby-aaws-0.7.0...

力尽きた。。。(はやっ!)