檢查哪些使用者有特定密碼

檢查哪些使用者有特定密碼

我正在嘗試刪除一組伺服器上的所有預設用戶密碼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 伺服器設定中允許密碼身份驗證時,這才有效。

相關內容