特定のパスワードを持つユーザーを確認する

特定のパスワードを持つユーザーを確認する

を使って、多数のサーバーからすべてのデフォルトのユーザー パスワードを削除しようとしていますansible。まず、現在のパスワードが であるすべてのユーザーの名前を出力したいと思いますfoobar。どうすればこれを実現できますか?

当初の目的は、ハッシュを取得し/etc/shadowgrepそれを取得することでしたが、ソルト処理のためこれは機能しません。

このためには独自のハッシュを計算して比較する必要がありますか? それとも、より速くて簡単な方法がありますか?

答え1

パスワードの脆弱性をチェックするための専用ツールがあります:ジョン・ザ・リッパー利用可能であり、おそらくすべての一般的な Unix および Linux フレーバーでパッケージ化されています。

以下はDebian GNU/Linux 9での使用例です(影を消すやってくるジョン)。パスワードファイルを操作する際には注意が必要です。これは単なるPoCです。ジョン適切なパスワード ファイルが提供されている限り、コマンドはリモートで実行できます (したがって、専用システム以外の場所にインストールすることはできません)。

セットアップ(パスワード設定を含む)フーバーアカウントへテスト):

# echo test:foobar | chpasswd
# grep ^test: /etc/shadow
test:$6$84SIejUB$qM5UulJEIiwjOc4PWXYupWoyU/jMP0rKA8cM1g8CEOgxMlC.x4ndbbdRq438rjKb.6UwCoTqzvgxoi0h51Kpm1:18050:0:99999:7:::
# unshadow /etc/passwd /etc/shadow > /root/workpasswd
# echo foobar > /tmp/wordlist

禁止/デフォルトのパスワードをテストします。

# john -wordlist:/tmp/wordlist /root/workpasswd
Created directory: /root/.john
Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
foobar           (test)
1g 0:00:00:00 100% 5.882g/s 5.882p/s 17.64c/s 17.64C/s foobar
Use the "--show" option to display all of the cracked passwords reliably
Session completed

結果:

# john -show /root/workpasswd 
test:foobar:1001:1001:,,,:/home/test:/bin/bash

1 password hash cracked, 2 left

掃除:

# rm -r /root/workpasswd /root/.john /tmp/wordlist

答え2

各ユーザーとしてログインしてみてはいかがでしょうか?例:

echo "foobar" | su username

一時的にTTYチェックを無効にする

答え3

既存のユーザーのパスワードをチェックする小さな C スニペットを次に示します。

次のスニペットを次のファイルに保存します。checkpass.c

#include <pwd.h>
#include <shadow.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <crypt.h>

static int pwcheck (char *user, char *passwd)
{
    struct passwd *pw;
    struct spwd *spwd;
    char *epasswd, *cpasswd;
    char *tty;

    if ((pw = getpwnam(user)) == NULL) {
        return 1;
    }
     /*
     * XXX If no passwd, let them login without one.
     */
    if (pw->pw_passwd[0] == '\0') {
        return 0;
    }
    spwd = getspnam(user);
    cpasswd = (spwd ? spwd->sp_pwdp : pw->pw_passwd);

    epasswd = crypt(passwd, cpasswd);
    if (epasswd == NULL) {
        return 2;
    }
    if (strcmp (epasswd, cpasswd)) {
        return 1;
    }

    return 0;
}

int main (int argc, char *argv[])
{
    if (argc < 3) return 4;
    return pwcheck (argv[1], argv[2]);
}

次のコマンドを使用して上記のコードをコンパイルします。

gcc -o checkpass checkpass.c -lcrypt

次に、コマンド ラインから次のコマンドを実行します。

while IFS=: read -r user _; do
  if ./checkpass "$user" foobar; then
    printf 'The ollowing user %s has the password set to foobar\n' "$user";
  fi;
done </etc/passwd

可能性は低いかもしれませんが、うまくいくはずです!

答え4

私は余分なソフトウェアをインストールするのが好きではなく、いじりたくないのでsudoers、最終的に私がやったことは

sshpass -p foobar ssh -o PreferredAuthentications=keyboard-interactive,password -o PubkeyAuthentication=no user@host

その後、Ansible で終了コードを確認します。パスワードが正しければ終了コードは 0 になり、そうでない場合は 5 になります。

これは明らかに、SSH サーバー設定でパスワード認証が許可されている場合にのみ機能します。

関連情報