A Deep Dive Into Windows Scheduled Tasks and The Processes Running Them | by Nasreddine Bencherchali | Medium


Just for reference, let’s begin by taking a look at the deprecated command “at.exe” and see how to create a task.

The command above will create a task that’ll run every “Sunday”, “Monday” and “Tuesday” at 11:11 and will executed the file named “MALWARE.EXE”. It’s as simple as that.

You can use other flags like specifying a remote computer name or the “/yes” flag for answering yes to all queries and many more. Take a look at MSDN for the full list.

To give you an idea, here is a small description of what to look for when hunting for the “at.exe” command. (This is by no mean exhaustive)


Since “At.exe” got deprecated in Windows 8, the modern way to create schedule tasks on modern windows system is to use the “schtasks.exe” command line utility.

Similar to the “At.exe” command (But actually more powerful), the “schtasks.exe” offers a lot of flags to customize the tasks to our needs.

From a threat hunting perspective one of the key things we’re interested in knowing is “what the task is going to execute”. The flag responsible for that is the “TR” (Task Run) flag.

So if we take an example of a malicious task creation, we’ll see something similar to command below.

“svchost.exe –k netsvcs –p –s schedule”

Since Windows 10 Version 1511, tasks were no longer run from “taskeng.exe”. In fact, “taskeng.exe” no longer exists on the system in newer versions of windows.

Nowadays, tasks are run directly by the “svchost.exe” process responsible for the “Task Scheduler” Service.

So when a task is run, you’ll see the executable as a child of the “svchost.exe -k netsvcs -p -s Schedule” process (See figure below).

So in the example above we can see “calc.exe” as a child of “svchost.exe” which means that there is a task on the system configured to run “calc.exe” at a certain time.

We can use this information to hunt for processes executed via a task by looking at the relationship of processes where the “svchost.exe -k netsvcs -p -s Schedule”is a parent.

Note: The “svchost.exe” must contain at least the “-k netsvcs” flag. If a different flag or no flag is present it cannot be considered as a task and should be treated differently.


On older windows versions any task that runs will spawn a “taskeng.exe” (short for Task Engine) process and the “taskeng.exe” process will spawn the executable(s) requested by the task. So in a process tree it’ll look something like this.

The “taskeng.exe” process will have the following syntax:

Everything is self-explanatory in this syntax except maybe for the “options” part which will be chosen depending on the configuration of the task. For example:

“taskhostw.exe” and its arguments

One thing I hope you noticed in the previous figure is the “taskhostw.exe” process.

The “taskhostw.exe” process is a special process, belonging to a larger family of hosting processes in windows.

Similar to “dllhost.exe” or “svchost.exe”, the “taskhostw.exe” process is designed to host DLL’s that are run from TASKS.

If we searched the “%SystemRoot%System32Tasks” folder, we can find some tasks that have as an action not an executable but a COM Object reference (I.e: CLSID) to a DLL.

Below is an example of a “.NET Framework” task that is designed to run the “ngentasklauncher.dll” (NGenTaskLauncher).

Once this task gets executed a “taskhostw.exe” will spawn as a child of the “svchost.exe” process.

You’ll notice that “taskhostw.exe” was launched with the argument “/RuntimeWide” the same argument that was mentioned in the “<Data>” section in the Task XML definition above.

In fact, similar to tasks that run executables. “taskhostw.exe” can use arguments as well. And one can go a step further and provide a dynamic argument.

I’m pretty sure that you’ve run into the following command before (Especially in logs).

To help us understand this, let’s take a look at MSDN.

Some action properties that are of type BSTR can contain $(Arg0), $(Arg1), …, $(Arg32) variables in their string values. These variables are replaced with the values that are specified in the params parameter of the IRegisteredTask::Run and IRegisteredTask::RunEx methods or are contained within the event trigger for the task. — MSDN

And if we take a look at some windows default tasks we can find this notation in a lot of them. (See example below)

One other common argument you’ll see “taskhostw.exe” running is this “{222A245B-E637–4AE9-A93F-A59CA119A75E}”. If you see his one in your logs, then it is referring to two tasks running inside “taskhostw.exe”

