Slslib dll что это
Недавно было обнародовано вопиющее поведение компании Lenovo, предустанавливающей на свои ноутбуки рекламное ПО. Оно не только вставляет рекламу в страницы, но и внедряет в систему SSL-сертификат, позволяющий сканировать зашифрованный трафик. Конечно же, этот сертификат был взломан и теперь безопасность всех пользователей ноубуков Lenovo под угрозой.
Компания разместила инструкцию по удалению программы, но к сожалению, они упустили из виду вопрос удаления самого сертификата, который при этом не исчезает из системы. Вот инструкция для тех, кто не хочет переустанавливать систему с нуля.
Сертификат размещается в хранилище сертификатов Windows. Некоторые программы, например Mozilla Firefox и Mozilla Thunderbird, используют свои хранилища, куда он тоже может быть внедрён. Для обеспечения безопасности необходимо удалить сертификат отовсюду.
Первый шаг избавления от назойливого adware – удаление самой программы. Это делается через обычную «Установку и удаление программ». Программа называется «Superfish Inc. VisualDiscovery».
Затем необходимо удалить сертификат из хранилища Windows. Для этого надо запустить программу certmgr.msc (через Пуск или командную строку). В открывшемся окне слева выбрать пункт Trusted Root Certification Authorities / Certificates. Затем справа найти сертификат Superfish, Inc и сжечь удалить его.
Если вы пользуетесь продуктами Mozilla, то это ещё не всё. В Firefox зайдите в расширенные настройки и выберите вкладку «Сертификаты».
Найдите в списке сертификатов Superfish и удалите его (кнопка Delete or Distrust).
В Thunderburd действия те же. Зайти в настройки.
Просмотреть сертификаты и удалить Superfish.
Теперь ваша система чиста от зловредной программы и с этого момента у вас всё будет хорошо.
Для проверки успешности удаления направьте ваш браузер на специальный проверочный сайт.
Недавно меня заинтересовала тема использования DLL из Python. Кроме того было интересно разобраться в их структуре, на тот случай, если придется менять исходники библиотек. После изучения различных ресурсов и примеров на эту тему, стало понятно, что применение динамических библиотек может сильно расширить возможности Python. Собственные цели были достигнуты, а чтобы опыт не был забыт, я решил подвести итог в виде статьи — структурировать свой знания и полезные источники, а заодно ещё лучше разобраться в данной теме.
Под катом вас ожидает статья с различными примерами, исходниками и пояснениями к ним.
Содержание
- Структура DLL
- DLL & Python
- Подключение DLL
- Типы данных в С и Python
- Аргументы функция и возвращаемые значения
- Своя DLL и ее использование
Надеюсь из содержания немного станет понятнее какую часть нужно открыть, чтобы найти ответы на свои вопросы.
DLL & Python
Первым делом, расскажу, как подключать уже собранные DLL, затем, как вызывать из них функции и передавать аргументы, а уже после этого, постепенно доделаю шаблон из Code Blocks и приведу примеры работы с собственной DLL.
Уязвимый системный компонент
Поскольку ImController должен получать и устанавливать файлы с серверов Lenovo, выполнять дочерние процессы и выполнять задачи настройки и обслуживания системы, он работает с правами SYSTEM.
Системные привилегии — это наивысшие права пользователя, доступные в Windows, которые позволяют кому-либо выполнять практически любую команду в операционной системе. По сути, если пользователь получает системные привилегии в Windows, он получает полный контроль над системой для установки вредоносных программ, добавления пользователей или изменения практически любых системных настроек.
Эта служба Windows будет порождать дополнительные дочерние процессы, которые открывают серверы именованных каналов, которые служба ImController использовала для связи с дочерним процессом. Когда ImController нуждается в одной из этих служб для выполнения команды, он подключится к именованному каналу и выдаст сериализованные команды XML, которые должны быть выполнены.
К сожалению, служба не обеспечивает безопасную связь между привилегированными дочерними процессами и не может проверить источник сериализованных команд XML. Это означает, что любой другой процесс, даже злонамеренный, может подключиться к дочернему процессу для выполнения своих собственных команд.
«Первая уязвимость — это состояние гонки между злоумышленником и родительским процессом, подключающимся к именованному каналу дочернего процесса», — поясняет NCC Group.
«Злоумышленник, использующий высокопроизводительные процедуры синхронизации файловой системы, может надежно выиграть гонку с родительским процессом за подключение к именованному каналу».
Исследователи подчеркивают, что их доказательный код концепции никогда не отказывался от подключения к именованному каналу до того, как это могла сделать родительская служба, а это означает, что эксплойт очень надежен.
Второй недостаток — это уязвимость между проверкой и временем использования (TOCTOU), которая позволяет злоумышленнику остановить процесс загрузки проверенного плагина ImControllerService и заменить его библиотекой DLL по своему выбору.
После снятия блокировки и продолжения процедуры загрузки выполняется DLL, что приводит к повышению привилегий.
Порядок поиска DLL и перехват
Поскольку DLL существуют в виде файлов на диске, вы можете задаться вопросом, как приложение узнает, откуда загружать DLL? Microsoft подробно задокументировала порядок поиска DLL здесь.
Начиная с Windows XP SP2, безопасный режим поиска DLL включен по умолчанию ( HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode ). При включенном безопасном режиме порядок поиска DLL следующий:
- Каталог, из которого загружено приложение.
- Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.
- 16-битный системный каталог. Функции, которая предоставляет путь к этому каталогу, нет, но в нем происходит поиск.
- Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
- Текущий каталог.
- Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входят пути для каждого приложения, указанные в разделе реестра App Paths. Ключ App Paths не используется при вычислении пути поиска DLL.
Если приложение не указывает, откуда загружать DLL, Windows использует порядок поиска DLL по умолчанию, приведенный выше. Первая позиция в порядке поиска DLL (каталог, из которого загружается приложение) представляет интерес для злоумышленников.
Если разработчик приложения предполагает загрузку DLL из C:\Windows\System32 , но явно не прописал это в приложении, вредоносная DLL, помещенная в каталог приложения, будет загружена раньше, чем легитимная DLL из System32. Загрузка вредоносной DLL называется подменой (или перехватом) DLL и используется злоумышленниками для загрузки вредоносного кода в доверенные/подписанные приложения.
Заключение
Напомним, что перехват DLL — это метод, с помощью которого злоумышленники могут повлиять на выполнение кода в подписанных/доверенных приложениях. Я создал инструменты, помогающие автоматизировать обнаружение путей перехвата DLL. Используя этот инструмент, я обнаружил пути перехвата DLL в Slack, Microsoft Teams и Visual Studio Code.
Я заметил, что пути перехвата DLL этих трех приложений частично совпадают, и исследовал причину. Я осветил свою методику понимания данного совпадения. Я узнал о DLL с отложенной загрузкой и обнаружил два вызова API, которые делают возможным перехват DLL в любой программе, которая их вызывает:
- NetShareEnum загружает cscapi.dll
- NetShareGetInfo загружает cscapi.dll
Подключение DLL
Основной библиотекой в Python для работы с типами данных, совместимыми с типами языка С является ctypes . В документации на ctypes представлено много примеров, которым стоит уделить внимание.
Чтобы начать работать с DLL, необходимо подключить библиотеку к программе на Python. Сделать это можно тремя способами:
- cdll — загружает динамическую библиотеку и возвращает объект, а для использования функций DLL нужно будет просто обращаться к атрибутам этого объекта. Использует соглашение вызовов cdecl.
- windll — использует соглашение вызовов stdcall. В остальном идентична cdll.
- oledll — использует соглашение вызовов stdcall и предполагается, что функции возвращают код ошибки Windows HRESULT. Код ошибки используется для автоматического вызова исключения WindowsError.
Для первого примера будем использовать стандартную Windows DLL библиотеку, которая содержит всем известную функцию языка С — printf() . Библиотека msvcrt.dll находится в папке C:\WINDOWS\System32 .
Код Python:
Результат:
Можно использовать подключение библиотеки с помощью метода windll либо oledll , для данного кода разницы не будет, вывод не изменится.
Если речь не идет о стандартной библиотеке, то конечно следует использовать вызов с указанием пути на dll. В ctypes для загрузки библиотек предусмотрен метод LoadLibrary . Но есть еще более эффективный конструктор CDLL , он заменяет конструкцию cdll.LoadLibrary . В общем, ниже показано два примера вызова одной и той же библиотеки msvcrt.dll.
Код Python:
Иногда случается, что необходимо получить доступ к функции или атрибуту DLL, имя которого Python не "примет"… ну бывает. На этот случай имеется функции getattr(lib, attr_name) . Данная функция принимает два аргумента: объект библиотеки и имя атрибута, а возвращает объект атрибута.
Код Python:
Результат:
Теперь становится понятно, как подключить библиотеку и использовать функции. Однако, не всегда в DLL нужно передавать простые строки или цифры. Бывают случаи, когда требуется передавать указатели на строки, переменные или структуры. Кроме того, функции могут и возвращать структуры, указатели и много другое.
Результаты
В Slack доступны следующие пути подмены DLL:
В Microsoft Teams доступны следующие пути подмены DLL:
В Visual Studio Code доступны следующие пути подмены DLL:
Кроме того, я обнаружил, что программы, использующие NetShareEnum и NetShareGetInfo , предоставляют возможность подмены DLL в форме cscapi.dll из-за жестко захардкоженного вызова LoadLibrary . Я подтвердил это поведение с помощью Ghidra и PoC.На примере Visual Studio Code
Повторяя описанный выше процесс, я обнаружил следующие потенциальные пути перехвата для Visual Studio Code:
Структура DLL
DLL — Dynamic Link Library — динамическая подключаемая библиотека в операционной системе (ОС) Windows. Динамические библиотеки позволяют сделать архитектуру более модульной, уменьшить количество используемых ресурсов и упрощают модификацию системы. Основное отличие от .EXE файлов — функции, содержащиеся в DLL можно использовать по одной.
Учитывая, что статья не о самих библиотеках, лучше просто оставить здесь ссылку на довольно информативную статью от Microsoft: Что такое DLL?.
Для того, чтобы понять, как использовать динамические библиотеки, нужно вникнуть в их структуру.
DLL содержит набор различных функций, которые потом можно использовать по-отдельности. Но также есть возможность дополнительно указать функцию точки входа в библиотеку. Такая функция обычно имеет имя DllMain и вызывается, когда процессы или потоки прикрепляются к DLL или отделяются от неё. Это можно использовать для инициализации различных структур данных или их уничтожения.
Рисунок 1 — Пустой template, предлагаемый Code Blocks для проекта DLL.
На рисунке 1 приведен шаблон, который предлагает Code Blocks, при выборе проекта типа DLL. В представленном шаблоне есть две функции:
Для начала стоит подробнее рассмотреть функцию DllMain . Через нее ОС может уведомлять библиотеку о нескольких событиях (fdwReason):
DLL_PROCESS_ATTACH – подключение DLL. Процесс проецирования DLL на адресное пространство процесса. С этим значением DllMain вызывается всякий раз, когда какой-то процесс загружает библиотеку с явной или неявной компоновкой.
DLL_PROCESS_DETACH – отключение DLL от адресного пространства процесса. С этим значением DllMain вызывается при отключении библиотеки.
DLL_THREAD_ATTACH – создание процессом, подключившим DLL, нового потока. Зачем DLL знать о каких-то там потоках? А вот зачем, далеко не каждая динамическая библиотека может работать в многопоточной среде.
DLL_THREAD_DETACH – завершение потока, созданного процессом, подключившим DLL. Если динамическая библиотека создает для каждого потока свои "персональные" ресурсы (локальные переменные и буфера), то это уведомление позволяет их своевременно освобождать.
Опять же, в тему структуры DLL можно углубляться до бесконечности, там есть много различных нюансов, о которых немного изложено в этой статье.
У DllMain не так много аргументов, самый важный fdwReason уже рассмотрен выше, теперь о двух других:
- Аргумент lpvReserved указывает на способ подключения DLL:
- 0 — библиотека загружена с явной компоновкой.
- 1 — библиотека загружена с неявной компоновкой.
О явной и неявной компоновке можно прочесть подробно в статье: Связывание исполняемого файла с библиотекой DLL.
В предложенном на рисунке 1 шаблоне есть функция SomeFunction , которая может быть экспортирована из динамической библиотеки. Для того, чтобы это показать, при объявлении функции указывается __declspec(dllexport) . Например, так:
Функции, не объявленные таким образом, нельзя будет вызывать снаружи.
Подмена DLL в NetShareGetInfo и NetShareEnum
Я следил за стек трейсом, когда Slack пытался загрузить cscapi.dll и видел вызов LoadLibraryExW , который, по-видимому, исходил из srvcli.dll .
Стек трейс при загрузке cscapi.dllЯ открыл srvcli.dll в Ghidra и использовал Search -> For Strings -> Filter: cscapi.dll . Двойной клик по найденной строке и переход по ссылкам приводит к ожидаемому LoadLibrary вызову.
srvcli.dll вызывает LoadLibrary для cscapi.dllПереименовав функцию, содержащую вызов LoadLibrary , и проследовав по ссылкам, я получил два места использования функции:
NetShareGetInfo загружает cscapi.dllЯ проверил это с помощью РоС программ, которые вызывали NetShareEnum и NetShareGetInfo :
NetShareEnum.exe загружает cscapi.dll
NetShareGetInfo.exe загружает cscapi.dllСвоя DLL и ее использование
Пример 1
Шаблон DLL уже был рассмотрен выше, а сейчас, когда дело дошло до написания своей DLL и работы с ней, выскочили первые и очевидные грабли — несовместимость разрядности DLL и Python. У меня на ПК установлен Python x64, оказалось, что как бы не были DLL универсальны, разрядность DLL должна соответствовать разрядности Python. То есть, либо ставить компилятор x64 и Python x64, либо и то и то x32. Хорошо, что это не сложно сделать.
Ниже привожу код шаблона DLL, в который добавил вывод строки при подключении библиотеки, а также небольшой разбор и вывод аргументов, с которыми вызвалась DllMain . В примере можно понаблюдать, какие участки кода библиотеки вызываются и когда это происходит.
Код DLL на С:
Код Python:
Функция SomeFunction получает указатель на строку и выводит её в окно. На рисунке ниже показана работа программы.
Рисунок 2 — Демонстрация работы шаблона библиотеки из Code Blocks.
Все действия происходящие в кейсе DLL_PROCESS_ATTACH , код которого приведен ниже, вызываются лишь одной строкой в Python коде:
Рисунок 3 — Действия происходящие при подключении DLL.
Пример 2
Чтобы подвести итог по использованию DLL библиотек из Python, приведу пример, в котором есть начальная инициализация параметров и передача новых через указатели на строки и структуры данных. Этот код дает понять, как написать аналог структуры С в Python. Ниже привожу код main.c , man.h и main.py .
Код DLL на С:
В коде main.h определена структура Passport с тремя полями: два указателя и целочисленная переменная. Кроме того, четыре функции объявлены, как экспортируемые.
Код DLL на С:
Внутри кейса DLL_PROCESS_ATTACH происходит выделение памяти под строки и начальная инициализация полей структуры. Выше DllMain определены функции:
GetPassport — вывод полей структуры passport в консоль.
*SetName(char new_name)** — установка поля name структуры passport .
*SetSurname(char new_surname)** — установка поля surname структуры passport .
*SetPassport(Passport new_passport)** — установка всех полей структуры passport . Принимает в качестве аргумента указатель на структуру с новыми полями.
Теперь можно подключить библиотеку в Python.
Код на Python
В коде выше многое уже знакомо, кроме создания структуры аналогичной той, которая объявлена в DLL и передачи указателя на эту структуру из Python в DLL.
Результат:
В этой статье мы рассмотрим концепцию перехвата порядка поиска динамически подключаемых библиотек (DLL hijacking) и то, как она может быть использована для достижения устойчивости (persistence) в юзерленде в системах Windows. Этот метод описан в MITER ATT&CK в разделе: «Перехват порядка поиска DLL (T1038)».
Подмена DLL может быть использована злоумышленниками для множества разных целей, но в этой статье основное внимание будет уделено достижению устойчивости с помощью приложений с автозапуском. Например, поскольку Slack и Microsoft Teams запускаются при загрузке (по умолчанию), подмена DLL в одном из этих приложений позволит злоумышленнику получить устойчивый доступ к своей цели — всякий раз, когда пользователь входит в систему.
После представления концепции DLL, порядка поиска DLL, и подмены DLL, я раскрою процесс автоматизации обнаружения возможности перехвата DLL. В этой статье будет рассказано об обнаружении путей перехвата DLL в Slack, Microsoft Teams и Visual Studio Code.
Наконец, я обнаружил несколько путей перехвата DLL, которые использовались разными приложениями, исследовал основную причину и обнаружил, что приложения, использующие определенные вызовы API Windows, подвержены перехвату DLL, когда не работают из C:\Windows\System32\ .
Я хочу поблагодарить своего коллегу Джозайю Массари ( @Airzero24 ) за то, что он первым обнаружил некоторые из этих перехватов DLL, объяснил их методологию и вдохновил меня автоматизировать обнаружение.
Подмена общих (shared) DLL
Я заметил, что Slack, Microsoft Teams и Visual Studio Code совместно используют следующие DLL:
- WINSTA.dll
- LINKINFO.dll
- ntshrui.dll
- srvcli.dll
- cscapi.dll
Использование подмены DLL для достижения устойчивости
Подмена DLL может использоваться для достижения устойчивости, когда уязвимое приложение/служба запускается и вредоносная DLL размещается в уязвимом месте. Мой коллега, @Airzero24 , обнаружил подмену DLL в Microsoft OneDrive, Microsoft Teams и Slack в виде userenv.dll .
Именно эти программы стали целью перехвата, потому что по умолчанию они настроены на запуск при загрузке Windows. Это можно увидеть ниже в диспетчере задач:
Приложения Windows, настроенные на автозапускЧтобы проверить подмену DLL, я создал загрузчик шеллкода DLL, который запускал Cobalt Strike Beacon. Я переименовал вредоносную DLL в userenv.dll и скопировал ее в каталог уязвимого приложения. Я запустил приложение и увидел свой новый Beacon коллбек.
Cobalt Strike Beacon через перехват DLLИспользуя Process Explorer, я могу проверить, действительно ли моя вредоносная DLL была загружена уязвимым приложением.
Обозреватель процессов, показывающий загруженную вредоносную DLLНа примере Slack
Чтобы начать этот процесс, я запустил Process Monitor (ProcMon) со следующими фильтрами:
Затем я запустил Slack и изучил ProcMon на предмет любых DLL, которые Slack искал, но не смог найти.
Возможные пути перехвата DLL, обнаруженные с помощью ProcMonЯ экспортировал эти данные из ProcMon в виде CSV файла для облегчения парсинга в PowerShell.
С моей текущей DLL загрузчика шелл-кода я не смог бы легко определить имена DLL, которые были успешно загружены Slack. Я создал новую DLL, которая использовала GetModuleHandleEx и GetModuleFileName для определения имени загруженной DLL и записи его в текстовый файл.
Моя следующая цель состояла в том, чтобы проанализировать CSV-файл на наличие в списке путей к DLL, просмотреть этот список, скопировать мою тестовую DLL по указанному пути, запустить целевой процесс, остановить целевой процесс и удалить тестовую DLL. Если тестовая DLL была успешно загружена, она запишет свое имя в результирующий файл.
Когда этот процесс завершится, у меня будет список возможных перехватов DLL (я надеюсь), записанных в текстовый файл.
Всю магию в моем проекте DLLHijackTest творит скрипт PowerShell. Он принимает путь к CSV-файлу, сгенерированному ProcMon, путь к вашей вредоносной DLL, путь к процессу, который вы хотите запустить, и любые аргументы, которые вы хотите передать процессу.
Параметры Get-PotentialDLLHijack
Get-PotentialDLLHijack.ps1Через несколько минут я проверяю текстовый файл, указанный в моей «вредоносной» DLL, на предмет возможных перехватов DLL. Я обнаружил следующие возможные пути перехвата для Slack:
Что такое DLL?
DLL — это библиотека, содержащая код и данные, которые могут использоваться одновременно более чем одной программой. (Сурс)
Функциональные возможности DLL могут быть использованы приложением Windows с помощью одной из функций LoadLibrary* . Приложения могут ссылаться на DLL, разработанные специально для этих приложений, или DLL Windows, уже находящиеся на диске в System32. Разработчики могут загружать DLL из System32, чтобы использовать в своих приложениях функционал, уже реализованный в Windows, без необходимости писать этот функционал с нуля.
На примере Microsoft Teams
Выполняем описанный выше процесс еще раз:
- Используйте ProcMon для выявления потенциальных путей перехвата DLL, экспортируйте эти данные в виде CSV файла.
- Определите путь запуска процесса.
- Определите любые аргументы, которые вы хотите передать процессу.
- Запустите Get-PotentialDLLHijack.ps1 с соответствующими аргументами.
Примечание: Мне пришлось внести небольшие изменения в скрипт PowerShell, чтобы завершить Teams.exe , так как мой скрипт пытается завершить процесс, который он пытался запустить, в данном случае это Update.exe .
Обновление — единственное решение
Всем пользователям Windows с ноутбуками или настольными компьютерами Lenovo, на которых установлена версия ImController 1.1.20.2 или более ранняя, рекомендуется обновить до последней доступной версии (1.1.20.3).
Чтобы определить, какую версию вы используете, выполните следующие действия:
- Откройте проводник и перейдите в папку C: \ Windows \ Lenovo \ ImController \ PluginHost \ .
- Щелкните правой кнопкой мыши файл Lenovo.Modern.ImController.PluginHost.exe и выберите « Свойства» .
- Щелкните вкладку « Подробности ».
- Прочтите версию файла.
Удаление компонента ImController или Lenovo System Interface Foundation с вашего устройства официально не рекомендуется, поскольку это может повлиять на некоторые функции вашего устройства, даже если это не считается необходимым.
Аргументы функций и возвращаемые значения
По умолчанию предполагается, что любая экспортируемая функция из динамической библиотеки возвращает тип int . Другие возвращаемые типы можно указать при помощи атрибута restype . При этом, чтобы указать типы аргументов функции можно воспользоваться атрибутом argtypes .
Например, стандартная функция strcat принимает два указателя на строки и возвращает один указатель на новую строку. Давайте попробуем ей воспользоваться.
Код Python:
Результат:
На этом закончим с примерами использования готовых DLL. Давайте попробуем применить знания о структуре DLL и модуле ctypes для того, чтобы собрать и начать использовать собственную библиотеку.
Ссылки
Сегодня многие люди сталкиваются с тем, что находят на своих компьютерах некий файл Adware.SweetLabs.5. Большинство не знает, что это такое, надо ли это и если нет, то как убрать с устройства. На самом деле, речь идет о рекламном модуле для ПК – «Adware».
У него есть несколько вариаций с разными наименованиями. Эта программа встраивается в браузер и начинает показывать всплывающую контекстную рекламу в момент посещения сайтов.
Несмотря на то, что фактически вреда от данного ПО почти нет, информацию он не ворует, но вот сам процесс пользования браузером осложняет. Мало кто захочет постоянно закрывать всплывающие окна.
Методология: понимание путей перехвата общих DLL
Я следил за стек трейсом, когда Slack пытался загрузить WINSTA.dll , LINKINFO.dll , ntshrui.dll , srvcli.dll и cscapi.dll .
DLL с отложенной загрузкой
Я заметил сходство в стек трейсе при загрузке WINSTA.dll , LINKINFO.dll , ntshrui.dll и srvcli.dll .
Стек трейс, когда Code.exe пытается загрузить WINSTA.dll
Стек трейс, когда Teams.exe пытается загрузить LINKINFO.dll ,
Стек трейс, когда Slack пытается загрузить ntshrui.dllСтек трейс постоянно содержит вызов _tailMerge_< dllname>_dll , delayLoadHelper2 за которым следует LdrResolveDelayLoadedAPI . Такое поведение было одинаковым для всех трех приложений.
Я определил, что это поведение связано с отложенной загрузкой DLL. Из стек трейса при загрузке WINSTA.dll я мог видеть, что модулем, ответственным за эту отложенную загрузку, был wtsapi32.dll .
Я открыл wtsapi32.dll в Ghidra и использовал Search -> For Strings -> Filter: WINSTA.dll . Двойной клик по найденной строке приведет вас к ее локации в памяти.
Строка « WINSTA.dll » в wtsapi32.dllКликнув правой кнопкой мыши по локации в памяти, мы сможем найти любые ссылки на этот адрес.
Ссылки на WINSTA.dllСледуя ссылкам, мы видим, что строка WINSTA.dll передается в структуру с именем ImgDelayDescr . Глядя на документацию по этой структуре, мы можем подтвердить, что она связана с отложенной загрузкой DLL.
Эту структуру можно передать в __delayLoadHelper2 , который будет использовать LoadLibrary / GetProcAddress для загрузки указанной DLL и исправления адреса импортируемой функции в таблице адресов импорта отложенной загрузки (IAT).
Найдя другие ссылки на нашу структуру ImgDelayDescr , мы можем найти вызов __delayLoadHelper2 , который затем вызывает ResolveDelayLoadedAPI . Я переименовал имя функции, типы и переменные, чтобы облегчить понимание.
__delayLoadHelper2 и ResolveDelayLoadedAPI в GhidraОтлично! Это соответствует тому, что мы видели в нашем ProcMon стек трейсе, когда Slack пытался загрузить WINSTA.dll .
__delayLoadHelper2 и ResolveDelayLoadedAPI в ProcMon.Такое поведение было единообразно для WINSTA.dll , LINKINFO.dll , ntshrui.dll и srvcli.dll . Основным отличием каждой DLL с отложенной загрузкой была «родительская» DLL. Во всех трех приложениях:
- wtsapi32.dll отложено загружала WINSTA.dll
- shell32.dll отложенно загружала LINKINFO.dll
- LINKINFO.dll отложено загружала ntshrui.dll
- ntshrui.dll отложено загружала srvcli.dll
Как удалить программу с компьютера
Делается это довольно просто:
- Потребуется зайти в Панель управления в раздел «Установка и удаление программ». Там нужно найти файл Adware.SweetLabs.5. Иногда у такого ПО нет оригинальной иконки или названия издателя. Поэтому придется внимательно посмотреть, не была ли на момент появления рекламы установлена какая-либо подозрительная программа. Если да, то это как раз искомый файл. Его нужно удалить.
- Зайти в раздел автозагрузок. Для этого нужно зайти в меню Пуск и в строке поиска набрать «cmd». Откроется окно «Команданая строка». В него нужно ввести «msconfig» и нажать на клавишу Enter. Далее выбрать пункт «автозагрузка».
Там нужно проверить программы, запускаемые из папки «Program Files» и удалить ненужные.
Ноутбуки Lenovo, включая модели ThinkPad и Yoga, уязвимы для ошибки повышения привилегий в службе ImControllerService, позволяющей злоумышленникам выполнять команды с правами администратора.
Дефекты отслеживаются как CVE-2021-3922 и CVE-2021-3969 и влияют на компонент ImControllerService всех версий Lenovo System Interface Foundation ниже 1.1.20.3. При просмотре экрана служб Windows эта служба имеет отображаемое имя «System Interface Foundation Service».
Конкретный сервис является компонентом Lenovo System Interface Foundation, который помогает устройствам Lenovo взаимодействовать с универсальными приложениями, такими как Lenovo Companion, Lenovo Settings и Lenovo ID. Служба по умолчанию предустановлена на многих моделях Lenovo, включая устройства Yoga и ThinkPad.
«Lenovo System Interface Foundation Service предоставляет интерфейсы для ключевых функций, таких как: управление питанием системы, оптимизация системы, обновления драйверов и приложений, а также системные настройки для приложений Lenovo, включая Lenovo Companion, Lenovo Settings и Lenovo ID», — говорится в описании Windows услуга.
«Если вы отключите эту службу, приложения Lenovo не будут работать должным образом».
Обнаружение уязвимостей стало результатом работы исследователей NCC Group, которые 29 октября 2021 года сообщили о своих результатах в Lenovo.
Производитель компьютеров выпустил обновления безопасности 17 ноября 2021 года, а соответствующие рекомендации были опубликованы 14 декабря 2021 года.
Автоматическое обнаружение возможности перехвата DLL
После подтверждения ранее известного перехвата DLL, я хотел проверить, смогу ли я найти другие возможности для подмены DLL, которые можно было бы эксплуатировать.
Код, использованный в моих проверка, можно найти здесь.
О чем говорит антивирус «Доктор Веб»
На официальном сайте Dr.Web регулярно публикуют угрозы, с которыми часто приходится сталкиваться антивирусу. Как раз Adware является одной из частых угроз.
Есть разные вариации рекламного модуля:
- Adware.SweetLabs.5, представленный в качестве альтернативного каталога приложений и в качестве специальной надстройки к графическому интерфейсу операционной системы. Создателем является «Adware.Opencandy».
- Adware.Elemental.17 представляет собой семейство рекламных программ, которые могут попадать на устройства за счет подмены ссылок на сервисах-файлообменниках. При этом вместо нужных файлов пользователь получит приложение с рекламной, которое потом может инсталлировать совершенно ненужное программное обеспечение на устройство.
- Adware.Downware.19856 – это рекламное ПО, которое осуществляет установку пиратских программ.
Таким образом, можно сделать вывод, что ни один вариант программы не нужен на ПК. Их деятельность будет только мешать и осложнять пользование компьютером, затормаживая работу браузеров.
Типы данных в С и Python
Модуль ctypes предоставляет возможность использовать типы данных совместимые с типами в языке С. Ниже приведена таблица соответствия типов данных.
Сtypes type C type Python type c_bool _Bool bool (1) c_char char 1-character string c_wchar wchar_t 1-character unicode string c_byte char int/long c_ubyte unsigned char int/long c_short short int/long c_ushort unsigned short int/long c_int int int/long c_uint unsigned int int/long c_long long int/long c_ulong unsigned long int/long c_longlong __int64 or long long int/long c_ulonglong unsigned __int64 or unsigned long long int/long c_float float float c_double double float c_longdouble long double float c_char_p char * (NUL terminated) string or None c_wchar_p wchar_t * (NUL terminated) unicode or None c_void_p void * int/long or None Таблица 1 — Соответствие типов данных языка Python и языка C, которое предоставляет модуль ctypes .
Первое, что стоит попробовать — это использовать указатели, куда без них? Давайте напишем программу, где создадим строку и указатель на неё, а потом вызовем printf() для них:
Результат:
Если вы создали указатель, то разыменовать (получить доступ к значению, на которое он указывает) можно с использованием атрибута value , пример выше.
Читайте также: