Привет, сообщество CyberSec,

Добро пожаловать обратно в мой блог-пост. Сегодня я расскажу об атаке Dirty-Cow, которая является интересным случаем уязвимости состояния гонки.

Она была обнаружена в ядре Linux с сентября 2007 года, но была обнаружена и использована в октябре 2016 года. также. Эта атака направлена ​​на получение полного доступа к привилегиям root путем использования уязвимости. Самый ненадежный метод этого эксплойта заключался в том, что он находится в коде копирования при записи (COW) внутри ядра Linux. Звучит жутко, не так ли? Злоумышленник может изменить любой защищенный файл, даже если эти файлы доступны только ему для чтения (/etc/password/passwd).

Давайте углубимся.

Чтобы разобраться в этой атаке, мы должны знать, что делает функция mmap() в этом сценарии. Если вы хотите узнать, что такое ядро ​​​​Linux, я поделюсь некоторыми ссылками, где вы можете его прочитать.

Отображение памяти с помощью mmap()

Чтобы понять уязвимость Dirty-Cow, нам нужно сначала понять, как работает сопоставление памяти. Пользователи Linux могут использовать справочную страницу, чтобы получить больше информации об этой POSIX-совместимой системе.

mmap() creates a new mapping in the virtual address space of the
       calling process.  The starting address for the new mapping is
       specified in addr.  The length argument specifies the length of
       the mapping (which must be greater than 0).

Тип сопоставления по умолчанию для mmap() — сопоставление с файловой поддержкой, при котором область виртуальной памяти процесса сопоставляется с файлами; чтение из сопоставленных областей приводит к чтению файла.

Этот код был написан Венлян Ду, как кодировался mmap().

Позвольте мне объяснить, что делает этот код, этот код также можно найти на странице руководства Linux.

  1. Первый аргумент указывает начальный адрес отображаемой памяти; если аргумент равен NULL
  2. Второй аргумент указывает размер отображаемой памяти.
  3. Третий аргумент указывает, доступна ли память для чтения. Флаги PROT_READ и PROT_WRITE. Если файл открывается с флагом O_RDONLY (только для чтения)

4.Четвертый аргумент определяет, видимо ли обновление сопоставления.

5.Пятый аргумент указывает файл, который необходимо сопоставить.

MAP_SHARED, MAP_PRIVATE и копирование при записи

Системный вызов mmap() создает новое сопоставление в виртуальном адресном пространстве вызывающего процесса. mmap — очень распространенный системный вызов в пользовательском пространстве, будь то выделение памяти, чтение и запись больших файлов, связывание файлов динамической библиотеки или совместное использование памяти между несколькими процессами.

MAP_SHARED: создать общую область сопоставления. Таким образом, несколько процессов могут отображать один и тот же файл, и измененное содержимое будет синхронизировано с файлом на диске.

MAP_PRIVATE: создает частное сопоставление для копирования при записи. Несколько процессов могут сопоставлять один и тот же файл в частном порядке, и изменения не синхронизируются с диском.

Давайте представим, что процессу нужна частная копия файла, и он не хочет, чтобы какое-либо обновление частной копии влияло на исходный файл. Когда процесс создает частную копию, содержимое исходной памяти необходимо скопировать в частную память. Поскольку мы знаем, что этот процесс требует времени для копирования памяти, действие копирования часто откладывается до тех пор, пока оно не понадобится. MAP_PRIVATE по-прежнему указывает на общую физическую память, которая изначально называется «главной копией». Если процессу не требуется запись в отображаемую память, нет необходимости иметь частную копию.

MAP_PRIVATE для MMAP также создает «копирование при записи», но что это означает?

Копирование при записи

Любая запись в область отражается только в памяти этого процесса; другие процессы, которые сопоставляют тот же файл, не увидят изменений. Вместо записи непосредственно на страницу, совместно используемую всеми процессами, процесс пишет на частную копию этой страницы. Это также метод оптимизации, который позволяет отображать виртуальные страницы памяти в разных процессах. Я забываю об этом, когда родительский процесс создает дочерний процесс с помощью системного вызова FORK(), который должен иметь свою собственную личную память.

Сопоставление файлов только для чтения

Про атаку Грязной Коровы я еще точно не объяснил, позвольте мне объяснить. Это включает в себя сопоставление только для чтения (если вы хотите узнать больше об этом файле сопоставления, вы можете проверить страницу руководства), мы должны быть в состоянии понять его поведение. Я хотел продемонстрировать этот процесс, но мой Ubuntu 12.04 не работает должным образом :( с помощью этой атаки мы можем изменить наш файл с владельца/группы на root. Допустимы любые числа, которые записаны в нашем файле, такие как 1,2, 3….

  • На этой иллюстрации я по-прежнему буду использовать код Венлян Ду*.

Позвольте мне продемонстрировать, что это за код, мы явно отображаем /aaa в постоянную память. Можем ли мы это сделать? Нет. Поскольку у него есть защита памяти, мы не можем напрямую писать в эту память, однако мы можем писать в нее через файловую систему proc, которая является специальной файловой системой в UNIX-подобной операционной системе. Для получения более подробной информации проверьте страницу руководства.

Через /proc/self/mem процесс может использовать файловые операции, такие как системный вызов read(), write и lseek(). Мы должны переместить указатель файла на пятый байт от начала отображаемой памяти. Чего мы ожидаем? Операция записи должна инициировать копирование при записи из-за параметра MAP_PRIVATE, когда /aaa отображается в память.

Уязвимость грязной коровы

Вы пришли сюда, чтобы прочитать об этой атаке, верно…? Что ж, вы правы :), но перед объяснением этой атаки я должен объяснить процесс, который выполняется во время использования этой атаки. Я проиллюстрировал системный вызов write(), который можно использовать для записи в отображаемую память.

Системный вызов работает следующим образом и должен выполнить три основных шага:

  1. Он делает копию отображаемой памяти.
  2. Он обновляет таблицу страниц, что означает, что виртуальная память будет указывать на только что созданную физическую память.
  3. Он пишет в память.

Эти три основных шага должны быть выполнены. Вы думаете, в чем проблема? Теперь позвольте мне объяснить. Проблема возникает между шагами 2 и 3, потому что; шаг 2 изменяет таблицу страниц процесса. На шаге 2, таким образом, если виртуальная память указывает на физическую память и если больше ничего не происходит, будет выполнен шаг 3. Система Write() успешно запишет в частную копию отображаемой памяти.

Для простоты не буду углубляться.

Давайте углубимся в часть эксплуатации уязвимости Dirty Cow.

Использование уязвимости Dirty Cow

Как я уже упоминал, я хотел показать вам, как эта атака проявляется в нашем терминале из-за ошибки Ubuntu, я смог показать это, тем не менее, я исправлю это позже.

Я кратко объясню, как эта уязвимость, связанная с состоянием гонки, получает права суперпользователя. Эта CVE-2016–5195 позволяет нам изменять любой файл, если у нас есть разрешение на чтение файла.

Я объясню шаг за шагом, как это работает…

Выбор /etc/passwd в качестве целевого файла

Чтобы выполнить нашу задачу, нам нужно выбрать /etc/passwd, чтобы изменить его, этот файл доступен для чтения всем, но не root не сможет его изменить. Этот адрес Linux содержит информацию об учетной записи пользователя, которую он записывает для каждого пользователя.

Каждая из приведенных выше записей содержит семь полей, разделенных двоеточиями, интерес этого поля находится в третьем поле, которое указывает значение идентификатора пользователя, назначенное пользователю, это также важно для безопасности. Пользователь root, как мы и ожидали, имеет значение 0, которому система угрожает как root.

Вы видели UID 1000 над этим изображением в третьем столбце (руткит), у этого пользователя нет привилегий root, но эта версия kali уже исправлена, поэтому уязвимости не будет. Основная идея сценария — очевидное создание пользователя.

Мы создали пользователя с именем cow, и запись этого пользователя будет добавлена ​​в /etc/passwd.

Настройте сопоставление памяти и угрозы

Сначала нам нужно отобразить /etc/passwd в память, у нас есть только разрешение на чтение файла, поэтому мы можем отобразить его только в память только для чтения. Наша цель — писать в эту отображенную память, а не в ее копию. Нам нужно закодировать два дополнительных потока.

Я буду использовать код Wenliang Du.

Чтобы использовать наш скрипт, нам нужно найти позицию, в которой находится запись счета коровы. Возможно, вы не знакомы с функцией strstr(), которая означает поиск строки «корова», после чего мы запускаем два потока.

Задание заменяет 0000 вместо 1001, а задание потока записи, перечисленное ниже, заключается в замене строки cow:x:1001 в памяти на cow:x:0000. Мы знаем, что отображаемая память имеет тип COW.

Тема Мэдвис

Madvise полезен, потому что он не делает только одну вещь: он отвергает частную копию отображаемой памяти, таким образом, таблица страниц может указывать на исходную отображаемую память.

Если системные вызовы write() и madvise() вызываются таким образом, когда вызываются только после завершения другого, мы знаем, что операция write() всегда будет выполняться на частной копии и никогда не сможет изменить цель. файл.

Краткое содержание

Атака состояния гонки DirtyCow работает только внутри ядра Linux, она не работает в среде Windows. Подводя итог этой атаке, я бы только сказал, что эта атака существует в реализации логики копирования при записи, включающей отображение памяти. Когда этот процесс работает, Linux захочет убедиться, что если процесс записывает в память, когда да.. Он будет писать в частную копию памяти. Система будет скомпрометирована :))

Эта атака опасна, потому что, когда Linux не исправлен, вы можете изменить записи пользователей и изменить идентификатор пользователя на 0, чтобы быть связанным с корневой группой. 0 означает ---› корень

Спасибо за чтение этого блога. Пожалуйста, поддержите, поставьте лайк, поделитесь и подписывайтесь на меня, чтобы не пропустить новые крутые эксплойты, взломы и другие вещи…

Ахмет Гёкер | Криптоаналитик | Эксплойт исследователь | Исследователь вредоносных программ | КТФ игрок.

Вы можете следить за мной на:

Linkedin: https://www.linkedin.com/in/ahmetg%C3%B6ker/

Твиттер: https://twitter.com/TurkishHoodie_

Ютуб: https://youtube.com/TurkishHoodie

Ресурсы: