March 3, 2022

Изучение обходов Windows UAC: методы и стратегии обнаружения

Всем привет, на связи 🅰️🅻🅰️🆅🅸🆁🅶🅾️🆂❗️

В этой статье мы рассмотрим методы обхода и стратегии обнаружения malware.


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

Пример cscript.exeзапуска в через cmd.exeэкземпляр с правами админа через обход UAC:

Большая часть логики проверки UAC реализована в службе Application Information (AppInfo). Отличный праймер об условиях возвышения и различных проверках можно найти здесь.

Сейчас мы рассмотрим коллекцию обходов UAC, исследуем некоторые ключевые примитивы, от которых они зависят, и исследуем возможности обнаружения.

Методы обхода UAC

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

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

Манипулирование ключами реестра

Целью манипулирования разделом реестра является перенаправление потока выполнения программы с повышенными правами на контролируемую команду. Наиболее часто используемые значения ключей связаны с командами открытия оболочки для определенных расширений (в зависимости от целевой программы) или windir/systemroot манипулированием переменными среды:

  • HKCU\\Software\\Classes\<targeted_extension>\\shell\\open\command (Значения по умолчанию или DelegateExecute)
  • HKCU\\Environment\\windir
  • HKCU\\Environment\\systemroot

Ниже приведен пример вредоносного ПО Glupteba, использующего этот метод для первого повышения прав от среднего до высокого, а затем от высокого до целостности системы с помощью манипулирования токенами (кражи токенов):

Примером обхода UAC, который манипулирует разделом реестра переменных среды Windows, является byeintegrity5. Чтобы проиллюстрировать это, этот обход использует этот примитив для перенаправления нормального потока выполнения запланированной задачи CDSSync (настроенной для запуска с наивысшими привилегиями) и повышения уровня целостности, как показано ниже.

Когда CDSSyncзапланированная задача выполняется, taskhostw.exeбудет пытаться загрузить npmproxy.dllиз %windir%\System32папки, но поскольку вредоносное ПО контролирует %windir%, он может перенаправить taskhostw.exeна загрузку DLL с именем npmproxy.dllиз пути, который он контролирует, как показано ниже.

Обходы UAC, основанные на манипулировании переменными среды, часто работают, когда UAC настроен на Always Notify (максимальный уровень UAC), поскольку они часто не включают запись файлов в защищенные пути или запуск приложения с автоматическим повышением. Изменения в SystemRootWindirреестре текущего пользователя подозрительны и должны быть сигналом с высокой степенью достоверности для обнаружения.

DLL Hijack

Метод DLL hijack обычно состоит из поиска отсутствующей DLL (часто отсутствующей зависимости) или путем загрузки вредоносной DLL в повышенный процесс. Если UAC включен, но не настроен на Always Notify, вредоносное ПО может выполнить повышенную IFileOperation (без приглашения UAC) для создания/копирования/переименования или перемещения файла DLL по доверенному пути (т. е. System32), а затем запустить программу с правами админа для загрузки вредоносной DLL вместо ожидаемой.

IFileOperation выполняется dllhost.exe(COM Surrogate) с process.command_lineсодержанием classId {3AD05575-8857-4850-9277-11B85BDB8E09}.

Мы можем использовать следующую корреляцию EQL для связи любой файловой операции с dllhost.exeпоследующей загрузкой DLL, не подписанной Microsoft, в процесс, работающий с целостностью системы:

EQL search - обход UAC через IFileOperation (среда для целостности системы)

