Проверьте, у каких пользователей есть определенный пароль

Проверьте, у каких пользователей есть определенный пароль

Я пытаюсь удалить все пароли пользователей по умолчанию на нескольких серверах с помощью ansible. Во-первых, я хотел бы вывести имя каждого пользователя, текущий пароль которого foobar. Как мне этого добиться?

Моей первой целью было получить из него гашиш /etc/shadow, grepно из-за соли это не сработает.

Нужно ли мне для этого вычислять свои собственные хеши и сравнивать их? Или есть более быстрый и простой подход?

решение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-сервера разрешена аутентификация по паролю.

Связанный контент