## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-SYNACKTIV-CONTRIB-EXPLOITING-CVE-2017-5123
# Эксплуатация CVE-2017-5123
## Введение
Этот репозиторий является дополнением к статье, опубликованной в журнале MISC №96.
Нам удалось надёжно повысить свои привилегии на нашей виртуальной машине с включёнными SMEP / SMAP и KASLR. Однако следует отметить, что система остаётся в нестабильном состоянии и возникновение oops весьма вероятно.
## Содержимое этого репозитория
В папке `configs/` вы найдёте файлы конфигурации для ядра Linux и Busybox, каждый из которых немного отличается от стандартных.
Папка `binaries/` содержит все предварительно собранные бинарные файлы, необходимые для воспроизведения нашей тестовой среды, включая готовую rootfs, которую можно использовать с QEMU.
`linux-stable` — это git-подмодуль, указывающий на уязвимую ревизию ядра Linux. Используйте `git submodule update --recursive`, чтобы получить его (если у вас есть хотя бы 1 ГБ свободного места на системе...). То же самое касается и `busybox`.
## Настройка окружения
Наша среда основана на виртуальной машине QEMU x86 с папкой, общей с хостом через 9P. Уязвимая версия ядра (`ff33952e4d23`) компилируется вместе со статически слинкованной сборкой Busybox.
### Конфигурация ядра
Наша конфигурация довольно проста, поскольку нам не нужно поддерживать какие-либо экзотические архитектуры или оборудование. Она была сгенерирована выполнением `make defconfig`, и некоторые функции были включены для поддержки сетевых возможностей QEMU и общего доступа к папкам:
root@kitploit:~
CONFIG_BLK_MQ_VIRTIO=y
CONFIG_MEMORY_BALLOON=y
CONFIG_BALLOON_COMPACTION=y
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_NET_9P_DEBUG=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_BLK_SCSI=y
CONFIG_VIRTIO_NET=y
CONFIG_HVC_DRIVER=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_BALLOON=y
CONFIG_VIRTIO_INPUT=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
CONFIG_9P_FS=y
CONFIG_9P_FS_POSIX_ACL=y
CONFIG_9P_FS_SECURITY=y
GDB-скрипты и отладочные символы также были добавлены для упрощения разработки первых PoC:
root@kitploit:~
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_DWARF4=y
CONFIG_GDB_SCRIPTS=y
Обратите внимание, что в этой версии KASLR включён по умолчанию на x86. Поскольку ядро отображается по разным адресам после каждой перезагрузки, GDB не сможет сопоставить с ним файл символов. У вас есть два варианта: проводить тесты без KASLR или передать базовый адрес ядра команде `symbol-file` при загрузке символов в GDB.
После компиляции вы найдёте bzImage в `linux-stable/arch/x86/boot/bzImage`.
Этот файл присутствует в `binaries/bzImage`, а наш файл конфигурации — в `confifs/kernel.config`. Чтобы использовать его, вам нужно лишь скопировать его как `.config` в `linux-stable`.
### Компиляция Busybox
Мы использовали последнюю стабильную версию Busybox, 1.28. Единственный параметр, который нужно изменить, — это `CONFIG_STATIC`, установите его в `y`. Компиляция не должна вызвать никаких проблем.
Наш файл конфигурации доступен в `configs/busybox.config`, а статически скомпилированный бинарный файл — в `binaries/busybox`. Как и для Linux, просто скопируйте его как `.config` в папку с исходниками Busybox.
### Сборка всего вместе
Busybox уже реализует init-процесс, который попытается выполнить `/etc/init.d/rcS`. Обычно он предоставляется вашим дистрибутивом (возможно, под другим именем), но здесь нам придётся сделать это самостоятельно! Этот скрипт создаст и смонтирует несколько обязательных системных папок (`proc`, `sys`, `dev`), нашу папку, общую с хостом, и опустит нас в непривилегированную оболочку:
root@kitploit:~
for i in $(seq 1 9); do mknod /dev/tty$i c 4 1; done
mknod -m 0666 /dev/null c 1 3
mknod -m 0660 /dev/ttyS0 c 4 64
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs none /dev
mkdir -p /mnt/share
mount -t 9p -o trans=virtio share /mnt/share/ -oversion=9p2000.L,posixacl,sync
chmod 777 /mnt/share/
export ENV=/etc/profile
setsid cttyhack setuidgid 1000 sh
umount /proc
umount /sys
umount /dev
poweroff -f
Файл `/etc/profile` не обязателен, но довольно полезен во время наших тестов, особенно когда эксплойт был ненадёжным и требовалось несколько попыток для получения root-привилегий.
## Эксплойт
Процесс написания эксплойта довольно подробно описан в MISC 96: мы используем `unsafe_put_user` для поиска в памяти базового адреса кучи. Затем тысячи вызовов `clone` позволяют нам распылить множество структур `cred` в памяти. Во время наших тестов их положение в памяти было гораздо более «постоянным», чем при использовании `fork`, поскольку для новой задачи выделяется меньше структур.
## Что осталось
Выход из дочернего процесса вызывает kernel oops из-за ошибочного запроса страницы; это необходимо корректно обработать.
## Участие в разработке
Если вы хотите повысить надёжность этого эксплойта или добавить документацию, ваш вклад приветствуется! Мы также могли допустить ошибки или неточности в некоторых концепциях — не стесняйтесь открыть issue, если считаете, что что-то не так.
## Полезные ссылки
**Ядро Linux**
* https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=96ca579a1ecc943b75beba58bebb0356f6cc4b51
* https://01.org/linuxgraphics/gfx-docs/drm/dev-tools/gdb-kernel-debugging.html
**Эксплуатация**
* https://reverse.put.as/2017/11/07/exploiting-cve-2017-5123/
* https://github.com/0x5068656e6f6c/CVE-2017-5123/blob/master/CVE-2017-5123.c