sequence by host.id
 [file where event.action in ("creation", "overwrite", "rename",
 "modification") and

  /* IFileOperation are performed by DllHost */
  process.name : "dllhost.exe" and user.id : "S-1-5-21-*" and

  /* executable file dropped via NewItem, Rename, Move or
  Copy IFileOperation */  (file.extension : "dll" or
  file.Ext.header_bytes : "4d5a*") and

  /* protected system paths usually abused via DLL search order hijack */
  file.path : ("?:\\Windows\\system32\\*",
               "?:\\Windows\\syswow64\\*",
               "?:\\Program Files (x86)\\Microsoft\\*",
               "?:\\Program Files\\Microsoft\\*"
               )] by file.path
 [library where
  /* non MS signed DLL loaded by a System Process */
  user.id : "S-1-5-18" and
  process.executable :
              ("?:\\Windows\\system32\\*",
               "?:\\Windows\\syswow64\\*",
               "?:\\Program Files (x86)\\Microsoft\\*",
               "?:\\Program Files\\Microsoft\\*") and
 not (dll.code_signature.subject_name : "Microsoft *" and
      dll.code_signature.trusted == true)] by dll.path

Это пример обнаружения боковой загрузки UACME 30 wow64log.dllв экземпляр WerFault.exerunning as System (который обеспечивает хороший прямой переход от среды к целостности системы), показанный ниже.

Если UAC настроен на Always Notify,то допустимым вариантом является поиск отсутствующей DLL или выигрыш в состоянии гонки записи файла в путь, доступный для записи процессом целостности среды. Это пример обхода UAC, перехватывающего запланированную задачу SilentCleanup (через условие записи файла), которая порождает процесс-потомок с высокой целостностью DismHost.exe выполнение из подпапки AppData (доступная для записи по средней целостности), и это еще один вариант, который злоупотребляет той же задачей, но для отсутствующей зависимости. api-ms-win-core-kernel32-legacy-l1.dll.

Другим примитивом DLL Hijack, который может достичь той же цели, является использование перенаправления загрузки DLL путем создания папки в том же каталоге целевой программы с повышенными правами (напримерtarget_program.exe.local, и удаление DLL, которая будет загружена вместо ожидаемой).

Этот метод может также использоваться в качестве примитива для локального повышения привилегий в случае уязвимости, которая позволяет создавать папку (с разрешающим списком контроля доступа) в контролируемое местоположение, например, описанное Jonas Lykkegård в этом блоге От удаления каталога до системной оболочки.

Поиск EQL - потенциальная эскалация привилегий через перенаправление DLL

library where user.id : "S-1-5-18" and
  dll.path : ("?:\\Windows\\system32\\*.exe.local\\*",
              "?:\\Windows\\syswow64\\*.exe.local\\*",
              "?:\\Program Files (x86)\\Microsoft\\*.exe.local\\*",
              "?:\\Program Files\\Microsoft\\*.exe.local\\*") and
 not (dll.code_signature.subject_name : "Microsoft *" and
      dll.code_signature.trusted == true) and
 process.executable :
              ("?:\\Windows\\system32\\*",
               "?:\\Windows\\syswow64\\*",
               "?:\\Program Files (x86)\\Microsoft\\*",
               "?:\\Program Files\\Microsoft\\*")

Этот запрос соответствует методу UACME 22, который нацелен consent.exe(выполняется как система), обманывая его в загрузке comctl32.dllиз SxS DotLocalкаталога вместоSystem32:

Стоит также отметить, что большинство обходов UAC через DLL hijack также полезны для сохранения и могут обходить обнаружение на основе автозапуска (известные места сохранения файлов и реестра)

Повышенный интерфейс COM

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

С точки зрения поведения, как правило, эти COM-интерфейсы будут выполняться в контексте dllhost.exe(COM Surrogate) с process.command_lineсодержанием classIdцелевого COM-объекта, это обычно приводит к созданию дочернего процесса с высокой целостностью.

Ниже приведены примеры различных семейств вредоносных программ, использующих этот метод для обхода UAC (например, семейства DarkSide и LockBit ransomware), чтобы повысить уровень целостности перед запуском возможностей шифрования и уклонения.

Атрибуты безопасности токенов

Проницательное наблюдение было сделано Джеймсом Форшоу для возможности использования атрибутов безопасности маркеров процессов для идентификации процессов, запущенных как приложения с автоматически повышенными правами .