I couldn’t find the source of the referenced {CLSDI} but it persisted across multiple reboots and machines.

:/>  Где в windows 10 находится команда выполнить

Note: On Windows 7 the process name was “taskhost.exe” instead of “taskhostw.exe” and in windows 8 an additional process was added and removed in future versions of windows named “taskhostex.exe”.

A deep dive into windows scheduled tasks and the processes running them

Task Scheduler

In my last blog post I talked about windows system processes in general, their child-parent relationship and gave a brief description of each (See link below).

Today I want to refocus on specific processes and talk about schedule tasks and the schedule task service.

Malware authors have often used schedule tasks as persistence mechanisms as they are a reliable way to make their malicious code run in a recurring way.

From a threat hunting perspective it is necessary to grasp how schedule tasks are run and understand the commands and command line arguments associated with their process(es).

Today, we’ll take a look at how schedule tasks get created with the “schtasks.exe” and “at.exe” commands and the services / processes (svchost.exe, taskhostw.exe, taskeng.exe) responsible for running them.

Running tasks (svchost.exe / taskeng.exe / taskhostw.exe)

Now that we covered how tasks can be created, it’s time to take a look at the process or processes that’ll be running these tasks.

The service responsible for running schedule tasks is called the “Task Scheduler” Service. It starts with the operating system and its part of the “netsvcs” group in the “svchost” registry key.

You can catch it running in the process tree by looking at the “svchost.exe” process with the following command line: “svchost.exe -k netsvcs -p -s Schedule” on Windows 10 Version 1703 and above (On computers with 3.5GB ram or more) and without the “-s Schedule” flag On windows versions before 1703.

Tasks and the task scheduler service

MSDN is filled with details about the task scheduler, its API and how it works. So I will not reinvent the wheel with this one. I’ll only quote what’s necessary to get us started in our discussion. Starting by the definition of what is the task scheduler service.

The Task Scheduler service allows you to perform automated tasks on a chosen computer. With this service, you can schedule any program to run at a convenient time for you or when a specific event occurs. The Task Scheduler monitors the time or event criteria that you choose and then executes the task when those criteria are met. — MSDN

The task scheduler runs tasks, which defines the work that the task scheduler will perform. They consists of the following components.



При ежедневном типе запуска есть возможность выбора: запускать ли задание ежедневно, либо запускать его только по рабочим дням (естественно, что праздничные дни на неделе считаются рабочими, задание запускается с понедельника по пятницу, включительно), либо запускать задание с периодичностью, например, один раз в три дня.

В этом же окне нужно выбрать время запуска задания. «Дата начала» позволит отложить первый запуск задания до определенной даты, т.е. если сегодня первое число месяца, а «Дата начала» установлена на 10-е, то задача начнет выполняться с десятого числа, не смотря на то, что ее запуск запланирован как ежедневный.

Ежедневный запуск задачи

Первый пример настройки показывает, как настроить задачу на ежедневный запуск в 21:00. Самый простой вариант расписания, которое создается мастером без последующей донастройки. Вкладка Расписание в Свойствах созданной задачи выглядит так:Ежедневно

Такое расписание, на мой взгляд, не требует каких-то дополнительных комментариев. Задача запускается каждый день в 21:00.

Ежедневный запуск задачи до определенной даты с последующим удалением задачи из планировщика

При таком расписании задача запускается ежедневно до определенной даты. Когда дата последнего запуска достигнута, задача удаляется из Планировщика.Основные настройки

Такое расписание запускает задачу каждый день, начиная с 7-го и заканчивая 15-м числом, о чем говорят Дополнительные настройки, показанные на рисунке выше. На вкладке Настройки показано то, что установлена галка Удалить задание. Установка этой галки приведет к тому, что задание, после последнего, запуска будет удалено из Планировщика.



При ежемесячном типе запуска задания необходимо отметить месяцы, по которым будет запускаться задание и указать число, когда задание будет запущено. Обратите внимание на то, что последнее число месяца может быть 28-е, 29-е, 30-е или 31-е, поэтому, если задание необходимо выполнить в конце месяца, то его запуск лучше запланировать на первое число следующего месяца в 00:01.

Ежемесячный запуск задачи

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

Запуск задачи запланирован на первую минуту нового месяца. Это связано с тем, что в месяце может быть 28, 29, 30 или 31 день. Чтобы не создавать для каждого месяца свое расписание, логичнее выполнять задачу первого числа каждого месяца.

:/>  Как восстановить пропавшую языковую панель в Windows 7

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

В следующей главе я кратко расскажу о том, как протестировать созданное задание, чтобы убедиться в том, что первый его запуск пройдет без проблем.

Мало создать задание и написать программу или скрипт, которые будут запускаться Планировщиком. Нужно обязательно выполнить тестовый запуск задачи, чтобы убедиться, что задача работает именно так, как планировалось и при ее запуске не возникает проблем. Сделать это достаточно просто.Планировщик

Щелкните правой кнопкой по созданной задаче в Планировщике и выберите пункт Выполнить. Задача будет немедленно запущена, не смотря на расписание.

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

Другая ошибка может быть вызвана тем, что путь к программе или скрипту, которые запускаются задачей, указан неправильно. В т.ч., если в пути к запускаемой программе или скрипту есть пробелы, то путь должен быть заключен в кавычки.

Еще одна проблема с запуском запланированной задачи может быть вызвана незапущенным сервисом Планировщика. Обратите внимание на то, что если есть запланированные задачи, то режим запуска службы Планировщик заданий должен быть Авто.

Если режим запуска службы Вручную, то мастер создания задачи запуститься без проблем, т.к. Windows самостоятельно запустит необходимый сервис при открытии мастера, а после перезагрузки сервис Планировщика останется незапущенным и задание выполняться не будет.

При удачном прохождении тестового запуска задачи, в главном окне Планировщика, в графе Прошлый результат появится значение 0х0. Это говорит о том, что запуск задачи был успешным. Если запуск задачи по каким-то причинам не удался, то в графе Состояние будет написано «Запуск не удался». Чтобы узнать причину незапуска задачи откройте журнал работы Планировщика.Планировщик

На рисунке показано меню Дополнительно Планировщика. Чтобы открыть журнал работы выберите нижний пункт меню Просмотр журнала. Пример ошибки, записанной в журнал, показан ниже.
“Тестирование Планировщика.job” (test.bat) 14.03.2004 20:51:

20 ** ОШИБКА **
Попытка использования учетной записи задания окончилась неудачей,
поэтому задание выполнено не было.
Специфическая ошибка:
0x8007052e: Вход в систему не произведен: имя пользователя или пароль не опознаны.
Проверьте правильность указания имени пользователя и пароля и повторите попытку.

Чтобы получить указанную ошибку я специально ввел неверный пароль пользователя в задании и запустил его при помощи команды Выполнить так, как об этом говорилось выше.

Таким образом, использование журнала работы Планировщика поможет быстро устранить причину незапуска задания.

Журнал работы находится в файле SchedLgU.Txt, который расположен в systemroot, т.е. в той папке, куда установлена Windows. Кодировка этого файла — Юникод.

Графа Состояние Планировщика может содержать значения, объяснение которых приведено в таблице ниже.


Задание в данный момент не выполняется, либо было успешно выполнено


Задание выполняется в данный момент


Одна или несколько попыток выполнить задание были пропущены

Запуск не удался

Последняя попытка запуска задачи не удалась

Успешные тестовые запуски задачи не отменяют необходимости постоянного контроля за выполнением задачи. Введя в «боевую» эксплуатацию задание, не забывайте периодически просматривать журнал и Планировщик. Более разумное решение — создавать лог-файл работы самой задачи и по завершении ее работы открывать этот лог.

К примеру, приходя утром на работу, Вы будете видеть открытое окно редактора с лог-файлом. Это вынудит невольно просмотреть результат выполнения задачи, а отсутствие открытого окна будет означать проблемы, возникшие либо при запуске задачи, либо в ходе ее выполнения. Это позволит оперативно исправить проблему.

Нередко возникает необходимость выполнять автоматически те или иные действия на компьютерах пользователей в локальной сети. Администратор может управлять заданиями Планировщика на компьютерах пользователей удаленно, по сети. Учетная запись, из-под которой будет производиться управление заданиями Планировщика должна обладать правами Администратора на компьютере пользователя.

