Verifique o hash da senha no script bash?

Verifique o hash da senha no script bash?

Relacionado aPor que a senha root no Linux Mint é minha senha de usuário?

Parece que minha caixa Mint 17.3 tem uma senha de root definida: vejo um hash de senha /etc/shadow(começa com $6$...). Gostaria de comparar esse hash de senha com minha senha de usuário (conhecida).

Por alguma razão, não confio su -(na pergunta vinculada) para não usarmeusenha, versus oraizsenha.

Existe uma maneira simples (no bash, por exemplo) de comparar um hash conhecido com uma senha conhecida e ver se elas correspondem?

Responder1

Encontre o sal usado em /etc/shadow, são os caracteres entre o segundo e o terceiro $, geralmente serão oito.

Use mkpasswd -m sha-512 -S <salt>e digite a senha que você acha que deveria ser quando for solicitada. Ele produzirá o hash com $6$<salt>$prefixo.

Responder2

No final, você precisa chamar a crypt(3)função do libcrypt(que em sistemas GNU como Linux Mint vem com o GNU libc) com a senha como primeiro argumento e o hash ( $6$...) como segundo argumento.

pythoné uma ferramenta que expõe essa função, então você pode fazer:

HASH='$6$...' python2 -c 'import crypt, os, getpass
print(crypt.crypt(getpass.getpass(), os.environ["HASH"]))'

E se a saída corresponder ao hash, essa era a senha correta.

$HASHacima pode ser o hash completo (como $6$rounds=1234$somesalt$6eFBNhSgwEwdfZBHueBedpcqaVKGcV2DJy/tQMFd3JL88hwvgTkISJShnOUrbtP1fRs8I9rGIdsgWCoiujxD2/) ou apenas a parte dele mais à direita $, incluindo o salt e a contagem de rodadas opcional ( $6$rounds=1234$somesalt$).

Ou você pode fazer a verificação em python:

HASH='$6$...' python2 -c '
import crypt, os, getpass
hash = os.environ["HASH"]
if crypt.crypt(getpass.getpass(), hash) == hash:
  print "OK"
else:
  print "Wrong password"'

(obviamente, $HASHdeve conter o hash completo).

Com pythonvocê também pode chamar funções de bibliotecas arbitrárias usando o ctypesmódulo. Portanto, outra maneira de chamar a crypt()função do sistema (não que você precise, como crypté um dos módulos padrão, só que anteriormente tive a impressão de que o cryptmódulo vinha com sua própria crypt()implementação separada) é algo como:

HASH='$6$...' python2 -c '
from ctypes import *
import os, getpass
l = CDLL("libcrypt.so.1")
l.crypt.restype = c_char_p
print l.crypt(getpass.getpass(), os.environ["HASH"])'

Responder3

ssh root@localhostvem à mente, embora sua distribuição possa ter desabilitado totalmente o login baseado em senha para root e/ou instalado um par de chaves; ou efetuando login na tela de login gráfica usual como usuário root. (Mesmo se você tiver o login automático ativado, a caixa de diálogo de desligamento poderá oferecer o login como outro usuário.)

informação relacionada