ProcessHacker также захватывает этот тип информации. Ниже приведен пример свойств токенов для notepad.exe экземпляр запускается через обход UAC.

LUA://HdAutoApАтрибут означает, что это приложение с автоматическим повышением (заполняется также для повышенных COM-объектов и жестко закодированных процессов AppInfo в белом списке). LUA://DecHdAutoApозначает, что это потомок приложения с автоматическим повышением, что очень полезно при отслеживании дерева процессов, сгенерированного с помощью обхода UAC.

Elastic Endpoint Security 7.16 и выше захватывают эту информацию с помощью событий выполнения процесса (process.Ext.token.security_attributes), которые открывают возможность поиска и обнаружения обходов UAC, захватывающих поток выполнения программы с автоматически повышенными правами или COM-интерфейса без предварительного знания специфики обхода (целевой двоичный файл, COM-интерфейс, метод перенаправления и другие важные детали) :

Программа с автоматически повышенными правами :

Поиск EQL - обнаружение обхода UAC с помощью атрибутов безопасности токенов

process where event.action == "start" and
   process.Ext.token.integrity_level_name : ("high", "system") and
   process.parent.command_line != null and
   /* descendant of an auto-elevated application or COM object */
   process.Ext.token.security_attributes : "LUA://DecHdAutoAp" and
    (
      /* common lolbins, evasion and proxy execution programs */
      process.pe.original_file_name :
                 ("rundll32.exe",
                  "cmd.exe",
                  "pwsh*",
                  "powershell.exe",
                  "mshta.exe",
                  "msbuild.exe",
                  "regsvr32.exe",
                  "powershell.exe",
                  "cscript.exe",
                  "wscript.exe",
                  "wmic.exe",
                  "installutil.exe",
                  "msxsl.exe",
                  "Microsoft.Workflow.Compiler.exe",
                  "ieexec.exe",
                  "iexpress.exe",
                  "RegAsm.exe",
                  "installutil.exe",
                  "RegSvcs.exe",
                  "RegAsm.exe",
                  "javaw.exe",
                  "reg.exe",
                  "schtasks.exe",
                  "sc.exe",
                  "net.exe",
                  "net1.exe",
                  "vssadmin.exe",
                  "bcdedit.exe",
                  "wbadmin.exe",
                  "msiexec.exe") or

       /* suspicious or unusual paths */
       process.executable : ("?:\\Windows\\Microsoft.NET\\*",
                             "?:\\Users\\Public\\*",
                             "?:\\Programdata\\*",
                             "?:\\Windows\\Temp\\*",
                             "?:\\Windows\\Tasks\\*",
                             "?:\\Windows\\System32\\Tasks\\*") or

       /* MS signed but from unusual paths */
       (process.code_signature.trusted == true and
        process.code_signature.subject_name : "Microsoft *" and
        not process.executable : ("?:\\Windows\\system32\\*.exe",
                                  "?:\\Windows\\SysWOW64\\*.exe",
                                  "?:\\Program Files\\*.exe",
                                  "?:\\Program Files (x86)\\*",
                                  "?:\\ProgramData\\Microsoft\\*",
                      "\\Device\\HarddiskVolume*\\Windows\\System32\\*.exe",
                      "\\Device\\HarddiskVolume*\\Windows\\SysWOW64\\*.exe") and

        /* runs from temp folder and invoked by different elevated processes */
        not process.pe.original_file_name == "DismHost.exe"
       ) or

    /* elevated and unsigned or untrusted programs excluding
      third party uninstallers executed via appwiz.cpl */
      ((process.code_signature.trusted == false or
      process.code_signature.exists == false) and
        not (process.parent.name : "dllhost.exe" and
          process.parent.command_line :
          "*FCC74B77-EC3E-4DD8-A80B-008A702075A9*"))) and

  /* Rundll32 FPs */
  not (process.name : "rundll32.exe" and
       process.args :
         ("devmgr.dll,DeviceProperties_RunDLL",
         "?:\\Windows\\system32\\iesetup.dll,IEShowHardeningDialog") and
       process.parent.name : ("dllhost.exe", "ServerManager.exe")) and

  /* uninstallers executed via appwiz.cpl */
  not (process.args : "/uninstall" and
       process.parent.name : "dllhost.exe" and
       process.parent.command_line : "*FCC74B77-EC3E-4DD8-A80B-008A702075A9*")
       and

  /* server manager may spawn interactive powershell commands */
  not (process.name : "powershell.exe" and
       process.parent.executable : "?:\\Windows\\System32\\ServerManager.exe")
       and

 /* Windows Installer service descendants */
 not (process.parent.executable : "?:\\Windows\\System32\\msiexec.exe" and
      process.parent.args : "/V")

