mkpasswd -m sha-512 производит неправильный вход

Кажется, есть еще одна ссылка под названием «Номинация для выпуска», которая, как предполагается, доступна только для администраторов ошибок, в соответствии с этим обсуждением списка рассылки и этим сообщением об ошибке. Поскольку ни один из нас не является одним из них, лучшим вариантом является оставить комментарий, отметив, что он все еще влияет на 12.04.

2
задан 4 December 2017 в 00:59

6 ответов

Хорошо, я заблокировал проблему. Поскольку вывод mkpassword приведет к $id$salt$hash, когда вы скопируете и вставьте это в команду useradd, bash попытается выполнить замену переменной на $. Таким образом, они должны быть экранированы с помощью \$id\$salt\$hash, так что bash не будет заменять переменную перед добавлением строки в /etc/shadow.

mkpasswd -m sha-512 "my password" приводит к

$6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1

, который можно скопировать и вставить в useradd, обязательно заменив каждый $ на \$.

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

3
ответ дан 22 May 2018 в 15:41
  • 1
    Моя система играла с моими трюками, и вы всегда могли сделать mkpasswd -m sha-512 "my password" | sed 's/\$/\\$/g' > out.txt, чтобы сохранить замену $ на \$ :-) – George Udosen 4 December 2017 в 06:38

Хорошо, я заблокировал проблему. Поскольку вывод mkpassword приведет к $id$salt$hash, когда вы скопируете и вставьте это в команду useradd, bash попытается выполнить замену переменной на $. Таким образом, они должны быть экранированы с помощью \$id\$salt\$hash, так что bash не будет заменять переменную перед добавлением строки в /etc/shadow.

mkpasswd -m sha-512 "my password" приводит к

$6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1

, который можно скопировать и вставить в useradd, обязательно заменив каждый $ на \$.

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

3
ответ дан 18 July 2018 в 01:56

Хорошо, я заблокировал проблему. Поскольку вывод mkpassword приведет к $id$salt$hash, когда вы скопируете и вставьте это в команду useradd, bash попытается выполнить замену переменной на $. Таким образом, они должны быть экранированы с помощью \$id\$salt\$hash, так что bash не будет заменять переменную перед добавлением строки в /etc/shadow.

mkpasswd -m sha-512 "my password" приводит к

$6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1

, который можно скопировать и вставить в useradd, обязательно заменив каждый $ на \$.

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

3
ответ дан 24 July 2018 в 17:29

Почему это происходит?

Причина, по которой он терпит неудачу, состоит в том, что элементы с ведущим $ рассматриваются как переменные и не сортируются, когда вы передаете его в useradd.

] Части $6..., $1... и $b... из вашего хэша рассматриваются как переменные. Конечно, ошибка заключается в том, что shell-оболочки выполняют переменное расширение (если только они не одинарные кавычки), прежде чем что-нибудь начнет работать. И поскольку эти 3 переменные не существуют в вашей среде, они исчезают из строки, которую вы передаете useradd.

Практический пример:

Давайте посмотрим, какая действительная команда запускается после завершения оболочки с выполнением всех необходимых расширений и замещений и передала ее системному вызову execve(). Compare:

$ 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

В первом примере $abra$cadabra (где находится ваш хэш) исчезает из команды, которая фактически запускается системой. Напротив, одинарная кавычка $abra$cadabra во втором примере появляется в списке аргументов, которые передаются в execve().

Другими словами, вы создали правильный хэш, но оболочка передает совершенно другую вещь в useradd как аргумент, который в конечном счете является командой, которую запускает система. Фактически, давайте просто возьмем ваш хэш, например, и сравним два случая цитирования и не цитирования:

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

Обратите внимание, что то, что система действительно видит после завершения оболочки, обрабатывает переменные FuuSdKgVke.LYTfrlknm5cWx65g. Но он увидит правильный хеш, если вы его процитируете:

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

Что можно сделать? Что работает?

Однако подоболочка работает, потому что не происходит замены - переменных нет. И цитирование также работает по той же причине.

Вот несколько методов:

Подстановка команд:
$ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr        
>
$ su newusr
Password: 
newusr@ubuntu1604:/home/admin$ 
Одиночное цитирование (обратите внимание, что я обрезал фактический хеш, потому что он слишком длинный и не вписывается в форматирование) :
$ 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
Возьмите вывод из потока mkpasswd stdout и передайте его через xargs с флагом -I:
$ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1 
Добавьте \ к каждому $ (который OP выяснил в своем ответе ). Сценарий, также, согласно комментарию Джорджа.
$ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser
3
ответ дан 22 May 2018 в 15:41
  • 1
    Ха-ха, мы оба работали над этим решением одновременно. Я пропустил ответ через 5 минут вперед. Хороший брат, вы можете получить ответ! Вы обязательно должны отредактировать свое решение, чтобы включить легкое исправление выхода из $ с \$ для тщательности. – Neurax 4 December 2017 в 03:32
  • 2
    Просматривая ваше решение, я не могу сказать, что вы делаете с strace, и, кроме того, выполнение sudo -p ">" сбивает с толку любого, кто смотрит на этот вопрос. Это не имеет никакого отношения к причине, почему ручная настройка хэша не работает. Я тоже удалю это. – Neurax 4 December 2017 в 03:39
  • 3
    @Neurax Я добавлю пояснения к strace и \$. Что касается sudo -p ">", это просто скрыть мое фактическое имя пользователя (хотя оно предоставлено - это все равно через Интернет). – Sergiy Kolodyazhnyy 4 December 2017 в 04:06
  • 4
    @Neurax и там мы идем - отредактируем сделанные – Sergiy Kolodyazhnyy 4 December 2017 в 04:19

Почему это происходит?

Причина, по которой он терпит неудачу, состоит в том, что элементы с ведущим $ рассматриваются как переменные и не сортируются, когда вы передаете его в useradd.

] Части $6..., $1... и $b... из вашего хэша рассматриваются как переменные. Конечно, ошибка заключается в том, что shell-оболочки выполняют переменное расширение (если только они не одинарные кавычки), прежде чем что-нибудь начнет работать. И поскольку эти 3 переменные не существуют в вашей среде, они исчезают из строки, которую вы передаете useradd.

Практический пример:

Давайте посмотрим, какая действительная команда запускается после завершения оболочки с выполнением всех необходимых расширений и замещений и передала ее системному вызову execve(). Compare:

$ 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

В первом примере $abra$cadabra (где находится ваш хэш) исчезает из команды, которая фактически запускается системой. Напротив, одинарная кавычка $abra$cadabra во втором примере появляется в списке аргументов, которые передаются в execve().

Другими словами, вы создали правильный хэш, но оболочка передает совершенно другую вещь в useradd как аргумент, который в конечном счете является командой, которую запускает система. Фактически, давайте просто возьмем ваш хэш, например, и сравним два случая цитирования и не цитирования:

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

Обратите внимание, что то, что система действительно видит после завершения оболочки, обрабатывает переменные FuuSdKgVke.LYTfrlknm5cWx65g. Но он увидит правильный хеш, если вы его процитируете:

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

Что можно сделать? Что работает?

Однако подоболочка работает, потому что не происходит замены - переменных нет. И цитирование также работает по той же причине.

Вот несколько методов:

Подстановка команд: $ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr > $ su newusr Password: newusr@ubuntu1604:/home/admin$ Одиночное цитирование (обратите внимание, что я обрезал фактический хеш, потому что он слишком длинный и не вписывается в форматирование) : $ 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 Возьмите вывод из потока mkpasswd stdout и передайте его через xargs с флагом -I: $ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1 Добавьте \ к каждому $ (который OP выяснил в своем ответе ). Сценарий, также, согласно комментарию Джорджа. $ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser
3
ответ дан 18 July 2018 в 01:56

Почему это происходит?

Причина, по которой он терпит неудачу, состоит в том, что элементы с ведущим $ рассматриваются как переменные и не сортируются, когда вы передаете его в useradd.

] Части $6..., $1... и $b... из вашего хэша рассматриваются как переменные. Конечно, ошибка заключается в том, что shell-оболочки выполняют переменное расширение (если только они не одинарные кавычки), прежде чем что-нибудь начнет работать. И поскольку эти 3 переменные не существуют в вашей среде, они исчезают из строки, которую вы передаете useradd.

Практический пример:

Давайте посмотрим, какая действительная команда запускается после завершения оболочки с выполнением всех необходимых расширений и замещений и передала ее системному вызову execve(). Compare:

$ 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

В первом примере $abra$cadabra (где находится ваш хэш) исчезает из команды, которая фактически запускается системой. Напротив, одинарная кавычка $abra$cadabra во втором примере появляется в списке аргументов, которые передаются в execve().

Другими словами, вы создали правильный хэш, но оболочка передает совершенно другую вещь в useradd как аргумент, который в конечном счете является командой, которую запускает система. Фактически, давайте просто возьмем ваш хэш, например, и сравним два случая цитирования и не цитирования:

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

Обратите внимание, что то, что система действительно видит после завершения оболочки, обрабатывает переменные FuuSdKgVke.LYTfrlknm5cWx65g. Но он увидит правильный хеш, если вы его процитируете:

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

Что можно сделать? Что работает?

Однако подоболочка работает, потому что не происходит замены - переменных нет. И цитирование также работает по той же причине.

Вот несколько методов:

Подстановка команд: $ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr > $ su newusr Password: newusr@ubuntu1604:/home/admin$ Одиночное цитирование (обратите внимание, что я обрезал фактический хеш, потому что он слишком длинный и не вписывается в форматирование) : $ 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 Возьмите вывод из потока mkpasswd stdout и передайте его через xargs с флагом -I: $ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1 Добавьте \ к каждому $ (который OP выяснил в своем ответе ). Сценарий, также, согласно комментарию Джорджа. $ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser
3
ответ дан 24 July 2018 в 17:29
  • 1
    Ха-ха, мы оба работали над этим решением одновременно. Я пропустил ответ через 5 минут вперед. Хороший брат, вы можете получить ответ! Вы обязательно должны отредактировать свое решение, чтобы включить легкое исправление выхода из $ с \$ для тщательности. – Neurax 4 December 2017 в 03:32
  • 2
    Просматривая ваше решение, я не могу сказать, что вы делаете с strace, и, кроме того, выполнение sudo -p ">" сбивает с толку любого, кто смотрит на этот вопрос. Это не имеет никакого отношения к причине, почему ручная настройка хэша не работает. Я тоже удалю это. – Neurax 4 December 2017 в 03:39
  • 3
    @Neurax Я добавлю пояснения к strace и \$. Что касается sudo -p ">", это просто скрыть мое фактическое имя пользователя (хотя оно предоставлено - это все равно через Интернет). – Sergiy Kolodyazhnyy 4 December 2017 в 04:06
  • 4
    @Neurax и там мы идем - отредактируем сделанные – Sergiy Kolodyazhnyy 4 December 2017 в 04:19

Другие вопросы по тегам:

Похожие вопросы: