RHEL9で作る自宅サーバ:パスワード・クラックとユーザの作成

RHEL9パソコン自宅サーバ

既存のシステムからユーザを移行するのですが、古いシステムのため、ほとんどのユーザが放置されています。

そこでユーザを以下のようにユーザを処置することにしました。

  • データが何もなくログインしていないユーザは黙って削除
  • ログインしてないが、データが残っているユーザはアカウントをロック
  • ログインしているユーザは、パスワードハッシュを確認し、古い形式(DESやMD5)であれば最新のものに変更する

3番目のパスワードの形式を変更するには、パスワードそのものが、わからなければいけません。
そこで、John The Ripperをインストールしてパスワードをクラックします。

John The Ripperのインストール

現行のOSはCentOS7ですが、ソースからインストールするので、RHEL9でも同様だと思います。

公式サイトから1.9.0-jumbo-1 sourcesファイルをダウンロードします。

[root@myhome build]# wget https://www.openwall.com/john/k/john-1.9.0-jumbo-1.tar.gz
--2024-03-14 11:58:41--  https://www.openwall.com/john/k/john-1.9.0-jumbo-1.tar.gz
www.openwall.com (www.openwall.com) をDNSに問いあわせています... 193.110.157.242
www.openwall.com (www.openwall.com)|193.110.157.242|:443 に接続しています... 接 続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 44303366 (42M) [application/octet-stream]
`john-1.9.0-jumbo-1.tar.gz' に保存中

100%[======================================>] 44,303,366   262KB/s 時間 4m 7s

2024-03-14 12:02:49 (175 KB/s) - `john-1.9.0-jumbo-1.tar.gz' へ保存完了 [44303366/44303366]

[root@myhome build]# tar xfz john-1.9.0-jumbo-1.tar.gz
[root@myhome build]# ls john-1.9.0-jumbo-1
CONTRIBUTING.md  README.md  doc  run  src
[root@myhome build]# cd john-1.9.0-jumbo-1/src/
[root@myhome john-1.9.0-jumbo-1]# cd 
[root@myhome src]# ./configure --help
`configure' configures john jumbo to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...
:
省略
:
Installation directories:

By default, `make install' will install all the files in `../run'
You can specify location other than `../run' using `--prefix',
for instance `--prefix=$HOME/bin'.
:
省略
:
[root@myhome src]#

インストール先は`../run’になるようですね。特にオプションを変更する必要はなさそうなので、configureを実行します。

[root@myhome src]# ./configure
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking whether to compile using MPI... no
checking for gcc... gcc
:
省略
:
Configured for building John the Ripper jumbo:

Target CPU ................................. x86_64 AVX2, 64-bit LE
AES-NI support ............................. depends on OpenSSL
Target OS .................................. linux-gnu
Cross compiling ............................ no
Legacy arch header ......................... x86-64.h

Optional libraries/features found:
Memory map (share/page large files) ........ yes
Fork support ............................... yes
OpenMP support ............................. yes (not for fast formats)
OpenCL support ............................. no
Generic crypt(3) format .................... yes
libgmp (PRINCE mode and faster SRP formats)  no
128-bit integer (faster PRINCE mode) ....... yes
libz (pkzip and some other formats) ........ yes
libbz2 (gpg2john extra decompression logic)  yes
libpcap (vncpcap2john and SIPdump) ......... no
OpenMPI support (default disabled) ......... no
ZTEX USB-FPGA module 1.15y support ......... no

Install missing libraries to get any needed features that were omitted.

Configure finished.  Now "make -s clean && make -sj4" to compile.
[root@myhome src]#

問題なく完了しました。次に指示があるようにmakeを実行します。

[root@myhome src]# make -s clean && make -sj4
ar: aes.a を作成しています
ar: ed25519-donna.a を作成しています
ar: secp256k1.a を作成しています

Make process completed.
[root@myhome src]#

コンパイル&インストールも問題なく終わりました。

パスワードのクラック実行

パスワードファイルに書かれているハッシュ値は以下のようなものがあります。

  • 先頭に$がないもの → DES
  • $1 から始まるもの → MD5
  • $5 から始まるもの → SHA-256
  • $6 から始まるもの → SHA-512 (Ubuntu 21.04 や CentOS 8など)
  • $2a から始まるもの → bcrypt 2a(Blowfish) (OpenBSD や SUSE Linuxなど)

1990年代から運用しているサーバなので、DESやMD5のパスワードが残っています。これらをクラックしてパスワードを見つけてみます。

[root@myhome src]# cd ../run
[root@myhome run]# ./unshadow /etc/passwd /etc/shadow > passwdfile

まず、インストールしたディレクトリ../runに移動して、パスワードファイルをJohn The Ripperの理解できる形式に変更します。

