{"id":38026,"date":"2026-04-15T13:06:43","date_gmt":"2026-04-15T11:06:43","guid":{"rendered":"https:\/\/enginsight.com\/?p=38026"},"modified":"2026-04-15T14:51:52","modified_gmt":"2026-04-15T12:51:52","slug":"bluehammer-critical-vulnerability-windows","status":"publish","type":"post","link":"https:\/\/enginsight.com\/de\/blog\/bluehammer-critical-vulnerability-windows\/","title":{"rendered":"BlueHammer \u2013 Windows did it again!"},"content":{"rendered":"<p>Ein unbekannter Forscher hat eine Zero Day L&#xFC;cke gefunden, die es erlaubt seine Rechte zu erweitern und in diesem Kontext eine Shell zu spawnen. Er ver&#xF6;ffentlichte sowohl einen <a href=\"https:\/\/deadeclipse666.blogspot.com\/2026\/04\/public-disclosure.html\" data-type=\"link\" data-id=\"https:\/\/deadeclipse666.blogspot.com\/2026\/04\/public-disclosure.html\" target=\"_blank\" rel=\"noopener\">Blogbeitrag<\/a> sowie einen Exploit. Im folgenden wird dieser analysiert und der Angriff erkl&#xE4;rt.<\/p>\n\n\n\n<p>Bisher gibt es von Microsoft keinen Patch dazu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Wie-funktioniert-der-Angriff?\">Wie funktioniert der Angriff?<\/h2>\n\n\n\n<p>Quelle: <a href=\"https:\/\/github.com\/Nightmare-Eclipse\/BlueHammer\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/Nightmare-Eclipse\/BlueHammer<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. <strong>RPC-Verbindung zum Windows Defender Dienst<\/strong><\/h2>\n\n\n\n<p>Der Angriff nutzt eine Schw&#xE4;che im Update-Mechanismus von Windows Defender aus. Windows Defender selbst l&#xE4;uft als hochprivilegierter Dienst und nutzt f&#xFC;r Updates eine sogenannte RPC-Schnittstelle (hier <code>c503f532-443a-4c69-8300-ccd1fbdb3839<\/code> &#x2013; weitere Infos unter <a href=\"https:\/\/gist.github.com\/enigma0x3\/2e549345e7f0ac88fad130e2444bb702\" target=\"_blank\" rel=\"noopener\">https:\/\/gist.github.com\/enigma0x3\/2e549345e7f0ac88fad130e2444bb702<\/a>). Diese Schnittstelle erm&#xF6;glicht es Programmen, Funktionen in anderen Adressr&#xE4;umen aufzurufen. Der Exploit ruft diese direkt an (ab Z.269) und t&#xE4;uscht dem Defender ein Update vor (<code>RPC_STATUS stat = Proc42_ServerMpUpdateEngineSignature(bindhandle, NULL, args-&gt;dirpath, &amp;errstat);<\/code>(Z.285)). Hierf&#xFC;r werden sogar echte Microsoft Update Dateien aus dem Internet heruntergeladen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"340\" src=\"https:\/\/enginsight.com\/wp-content\/uploads\/01-1024x340.png\" alt=\"\" class=\"wp-image-38029\" srcset=\"https:\/\/enginsight.com\/wp-content\/uploads\/01-1024x340.png 1024w, https:\/\/enginsight.com\/wp-content\/uploads\/01-300x100.png 300w, https:\/\/enginsight.com\/wp-content\/uploads\/01-768x255.png 768w, https:\/\/enginsight.com\/wp-content\/uploads\/01-1536x510.png 1536w, https:\/\/enginsight.com\/wp-content\/uploads\/01.png 1716w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Aufbau und Interaktion zur RPC Schnittstelle des Defenders<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. <strong><strong>TOCTOU-Manipulation &#x2013; Erstellen eines NT Symbolic Link<\/strong><\/strong><\/h2>\n\n\n\n<p>W&#xE4;hrend der Defender Dienst pr&#xFC;ft, welche Datei er einlesen soll, entsteht eine zeitliche L&#xFC;cke bis zum eigentlichen Einlesen. In dieser Zeit tauscht der Exploit das Ziel aus, mittels eines Symbolic Links. Der privilegierte Defender-Prozess liest dann nicht mehr die harmlose Update-Datei, sondern ein vom Angreifer kontrolliertes Ziel. Der Code l&#xE4;dt dabei <code>NtCreateSymbolicLinkObject<\/code> direkt aus der <code>ntdll.dll<\/code> zur Laufzeit, anstatt auf normale Windows-APIs zur&#xFC;ckzugreifen. Dadurch kann er eine interne, nicht dokumentierte NT-Systemfunktion nutzen, um im Object Manager Namespace symbolische Links auf niedriger Ebene zu erzeugen und so den Pfad gezielt zwischen Pr&#xFC;fung und Nutzung umzubiegen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"932\" height=\"229\" src=\"https:\/\/enginsight.com\/wp-content\/uploads\/02-1.png\" alt=\"\" class=\"wp-image-38030\" srcset=\"https:\/\/enginsight.com\/wp-content\/uploads\/02-1.png 932w, https:\/\/enginsight.com\/wp-content\/uploads\/02-1-300x74.png 300w, https:\/\/enginsight.com\/wp-content\/uploads\/02-1-768x189.png 768w\" sizes=\"(max-width: 932px) 100vw, 932px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Erstellen des NT Symbolic Links<\/p>\n\n\n\n<p>Dieses Verfahren nennt man auch Time-of-Check, Time-of-Use (TOCTOU)-Prinzip und bedeutet so viel wie: gepr&#xFC;ft wird Objekt A, verwendet wird aber Objekt B. Weitere Infos dazu unter: <a href=\"https:\/\/www.heise.de\/hintergrund\/Secure-Coding-CWE-377-TOCTOU-Race-Conditions-in-den-Griff-bekommen-10081613.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.heise.de\/hintergrund\/Secure-Coding-CWE-377-TOCTOU-Race-Conditions-in-den-Griff-bekommen-10081613.html<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. <strong>SAM-Zugriff via Offline Registry<\/strong><\/h2>\n\n\n\n<p>Nach dem Austausch des Objektes, wird dieses mit den Defender Rechten (SYSTEM) ge&#xF6;ffnet. Dar&#xFC;ber gelangt er an die SAM-Datenbank, welche die Benutzerverwaltung von Windows ist. Der Exploit nutzt eine Offline Registry-Bibliothekt (<code>offreg.h<\/code>), die zum Bearbeiten von Registry-Hives im Offline-Modus (also ohne die laufenden Sicherheitspr&#xFC;fungen des Systems) genutzt werden kann.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"395\" height=\"307\" src=\"https:\/\/enginsight.com\/wp-content\/uploads\/03-1.png\" alt=\"\" class=\"wp-image-38031\" srcset=\"https:\/\/enginsight.com\/wp-content\/uploads\/03-1.png 395w, https:\/\/enginsight.com\/wp-content\/uploads\/03-1-300x233.png 300w\" sizes=\"(max-width: 395px) 100vw, 395px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Laden der Offline Registry-Bibliotheken<\/p>\n\n\n\n<p>In Kombination mit <code>ntsecapi.h<\/code> (NT Security API) wird damit direkt in die SAM-Datenbank geschrieben, um Passw&#xF6;rter und Gruppenrechte zu &#xE4;ndern.<\/p>\n\n\n\n<p>Dazu wird <code>DWORD err = OROpenHive(sampath, &amp;hSAMhive);<\/code>(Z. 2492) verwendet, wobei <code>sampath<\/code>der Pfad zur Datei SAM-Datei (C:\\Windows\\System32\\config\\SAM) ist und <code>OROpenHive<\/code>die Datei als offline Registry Hive l&#xE4;dt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"405\" src=\"https:\/\/enginsight.com\/wp-content\/uploads\/04.png\" alt=\"\" class=\"wp-image-38033\" srcset=\"https:\/\/enginsight.com\/wp-content\/uploads\/04.png 641w, https:\/\/enginsight.com\/wp-content\/uploads\/04-300x190.png 300w\" sizes=\"(max-width: 641px) 100vw, 641px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Initialisierung der Passwortmanipulation in <code>DoSpawnShellAsAllUsers<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. <strong>Zugriff auf die Account Struktur und Passwort &#xC4;nderung<\/strong><\/h2>\n\n\n\n<p>Nachdem die SAM geladen wurde, navigiert der Code innerhalb der Registry-Struktur. Zuerst wird der Account-Bereich ge&#xF6;ffnet (Z.2510) <code>err = OROpenKey(hSAMhive, L&quot;SAM\\\\Domains\\\\Account&quot;, &amp;hkey);<\/code><\/p>\n\n\n\n<p>Kurz darauf folgt der entscheidende Schritt, bei dem der Zugriff auf alle Benutzer erfolgt (Z.2533) <code>err = OROpenKey(hSAMhive, L&quot;SAM\\\\Domains\\\\Account\\\\Users&quot;, &amp;hkey);<\/code>.<\/p>\n\n\n\n<p>Dieser Pfad ist wichtig, denn hier liegen alle lokalen Benutzerkonten. Jeder Subkey innerhalb dieses Schl&#xFC;ssels entspricht einem Benutzer, identifiziert durch seine RID.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"594\" src=\"https:\/\/enginsight.com\/wp-content\/uploads\/05-1024x594.png\" alt=\"\" class=\"wp-image-38034\" srcset=\"https:\/\/enginsight.com\/wp-content\/uploads\/05-1024x594.png 1024w, https:\/\/enginsight.com\/wp-content\/uploads\/05-300x174.png 300w, https:\/\/enginsight.com\/wp-content\/uploads\/05-768x446.png 768w, https:\/\/enginsight.com\/wp-content\/uploads\/05.png 1137w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Zugriff auf die SAM-Account-Struktur &#x2013; &#xD6;ffnen des Registry-Pfads<\/p>\n\n\n\n<p>Um alle Nutzer zu verarbeiten, wird im n&#xE4;chten Schritt, die Anzahl der Subkeys ermittelt, mittels (Z. 2541)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DWORD subkeys = NULL; err = ORQueryInfoKey(hkey, NULL, NULL, &amp;subkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL);<br><br><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"892\" height=\"830\" src=\"https:\/\/enginsight.com\/wp-content\/uploads\/06.png\" alt=\"\" class=\"wp-image-38035\" srcset=\"https:\/\/enginsight.com\/wp-content\/uploads\/06.png 892w, https:\/\/enginsight.com\/wp-content\/uploads\/06-300x279.png 300w, https:\/\/enginsight.com\/wp-content\/uploads\/06-768x715.png 768w\" sizes=\"(max-width: 892px) 100vw, 892px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Enumeration der Benutzerkonten in der SAM-Hive<\/p>\n\n\n\n<p>Die eigentliche Suche nach den Accounts erfolgt &#xFC;ber eine Schleife, die jeden Subkey durchl&#xE4;uft (Z. 2552)<\/p>\n\n\n\n<p><code>for (int i = 0; i &lt; subkeys; i++) { DWORD keynamesz = 0x100; wchar_t keyname[0x100] = { 0 }; err = OREnumKey(hkey, i, keyname, &amp;keynamesz, NULL, NULL, NULL);<\/code><\/p>\n\n\n\n<p>Dabei liefert <code>OREnumKey<\/code>jeweils den Namen eines Subkeys. F&#xFC;r jeden gefundenen Eintrag wird anschlie&#xDF;end der jeweilige User Key ge&#xF6;ffnet (Z. 2564)<\/p>\n\n\n\n<p><code>ORHKEY hkey2 = NULL; err = OROpenKey(hkey, keyname, &amp;hkey2);<\/code><\/p>\n\n\n\n<p>Dadurch ist es m&#xF6;glich, den sogenannten V-Wert auzulesen und an Usernamen, LM-Hash, NTLM-Hash und weitere Metadaten zu gelangen (Z. 2571).<\/p>\n\n\n\n<p><code>DWORD valuesz = 0; err = ORGetValue(hkey2, NULL, L&quot;V&quot;, NULL, NULL, &amp;valuesz);<\/code><\/p>\n\n\n\n<p>Der NTLM Hash (<code>realNTLMHash<\/code>) wird entschl&#xFC;sselt und es folgt die Passwort&#xE4;nderung durch die Funktion <code>ChangeUserPasswort<\/code>. Dabei wird der aktuelle Hash durch den neuen Hash (<code>newNTLM<\/code>) ersetzt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"763\" height=\"186\" src=\"https:\/\/enginsight.com\/wp-content\/uploads\/07.png\" alt=\"\" class=\"wp-image-38036\" srcset=\"https:\/\/enginsight.com\/wp-content\/uploads\/07.png 763w, https:\/\/enginsight.com\/wp-content\/uploads\/07-300x73.png 300w\" sizes=\"(max-width: 763px) 100vw, 763px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Passwort&#xE4;nderung durch &#xDC;berschreiben des Hashes<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. <strong>Spawnen der Shell<\/strong><\/h2>\n\n\n\n<p>Nach erfolgreicher Passwort&#xE4;nderung spawnt der Exploit im n&#xE4;chsten Schritt eine Shell im Kontext des manipulierten Users und nutzt daf&#xFC;r das tempor&#xE4;r gesetzte Passwort:<br><\/p>\n\n\n\n<p><code>if (!CreateProcessWithLogonW( username, NULL, newpassword_unistr, LOGON_WITH_PROFILE, L&quot;C:\\\\Windows\\\\System32\\\\conhost.exe&quot;, NULL, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &amp;si, &amp;pi)) { printf(&quot; Shell : Error %d\\n&quot;, GetLastError()); } else { printf(&quot; Shell : OK.\\n&quot;); }<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"431\" src=\"https:\/\/enginsight.com\/wp-content\/uploads\/08-1024x431.png\" alt=\"\" class=\"wp-image-38037\" srcset=\"https:\/\/enginsight.com\/wp-content\/uploads\/08-1024x431.png 1024w, https:\/\/enginsight.com\/wp-content\/uploads\/08-300x126.png 300w, https:\/\/enginsight.com\/wp-content\/uploads\/08-768x323.png 768w, https:\/\/enginsight.com\/wp-content\/uploads\/08.png 1428w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Spawnen der Shell<\/p>\n\n\n\n<p>Mit dem erfolgreichen Spawn der Shell ist die Ausf&#xFC;hrungskette des Exploits abgeschlossen. Durch die tempor&#xE4;re Manipulation der NTLM-Hashes und die anschlie&#xDF;ende Anmeldung im Kontext privilegierter Accounts erh&#xE4;lt der Angreifer unmittelbaren Zugriff auf eine interaktive Session mit erweiterten Rechte.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein unbekannter Forscher hat eine Zero Day L&#xFC;cke gefunden, die es erlaubt seine Rechte zu erweitern und in diesem Kontext eine Shell zu spawnen. Er ver&#xF6;ffentlichte sowohl einen Blogbeitrag sowie einen Exploit. Im folgenden wird dieser analysiert und der Angriff erkl&#xE4;rt. Bisher gibt es von Microsoft keinen Patch dazu. Wie funktioniert der Angriff? Quelle: https:\/\/github.com\/Nightmare-Eclipse\/BlueHammer [&#x2026;]<\/p>\n","protected":false},"author":34,"featured_media":38027,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"content-type":"","_eb_attr":"","footnotes":""},"categories":[334],"tags":[],"class_list":["post-38026","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-schwachstellen"],"_links":{"self":[{"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/posts\/38026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/comments?post=38026"}],"version-history":[{"count":5,"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/posts\/38026\/revisions"}],"predecessor-version":[{"id":38043,"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/posts\/38026\/revisions\/38043"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/media\/38027"}],"wp:attachment":[{"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/media?parent=38026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/categories?post=38026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/enginsight.com\/de\/wp-json\/wp\/v2\/tags?post=38026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}