Использование архитектуры компьютера в фишинговых цепочках. Часть 1
Предупреждение: данная статья предназначена исключительно для исследовательских и образовательных целей. Автор не несет ответственности за любое использование информации из статьи в незаконных или вредоносных целях. Материал представлен для понимания современных технологий и угроз, а также для повышения уровня осведомленности и безопасности. Использование изложенных данных должно соответствовать действующему законодательству.
Статья получилась объемная, поэтому она будет разделена на две части:
- В первой части мы рассмотрим виды полезной нагрузки и малварей с точки зрения взаимодействия с архитектурой, а затем углубимся в общие принципы эксплуатации, защиты и способы обхода
- Во второй части мы рассмотрим автоматизацию подобных атак и два наиболее известных примера: использование зараженного PDF и в документах Office
Фишинговые цепочки обычно делятся на несколько этапов:
- Разведка
- Составление и выбор сценария
- Подготовка социалки
- Подготовка вредоноса
- Тестирование
- Осуществление сценария
Дальнейшие действия будут зависеть от успеха фишинга: если все успешно, то мы закрепляемся или быстро собираем данные и уходим, если провал, то анализируем возможные причины и пробуем другие варианты
Сейчас акцент будет на то, как происходит взаимодействие малвари с архитектурой компьютера. Сначала посмотрим на тему более глобально, а потом изучим два конкретных примера.
Виды полезной нагрузки и малварей
Эксплойты для уязвимостей программного обеспечения
Сначала стоит посмотреть на общую концепцию создания эксплойтов под уязвимости разного ПО
Архитектурные аспекты
- Процессорная архитектура
- Эксплойт разрабатывается с учётом инструкции процессора (x86, x64, ARM). Например, 32-битный процесс не может напрямую работать с 64-битной адресацией.
- Для процессоров с поддержкой SIMD (это single instruction, multiple data. то есть, одиночный поток команд и множественный поток данных. это позволяет обеспечивать параллелизм. SSE - это набор команд для процессоров, который был создан для обработки нескольких чисел одновременно, AVX - это более продвинутая версия SSE. Она позволяет процессору работать с большими объемами данных и выполнять более сложные операции) эксплойты могут использовать инструкции для ускорения выполнения вредоносного кода.
- Память и адресация
- Эксплойты используют доступ к физической и виртуальной памяти. Например, переполнение стека требует знания точного расположения буфера, которое может быть рандомизировано ASLR (механизм защиты, который меняет расположение важных частей программы (например, стека, кучи, библиотек) в памяти каждый раз при запуске программы). Например, без ASLR буфер всегда находится по адресу, например,
0x7ffd1a2b3c40
. Поэтому мы спокойно можем узнать и эксплуатировать этот адрес. А вот с ASLR при каждом запуске программы адрес буфера будет меняться. Например:0x7ffe1c2d3e50
(первый запуск),0x7ffd1f3a2d60
(второй запуск),0x7ffc1e4b3f70
(третий запуск).
Сейчас практически любые устройства имеют ASLR - Доступ к ядру через ring-0 (это кольца привилегий, ring-0 имеет максимальные права): многие эксплойты (например, kernel exploits) пытаются выйти за пределы пользовательского уровня (ring-3) и получить доступ к привилегированным ресурсам.
- Операционные системы
Способы защиты со стороны системы
Думаю, не стоит напоминать, что если мы знаем алгоритмы защиты, то нам проще будет придумать обходы.
- ASLR (Address Space Layout Randomization)
- DEP (Data Execution Prevention)
- Защищает от выполнения кода в сегментах данных, например, в стеке. Как это происходит? DEP использует аппаратные возможности процессора, чтобы пометить некоторые области памяти как "недопустимые для выполнения кода".
Это делается, например, с помощью флага "NX" (No eXecute) на процессорах x86/x64 или с помощью "Execute Never" на ARM. - Control Flow Guard (CFG)
- Следит за корректностью переходов между блоками кода, предотвращая использование ROP (Return-Oriented Programming). Когда программа компилируется с включенной поддержкой CFG, компилятор добавляет метаданные о "разрешенных" точках перехода в коде и создает специальную таблицу, где хранится информация о допустимых адресах переходов. И когда программа пытается выполнить косвенный переход (например, через указатель функции), CFG проверяет, находится ли адрес перехода в таблице допустимых адресов.
Если переход недопустим, то программа прерывается - Патчи уязвимостей
Как можно обойти вышеописанные методы защиты?
- Для обхода ASLR можно использовать утечки информации через вызовы, возвращающие адреса библиотек. Пример: чтение адресов через злоупотребление системными функциями.
- Для обхода CFG можно создавать ложные цепочки вызовов с использованием промежуточных библиотек.
- Для обхода DEP есть два варианта:
- ROP (Return-Oriented Programming). За счет ROP можно использовать легитимные фрагменты кода для выполнения вредоносных действий.
- JIT-спрей (Just-In-Time Spray) создаёт исполняемый код в памяти динамически.
2. Dropper
Основная цель дроппера заключается в доустановке и установке других вредоносных компонентов на целевую систему.
Архитектурные аспекты
- Адаптация к системе:
- Дроппер определяет архитектуру системы (32 или 64 бита) через вызов
IsWow64Process
или проверяет регистры CPUID для процессора. А далее загружает полезную нагрузку через powershell или bash - Загрузка полезной нагрузки:
- Дроппер может использовать системные библиотеки (
WinInet.dll, ws2_32.dll
) для сетевых взаимодействий - Может сохранять вредоносный код в памяти, избегая записи на диск, а это затрудняет обнаружение
- Маскировка:
Способы защиты со стороны системы
Обход защит
- Полиморфизм и шифрование
- Бесфайловая работа
- Использование доверенных процессов (тот же powershell или WMI)
3. Keylogger
Кейлоггеры записывают все действия пользователя в системе (движение мышкой, нажатие на клавиатуру и тд)
Архитектурные аспекты
- Интерфейсы API
- В Windows может использоваться функция
SetWindowsHookEx
для перехвата ввода с клавиатуры или функцииGetAsyncKeyState
для записи нажатий. - В Linux кейлоггер может взаимодействовать с устройствами через
/dev/input
. - Уровни доступа
- Для пользовательского уровня (Ring-3) можно работать через API системы.
- Для уровень ядра (Ring-0)необходимо внедряться в драйверы.
- Маскировка
Способы защиты со стороны системы
Обход защит
4. RAT
По сути, это троян удаленного доступа
Архитектурные аспекты
- Сетевые соединения
- Для маскировки трафика RAT может использовать протоколы HTTP/HTTPS, а для скрытия местоположения может работать через прокси или tor.
- Автономная работа
Способы защиты со стороны системы
Обход защит
5. Ransomware
Это программа-вымогатель — блокирует доступ к данным или устройству данных (например, шифрует файлы) и требует выкуп для восстановления доступа.
Архитектурные аспекты
- Криптография
- Используются аппаратные инструкции AES-NI для ускорения шифрования.
- Генерация ключей через PRNG (Pseudo-Random Number Generator), встроенные в процессор.
- Некоторые рансомвары (например, DoppelPaymer, Maze) шифруют файлы дважды, используя разные ключи, чтобы усложнить процесс расшифровки, а также используют комбинации из симметричного и ассиметричного шифрования (например, RSA-2048 + AES-256)
- Файловая система
Способы защиты со стороны системы
Обход защит
- Удаление резервных копий
- Уход от детектирования
- Медленное шифрование для обхода поведенческого анализа. Это делается для того, чтобы шифрование было более "незаметным", распределяя операции во времени и маскируя их под нормальную активность. Однако современные защитные решения начинают учитывать такие тактики, анализируя поведение в долгосрочной перспективе и используя машинное обучение для анализа.
- Шифрование резервных копий (имеются в виду целевые атаки на сервера резервного копирования)
6. Stealers
Тип вредоносного ПО, которое собирает конфиденциальную информацию: данные учетных записей, сохраненные пароли в браузерах и тд
Архитектурные аспекты
- Браузеры
- Стилеры взаимодействуют с API браузеров для извлечения сохранённых паролей и cookie-файлов.
- Для браузеров на основе Chromium используются встроенные SQLite-базы.
- Шифрование паролей в современных браузерах привязано к профилю пользователя и ключам ОС. Например, в Windows это API Data Protection (DPAPI).
- Менеджеры паролей
- Стилеры анализируют файловую структуру и извлекают зашифрованные хранилища паролей (например, KeePass, LastPass).
- Часто используются утилиты дешифровки, разработанные для обхода встроенной защиты.
- Мессенджеры
- Общая суть, независимо от мессенджера: стилеры ищут локальные базы данных сессий и извлекают токены авторизации.
- Файловая система
- Стилер сканирует целевую файловую систему, ориентируясь на специфичные расширения файлов, такие как
.txt
,.docx
,.pdf
, или папки, где обычно хранятся конфиденциальные данные. - Используются функции API (например,
FindFirstFile
иFindNextFile
в Windows) для рекурсивного обхода файловой структуры. - Процессы и память
- Стилеру может потребоваться доступ к оперативной памяти для извлечения данных из активных процессов. Например, расшифровка паролей или токенов, которые хранятся временно в памяти. Для этого используются системные вызовы, такие как
OpenProcess
иReadProcessMemory
. - Архитектурные аспекты
- Отправка данных
- Стилер использует сетевые библиотеки (например,
WinHTTP
,WinInet
илиlibcurl
в Linux) для отправки полученных данных на сервер атакующего. Часто данные шифруются перед отправкой для предотвращения анализа трафика (например, через алгоритмы AES или XOR). - Маскировка трафика (как у RAT)
Обход защит
Для этого стилеры проверяют, не выполняются ли они в виртуальной машине или песочнице. Это может быть сделано через:
Стилеры часто упакованы или зашифрованы, чтобы избежать статического анализа антивирусами. Для этого используются полиморфные генераторы, которые изменяют сигнатуры вредоносного ПО при каждом запуске.
Стилеры может динамически загружать системные библиотеки, такие как nss3.dll
для доступа к SQLite-базам браузеров.
Стилер может не записываться на диск, а выполнять все действия в оперативной памяти, обходя антивирусы.
Вредоносный процесс может маскироваться под легитимный, используя имя системного процесса.
Способы защиты со стороны системы
- Поведенческий анализ
- Шифрование конфиденциальных данных
- Мониторинг файловой системы
- Защита памяти (например, Control Flow Guard)
- Фильтрация сетевого трафика:
7. Rootkits
Архитектурные аспекты
- Уровни работы руткитов
- Ring-3 (пользовательский уровень)
- Руткиты работают как приложения, скрывают свои процессы и подменяют системные вызовы (например, через API-интерфейсы Windows или Linux).
- Ring-0 (уровень ядра)
- Руткиты внедряются в ядро ОС, модифицируя таблицу системных вызовов (SSDT) или функции драйверов. Это даёт полный контроль над системой.
- Аппаратный уровень
Способы защиты со стороны системы
- Secure Boot (предотвращает запуск неподписанных модулей ядра или изменённого кода прошивки)
- Песочницы
- Мониторинг целостности ядра
Обход защит
8. Backdoors (Бэкдоры)
Архитектурные аспекты
- Методы работы
- Сетевые бэкдоры
- Открывают скрытые порты на устройстве и предоставляют атакующему доступ через протоколы TCP или UDP.
- Kernel - бэкдоры
- Внедряются в системные модули, например, в сетевые драйверы, и обрабатывают входящие соединения без уведомления ОС.
- Программные бэкдоры
- Маскировка:
Способы защиты со стороны системы
Обход защит
9. Трояны
Архитектурные аспекты
Способы защиты со стороны системы
Обход защит
Теперь время подводить итоги первой части. Сейчас мы посмотрим на уязвимости процессора, как используются особенности памяти и кэширования и как происходит работа с системным ПО и аппаратными интерфейсами для контроля и скрытности.
Как может эксплуатироваться архитектура
Эксплуатация уязвимостей процессора на примере Spectre, Meltdown
Общая суть
Несмотря на то, что уязвимости Spectre и Meltdown были освещены где только можно, они все равно являются показательными примерами, так как основаны на архитектурных особенностях современных процессоров, которые используют спекулятивное исполнение (speculative execution) для повышения производительности.
Спекулятивное исполнение позволяет процессору выполнять инструкции до того, как станет известно, нужны ли они, чтобы минимизировать задержки и, конечно, эта оптимизация может раскрывать данные, которые обычно недоступны программам из-за механизмов защиты памяти.
1. Уязвимость Spectre
Spectre использует спекулятивное исполнение для обмана процессора, заставляя его выполнить инструкции, которые приводят к утечке конфиденциальных данных через побочные каналы, например, через кэш-память. Он использует Branch Target Injection (BTI) или Bounds Check Bypass (BCB).
Основная цель — обход изоляции памяти между процессами.
- Механизм работы
- Спекулятивное выполнение недопустимой ветки
- Атакующий заставляет процессор спекулятивно выполнять инструкции, основанные на заведомо ложном предположении (например, через манипуляции с ветвлением
if
). Что вообще это значит? Атакующий использует ветвление с условием, которое он контролирует. Процессор "ошибочно" выполняет недопустимую ветку из-за предсказателя ветвлений. В недопустимой ветке процессор может косвенно загрузить защищенные данные в кэш, даже если позже выполнение будет отменено. - Кэширование данных
- Хотя результаты выполнения инструкций будут отменены после обнаружения ошибки, изменения в кэше сохраняются.
- Извлечение данных через кэш
2. Уязвимость Meltdown
Meltdown позволяет получать доступ к данным, которые должны быть защищены механизмом изоляции памяти между ядром и пользовательскими процессами.
Meltdown эксплуатирует Out-of-Order Execution — механизм процессора, который позволяет выполнять инструкции в произвольном порядке для оптимизации.
Упущение здесь следующее: проверки доступа к памяти выполняются после обращения к памяти.
Способы защиты
- Изоляция памяти ядра (KPTI)
- Для защиты от Meltdown операционные системы внедрили механизм Kernel Page-Table Isolation, который изолирует таблицы страниц ядра от пользовательских процессов.
- Retpolines
- Механизм защиты от Spectre, который предотвращает использование спекулятивного перехода в ветвление.
- Программные и аппаратные патчи
Обход защит
Использование особенностей памяти и кэширования для оптимизации атак
Современные процессоры используют многоуровневую кэш-память (L1, L2, L3) для ускорения доступа к данным. Кэширование, хотя и увеличивает производительность, создаёт побочные каналы, которые атакующий может использовать для извлечения конфиденциальной информации.
1. Использование побочных каналов на основе кэша
Кэш-память хранит часто используемые данные, чтобы ускорить доступ к ним. Атакующий использует время доступа к кэшу для определения содержимого памяти. Ниже будут приведены не все атаки, лишь примеры с коротким описанием. Если вы хотите узнать об этом подробнее, то вам стоит прочитать данную статью на Хакере.
- Механизм атак
- Flush+Reload
- Атакующий очищает строку кэша с помощью команды
CLFLUSH
. - Когда таргет обращается к очищенному адресу, данные загружаются обратно в кэш.
- Атакующий измеряет время доступа к адресу: быстрый доступ указывает на то, что данные были загружены таргетом.
- Prime+Probe
- Атакующий заполняет кэш своими данными.
- Таргет выполняет свои операции, вытесняя часть данных атакующего из кэша.
- Атакующий измеряет время доступа к своим данным, чтобы понять, какие линии кэша были использованы таргетом.
- Evict+Reload
2. Использование виртуальной памяти
Атакующий использует механизмы перевода виртуальных адресов в физические для анализа памяти.
Хорошим примером может служить атака через TLB (Translation Lookaside Buffer, это кэш для хранения соответствия виртуальных и физических адресов)
Принцип тот же: время доступа к памяти позволяет определить, какие страницы памяти используются таргетом.
3. Системные вызовы и побочные каналы
Принцип повторяется: используется анализ времени.
- Атаки через системные вызовы
- Атакующий анализирует время выполнения системных вызовов (например,
read
,write
) для извлечения информации о состоянии системы. Например, время отклика может указать, находится ли нужная информация в кэше или памяти. - Профилирование инструкций
Способы защиты
- Изоляция процессов
- Разделение кэша для разных процессов, чтобы предотвратить вытеснение данных.
- Использование технологии Intel CAT (Cache Allocation Technology) для управления доступом к кэшу.
- Рандомизация кэша (изменение логики работы)
- Ограничение высокоточных таймеров
Обход защит
- Атаки через аппаратные таймеры
- Атакующий использует таймеры в аппаратных компонентах, например, в сетевых картах, для измерения времени доступа.
- Многопоточность
- Одновременное выполнение вредоносного кода и легитимного кода в соседних потоках позволяет обойти изоляцию.
- Кросс-кэш атаки
Работа с системным ПО и аппаратными интерфейсами для контроля и скрытности
При фишинге есть основные задачи: получить максимальный контроль над системой и оставаться незамеченным. Для этого можно взаимодействовать с системным ПО и аппаратными интерфейсами
1. Работа с системными вызовами
- Захват системных вызовов
- Используется подмена таблицы системных вызовов (System Service Descriptor Table, SSDT) в Windows.
- Например, атакующий заменяет вызов
NtQueryDirectoryFile
так, чтобы скрывать определённые файлы или процессы. - В Linux системные вызовы можно захватывать через модификацию таблицы
syscall_table
. - Хуки в пользовательском пространстве (User-Mode Hooks)
2. Взаимодействие с драйверами и ядром ОС
- Уровень ядра (Ring-0)
- Атакующий внедряет драйверы, которые имеют привилегированный доступ к системе. Это позволяет перехватывать сетевые пакеты, манипулировать памятью и изменять поведение ядра. Пример: установка фильтров на сетевые адаптеры через NDIS (Network Driver Interface Specification).
- В Windows драйверы используют функции, такие как
ZwQuerySystemInformation
, чтобы получить информацию о процессах и памяти. - В Linux драйверы взаимодействуют с ядром через интерфейсы
/proc
или/dev
. - Аппаратно-зависимые драйверы (HAL)
3. Работа с аппаратными интерфейсами
- Использование BIOS/UEFI
- Атакующий внедряет вредоносный код в прошивку BIOS или UEFI, чтобы сохранить контроль над системой даже после переустановки ОС.
- Например, вредоносное ПО Lojax заражает прошивку UEFI и перезапускается при каждом включении компьютера.
- Контроль через DMA (Direct Memory Access)
- Интерфейсы, такие как Thunderbolt или PCI Express, позволяют обходить защиту памяти, используя прямой доступ к оперативной памяти.
- DMA-атаки могут перехватывать данные из памяти без участия операционной системы.
- Аппаратные руткиты могут использовать микроконтроллеры для внедрения вредоносного кода в периферийные устройства (например, сетевые карты, клавиатуры)
4. Методы скрытности
Способы защиты
- Цифровая подпись драйверов
- Windows требует, чтобы все драйверы имели цифровую подпись. Это затрудняет установку нелегитимных модулей. При этом, никто не запрещает использовать легитимные драйвера с уязвимостями, которые можно проэксплуатировать.
- Мониторинг ядра
- Использование инструментов, таких как Windows Defender Credential Guard или Hyper-V, для контроля модификаций ядра.
- UEFI Secure Boot