[root@myhome run]# ./john --format=descrypt passwdfile --max-length=8
Using default input encoding: UTF-8
Loaded 14 password hashes with 14 different salts (descrypt, traditional crypt(3) [DES 256/256 AVX2])
Remaining 4 password hashes with 4 different salts
Will run 2 OpenMP threads
Proceeding with single, rules:Single, lengths:0-8
Press 'q' or Ctrl-C to abort, almost any other key for status
Warning: Only 361 candidates buffered for the current salt, minimum 512 needed for performance.
Almost done: Processing the remaining buffered candidate passwords, if any.
Warning: Only 131 candidates buffered for the current salt, minimum 512 needed for performance.
Warning: Only 29 candidates buffered for the current salt, minimum 512 needed for performance.
Warning: Only 378 candidates buffered for the current salt, minimum 512 needed for performance.
Proceeding with wordlist:./password.lst, rules:Wordlist, lengths: 0-8
Proceeding with incremental:ASCII, lengths: 0-8
0g 0:01:41:15  3/3 0g/s 3663Kp/s 14653Kc/s 14653KC/s sndkmgm..sndk5ts
0g 0:02:19:40  3/3 0g/s 3675Kp/s 14703Kc/s 14703KC/s pjstevaz..pjsta10!
0g 0:03:29:00  3/3 0g/s 3540Kp/s 14160Kc/s 14160KC/s o6gh9lf..o6g1crs
0g 0:03:52:08  3/3 0g/s 3512Kp/s 14051Kc/s 14051KC/s hjrran45..hjrryays
※パスワード1※         (※アカウント1※)
※パスワード2※         (※アカウント2※)
2g 0:11:02:12  3/3 0.000050g/s 4621Kp/s 14028Kc/s 14028KC/s JPWN479..JPWN@m!
2g 0:12:25:04  3/3 0.000044g/s 4791Kp/s 13836Kc/s 13836KC/s ew3nkwme..ew3tw376
Use the "--show" option to display all of the cracked passwords reliably
Session aborted
[root@myhome run]#

john コマンドのオプションをDES形式、パスワードの長さは8桁(DES形式は最大長8桁なので)を指定して実行してみました。

すると、2つのパスワードが見つかりました。

ちなみにjohn コマンドは単純なパスワード→パスワードリスト(デフォルトでは./password.lst)→総当たりの順番でパスワードを探します。
何かキーを押すと 0g 0:01:41:15 3/3 0g/s 3663Kp/s 14653Kc/s 14653KC/s sndkmgm..sndk5ts のように実行中の速度が表示されます。

この意味は

  • 見つけた鍵の数(g)
  • 実行時間
  • 1秒あたりの見つけた鍵の数 (g/s)
  • 1秒あたりのテストされるパスワード候補の数(p/s)
  • 1秒あたりの パスワード ハッシュまたは暗号を計算した数(c/s)
  • 1秒あたりのパスワード候補とターゲット ハッシュの組み合わせの数(C/s)

となります。

利用中のアカウントのパスワードが見つかったら、SHA-512形式で暗号化しなおして、使っていないアカウントはパスワードを削除してアカウントロックすることにしました。

ユーザーの作成

グループおよびユーザの追加は以下のコマンドを使います。

[root@ace ~]# vi /etc/group
でグループを追加
[root@ace ~]# adduser -u ユーザID  -g グループID -c "コメント" ユーザ名
でユーザの追加

ユーザ毎にグループを作成していた場合、グループを先に作ったほうが良いです。

ユーザのパスワードを設定する際、パスワードがわからなければ/etc/shadowに書かれているパスワードハッシュをそのままコピーします。

[root@ace ~]# vipw -s
:
ユーザID:!!:作成日付:0:99999:7:::
を
:
ユーザID:$6$...(パスワードハッシュ):作成日付:0:99999:7:::
に編集

vipw -s コマンドで/etc/shadowを編集します。作成したユーザはパスワードハッシュのところに「!!」と書かれています。これはアカウントロックの設定なので、これを削除し、移行元のサーバに定義されているパスワードハッシュをコピーしておきます。

また、古いDESやMD5形式のハッシュをパスワードクラックして元のパスワードがわかっている場合、

[root@ace ~]# passwd ユーザID
ユーザー ユーザID のパスワードを変更。
新しい パスワード:
新しい パスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@ace ~]#

のように最新の形式に編集しておきます。

ちなみに最新の形式のパスワードハッシュは「ハッシュから総当たりで計算して元のパスワードを調べるのに時間がかかる」というだけで、単純なパスワードを設定していた場合、すぐにクラックされてしまいます。

サーバ管理者としてはJohn The Ripperでパスワードチェックして単純なものが使われていないかを調べておくのも良いかもです。

お勧めのKindle本です!

コメント