我正在尝试删除一组服务器上的所有默认用户密码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
答案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 服务器配置中允许密码身份验证时,这才有效。