Перезапись/изменение пути при подключении по SSH

Если у пользователя нет разрешения на чтение исполняемого скрипта, то попытка запустить его завершится неудачей , если у пользователя нет CAP_DAC_OVERRIDEвозможности (, например. она корень):

$ cat > yup; chmod 100 yup
#! /bin/sh
echo yup
^D
$./yup
/bin/sh: 0: Can't open./yup

Интерпретатор (при неудачном или успешном выполнении )всегда будет работать от имени текущего пользователя, игнорируя любые биты setuid или расширенные атрибуты setcap скрипта.

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

.

$ cat > interp; chmod 755 interp
#! /bin/sh
printf 'you said %s\n' "$1"
^D
$ cat > script; chmod 100 script
#!./interp
nothing to see here
^D
$./script
you said./script

Конечно, сам интерпретатор может быть двоичным файлом setuid илиcap_dac_override=ep-setcap (или передавать путь сценария в качестве аргумента такому двоичному файлу ), и в этом случае он будет работать с повышенными привилегиями и может игнорировать любые права доступа к файлам.

Нечитаемые сценарии setuid в Linux через binfmt _разное

В Linux вы можете обойти все ограничения на исполняемые скрипты (и разрушить вашу систему; -))с помощью модуля binfmt_misc:

Как root:

# echo ':interp-test:M::#!./interp::./interp:C' \
    > /proc/sys/fs/binfmt_misc/register

# cat > /tmp/script <<'EOT'; chmod 4001 /tmp/script # just exec + setuid
#!./interp
id -u
EOT

Как обычный пользователь:

$ echo 'int main(void){ dup2(getauxval(AT_EXECFD), 0); execl("/bin/sh", "sh", "-p", (void*)0); }' |
    cc -include sys/auxv.h -include unistd.h -x c - -o./interp
$ /tmp/script
0

Яппи!

Больше информации вDocumentation/admin-guide/binfmt-misc.rstв исходниках ядра.

Опция -pможет вызвать ошибку в некоторых оболочках (, где ее можно просто удалить ), но она необходима в более новых версиях dashи bash, чтобы предотвратить их . ] сброс привилегий , даже если они не запрашиваются.

0
22.03.2021, 10:32
1 ответ

Итак, после долгих раздумий я пришел к выводу, что в SSH нет ничего встроенного для выполнения того, что мод _rewrite делает для Apache2, скорее всего, по веским причинам.

Итак, вместо этого я прибегнул к замене команды gogs, вызываемой из SSH (в файле .authorized_keys, сценарием, который перезаписывает переменную окружения SSH _ORIGINAL _COMMAND, а затем вызывает реальную исполняемый файл gogs.

SSH _ОРИГИНАЛЬНАЯ _КОМАНДА — это переменная, в которую SSH записывает команду, отправленную на сервер, перед вызовом команды, записанной в .authorized_keys(, когда она есть ). В случае gogs эта переменная используется для проверки существования репозитория, проверки его принадлежности вошедшему в систему пользователю SSH и т. д. и, наконец, выполнения над ним операции git. Изменив путь репозитория в этой переменной,можно использовать псевдонимы репозиториев на -лету -.

0
28.04.2021, 22:58

Теги

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