어떤 사용자가 특정 비밀번호를 가지고 있는지 확인하세요

어떤 사용자가 특정 비밀번호를 가지고 있는지 확인하세요

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

관련 정보