Verificar o hash da senha no script bash?

0

Relacionado a Por que a senha do 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 em /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 em su - (na questão vinculada) para não usar a senha minha , em oposição à senha raiz .

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

    
por Roger Lipscombe 29.11.2017 / 11:23

3 respostas

2

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

Use mkpasswd -m sha-512 -S <salt> e insira a senha que você acha que deve ser quando perguntar. Ele irá gerar o hash com $6$<salt>$ prefixado.

    
por 29.11.2017 / 13:27
2

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

python é uma dessas ferramentas 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 foi a senha correta.

$HASH acima pode ser o hash completo (como $6$rounds=1234$somesalt$6eFBNhSgwEwdfZBHueBedpcqaVKGcV2DJy/tQMFd3JL88hwvgTkISJShnOUrbtP1fRs8I9rGIdsgWCoiujxD2/ ) ou apenas a parte dele até o nível mais à direita $ , ou seja, o sal e a contagem de round 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"'

(então, obviamente, $HASH tem que conter o hash completo).

Com python , você também pode chamar funções de bibliotecas arbitrárias usando o módulo ctypes . Assim, outra maneira de chamar a função crypt() do sistema (não que você precise como crypt é um dos módulos padrão, é que eu estava com a impressão de que o módulo crypt veio com seu próprio código separado crypt() implementation) é 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"])'
    
por 29.11.2017 / 15:52
0

ssh root@localhost vem à mente, embora a sua distribuição possa ter desativado o login baseado em senha para raiz inteira e / ou instalado um par de chaves; ou fazendo login na sua 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 pode oferecer login como outro usuário.)

    
por 29.11.2017 / 11:28

Tags