Приведенный выше запрос также соответствует всем потомкам обхода UAC, а не только прямому дочернему процессу.

Здесь мы видим этот подход, обнаруживающий захват потока выполнения с помощью манипулирования разделом реестра:

Вот пример этого совпадающего обхода UAC:

Ниже приведены примеры совпадений для 3 различных обходов UAC через повышенный COM-интерфейс:

Уклонение от обнаружения

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

Ниже приведен пример уклонения от мониторинга файлов с помощью переименования каталогов (UACME 22).

Вот пример уклонения от мониторинга пути к ключу реестра с помощью переименования ключа (byeintegrity8).

Еще один интересный трюк уклонения, который недавно был добавлен в UACME v.3.5. 7, - это подраздел CurVer, который можно использовать для перенаправления обработчика оболочки по умолчанию. Это эффективно обходит обнаружения, ищущие жестко закодированный подозрительный путь/значения реестра:

Для обнаружения файлов, связанных с захватом DLL, лучше использовать события загрузки DLL (Elastic Endpoint Security 7.16 регистрирует библиотеки DLL, не подписанные Microsoft). Для реестра сочетание registry.data.strings и имен значений должно быть немного более устойчивым, чем полный путь ключа.

Приведенный ниже пример корреляции EQL показывает, как обнаружить загрузку DLL из каталога, маскирующегося под System32 (т. е. В результате модификации переменной среды windir/systemroot) :

Поиск EQL - обнаружение перенаправления через rogue Windir/SystemRoot

sequence by process.entity_id with maxspan=1m
  [process where event.action == "start" and
    /* any process running as high or system integrity */
    process.Ext.token.integrity_level_name : ("high", "system")]
  [library where dll.path :
    /* masquerading as windir/system root */
    ("?:\\*\\System32\\*.dll", "?:\\*\\SysWOW64\\*.dll") and
    not dll.path :
           ("?:\\Windows\\System32\\*.dll","?:\\Windows\\Syswow64\\*.dll") and
    not (dll.code_signature.subject_name : "Microsoft *" and
         dll.code_signature.trusted == true)]

В этом примере показаны совпадения для 2 различных методов (манипуляция ключом реестра и захват DLL через поддельный Windir):

Следующий пример объединяет символическую ссылку реестра и переименование раздела реестра, чтобы избежать обнаружения обхода UAC на основе мониторинга изменений ключа реестра (ms-settings или shell\open\command) :

UACME v.3. 5 и выше реализует это уклонение для методов, связанных с манипулированием ключами реестра.

Вы можете охотиться с помощью Elastic Endpoint или Sysmon logs registry symbolic link creation, ища модификацию реестра со значением name, равным SymbolicLinkValue.

Пример запроса KQL для обнаружения этого уклонения: registry.value :"SymbolicLinkValue" and registry.key :S-1-5-21-15Classes\\*`:

Наиболее распространенные обходы UAC

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

Наиболее часто выполняемые команды через обход UAC-это либо повторное выполнение вредоносного ПО как высокой целостности, либо методы уклонения от защиты, такие как:

  • Вмешательство в исключения AV или состояние
  • Запись в ключи реестра, защищенные HKLM
  • Вмешательство в настройки восстановления системы

Спасибо за прочтение!

S C A M P R P O J E C T