Как моделируют Windows как подсказка пароля администратора в Linux?

На одном концептуальном уровне ядро - это все, что работает на "более привилегированном" уровне аппаратной защиты. Это как кольцо 0 на процессорах x86, системный режим на ARM, режим ядра на MIPS, режим супервизора на 68xxx и др. Ядро обычно управляется прерываниями, либо программными (системные вызовы), либо аппаратными (дисковые накопители, сетевые карты, аппаратные таймеры).

На этом же концептуальном уровне "земля пользователя" - это то, что запускается в наименее привилегированном режиме (кольцо 3 на x86 процессорах, режим пользователя на ARM или MIPS и т.д.). Пользовательская земля" использует то, как ядро сглаживает небольшие аппаратные различия, представляя один и тот же API для всех программ. Например, некоторые беспроводные карты могут иметь дополнительные регистры управления по отношению к другим, или содержать более или менее встроенный буфер для входящих пакетов. Код драйвера учитывает эти различия (иногда игнорируя расширенные или необычные возможности) и предоставляет один и тот же API сокета всем программам.

Некоторые процессоры (например, x86, VAX, Alpha AXP) имеют более двух режимов, но общая архитектура Unix не использует промежуточные режимы.

Программы и процессы, которые вы видите запущенными в Unix или Linux, или *BSD - это пользовательская земля. Так как процессы предварительно вытесняются, вы фактически никогда не видите запущенное ядро, вы просто видите побочные эффекты, такие как возврат системного вызова read(), или запущенную функцию обработчика сигналов.

Чтобы ответить на ваш конкретный вопрос, в Unix, Linux, *BSD "драйвер" - это обычно какой-нибудь маленький кусочек программного обеспечения, который работает со специфическими особенностями какого-нибудь аппаратного обеспечения: сетевой карты, дискового накопителя, видеокарты. Программное обеспечение драйверов почти всегда должно работать в режиме Ring 0/supervisor/пространство ядра, чтобы иметь доступ к аппаратным прерываниям, или к маппируемой памяти аппаратуры, или к чему угодно. Драйвер заботится о специфических особенностях аппаратного обеспечения и делает это аппаратное обеспечение подходящим для стандартизированного или конвенционального представления о том, как должно работать аппаратное обеспечение. Следовательно, запуск драйвера в пользовательской области требует от ядра показать пользовательской области программы такие вещи, как mapped-in memory или регистры устройств, или прерывания, или другие специальные возможности. Это может быть сложно, так как специальные возможности, которые могут потребоваться устройству, нелегко вписываются в обычный API в стиле Unix, представляемый пользовательским программам земли. Кроме того, планирование является проблемой, так как пользовательские программы обычно не реагируют на все прерывания так быстро.

.
1
12.08.2014, 21:50
2 ответа

Если вам нужно сделать что-то, для чего требуются привилегии root, вам нужно использовать какой-либо метод получения привилегий root, который в большинстве современных систем означает su , sudo или обертку вокруг одного из них. Что опасно в выполнении команд от имени пользователя root (будь то с su или sudo ), так это то, что это дает вам гораздо больше способов повредить вашу систему. Таким образом, вы должны запускать команду от имени пользователя root только тогда, когда она действительно этого требует.

Основное различие между su и sudo в их типичной конфигурации заключается в том, что для sudo вы вводите тот же пароль, что и при входе в систему, тогда как su требует другого пароля (пароль пользователя root ). Для типичной однопользовательской машины между ними нет существенной разницы с точки зрения безопасности. Также можно настроить sudo так, чтобы пароль не требовался.

Если вы работаете в терминале и хотите запустить команду от имени пользователя root с помощью su , выполните:

su -c 'somecommand an_argument another_argument'

С помощью sudo :

sudo somecommand an_argument another_argument

В любом случае, вам будет предложено ввести пароль (пароль root для su , ваш собственный пароль для sudo ). Судо может запомнить ваш пароль и не спрашивать вас снова в течение следующих нескольких минут; с su вам придется каждый раз вводить его снова.

Вы также можете получить графическое приглашение для ввода пароля (с помощью gksu , kdesu ,…), но если вы уже работаете в терминале, это менее удобно.

3
27.01.2020, 23:28

Помня о том, что бесплатных блюд не бывает, можно минимизировать риск.

Если вы хотите запускать свой скрипт от имени root и сразу же выходить без запроса пароля и команды exit, то вам придется пойти на небольшой компромисс.

Следующее решение позволяет хранить ваш дважды (или более) зашифрованный root пароль в любом месте с текущими правами пользователя.

Высокий уровень:

  1. Шифрование root пароля в base64 дважды один раз и размещение файла в любом месте (может быть 1234.txt, например).

  2. Вызываем скрипт expect с аргументом (расшифрованная строка сверху)

  3. Expect запускаем нужный скрипт и выходим.

  4. Файл очистки под /root, вызванный из expect, удаляет bash_history (обычного пользователя) строки, содержащие root, зашифрованный паролем файл и base64. Для удаления любых следов был вызван скрипт (с точки зрения обычного пользователя). Этот скрипт доступен только пользователю root.

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

Более того, двойное base64 шифрование, кажется мне довольно случайным и невинным (хотя я не эксперт по безопасности, я бы не распознал его как 2xbase64). Например:

V1c5MVFYSmxWMlZzWTI5dFpRbz0K decrypted to YouAreWelcome 

Кодируем пароль дважды в base64 1 раз:

$ cat pass.txt | base64 | base64 > innocent_name.txt
$ rm pass.txt

Затем:

Запускаем скрипт:

$ ./root_wrap.exp "$(cat innocent_name.txt | base64 -d | base64 -d)"

Ожидаемый скрипт:

#!/usr/bin/expect -f

set root_user root;
set root_pass [ lindex $argv 0 ];

spawn bash
expect "*$ "
send -- "whoami\r"
expect "*$ "
send -- "su $root_user\r"
expect "*?assword:*"
send -- "$root_pass\r"
expect "*# "
send -- "./whoam.sh\r"
expect "*# "
send -- "/root/rm_trace.sh\r"
expect "*# "
send -- "exit\r"
send -- "whoami\r"
expect "*$ "
expect eof

Скрипт очистки истории /root/rm_trace.sh:

#!/bin/bash

sed -i '/base64/d' /home/<user>/.bash_history
sed -i '/root_wrapp/d' /home/<user>/.bash_history
sed -i '/innocent_name/d' /home/<user>/.bash_history

Образец bash скрипта для запуска от имени root:

 #!/bin/bash

 echo "now running as root"
 whoami
0
27.01.2020, 23:28

Теги

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