. 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 서버 구성에서 비밀번호 인증이 허용된 경우에만 작동합니다.