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/shadow
e grep
para 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.