Verifique quais usuários possuem senha específica

Verifique quais usuários possuem senha específica

Estou tentando remover todas as senhas de usuário padrão em vários servidores com ansible. Em primeiro lugar, gostaria de exibir o nome de cada usuário cuja senha atual seja foobar. Como posso conseguir isso?

Minha primeira intenção foi obter o hash dele /etc/shadowe greppara ele, mas isso não funcionará por causa da salga.

Preciso calcular meus próprios hashes para isso e compará-los? Ou existe uma abordagem mais rápida e fácil?

Responder1

Existe uma ferramenta especializada para verificação de fraqueza de senha:João, o Estripadordisponível e provavelmente empacotado em todos os sabores Unix e Linux comuns.

Aqui está um exemplo de uso no Debian GNU/Linux 9 (desombrarvem juntoJohn). Alguns cuidados devem ser tomados ao manipular arquivos de senha, isso é apenas um PoC. Observe que oJohnO comando pode ser executado remotamente (e, portanto, não instalado em nenhum outro lugar que não seja um sistema dedicado), desde que sejam fornecidos arquivos de senha adequados.

Configuração (incluindo configuração de senhafoobarcontabilizarteste):

# 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

Teste para senhas proibidas/padrão:

# 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

Resultado:

# john -show /root/workpasswd 
test:foobar:1001:1001:,,,:/home/test:/bin/bash

1 password hash cracked, 2 left

Limpar:

# rm -r /root/workpasswd /root/.john /tmp/wordlist

Responder2

Você pode tentar fazer login como cada usuário? por exemplo

echo "foobar" | su username

Você precisaria temporariamentedesativar a verificação TTY.

Responder3

Então aqui está um pequeno trecho em C que verifica a senha dos usuários existentes:

Salve o seguinte trecho em um arquivo chamado: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]);
}

Compile o código acima usando:

gcc -o checkpass checkpass.c -lcrypt

Agora, na linha de comando, basta executar o seguinte:

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

Talvez seja um tiro no escuro, mas deve funcionar!

Responder4

Como não sou fã de instalar software extra e não quero mexer com isso sudoers, o que acabei fazendo foi

sshpass -p foobar ssh -o PreferredAuthentications=keyboard-interactive,password -o PubkeyAuthentication=no user@host

e depois verifique o código de saída no Ansible. Se a senha estiver correta o código de saída será 0, caso contrário 5.

Obviamente, isso só funcionará se a autenticação por senha for permitida na configuração do servidor SSH.

informação relacionada