John the Ripper を使って、パスワードクラック
John the Ripper(通称john)は、強力なパスワード探索プログラムです。対応アルゴリズムは、DES、BSDI、MD5(FreeBSD)、Blowfish(OpenBSD)、Kerberos AFS、RC4(Windows2000)と多岐にわたります。そして、非常に高速です。8文字程度のパスワードは容易に探索することが可能です。
こういうツールの存在、その性能を知り、脅威と感じるならば十分な対策を練るようにしましょう。そのためにもまず、知ることが大切です。
環境
- CentOS5
- RPMforgeが使えること
インストール
RPMforgeにはJohn the RipperのRPMパッケージが用意されています。
# 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、TCP、UDPとなります。これにより各種エラー、受診したパケット数、破棄されたパケット数などが分かるので、ネットワークの負荷の状況や、障害発生時の原因究明に役立てることができます。
# 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
#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/security/access.conf
例)grgrjnjnユーザのログインを、10.9.40.1からのみ許可して、それ以外からのログインは拒否する設定。
- : grgrjnjn : ALL EXCEPT 10.9.40.1
設定の反映
$ sudo /sbin/service sshd reload
以上
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...
力尽きた。。。(はやっ!)
