Angriffsbeispiele aus Access-Logs
(nishtahir.com)- Die Access-Logs einer seit über 10 Jahren selbst gehosteten öffentlichen IP zeigen Angriffsversuche, denen im Internet erreichbare Dienste regelmäßig ausgesetzt sind – von der Suche nach Zugangsdaten bis zu Command Injection gegen IoT-Geräte.
- Das häufigste Muster war die Suche nach Konfigurationsdateien und Verzeichnissen wie
.env,.aws/credentials,.git/config,backup/odertest/; einige Requests nutzten User-Agents mit Tippfehlern wieMozlila/5.0. - Shellshock-Versuche packten Payloads in Form von Bash-Funktionen in den User-Agent, um
/etc/passwdauszulesen, und errieten wiederholt verschiedene CGI-Pfade. - Angriffe auf LuCI und Zyxel versuchten, Befehle in Webinterfaces von Routern und Embedded-Geräten einzuschleusen, um Remote-Skripte sowie Binärdateien für mehrere Architekturen herunterzuladen und auszuführen.
- Man sollte die Angriffsfläche im öffentlichen Internet reduzieren, für notwendige Tools und Verzeichnisse Authentifizierung sowie IP-Beschränkungen einsetzen und IoT-Geräte aktuell halten sowie möglichst vom öffentlichen Netz trennen.
Traffic, den öffentlich im Internet erreichbare Dienste erhalten
- Seit über 10 Jahren wird selbst gehostet, um die eigenen Daten selbst zu besitzen und Abhängigkeiten von Plattformen jenseits von Cloud-Hosts zu verringern.
- Sobald eine IP im öffentlichen Internet erreichbar ist, trifft sehr viel bösartiger Traffic ein; anhand der Access-Logs lässt sich nachvollziehen, welche Angriffe zuletzt eingegangen sind.
- Diese Analyse ist weniger forensische Arbeit eines Sicherheitsexperten als vielmehr die Beobachtung eines neugierigen Entwicklers.
- IP-Adressen der Angreifer und einige von Angreifern verwendete beleidigende Ausdrücke wurden vorsichtshalber unkenntlich gemacht.
Suche nach Zugangsdaten und Konfigurationsdateien
- Der häufigste Angriff war der Versuch, per Directory Traversal Zugangsdaten zu finden; besonders häufig tauchten Requests nach
.env-Dateien auf.- Beispiele für Request-Pfade sind
/laravel/.env,/backend/.env,/api/.env,/.env,//.envusw. .envgilt üblicherweise als Datei, die Application-Secrets enthält.
- Beispiele für Request-Pfade sind
- Auch AWS-bezogene Dateien und Git-Repository-Konfigurationen wurden durchsucht.
- Beispiele sind
/aws.yml,/.env.bak,/info.php,/.aws/credentials,/config/aws.yml,/.git/configusw.
- Beispiele sind
- Ebenfalls wiederholt angefragt wurden gängige Verzeichnisse, die versehentlich zurückgelassen worden sein könnten.
- Beispiele sind
/old/,/new/,/test/,/backup/,/temp/usw.
- Beispiele sind
- In einigen User-Agents stand
Mozlila/5.0, offenbar ein Tippfehler vonMozilla/5.0.- Ergebnisse einer GitHub-Suche deuten darauf hin, dass dieser Tippfehler möglicherweise von verbreiteten Tools erzeugt und per Copy-and-paste weiterverwendet wurde.
- Auch Requests auf Tools für Remote-Zugriff oder Konfigurationstools wurden beobachtet.
- Beispiele sind
/actuator/gateway/routes,/hudson,/ui/login.action,/?XDEBUG_SESSION_START=phpstormusw.
- Beispiele sind
- Im öffentlichen Internet sollten nur die unbedingt notwendigen Bestandteile erreichbar sein; wenn Tools oder Verzeichnisse exponiert werden müssen, braucht es eine Authentifizierungsschicht und möglichst Beschränkungen auf bestimmte IPs.
Shellshock-Versuche
- Mehrere Requests scheinen auf die Shellshock-Schwachstelle gezielt zu haben.
- Dieser Angriff zielt auf die Ausführung beliebiger Befehle auf Webservern ab, die CGI-Skripte mit einer verwundbaren Bash-Version ausführen.
- Beim Start eines CGI-Programms werden Umgebungsvariablen aus Request-Inhalten gesetzt;
HTTP_USER_AGENTgehört zu den möglichen Zielen. - Enthält der Wert Zeichen wie
() { :; };, interpretiert Bash dies als auszuführende Funktion.
- Beim Start eines CGI-Programms werden Umgebungsvariablen aus Request-Inhalten gesetzt;
- Im User-Agent der tatsächlichen Logs fanden sich Payloads wie die folgenden.
() { ignored; }; echo Content-Type: text/html; echo ; /bin/cat /etc/passwd() { ignored; };hat die Form einer Bash-Funktionsdefinition.echo Content-Type: text/html; echo ;gibt den Content-Type und eine Leerzeile für die HTTP-Antwort aus./bin/cat /etc/passwdist ein Befehl, der den Inhalt von/etc/passwdmit Informationen zu Benutzerkonten auszugeben versucht.
- Wäre der Angriff erfolgreich gewesen, hätte er Zugriff auf Benutzerinformationen und die Ausführung beliebigen Codes auf dem Server ermöglichen können.
- Wie bei Directory Traversal errieten die Angreifer gängige Pfade wie
/cgi-bin/status,/cgi-bin/stats,/cgi-bin/test,/cgi-bin/status/status.cgi,/test.cgi,/debug.cgi,/cgi-bin/test-cgi.
Command Injection gegen LuCI
- Ein Request scheint auf LuCI, das Webinterface für OpenWRT-Router, gezielt zu haben.
- Die Angriffs-URL war so aufgebaut, dass im Feld
countryein Befehl eingeschleust wurde, um das Shellskripttenda.shvon einem Remote-Server herunterzuladen und auszuführen.- Nach dem URL-Decoding wechselte der Befehl nach
/tmp, löschte Dateien, lud perwgetdas Skript herunter, setzte Ausführungsrechte und führte es aus.
- Nach dem URL-Decoding wechselte der Befehl nach
- Das heruntergeladene Skript enthielt Anweisungen, weitere Binärdateien herunterzuladen und auszuführen.
- Enthalten waren Architekturbezeichnungen wie
mips,mpsl,x86_64,arm,arm5,arm6,arm7,i586,i686,powerpc,sh4,m68k,sparc. - Der Versuch, Binärdateien für mehrere Architekturen auszuführen, wirkt wie ein Ansatz, die Angriffsfläche zu vergrößern, wenn die Architektur des Zielgeräts unbekannt ist.
- Enthalten waren Architekturbezeichnungen wie
- Für weitere Untersuchungen wurde eine mit der eigenen Umgebung inkompatible Binärdatei heruntergeladen und mit Ghidra untersucht.
- Anfangs gab es nur drei Funktionen und nicht viele String-Daten.
- In einem großen Datenbereich wurden die Strings
$Info: This file is packed with the UPX executable packerundUPX 3.94gefunden.
- Es handelte sich um eine mit UPX gepackte ELF-Binärdatei; sofern UPX-Header oder packed binary nicht verändert wurden, lässt sie sich mit
upx -dentpacken.- Tatsächlich wuchs die Dateigröße nach
upx -d mipsvon34932auf93732, und es waren deutlich mehr Strings sichtbar.
- Tatsächlich wuchs die Dateigröße nach
- Die Strings der entpackten Binärdatei enthielten
M-SEARCH * HTTP/1.1,ST: urn:dial-multiscreen-org:service:dial:1sowie XML-Payloads für Upgrades von Huawei-Geräten.- Dies sieht nach einem UPnP-Befehl aus, der Geräte mit Unterstützung für das DIAL-Protokoll im Netzwerk sucht.
- Der XML-Payload scheint darauf ausgelegt zu sein, nach Huawei-Geräten zu scannen, die für Command Injection anfällig sind.
- Dieses Verhalten wurde offenbar als Teil des Mirai-Botnets identifiziert.
- Die referenzierte Datei
yeye.mipswar beim Abruf nicht verfügbar.- Ein
nmap-Scan des Servers zeigte als offene Ports nur22/tcp sshund646/tcp filtered ldp.
- Ein
Command Injection gegen Zyxel
- Ein anderer Request enthielt Shell-Befehle in der GET-URL; entfernt man die Shell-Substitution
${IFS}, wird er leichter lesbar.- Der bereinigte Befehl wechselte nach
/tmp, löschte*mips*-Dateien, ludhuhu.mipsherunter, setzte Ausführungsrechte und führte die Datei mit dem Argumentzyxel.selfrepaus.
- Der bereinigte Befehl wechselte nach
- Dieser Angriff scheint auf einen
zhttpd-Exploit für Zyxel-Geräte gezielt zu haben. - Diese Binärdatei war nicht gepackt, sodass die Strings in Ghidra direkt sichtbar waren.
- Zu den Strings gehörten
M-SEARCH * HTTP/1.1, der DIAL-bezogeneST-Header,skyljne.arm,skyljne.arm5,skyljne.arm6,skyljne.arm7,skyljne.mips,skyljne.mpsl,skyljne.x86_64,skyljne.sh4usw. - Ebenfalls enthalten war ein XML-Payload, der gegen Huawei-Geräte gerichtet ist,
huhu.mipsherunterlädt und alsselfrep.huaweiausführt.
- Zu den Strings gehörten
- Ein weiterer String enthielt einen Befehl, der einen POST an
/goform/set_LimitClient_cfgsendet.- Zusammen mit dem Header
Cookie: user=adminversucht er, über den Parametermaceinen Befehl einzuschleusen, umhuhu.mpslherunterzuladen und auszuführen. - Laut einem Akamai-Beitrag richtet sich diese Schwachstelle gegen Router und kann ohne vorherige Authentifizierung ausgenutzt werden, da keine besonderen Authentifizierungs- oder Autorisierungsprüfungen stattfinden.
- Zusammen mit dem Header
- Es wird als sehr wahrscheinlich eingeschätzt, dass diese Binärdatei ein Agent des Mirai-Botnets ist.
- Einige Quellen erwähnen auch eine mögliche Verbindung zu Linux Medusa.
Betriebliche Gegenmaßnahmen
- Die geprüften Logs sind nur ein Ausschnitt; täglich gibt es viele weitere Exploit-Versuche.
- Es ist wichtig, Geräte, insbesondere IoT-Geräte, aktuell zu halten.
- IoT-Geräte sollten möglichst nicht direkt im öffentlichen Internet erreichbar sein.
- Falls sie zwingend exponiert werden müssen, sollten sie nach Möglichkeit in einem separaten VLAN isoliert werden.
1 Kommentare
Hacker-News-Kommentare
Interessanterweise scheinen manche Angreifer Certificate-Transparency-Logs zu überwachen, um neu ausgestellte Zertifikate zu finden.
Wenn man einen neuen Server auf einer neuen IP länger als eine Woche laufen lässt, sieht man in den Access Logs nur ein paar zufällige Scans; aber etwa eine Stunde nachdem man ein Let’s-Encrypt-Zertifikat erhalten hat, kamen bei mir schon mehrfach Hunderte Requests wie die im Artikel beschriebenen herein.
Fazit: Neue Dienste sollten so früh wie möglich abgesichert werden, idealerweise bevor sie dem Internet ausgesetzt werden.
Oder man nutzt eine eigene Zertifizierungsstelle und bis zur Umstellung selbstsignierte Zertifikate plus mTLS.
Wenn eine Software zum Beispiel einen Initial-Setup-Bildschirm für das Anlegen eines Admin-Kontos oder die DB-Verbindung offen ausliefert, ist das riskanter, als diese Werte von Anfang an über Umgebungsvariablen, Konfigurationsdateien oder ein dediziertes Secret-Management-Tool festzulegen.
Zum Beispiel, um Domains innerhalb eines bestimmten Zeitraums zu durchsuchen.
Cloudflares Merkle Town[0] ist nützlich für einen Überblick, aber eine einfache Möglichkeit, CT-Logs abzufragen, habe ich noch nicht gefunden; ct-woodpecker[1] sieht ebenfalls vielversprechend aus.
[0] https://ct.cloudflare.com/
[1] https://github.com/letsencrypt/ct-woodpecker
VPNs sind heutzutage so gut, dass ich damit viel ruhiger schlafe; Dinge wie Fotohosting oder Backups möchte ich besonders ungern öffentlich exponieren.
Als ich anfing, eine selbst gehostete Website zu betreiben, habe ich mir auch die Access Logs angesehen und eine Zeit lang sogar ein Intrusion-Detection-System genutzt, das Daten sammelte und eingehende Angriffsversuche anzeigte.
Am Ende habe ich sowohl die proaktive Durchsicht der Logs als auch das Bezahlen für ein Intrusion-Detection-System aufgegeben; es war Zeitverschwendung und lenkte nur ab.
Gute Zusammenfassungen gängiger Schwachstellen und Angriffe findet man leicht, und die kann man als Maßstab für die Serveradministration nehmen. Für jede verbreitete Webserver-Technologie gibt es viele Best-Practice-Guides, und allein deren vollständige Umsetzung bringt einen schon weit vor fast alle Angreifer.
Der nächstbeste Einsatz von Zeit und Ressourcen ist, einen möglichst schnellen Patch-Zyklus zu priorisieren. Die meisten Angriffe zielen auf öffentlich bekannte Schwachstellen.
Besonders nützlich sind Logs, wenn man nach einem Vorfall eine Diagnose stellen muss. Mit Log-Analyse-Software konnte ich gespeicherte Logs durchsuchen und in zwei oder drei Fällen die Root Cause eines erfolgreichen Angriffs finden; jedes Mal war eine bekannte Schwachstelle die Ursache, die viel zu spät gepatcht worden war.
Die Lösung ist Defense in Depth, und beim Selbsthosting persönlicher Dienste lässt sich das meist ziemlich einfach umsetzen.
Man setzt eine Firewall davor oder versteckt den Dienst hinter VPN/Tailscale; wenn man ihn statt unter
/phpmyadmin/unter einem Unterordner wie/mawer/phpmyadmin/versteckt, den automatisierte Angriffe nicht ansteuern, finden ihn 99,9 % nicht. Das nennt man Security by Obscurity, und man sollte sich nicht allein darauf verlassen, aber als zusätzliche Schicht ist es sehr nützlich.Man sollte Apps in Sandboxes betreiben und Server isolieren, damit sich ein Eindringling nach einem Kompromittieren nur schwer weiterbewegen kann, und Logs schreiben, damit man erkennen kann, ob ein Angriff stattgefunden hat und ob er erfolgreich war.
Der Kernpunkt ist: Man darf sich nicht auf eine einzige Schutzmaßnahme verlassen, egal ob Patch oder Firewall. Irgendeine davon wird am Ende versagen.
Im Moment versuche ich, Pakete quartalsweise zu aktualisieren[0], aber ein Tool, das mich über bekannte Schwachstellen informiert, damit ich sofort reagieren kann, wäre hilfreich.
[0] Mit „versuche“ meine ich hier, dass ich nicht sofort upgraden kann, wenn es Breaking Changes gibt, die sich schwer auf die neueste Version übertragen lassen, oder wenn es sich um ein X.0.0-Release handelt, dem ich noch nicht vertraue.
Da der Autor gesagt hat, dass er kein Sicherheitsexperte ist, eine kleine Korrektur: Das Beispiel am Anfang ist Credential- und Konfigurations-Scanning, nicht Directory Traversal.
Unter Directory Traversal verstehe ich eine Technik, bei der ein Angreifer aus dem Webroot „ausbricht“ oder den Server dazu bringt, Dateien außerhalb des normalen Verzeichnisses auszuliefern.
"/../../passwd/etc".Zumindest meiner Erfahrung nach ist ein wesentlicher Punkt, dass viele dieser Angriffe von feindlichen staatlichen Akteuren kommen.
Das ist umstritten, aber es kann sinnvoll sein, ganze IP-Bereiche problematischer Länder zu blockieren, mit denen man ohnehin nichts zu tun hat. Auf diese Weise habe ich einmal 100 % der Scan-Versuche auf einen neuen Dienst verhindert.
Die Scans auf meinen Server kommen größtenteils aus den USA, mit den Niederlanden mit großem Abstand auf Platz zwei. Vermutlich stammt das meiste davon von AWS und anderen Rechenzentren.
Ich arbeite im Bereich Anwendungs-/Produktsicherheit und habe über Jahre hinweg WAFs von Unternehmen im Milliarden-Dollar-Bereich verwaltet.
Man muss das DNS zu Cloudflare umziehen und ein paar WAF-Regeln für die Site einrichten. Zum Beispiel eine Managed Challenge auslösen, wenn der Bot-Score unter 2 liegt, oder entsprechend reagieren, wenn der Attack-Score einen bestimmten Wert erreicht. Das dürfte wahrscheinlich kaum etwas kosten und viele Probleme lösen.
Vor dem Umzug in die Produktion muss man das aber unbedingt testen. Eine Test-Domain zu haben ist ebenfalls sinnvoll. Eine WAF ist keine Allzwecklösung, sondern eher ein Pflaster; wenn die App selbst nicht so gehärtet ist, dass sie Angriffe aushält, kann sie auch die fortschrittlichste WAF oder Bot Protection nicht retten.
Das Free Managed Ruleset scheint standardmäßig ausgerollt zu werden, und Cloudflare pflegt das Änderungsprotokoll hier: https://developers.cloudflare.com/waf/change-log
Das funktioniert sehr gut. Da nur meine Familie darauf zugreift, war die Einrichtung einfach, und jeder hat ein eigenes Zertifikat, das ich bei Bedarf widerrufen kann.
Da du dich in diesem Bereich offenbar gut auskennst, würde mich interessieren, ob du auch schon Lösungen mit Azure-Infrastruktur zusammen mit Cloudflare verwaltet hast, und falls ja, ob es abseits der üblichen Dinge wie OWASP Punkte gibt, die Leute häufig übersehen.
Wenn ein Unternehmen aus irgendeinem Grund unbedingt etwas betreiben muss, das nicht auf dem neuesten Stand ist, kann das nötig sein, aber am Ende bleibt es nur ein Pflaster.
Ich hoste seit etwa einem Jahr einen selbst entworfenen HTTP/S-Server mit 400 Zeilen Code selbst, und die Menge an Angriffs-Traffic, die über die drei offenen Ports (22, 80, 443) hereinkommt, ist erstaunlich hoch.
Allerdings habe ich mir nie die Zeit genommen zu analysieren, was die Angreifer eigentlich versuchen; dieser Artikel füllt viele Lücken.
Die merkwürdigen Dinge in
/var/log/auth.logauf die gleiche Weise zu analysieren, wäre ebenfalls gut.Der gesamte Code ist Open Source und es gibt keinen serverseitigen Zustand, daher ist es seltsam, dass ein Angreifer ausgerechnet mich ins Visier nehmen sollte. Das Beste, was er bekommen könnte, wäre Root-Zugriff auf einen 5-Dollar-im-Monat-VPS und eine vorübergehende Verunstaltung einer Domain, die niemand besucht.
Wenn man die drei bekanntesten Ports öffnet, kommen Verbindungen herein; sie wissen weder, was du betreibst, noch interessiert es sie.
Auch das Hosten von Malware oder das Ausführen eines Kryptowährungs-Miners ist möglich.
Mein ISP ändert die IP tatsächlich kaum, und wenn sie sich ändert, kann ich mich im Web-Admin-Panel des Hosters anmelden und die Regel aktualisieren.
Auf jedem Server lasse ich unbedingt fail2ban laufen und füge auch eigene Jails hinzu, um Angriffe abzufangen, die auf die Art der jeweils exponierten Site-Funktionalität zugeschnitten sind.
Allerdings habe ich schon lange nicht mehr geprüft, ob die anderen Standardwerte von fail2ban noch ausreichen, um gängige Angriffe zu blockieren. Ich sollte diesen Link für später bookmarken.
Ich prüfe ebenfalls die Access-Logs meiner selbst gehosteten Dienste, und in dieser Analyse fehlt ein Detail, das deutlich auffällt.
Ein großer Teil der bösartigen Requests stammt von ganz normalen Leuten, die Security-Scanner ausführen, die man leicht auf GitHub oder anderswo findet. Meist sind das keine ausgefeilten Angriffe; Instanzen solcher Projekte hämmern auf Server ein, ohne sich überhaupt die Antworten anzusehen oder darauf zu achten, ob sie gedrosselt wurden.
Manche Angriffe zielen nicht direkt auf IPs, sondern überwachen Domains und Subdomains und wiederholen regelmäßig denselben Scan aus demselben IP-Bereich.
Bei einem früheren Arbeitgeber kamen ständig wiederholte Scans von einer einzelnen statischen IP aus der Türkei; das Team begann, sie „den Türken“ zu nennen, und bei seltsamen Request-Mustern gehörte es zur Incident Response, zuerst zu prüfen, ob diese Person gerade unseren Dienst anfasst.
Wenn man solche Logs bei AWS sieht, sollte man bitte AWS WAF vor die VPC setzen.
Das ist nicht teuer und hilft in solchen Situationen ziemlich gut dabei, viele Kopfschmerzen zu reduzieren. Selbst wenn es nicht alles blockiert, was bis zum Service durchkommt, kann es eine große Hilfe sein.
Einige überaktive Regeln haben Teile der App unauffällig kaputtgemacht.
Es gab eine Request-Body-Regel, die Anfragen blockierte, wenn der Request-Body
"localhost"enthielt, und auch eine Regel, die Requests ohne User-Agent-Header blockierte. Da wir vorher für API-Requests keinen User-Agent verlangt hatten, hat das für einige Nutzer die gesamte API kaputtgemacht, bis wir die Ursache gefunden hatten.Man muss wissen, was blockiert wird, und es zuerst validieren; sonst verliert man in manchen Fällen Kunden.
Sie vermittelt ein trügerisches Sicherheitsgefühl, obwohl sie leicht umgangen werden kann, verursacht erhebliche Performance-Kosten und hat ein beträchtliches Risiko, legitimen Traffic zu blockieren: https://www.macchaffee.com/blog/2023/wafs/
Zum Beispiel erforschen Forschende an unserer Universität Twitter-Daten, und weil sie Links aus einer kleinen zufälligen Stichprobe von Tweets folgen, werden die IPs der Universität von den meisten WAFs blockiert.
Manchmal kommt mir der Gedanke, dass es lustig wäre, einen Express-Server zu bauen, der auf einen dieser Angriffe korrekt reagiert und damit jemandes Zeit verschwendet
Aber dadurch würde ich auch meine eigene Zeit verschwenden
[1] https://infosec.exchange/@gnyman/109318464878274206
[2] https://nyman.re/super-simple-ssh-tarpit/