Чтобы создать, изменить или удалить задание на компьютере пользователя по сети откройте через Сетевое окружение его компьютер.Компьютер через сетевое окружениеНазначенные задания. Откройте эту папку. Пример окна показан на следующем рисунке.Создание задания

Чтобы создать новое задание на компьютере пользователя, щелкните правой кнопкой и выберите в меню Создать Назначенное задание, так, как это показано на рисунке выше. После этого на компьютере пользователя будет создано новое пустое задание.

Мастер запущен не будет, т.к. задание создается по сети, а не локально. После того, как будет введено имя нового задания, нужно настроить его свойства. Это можно сделать в окне, открывающемся по клику правой кнопки по новому заданию, при выборе пункта меню Свойства.

:/>  Локальная сеть: Общие правила

При настройке задания не забывайте, что задание настраивается удаленно, а не локально.

Все параметры задания, которое настраивается удаленно, идентичны настройке локального задания, и были описаны выше.

В Windows XP и старше есть утилита командной строки schtasks, которая позволяет управлять назначенными заданиями на компьютерах в локальной сети. Эта утилита будет незаменима для управления заданиями из скриптов. Справку о ключах для запуска этой утилиты можно получить, набрав в командной строке

schtasks /?

Ежеминутный запуск задачи в рабочее время в рабочие дни

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

Старт расписания запланирован каждый рабочий день в 8:00. В Дополнительных настройках указано, что задача запускается снова и снова каждую минуту до 19:00. Таким образом, максимальная задержка при обработке появившегося файла в папке составит секунды.



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

Запуск задачи в разные дни недели в разное время

Этот пример демонстрирует настройку расписания запуска задачи Планировщиком в разные дни недели в разное время.Расписание 1

При помощи такого расписания реализована следующая задача. Задание запускается в рабочие дни в 21:00, а в выходные — в 9:00. На вкладке Расписание была установлена галка Показывать несколько расписаний, затем были отмечены галками рабочие дни и выставлено время запуска задачи в 21:00.

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

Запуск задачи через день

Это расписание отличается от предыдущего лишь тем, что оно запускается раз в два дня.Через день

Как видно на скриншоте, в поле Расписание по дням установлено значение – Каждый 2 день. Это приведет к тому, что задача будет запущена раз в два дня. В это поле можно ввести любое значение.



При выборе однократного выполнения задания требуется указать только дату и время его запуска. Задание будет запущено в указанное время, и после этого его запуск больше производится не будет. Задание из Планировщика не будет удалено, поэтому его можно будет использовать в дальнейшем, исправив дату и время запуска.

Отложенный ежедневный запуск задачи

В этом примере запланирован ежедневный запуск задачи, но первый ее запуск отложен на 10 дней.Основные настройки

Как видно, в Дополнительных настройках установлена дата начала работы задания на 17-е число, притом, что задание создано 6-го. Таким образом, мы создали задачу, но отложили начало ее ежедневного запуска на 10 дней.

Управление заданиями планировщика задач по сети

Нередко возникает необходимость выполнять автоматически те или иные действия на компьютерах пользователей в локальной сети. Администратор может управлять заданиями Планировщика на компьютерах пользователей удаленно, по сети. Учетная запись, из-под которой будет производится управление заданиями Планировщика должна обладать правами Администратора на компьютере пользователя.

Чтобы создать, изменить или удалить задание на компьютере пользователя по сети, откройте “Планировщик задач”, и в левом столбце нажмите правой кнопкой мыши на “Планировщик заданий (Локальный компьютер)”. В появившемся контекстном меню нужно выбрать пункт “Подключится к другому компьютеру…”.

После этого, следует ввести имя компьютера, к которому будет выполнятся подключение. Если для подключения к другому компьютеру нужно использовать данные пользователя, отличающиеся от локального, необходимо установить галочку на пункте “Подключиться как другой пользователь”.

После этого, можно начинать пользоваться удаленным планировщиком, будто это локальный.

Оставьте комментарий