Кеш планувальника завдань¶
Що таке TaskCache¶
Планувальник завдань Windows (Task Scheduler) зберігає кеш у реєстрі в SOFTWARE, який пов'язує шляхи завдань із GUID,
тригерами/списками, суб'єктами безпеки (principals), діями, метаданими виконання та дескрипторами безпеки. Juntei декодує
дії виконання та обробника COM, а також застарілі дії надсилання електронної пошти/повідомлень, часові позначки завдань і ознаки
завдань, прихованих від звичайного інтерфейсу Task Scheduler.
Завдання — поширений механізм закріплення та віддаленого виконання. Кеш у реєстрі також цінний, коли зловмисник видаляє або змінює XML-файл завдання.
Найобґрунтованіший висновок: TaskCache налаштував або зберіг завдання/дію. Щоб довести конкретне виконання, потрібні поля часу виконання та незалежні журнали.
Розташування¶
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache
C:\Windows\System32\Tasks\... (task XML/files; collect separately)
Збирайте SOFTWARE разом із журналами транзакцій і повне дерево System32\Tasks. Журнали подій Task Scheduler
Operational і Security додають докази створення/оновлення/виконання.
Застереження для аналітика¶
- Кеш у реєстрі та XML завдання можуть не збігатися після підробки, видалення, неповної реєстрації або пошкодження.
Hiddenу Juntei визначає структурне приховування (відсутній зв'язок із Tree/дескриптор безпеки за відповідних умов), а не просто завдання, налаштоване зі звичайним прапорцем інтерфейсу «Hidden».- Windows 7 зберігає дії завдань у XML, а не в значенні
Actionsкешу; порожня дія там не є автоматично підозрілою. LastRunіLastResultкорисні, але не є повною, захищеною від підробки історією виконання.Contextназиває налаштований суб'єкт безпеки/контекст, а не користувача, який зареєстрував завдання.- CLSID обробників COM потребують окремого визначення через реєстр/файли.
Аналіз за допомогою Juntei¶
Usage: juntei parse-registry taskcache <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SOFTWARE hives
-f, --file <FILE> Parse one SOFTWARE hive
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Filtering:
--task <NAME> Full task path or final task name
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry taskcache -f SOFTWARE -o tasks.csv
juntei parse-registry taskcache -f SOFTWARE -t jsonl \
| jq 'select(.Hidden == true or (.Executable? | test("powershell|cmd|mshta"; "i")))'
Поля виводу¶
| Поле | Інтерпретація |
|---|---|
Host, SourcePath |
Контекст хоста та вихідний кущ SOFTWARE. |
TaskName |
Повний шлях у планувальнику. Основна точка переходу до XML і журналів подій. |
TaskGUID |
GUID, що поєднує записи кешу Tree і Tasks. Надійний ключ зіставлення. |
TaskIndex |
Метадані Tree/індексу, які використовує планувальник; контекст, а не кількість виконань. |
TaskLists |
Списки кешу (Boot, Logon, Plain, Maintenance), що класифікують запуск/обробку. |
Hidden |
Структурний індикатор прихованого завдання. Перш ніж робити висновок про підробку, перевірте InTree, InTasks і стан дескриптора. |
InTree, InTasks |
Чи існують обидві частини кешу. Відсутній зв'язок може вказувати на видалення/підробку/неповну реєстрацію. |
HasSecurityDescriptor |
Чи має запис Tree значення SD; його відсутність може сприяти приховуванню завдання у відповідних версіях. |
TreeKeyLastWrittenUTC, TaskKeyLastWrittenUTC |
Зміни на рівні ключа для кожної частини кешу; не точний час створення/запуску. |
ActionIndex |
Номер дії в завданні, починаючи з нуля. Одне завдання може дати кілька рядків. |
ActionType |
exec, com_handler, send_email або show_message. |
Executable, Args, WorkingDirectory |
Фактична дія виконання. Інтерпретуйте лапки, змінні, відносні шляхи та LOLBins. |
COM-ClassID, ActionData |
CLSID і дані обробника COM або застаріле корисне навантаження електронного листа/повідомлення. CLSID визначайте окремо. |
Context |
Контекст суб'єкта безпеки, закодований разом із діями (LocalSystem, Author тощо); налаштована ідентичність, а не той, хто реєстрував завдання. |
Author, URI, Description |
Метадані завдання. Зловмисник легко може їх контролювати; вони не є доказом довіри. |
LastRegisteredUTC |
Час реєстрації/оновлення з DynamicInfo, якщо він наявний. |
LastRunUTC, LastSuccessfulRunUTC, LastResult |
Кешовані метадані виконання/результату. Зіставляйте з операційними журналами та доказами процесів. |
ActionsRaw |
Вихідні байти дій, якщо декодування неповне або потрібна перевірка. |
TransactionLogStatus, LogsApplied |
Контекст відновлення реєстру. |
Problems |
Невідповідність шляху/GUID, неправильний тип значення, усічена структура дії або відсутні частини. |
Стратегія розслідування¶
- Спершу перевірте приховані/неузгоджені завдання та шляхи, що не належать Microsoft.
- Відтворіть фактичні команди, зокрема аргументи, робочий каталог, розгортання змінних середовища та визначення COM.
- Порівняйте запис реєстру з XML завдання та обчисліть хеш/перевірте часові позначки виконуваного файлу, на який він посилається.
- Зіставляйте
TaskName/GUID/час із подіями Task Scheduler, Security 4698/4702, журналами процесів, Prefetch і MFT/USN. - Якщо зловмисник видалив завдання, шукайте у видалених/відновлених даних реєстру.