This hypothesis targets the presence of XWorm, a multi-stage malware that establishes persistence and exfiltrates data through compromised credentials and phishing vectors. Proactively hunting for these IOCs in Azure Sentinel allows the SOC to identify and isolate affected assets before the adversary leverages lateral movement to expand their foothold within the environment.
Malware Family: XWorm Total IOCs: 6 IOC Types: domain, url, ip:port
| Type | Value | Threat Type | First Seen | Confidence |
|---|---|---|---|---|
| ip:port | 103[.]83[.]86[.]96:4001 | botnet_cc | 2026-09-10 | 75% |
| ip:port | 91[.]239[.]6[.]97:4449 | botnet_cc | 2026-09-10 | 75% |
| domain | windowsupgrade[.]3utilities.com | botnet_cc | 2026-09-10 | 75% |
| ip:port | 107[.]149[.]8[.]250:54321 | botnet_cc | 2026-09-10 | 75% |
| ip:port | 185[.]29[.]10[.]23:1012 | botnet_cc | 2026-09-10 | 75% |
| url | hxxp://209[.]145[.]51[.]44/keepon.exe | payload_delivery | 2026-09-10 | 100% |
// Hunt for network connections to known malicious IPs
// Source: ThreatFox - XWorm
let malicious_ips = dynamic(["91.239.6.97", "103.83.86.96", "185.29.10.23", "107.149.8.250"]);
CommonSecurityLog
| where DestinationIP in (malicious_ips) or SourceIP in (malicious_ips)
| project TimeGenerated, SourceIP, DestinationIP, DestinationPort, DeviceAction, Activity
| order by TimeGenerated desc
// Hunt in Defender for Endpoint network events
let malicious_ips = dynamic(["91.239.6.97", "103.83.86.96", "185.29.10.23", "107.149.8.250"]);
DeviceNetworkEvents
| where RemoteIP in (malicious_ips)
| project Timestamp, DeviceName, RemoteIP, RemotePort, InitiatingProcessFileName, ActionType
| order by Timestamp desc
// Hunt for DNS queries to known malicious domains
// Source: ThreatFox - XWorm
let malicious_domains = dynamic(["windowsupgrade.3utilities.com"]);
DnsEvents
| where Name has_any (malicious_domains)
| project TimeGenerated, Computer, Name, IPAddresses, QueryType
| order by TimeGenerated desc
// Hunt for access to known malicious URLs
// Source: ThreatFox - XWorm
let malicious_urls = dynamic(["http://209.145.51.44/keepon.exe"]);
UrlClickEvents
| where Url has_any (malicious_urls)
| project Timestamp, AccountUpn, Url, ActionType, IsClickedThrough
| order by Timestamp desc
| Sentinel Table | Notes |
|---|---|
CommonSecurityLog | Ensure this data connector is enabled |
DeviceNetworkEvents | Ensure this data connector is enabled |
DnsEvents | Ensure this data connector is enabled |
UrlClickEvents | Ensure this data connector is enabled |
net use command to map a network share for a new application deployment, followed immediately by a schtasks /create command to set up a nightly backup job. The sequence of establishing a network connection and creating a scheduled task can mimic XWorm’s persistence and lateral movement patterns.
DevOps or ServiceAccount group and the scheduled task name contains keywords like Backup, Sync, or Deploy. Additionally, ignore if the source IP is within the internal DMZ or server subnet range.PsExec (Sysinternals) to execute a remote PowerShell script on a target server for patching, which involves establishing a named pipe or network connection and running a process. If the script creates a temporary service or scheduled task for cleanup, it may trigger the multi-stage execution logic.
PsExec.exe or PsExec64.exe located in the standard C:\Windows\System32 or C:\Tools directories. Also, filter out if the parent process is a known management tool like PowerShell.exe or cmd.exe initiated by an admin group.nessus.exe, qualys_agent.exe) or if the user account belongs to a SecurityTooling group.