mkpasswd -m sha-512 produz login incorreto

2

Estou com problemas para tentar definir senhas para meus novos usuários.

Eu encontrei um tutorial indicando que mkpasswd -m sha-512 "my password here" produziria uma senha com hash e salgada que pode ser usada em combinação com useradd -m -p "hashed and salted passwd" -s /bin/bash username , no entanto, quando tentei isso em um usuário de teste, recebi sempre Incorrect Login .

Estou executando o Ubuntu 16.04 e usando mkpasswd do pacote whois .

O que estou fazendo de errado aqui?

Etapas Exatas

1) apt update

2) apt install whois

3) mkpasswd -m sha-512 "my password here"

produz: FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g.

4) useradd -m -p FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g. -s /bin/bash testuser

5) login testuser

Solicita senha:

6) digite minha senha aqui

Diz: Login incorrect

Gostaria de acrescentar que tentei a mesma coisa com uma senha que não possui espaços e omiti as aspas do comando mkpasswd . Nenhum dos dois pareceu fazer diferença.

Eu também tentei fazer o usuário sem o sinalizador -p (significando não adicionar uma senha) e copiei manualmente a senha salgada / com hash para /etc/shadow , o que produz os mesmos resultados acima, Login incorreto.

Ainda mais interessante, se eu usar um subshell para colocar o valor, tudo parece funcionar bem.

useradd -m -p $(mkpasswd -m sha-512 "my password") -s /bin/bash test

login test tipo: my password

Faz o login bem!

    
por Neurax 03.12.2017 / 19:09

2 respostas

3

Ok, eu encerrei o problema. Como a saída de mkpassword resultará em $id$salt$hash , quando você copiá-lo e colá-lo em um comando useradd , o bash tentará fazer a substituição de variável no $ . Como tal, esses precisam ser escapados usando $id$salt$hash para que o bash não faça a substituição de variáveis antes de adicionar a string a /etc/shadow .

mkpasswd -m sha-512 "my password" resulta em

AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1

, que pode ser copiado e colado em useradd , certificando-se de substituir cada $ por $ .

useradd -m -s /bin/bash -p $6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1

    
por Neurax 03.12.2017 / 23:36
3

Por que isso acontece?

O motivo pelo qual ele falha é porque os itens com $ iniciais são tratados como variáveis e não são citados quando você os passa para useradd .

As porções ... , ... e $b... do seu hash são tratadas como variáveis. Naturalmente, a falha é com os shell - shells executam uma expansão variável (a menos que eles estejam entre aspas simples) antes que algo seja executado. E como essas 3 variáveis não existem em seu ambiente, elas desaparecem da string que você passa para useradd .

Exemplo prático:

Vamos ver o comando real executado após o shell terminar de executar todas as expansões e substituições necessárias e passar isso para execve() system call. Comparar:

$ strace -e execve useradd -p $abra$cadabra newuser                                                                                                                    
execve("/usr/sbin/useradd", ["useradd", "-p", "newuser"], [/* 82 vars */]) = 0

$ strace -e trace=execve useradd -p '$abra$cadabra' newuser                                                                                                            
execve("/usr/sbin/useradd", ["useradd", "-p", "$abra$cadabra", "newuser"], [/* 82 vars */]) = 0

No primeiro exemplo $abra$cadabra (que é onde o hash iria) desaparece do comando que realmente é executado pelo sistema. Por outro lado, o único citado $abra$cadabra no segundo exemplo aparece na lista de argumentos transmitidos para execve() .

Em outras palavras, você gerou o hash correto, mas o shell passa uma coisa completamente diferente para useradd como argumento, que é o comando que o sistema executa. De fato, vamos pegar seu hash por exemplo e comparar dois casos de cotação e não-citação:

$ strace -e execve echo FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g                                                            
execve("/bin/echo", ["echo", "FuuSdKgVke.LYTfrlknm5cWx65g"], [/* 82 vars */]) = 0
FuuSdKgVke.LYTfrlknm5cWx65g
+++ exited with 0 +++

Observe que o que o sistema realmente vê após o shell é processado, as variáveis são FuuSdKgVke.LYTfrlknm5cWx65g . Mas ele verá o hash correto se você citá-lo:

$ strace -e execve echo 'FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g'                                                          
execve("/bin/echo", ["echo", "FuuSdKgVke$bc8doOVGZhzomoeaf"...], [/* 82 vars */]) = 0

O que pode ser feito? O que funciona?

No entanto, o subshell funciona porque não há substituição ocorrendo - não há variáveis. E as citações também funcionam pelo mesmo motivo.

Aqui estão alguns métodos:

  1. Substituição de comandos:

    $ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr        
    >
    $ su newusr
    Password: 
    newusr@ubuntu1604:/home/admin$ 
    
  2. Aspas simples (observe que apareci o hash real porque é muito longo e não cabe na formatação):

    $ sudo -p ">" mkpasswd --hash=SHA-512 "112"
    >
    GVhvDY$vhw89D2X0bd2REQWE
    $ sudo -p ">" useradd -m -s /bin/sh -p 'GVhvDY$vhw89D2X0bd2REQWE' newusr2
    > 
    $ su newusr2
    Password: 
    $ echo $USER
    newusr2
    
  3. Pegue a saída do mkpasswd ' stdout stream e passe-a via xargs com -I flag:

    $ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1 
    
  4. Anexe o \ a cada $ (que o OP descobriu na sua resposta ). Scriptable, também, como por comentário de George . / p>

    $ useradd -m -s /bin/bash -p $6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser
    
por Sergiy Kolodyazhnyy 03.12.2017 / 23:42