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

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

서버 세트에서 모든 기본 사용자 비밀번호를 제거하려고 합니다 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 서버 구성에서 비밀번호 인증이 허용되는 경우에만 작동합니다.

관련 정보