Я пытаюсь удалить все пароли пользователей по умолчанию на нескольких серверах с помощью 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-сервера разрешена аутентификация по паролю.