Today I’ll share just a short snippet that I used to look for some specific scheduled tasks on a Windows system. Luckily windows creates XML files that are located somewhere like the C:\Windows\System32\Tasks
folder. These files contain an XML representation of the scheduled tasks, and it is this that I am scanning with YARA.
Here’s a quick example of the rule:
// Detects the scheduled task on a Windows machine that runs Ransim
rule RansimTaskDetect : RansomwareScheduledTask {
meta:
author = "Ben Meadowcroft (@BenMeadowcroft)"
strings:
// Microsoft XML Task files are UTF-16 encoded so using wide strings
$ransim = "ransim.ps1 -mode encrypt</Arguments>" ascii wide nocase
$task1 = "<Task" ascii wide
$task2 = "xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">" ascii wide
condition:
all of them
}
The scheduled tasks runs a short PowerShell script that simulates some basic ransomware behavior, and this rule just matches the XML file for that task. This file is encoded in UTF-16, so the $task1
and $task2
strings simply reference some strings with the wide
that are a part of the common strings found within the XML file (the start of the <Task
element, and the XML namespace used to define the schema), the ascii wide
modifiers searches for the string in both ascii and wide (double byte) form. The remaining string just looks for the invocation of the script as an argument to the task, and ignores the case used.
If I was looking for the presence of a task on live systems then I of course have other tools I could use, such as schtasks query
. However, as I am often operating on the backups of a system being able to use this file based approach can be very helpful as it doesn’t rely on the availability of the primary system when I want to identify whether a scheduled task was present at some historical point in time.