«БХВ-Петербург»
2020
УДК 004
ББК 32.973
В40
Вместо предисловия........................................................................................................ 7
1. Повышаем привилегии до суперпользователя через уязвимость в sudo
(Иван aLLy Комиссаров) ................................................................................................. 10
Подготовка ..................................................................................................................................... 10
Детали уязвимости......................................................................................................................... 12
Принцип работы эксплоита .......................................................................................................... 15
Практическая эксплуатация и повышение привилегий .............................................................. 20
15. Извлекаем и анализируем данные Apple Watch (Олег Афонин) ................... 164
Почему Apple Watch? .................................................................................................................. 164
Анализ резервной копии iPhone .................................................................................................165
Промежуточные итоги ................................................................................................................ 174
Извлечение данных из Apple Watch через адаптер ................................................................... 175
Подключение к компьютеру ............................................................................................... 175
Анализ лог-файлов часов .................................................................................................... 180
Доступ к медиафайлам ........................................................................................................ 182
Выводы ................................................................................................................................. 185
Доступ через облако .................................................................................................................... 185
Заключение................................................................................................................................... 186
Вместо предисловия
ВНИМАНИЕ!
Вся приведенная на страницах этой книги информация, код и примеры публикуются
исключительно в ознакомительных целях. Ни издательство «БХВ», ни редакция жур-
нала «Хакер», ни авторы не несут никакой ответственности за любые последствия ис-
пользования информации, полученной в результате прочтения книги, а также за лю-
бой возможный вред, причиненный информацией из этого издания.
Помните, что несанкционированный доступ к компьютерным системам и распростра-
нение вредоносного ПО преследуются по закону. Все рассмотренные в книге методы
____ ____
9
Искренне надеюсь, что ты, дорогой читатель, прекрасно понимаешь, что любые
знания подразумевают ответственность. С использованием одной и той же ядерной
реакции можно построить атомную электростанцию, которая согреет миллионы
людей, а можно соорудить бомбу, способную уничтожить их. Уверен, ты сделаешь
правильный выбор и используешь обретенные благодаря этой книге знания во бла-
го — для борьбы с компьютерными угрозами, повышения информационной безо-
пасности и выявления уязвимостей, которые можно и нужно закрыть. Ну а я, соста-
витель этого сборника, и авторы опубликованных в нем статей будем рады видеть
тебя среди постоянных читателей журнала «Хакер». До встречи!
Валентин Холмогоров,
редактор рубрики «Взлом» журнала «Хакер»
http://xakep.ru
http://holmogorov.ru
______________
1. Повышаем привилегии
до суперпользователя
через уязвимость в sudo
Иван aLLy Комиссаров
Подготовка
Начнем с выбора операционной системы. Я буду использовать CentOS 7 в качестве
гостевой ОС, поэтому все мои манипуляции будут актуальны именно для этой вер-
сии системы. Запускать ОС через Docker я не советую — SELinux в нем работает не
так же, как в полноценном дистрибутиве. Лучше использовать VMware или
VirtualBox.
Чтобы протестировать уязвимость, нам понадобятся три условия:
1. Обычный пользователь с sudo-привилегиями выполнения какой-нибудь про-
граммы.
2. Активированный SELinux (Security Enhanced Linux).
3. Сам бинарник sudo должен быть собран с поддержкой SELinux (поддержка sudo
-r role).
Разберемся с каждым пунктом.
Для начала создадим юзера attacker. Я уже сделал это на этапе установки системы,
но если тебе по каким-то причинам такой вариант не подходит, то это можно про-
вернуть следующей командой в консоли:
____ ____
11
Детали уязвимости
В самом начале я упомянул, что проблема находится в функции get_process_
ttyname, которая объявлена в файле ttyname.c.
Давай разберемся, что делает эта функция. При выполнении команды она получает
информацию о статусе процесса /proc/[pid]/stat и читает номер терминала tty из
поля под номером 7 — tty_nr (рис. 1.3).
Рис. 1.3. Поле tty_nr (7) — номер терминала, который использует процесс
array.c
/src/ttyname.c
Теперь посмотрим на поле под номером 2 (comm). Это не что иное, как имя испол-
няемого файла, взятое в круглые скобки. А ведь оно вполне может содержать про-
белы. Например, возьмем стандартный бинарник cat, скопируем и сохраним его
под новым именем — cat with spaces. Теперь выполним команду cat\ with\ spaces
/proc/self/stat и посмотрим на результат (рис. 1.4).
/src/ttyname.c
326: /*
327: * First check search_devs for common tty devices.
328: */
329: for (sd = search_devs; (devname = *sd) != NULL; sd++) {
330: len = strlen(devname);
331: if (devname[len - 1] == '/') {
...
147: /*
148: * Devices to search before doing a breadth-first scan.
149: */
150: static char *search_devs[] = {
151: "/dev/console",
152: "/dev/wscons",
153: "/dev/pts/",
154: "/dev/vt/",
155: "/dev/term/",
156: "/dev/zcons/",
157: NULL
158: };
/src/ttyname.c
369: /*
370: * Not found? Do a breadth-first traversal of /dev/.
371: */
372: ret = sudo_ttyname_scan(_PATH_DEV, rdev, false, name, namelen);
/src/selinux.c
42183.c
42183.c
Рис. 1.5. Отладка эксплоита в момент генерации имени симлинка для sudo
Этот трюк, как ты помнишь, нужен для того, чтобы нарушить логику работы функ-
ции get_process_ttyname в месте парсинга результатов stat по символу пробела.
Почему здесь используется число 34 873? Для разъяснения нужно обратиться к до-
кументации proc (http://man7.org/linux/man-pages/man5/proc.5.html):
(7) tty_nr %d
The controlling terminal of the process. (The minor
device number is contained in the combination of
bits 31 to 20 and 7 to 0; the major device number is
in bits 15 to 8.)
Представим число 34 873 в двоичной системе, получится 1000 1000 0011 1001.
В битах с 15 по 8 хранится тип терминала. Для обычной консоли tty это число рав-
но 0000 0100, или 4 в десятеричной системе. Но мы проводим манипуляции с псев-
дотерминалами. Доступ к ним можно получить через /dev/pts/, и им соответствует
тип 136, или 1000 1000.
____ ____
17
42183.c
Далее собираем параметры для запуска sudo через символическую ссылку. Исполь-
зуем флаг -r role, где role — роль нашего пользователя в контексте SELinux. По
умолчанию в эксплоите используется unconfined_r.
42183.c
42183.c
Настало время гонок. Чтобы перезаписать файл, нам нужно успешно выиграть два
заезда. Для облегчения этого процесса в эксплоите использовано три любопытных
трюка.
Трюк первый: функция sched_setaffinity заставляет sudo отрабатывать на том же
логическом процессоре, что и наш эксплоит.
42183.c
Второй трюк: при помощи функции setpriority понижается приоритет nice процес-
са sudo до минимального (+19):
42183.c
42183.c
Шансы выиграть гонку заметно подросли, и теперь нам нужно поймать момент,
когда sudo выполнит функцию opendir для рабочей директории — /dev/shm/_tmp.
Для этого используется inotify API. Его цель — наблюдать за объектами в ожида-
нии определенных событий, а при возникновении этих событий выполнять указан-
ные действия.
Вешаем вотчер ивента IN_OPEN на папку и ждем, пока программа дойдет до ее
открытия. Это происходит при поиске несуществующего псевдотерминала из сим-
линка. Как только событие срабатывает, останавливаем процесс sudo, отправив ему
сигнал SIGSTOP: