Перевод:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
Планировщик задач является одной из самых популярных техник атак, используемых злоумышленниками для установления постоянного присутствия на компьютере жертвы. Исследовательская команда Qualys изучила различные способы, которые могут использоваться злоумышленниками для сокрытия запланированных задач.
В этой статье мы описываем три новых метода скрытия и удаления запланированных задач в среде Microsoft Windows.
Злоумышленники часто используют функциональность планировщика задач в среде Microsoft Windows, чтобы облегчить начальное или регулярное выполнение вредоносного кода при запуске системы или по расписанию для сохранения присутствия.
Недавно исследователи безопасности Microsoft опубликовали статью, в которой задокументировали, как китайская государственная группа Hafnium скрывала запланированные задачи, удаляя значение Security Descriptor (SD) в пути реестра Windows:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TASK_NAME.
После раскрытия информации Microsoft, исследовательская команда Qualys задалась вопросом, существуют ли другие способы сокрытия запланированных задач и решила провести дальнейшее расследование. Цель этой статьи - сообщить результаты нашего исследования.
Наше самое важное открытие заключается в том, что значение Index в пути реестра Windows
(HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TASK_NAME)
также может быть использовано для скрытия и удаления любой запланированной задачи.
Сначала кратко опишем метод, используемый Hafnium и другими для скрытия запланированной задачи. Затем мы подробно опишем новые методы, используемые для скрытия запланированной задачи в среде Microsoft.
Как злоумышленники скрывают запланированные задачи
Согласно блогу Microsoft, при создании каждой запланированной задачи создаются следующие два подпункта реестра: один в пути Tree и другой в пути Tasks.
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TASK_NAME
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks{GUID}
Первый подпункт TASK_NAME, созданный в пути Tree, соответствует имени запланированной задачи. Значения, созданные в нем (Id, Index и SD), содержат метаданные для регистрации задачи в системе.
Второй подпункт {GUID}, созданный в пути Tasks, соответствует значению Id в подпункте Tree. Значения, созданные в нем (Actions, Path, Triggers и т.д.), содержат основные параметры, необходимые для выполнения задачи.
В случае Hafnium злоумышленник создал запланированную задачу под названием “WinUpdate” для восстановления любых разорванных соединений с их командной инфраструктурой. Это привело к созданию подпунктов в пути Tree и Tasks. Впоследствии злоумышленник получил системные привилегии (через кражу токена) и удалил значение SD в подпункте Tree. Удаление значения SD привело к "исчезновению" задачи из приложения Task Scheduler и вывода команды schtasks /query, что позволило скрыть запланированную задачу от любых традиционных методов идентификации.
Наше расследование показало, что изменение или удаление значения Index в подпункте Tree также скрывает запланированные задачи. Теперь мы подробно рассмотрим наши выводы, но сначала кратко опишем условия нашего лабораторного эксперимента.
Наши эксперименты проводились на Windows 10 Pro (v10.0.19043), Windows 10 Enterprise (v10.0.19044) и Windows Server 2016. На каждой машине мы сначала выполнили следующие два шага:
- Настроили аудит объектов в расширенных параметрах аудита локальной политики безопасности, чтобы получать события, соответствующие созданию (4698), удалению (4699) и обновлению (4702) запланированных задач в журнале безопасности Windows.
- Создали запланированную задачу под названием ImpTask, которая выполняется после входа пользователя в систему:
Код:
schtasks /create /tn ImpTask /tr cmd.exe /sc onlogon /rl highest
После выполнения команды schtasks /create создаются следующие три подпункта, соответствующие вновь созданной задаче ImpTask (см. Рисунок 1):
- HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\ImpTask
- HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks{GUID}
- HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Logon{GUID}
Рисунок1
Новые методы сокрытия запланированной задачи
Мы обнаружили, что при создании запланированной задачи, кроме подпунктов Tree и Tasks, создается еще один подпункт. Этот третий подпункт создается в зависимости от того, когда задача запланирована для выполнения:- При запуске системы, как указано параметром /sc onstart в команде schtasks /create
- При входе пользователя в систему, как указано параметром /sc onlogon в команде schtasks /create
- В другое время, кроме запуска или входа в систему (например, /sc daily /st 09:00)
- HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Boot{GUID}
- HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Logon{GUID}
- HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Plain{GUID}
- Все задачи, зарегистрированные в пути HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Boot имеют значение Index 0x1
- Все задачи, зарегистрированные в пути HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Logon имеют значение Index 0x2
- Все задачи, зарегистрированные в пути HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Plain или Maintenance имеют значение Index 0x3
- Скрыть конкретную запланированную задачу: Мы обнаружили, что установка значения Index на 0x0 в подпункте Tree скрывает задачу из приложения Task Scheduler и вывода команды schtasks /query. Однако задача продолжает выполняться в соответствии с запланированным временем, даже после перезапуска системы. Поведение точно такое же, как достигнутое злоумышленниками Hafnium после удаления значения SD. Более того, если попытаться изменить задачу после установки значения Index на 0x0 с помощью команды schtasks /change, задача будет удалена. Однако событие с id 4699, соответствующее удалению запланированной задачи, не будет зафиксировано в журнале событий безопасности Windows.
- Скрыть все запланированные задачи: Мы также обнаружили, что удаление значения Index вызывает ошибку в приложении Task Scheduler и выводе команды schtasks /query с сообщением "Произошла внутренняя ошибка", что фактически скрывает все запланированные задачи. Существующие задачи продолжают выполняться, и новые задачи все еще могут быть созданы.
Теперь рассмотрим два результата манипуляции значением Index.
Скрытие запланированной задачи
В первом сценарии мы создаем еще одну запланированную задачу под названием ModifyIndexTask, которая выполняется один раз с системными привилегиями – после создания ImpTask – и устанавливает значение Index на 0x0. Команда выглядит следующим образом:
Код:
schtasks /create /tn ModifyIndexTask /tr "reg.exe add \"HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\ImpTask\" /v Index /d 0x0 /t REG_DWORD /f" /ru "NT AUTHORITY\SYSTEM" /rl highest /sc once /st <время, позднее времени создания ImpTask>
Рисунок 2
После выполнения ModifyIndexTask значение Index задачи ImpTask устанавливается на 0 (Рисунок 2). В результате ImpTask исчезает как из приложения Task Scheduler (Рисунок 3), так и из вывода команды schtasks /query (Рисунок 4). Однако ImpTask продолжает выполняться даже после перезагрузки системы (Рисунок 5). Хотя ImpTask не отображается в выводе команды schtasks /query, на Рисунке 5 показано, что возможно получить статус задачи, используя команду schtasks /query с указанием имени задачи с помощью параметра /tn.
Рисунок 3
Рисунок 4
Рисунок 5
Исследовательская команда Qualys смогла воспроизвести эту проблему на каждой машине с Windows 10, с которыми мы проводили эксперименты, всего на пяти устройствах.
Еще одно интересное наблюдение заключалось в том, что если попытаться изменить имя программы в задаче ImpTask (со значением Index 0x0) с помощью команды schtasks /change /tr, задача удаляется, как показано на Рисунке 6. Это выполняется без регистрации события с id 4699: удаление запланированной задачи, или события с id 4702: обновление запланированной задачи в журнале безопасности Windows. Однако событие с id 4699 регистрируется, если мы используем команду schtasks /delete для удаления задачи ImpTask.
Рисунок 6
Скрытие всех запланированных задач
Во втором сценарии мы создаем еще одну запланированную задачу, которая выполняется с системными привилегиями и удаляет значение Index в подпункте ImpTask. Команда выглядит следующим образом:
Код:
schtasks /create /tn ModifyIndexTask /tr "reg.exe delete \"HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\ImpTask\" /v Index /f" /ru "NT AUTHORITY\SYSTEM" /rl highest /sc once /st <время, позднее времени создания ImpTask>
После удаления значения Index в подпункте ImpTask (Рисунок 7) все запланированные задачи исчезают из приложения Task Scheduler (Рисунок 8) и вывода команды schtasks /query (Рисунок 9), вместо этого выводится сообщение об ошибке: «Произошла внутренняя ошибка». Даже указание имени задачи ImpTask в параметре /tn также не работает.
Рисунок 7
Рисунок 8
Рисунок 9
Хотя запланированные задачи не отображаются, они выполняются в соответствии с запланированным временем. Невозможность просмотра запланированных задач сохраняется даже после перезагрузки системы. Изменение задачи ImpTask с помощью команды schtasks /change вызывает повторное создание значения Index, после чего команда schtasks /query выполняется успешно (Рисунок 10).
Рисунок 10
После удаления значения Index мы попытались удалить задачу ImpTask с помощью команды schtasks /delete. Интересно, что команда завершилась с сообщением об ошибке. Когда мы затем попытались изменить ImpTask с помощью команды schtasks /change, значение Index в подпункте ImpTask было восстановлено. Все задачи снова появились в приложении Task Scheduler, и выполнение команды schtasks /query также прошло успешно. Обратите внимание, что значение Index восстанавливается только в случае, если команда schtasks /delete предшествует команде schtasks /change. Когда мы выполняли команду schtasks /change без предварительного выполнения команды schtasks /delete, значение Index не восстанавливалось, и мы продолжали получать сообщение об ошибке при выполнении команды schtasks /query.
Заключение
Исследование, проведенное командой Qualys Research, показало, что значение Index наряду со значением SD в подпункте Tree запланированной задачи играет важную роль и может быть использовано злоумышленниками. В этой статье мы описали три новых техники скрытия и удаления запланированных задач:- Скрыть запланированную задачу из приложения Task Scheduler и вывода команды schtasks /query, установив ее значение Index на 0x0.
- Удалить запланированную задачу, сначала установив ее значение Index на 0x0, а затем используя команду schtasks /change /tr, что эффективно удаляет задачу без оставления следов в журнале безопасности Windows.
- Скрыть все запланированные задачи из приложения Task Scheduler и вывода команды schtasks /query, удалив значение Index любой запланированной задачи.
Как можно поиграться с этим всем.)
SD, ARC Labs разработала сценарий PowerShell под названием "hunt_hidden_tasks", который доступен на странице ARC Labs GitHub по следующей ссылке:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
Hidden Task Hunter
Proof of Concept PowerShell скрипт для перечисления запланированных задач в реестре и выявления любых задач, которые имеют признаки удаления или изменения значения SD для обхода обнаружения с помощью распространенных инструментов аудита, таких как AutoRuns, schtasks или графический интерфейс Task Scheduler.Есть ещё инструмент:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
Уже разработано несколько инструментов на C# для имитации атаки с использованием запланированных задач. Я пробовал некоторые из них, но у каждого из них есть свои ограничения по настройке запланированных задач. Поэтому этот проект направлен на создание инструмента на C# (совместимого с CobaltStrike execute-assembly), который включает необходимые мне функции и обеспечивает достаточную гибкость в настройке запланированных задач.
Техника скрытия запланированной задачи
Для использования этой техники вам потребуется учетная запись "NT AUTHORITY/SYSTEM", и в ScheduleRunner выполнить следующие действия:
- Удалить значение "SD" из "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree[task name]"
- Удалить XML файл запланированной задачи "C:\Windows\System32\Tasks[task name]"
Пример команды создания скрытой задачи в ScheduleRunner:
Код:
ScheduleRunner.exe /method:create /taskname:demo /trigger:minute /modifer:10 /program:"C:\Temp\beason.exe" /technique:hide
Демо: