{"id":462,"date":"2026-03-29T01:33:15","date_gmt":"2026-03-29T01:33:15","guid":{"rendered":"http:\/\/quantusintel.group\/osint\/blog\/2026\/03\/29\/wmi-event-consumer-persistence-how-apt29-achieves-fileless-persistence-part-1\/"},"modified":"2026-03-29T01:33:15","modified_gmt":"2026-03-29T01:33:15","slug":"wmi-event-consumer-persistence-how-apt29-achieves-fileless-persistence-part-1","status":"publish","type":"post","link":"https:\/\/quantusintel.group\/osint\/blog\/2026\/03\/29\/wmi-event-consumer-persistence-how-apt29-achieves-fileless-persistence-part-1\/","title":{"rendered":"WMI Event Consumer Persistence: How APT29 Achieves Fileless Persistence (Part 1)"},"content":{"rendered":"<h4>Understanding the theory before analyzing real attack\u00a0logs<\/h4>\n<p>I\u2019m learning about WMI persistence. This is not research. This is me documenting what I found while studying a technique that APT29 and 20+ other APT groups\u00a0use.<\/p>\n<p>Part 2 will be different\u200a\u2014\u200aactual lab testing, real Sysmon logs, detection methodology. This is just my\u00a0notes.<\/p>\n<h3>Why I\u2019m Studying\u00a0This<\/h3>\n<p>I kept seeing WMI persistence mentioned in threat reports. APT29, APT28, and 20+ other groups use it. But I realized I didn\u2019t actually understand HOW it works. I just knew THAT they use\u00a0it.<\/p>\n<p>So I started reading. Here\u2019s what I\u00a0found.<\/p>\n<figure><img data-opt-id=771569372  fetchpriority=\"high\" decoding=\"async\" alt=\"\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/1*DTCE_X3TsWZnvCh0ey7ijg.png\" \/><figcaption>redcanary\u2019s quote<\/figcaption><\/figure>\n<h3>What I Found: WMI Has Three\u00a0Parts<\/h3>\n<p>When I read about WMI persistence, I kept seeing three things mentioned:<\/p>\n<ol>\n<li>Event Filter<\/li>\n<li>Event Consumer<\/li>\n<li>Binding<\/li>\n<\/ol>\n<p>I didn\u2019t understand why all three mattered. Here\u2019s what I\u00a0learned.<\/p>\n<h3>The Event Filter (EventID\u00a019)<\/h3>\n<p>An Event Filter is a trigger. It\u2019s basically saying: \u201cWhen this happens, do something.\u201d<\/p>\n<p>From MITRE docs, I read that APT29 set up a filter that said: \u201cWhen a process is created, trigger my\u00a0action.\u201d<\/p>\n<p>In Sysmon, this shows up as EventID 19\u200a\u2014\u200aWMI Event Filter Activity.<\/p>\n<p>What confused me: This isn\u2019t execution yet. This is just setup. The trigger exists, but nothing has happened.<\/p>\n<h3>The Event Consumer (EventID\u00a020)<\/h3>\n<p>The Consumer is what actually runs. It\u2019s the\u00a0payload.<\/p>\n<p>So the Consumer says: \u201cWhen the filter triggers, execute this command.\u201d<\/p>\n<p>MITRE documents that attackers use Event Consumers to execute backdoors, malware, or lateral movement commands when the trigger\u00a0fires.<\/p>\n<p>In Sysmon, this shows up as EventID 20\u200a\u2014\u200aWMI Event Consumer Activity.<\/p>\n<p>Still no execution. Still just\u00a0setup.<\/p>\n<h3>The Binding (EventID\u00a021)<\/h3>\n<p>This is where I realized the attack actually happens: the binding connects the filter to the consumer.<\/p>\n<p>Without the binding, you have a filter with nothing to execute. You have a consumer with no\u00a0trigger.<\/p>\n<p>The binding LINKS them together.<\/p>\n<p>In Sysmon, this is EventID 21\u200a\u2014\u200aWMI Event Consumer-to-Filter Binding Activity.<\/p>\n<p>Once this binding exists, the attack is\u00a0armed.<\/p>\n<h3>Why APT29 (and 20+ Others) Use\u00a0This<\/h3>\n<p>I was wondering: Why WMI? Why not just use a Registry Run key or Scheduled Task?<\/p>\n<p>Here\u2019s what I\u00a0think:<\/p>\n<p><strong>WMI looks like a Windows function.<\/strong> Most defenders trust it by default. Most people think WMI activity is normal system behavior.<\/p>\n<p>APT29, APT28, and others all chose WMI because it blends in. If a defender saw EventID 20 (WMI Consumer activity), they might think: \u201cThat\u2019s probably Windows doing Windows\u00a0things.\u201d<\/p>\n<p>But if they saw Registry Run key activity, they\u2019d immediately think: \u201cThat\u2019s suspicious.\u201d<\/p>\n<p>So WMI is harder to detect. That\u2019s why so many APT groups use\u00a0it.<\/p>\n<h3>The Attack\u00a0Timeline<\/h3>\n<p>I was confused about when the actual execution happens. The answer: EventID\u00a04688.<\/p>\n<p>EventID 4688 is process creation. This is when the malicious command actually\u00a0runs.<\/p>\n<p>Here\u2019s the timeline:<\/p>\n<ol>\n<li>Attacker creates Filter (EventID 19)\u200a\u2014\u200a\u201cWhen X event happens,\u00a0trigger\u201d<\/li>\n<li>Attacker creates Consumer (EventID 20)\u200a\u2014\u200a\u201cRun this\u00a0command\u201d<\/li>\n<li>Attacker creates Binding (EventID 21)\u200a\u2014\u200a\u201cLink filter to consumer\u201d<\/li>\n<li>System triggers the event (boot, process creation, file write,\u00a0etc.)<\/li>\n<li>Filter executes the\u00a0consumer<\/li>\n<li>Sysmon captures EventID 4688\u200a\u2014\u200aprocess created (the malicious code\u00a0running)<\/li>\n<\/ol>\n<p>So EventID 19, 20, 21 might happen at 3 AM on\u00a0Tuesday.<\/p>\n<p>But EventID 4688 might happen at 8 AM on Friday when the trigger\u00a0fires.<\/p>\n<p>That\u2019s why defenders miss this\u200a\u2014\u200athe setup and execution are days\u00a0apart.<\/p>\n<h3>What I Don\u2019t Understand Yet<\/h3>\n<p>When I read about this, some things didn\u2019t\u00a0click:<\/p>\n<p><strong>Question 1:<\/strong> If the setup (EventID 19, 20, 21) happens at 3 AM, why does the trigger wait until\u00a0Friday?<\/p>\n<p><strong>Question 2:<\/strong> Can an attacker control WHEN the trigger fires, or does it depend on the system\u00a0event?<\/p>\n<p><strong>Question 3:<\/strong> If I see EventID 20 and 21 in my logs, how do I know if it\u2019s legitimate WMI activity or malicious?<\/p>\n<p><strong>Question 4:<\/strong> Where exactly do these WMI components get stored on disk? Is it Registry? Memory?\u00a0Both?<\/p>\n<h3>Why This Matters (Even Though It\u2019s\u00a0Old)<\/h3>\n<p>APT29, APT28, APT19, APT33, APT37, APT38, APT40, APT41, Lazarus Group\u200a\u2014\u200aMITRE documents that 20+ groups use WMI persistence.<\/p>\n<p>APT29 used it in the SolarWinds compromise to maintain backdoor access. But it\u2019s not just SolarWinds. It\u2019s everywhere.<\/p>\n<p>Most defenders still miss it because they don\u2019t correlate WMI events with process creation\u00a0events.<\/p>\n<p>That\u2019s what I want to understand: If the technique is old and documented, why are people still falling for\u00a0it?<\/p>\n<p>Answer: Because WMI looks legitimate.<\/p>\n<h3>Open to Collaboration<\/h3>\n<p>Building detection rules that actually work in real environments is what drives me. The gap between theory and practice is huge, and that\u2019s where the interesting problems\u00a0are.<\/p>\n<p>If you\u2019re working on detection engineering, scaling your SOC, or trying to improve threat hunting in your environment, I\u2019m interested in talking about\u00a0it.<\/p>\n<p>I\u2019m open to remote contract work or project-based collaboration where I can contribute expertise in detection engineering. If your team is serious about improving threat detection capabilities and understanding real-world attack patterns, let\u2019s\u00a0connect.<\/p>\n<p>LinkedIn: <a href=\"https:\/\/www.linkedin.com\/in\/manishrawat-soc\/\">https:\/\/www.linkedin.com\/in\/manishrawat-soc\/<\/a><br \/>GitHub: <a href=\"https:\/\/github.com\/Manishrawat21\/\">https:\/\/github.com\/Manishrawat21\/<\/a><\/p>\n<h3>Sources<\/h3>\n<ul>\n<li>MITRE ATT&amp;CK: T1547.001 (Event Triggered Execution\u200a\u2014\u200aWindows Management Instrumentation Event Subscription)<\/li>\n<li>Mandiant: SolarWinds Compromise &amp; APT29\u00a0Analysis<\/li>\n<li>Red Canary: WMI Persistence &amp; Detection Evasion\u00a0Research<\/li>\n<\/ul>\n<p><strong>This is Part 1: My Learning\u00a0Notes<\/strong><\/p>\n<p><strong>Part 2 Coming:<\/strong> Real lab testing. Real Sysmon logs. Real detection.<\/p>\n<p>Not theory.\u00a0Proof.<\/p>\n<p><img data-opt-id=574357117  fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/medium.com\/_\/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=c93477ea7025\" width=\"1\" height=\"1\" alt=\"\" \/><\/p>\n<hr \/>\n<p><a href=\"https:\/\/osintteam.blog\/wmi-event-consumer-persistence-how-apt29-achieves-fileless-persistence-part-1-c93477ea7025\">WMI Event Consumer Persistence: How APT29 Achieves Fileless Persistence (Part 1)<\/a> was originally published in <a href=\"https:\/\/osintteam.blog\/\">OSINT Team<\/a> on Medium, where people are continuing the conversation by highlighting and responding to this story.<\/p>","protected":false},"excerpt":{"rendered":"<p>Understanding the theory before analyzing real attack\u00a0logs I\u2019m learning about WMI persistence. This is not research. This is me documenting what I found while studying a technique that APT29 and 20+ other APT groups\u00a0use. Part 2 will be different\u200a\u2014\u200aactual lab testing, real Sysmon logs, detection methodology. This is just my\u00a0notes. Why I\u2019m Studying\u00a0This I kept &#8230; <a title=\"WMI Event Consumer Persistence: How APT29 Achieves Fileless Persistence (Part 1)\" class=\"read-more\" href=\"https:\/\/quantusintel.group\/osint\/blog\/2026\/03\/29\/wmi-event-consumer-persistence-how-apt29-achieves-fileless-persistence-part-1\/\" aria-label=\"Read more about WMI Event Consumer Persistence: How APT29 Achieves Fileless Persistence (Part 1)\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":463,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-462","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/posts\/462","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/comments?post=462"}],"version-history":[{"count":0,"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/posts\/462\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/media\/463"}],"wp:attachment":[{"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/media?parent=462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/categories?post=462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/quantusintel.group\/osint\/wp-json\/wp\/v2\/tags?post=462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}