SQL-Injection analysiert

Am 4. Februar 2013 wurde die Internetseite der Kirchengemeinde „erfolgreich“ angegriffen wurde. Die angegriffene Internetseite basierte auf einem selbst programmierten Content Management System (CMS) und nutzt neben PHP auch eine MySQL Datenbank. Dieser Beitrag informiert über die Methoden und Hintergründe dieser Attacke.

In diesem Beitrag werden einige Internetadressen, die ich während der Recherche aufgedeckt habe, ganz oder teilweise anonymisiert dargestellt. Bei den anonymisierte Adressen sind nur der erste und der letzte Buchstabe dargestellt. Dazwischen sind immer drei Unterstriche um die Läge zu verschleiern. Hier ein Beispiel für www.google.de: www.g___e.de

Der oder die Angreifer bezeichneten sich als K3___K und haben die Seite verändert und Daten gestohlen. Zu unserem Glück wurde die Seite nicht gelöscht oder Zugangsdaten geändert, aber dennoch hat die Schadensbeseitigung mehrere Stunden in Anspruch genommen.

Ich bezeichne den Angriff als „erfolgreich“, da ich nach der Analyse der Logfiles feststellen muss, dass dauernd Angriffsversuche auf diese und auch andere Internetseiten gibt. Nicht jeder Angriffsversuch ist erfolgreich.

Veränderungen

Ab wann die Internetseite verändert wurde kann ich nicht sagen. In diesem Anschnitt beschreibe ich die „sichtbaren“ Änderungen. Unsichtbare Änderungen können nie ausgeschlossen werden oder wurden bislang nicht entdeckt.

Optik

SQL-Injection_Vorher-Nachher

Veränderungen nach dem Angriff

Die offensichtlichsten Änderungen fand in zwei Schritten statt. Zunächst wurde nur die Optik der Seite geändert und eine „Botschaft“ in die Fußzeile eingebaut.

Das dunkle Hintergrundbild stammt nicht vom Server der angegriffenen Internetseite sondern von einem anderen Server. Leider habe ich die URL nicht notiert, aber im Google Cache vom 04. Februar 2013 konnte man erkennen woher das Bild stammt: https://now-here-this.timeout.com/wp-content/uploads/2012/12/url-71.gif.

Weiterleitung

Einen Tag nach der Änderung vom Hintergrundbild wurde eine weitere Änderung vorgenommen oder aktiviert. Der Besucher wurde nach wenigen Sekunden auf eine andere Internetseite umgeleitet. Die Weiterleitung zu der anderen, externen, Internetseite wurde durch eine HTML Anweisung in der Fußzeile erreicht:

Der auf diese Weise weitergeleitete Besucher sah auf der externen Internetseite ein unscharfes Bild wie aus einer WebCam. Es war jedoch keine Live WebCam, sondern nur eine statische Grafik welche dem Besucher Hoffnung auf „Amanda“ machte ;-)

Die Internetseite s___l.seite.com war über IP-Adresse 88.198.21.241 erreichbar. Die Seite ist eine so genannte Subdomain von https://seite.com, ein kostenloser WebHoster. Ich habe bei https://seite.com den Missbrauch gemeldet. Wenige Tage später war diese Seite nicht mehr erreichbar. Ob es an meiner Meldung gelegen hat, kann ich nicht sagen.

Ab nun kann man den Besucher getrost als Opfer bezeichnen, denn der einzige Zweck der externen Seite war die Ausführung eines Java Applets:

Das Applet wird bei „sicheren“ Internetbrowsern nicht automatisch ausgeführt sondern der Browser erwartet eine Bestätigung vom Benutzer. Die in dem Skript angegebene Datei (kil.exe) enthält vermutlich ein Virus oder einen Trojaner! Siehe auch google.com.

Auch hier tauchte wieder ein kostenloser und nutzloser Service auf einem Server der Hetzner Online AG auf. Gleiche Aufmachung, gleicher Zweck. Auch diese Subdomain ist mittlerweile nicht mehr erreichbar…

Upload

Aber es gab noch eine Veränderung: Der Angreifer hat eine Textdatei in das Upload-Verzeichnis der angegriffenen Internetseite hoch geladen. Der Dateiupload dient normalerweise den Autoren um für Artikel ein paar Bilder oder pdf-Dateien zu Server zu kopieren.

Die vom Angreifer hochgeladene Textdatei enthielt alle Benutzernamen und die verschlüsselten Kennwörter der angegriffenen Internetseite. Der Angreifer hat diese Zugangsdaten zu dem Content Management System (CMS) zuvor aus der Datenbank ausgelesen:

Die Kennwörter werden nicht im Klartext sondern mit der MD5-Verschlüsselung gespeichert. Wie bei vielen anderen CMS Systemen wird das vom Autor eigegebene Kennwort ebenfalls MD5-verschlüsselt. Wenn der MD5-Schlüssel mit dem gespeicherten MD5-Schlüssel übereinstimmt, wird der Autor für die Seite frei geschaltet.

Die MD5-Verschlüsselung erzeugt aus einem beliebigen Text einen 32 Zeichen langen Code. Dieser Code wird auch als Hashwert bezeichnet, da der Verschlüsselungsprozess nicht umkehrbar ist. Man kann also nicht aus dem Code das Kennwort errechnen. Man kann aber durch andere Methoden wie Brute-Force das Kennwort „erraten“. Mittlerweile kann man die meisten „schlechten“ Kennwörter online entschlüsseln! Schlechte Kennwörter sind einfache Kennwörter wie 123456, geheim, abcdef, sonne, mond, sterne. „Gute“ Kennwörter lassen sich nicht entschlüsseln…

Analyse

Bei der Analyse helfen einem die so genannten Logfiles. Die angegriffene Internetseite ist bei https://www.strato.de gespeichert. Strato bietet verschiedene Logfiles und Statistiken:

Error-Log 
PHP Fehlermeldungen
Access-Log 
Zugriffsprotokoll
Statistik 
Zugriffsstatistik (Pageview, Hits, Files, Transfer…)

Denial of Service

SQL-Injection_Pageviews

Denial of Service

Wenn man durch Überlastung einen Service zu schwächen oder zu stören versucht, so nennt man das auch ein DoS-Angriff. Wenn dieser Angriff auch noch von verschiedenen Quellen gestartet wird, so nennt man das einen Distributed-DoS oder auch DDoS-Angriff.

Das nebenstehende Bild zeigt, dass die Anzahl der abgerufenen Dateien mehrmals sprunghaft angestiegen ist.
Zu diesen Zeiten wurden z.B. DoS-Angriffe auf die WordPress Anmeldeseite vom Familienzentrum ausgeführt. Am 17.01.2013 in der Zeit von 00:40:00 bis 01:31:41 Uhr (ca 52 Minuten) wurde ca 4700 mal versucht die Seite zu knacken. Das sind immerhin 1,5 Login Versuche pro Sekunde:

Am 05.02. in der Zeit von 18:35:11 bis 18:53:43 (1112 Sekunden) wurde ca 8590 mal von einer einzigen IP-Addresse auf die Seite der Kirchengemeinde und dem Familienzentrum zugegriffen. Das sind ca 7,7 Anfragen pro Sekunde. Dabei wurden verschieden Angriffe ausgeführt.

Scanning SQL-Injections

Moderne Internetseiten arbeiten mit Datenbanken um die Artikel und die Einstellungen der Internetseite zu speichern. Content Management Systeme (CMS) wie Joomla!, WordPress oder MediaWiki nutzen meistens MySQL Datenbanken. Eine SQL-Injection bezeichnet die „unkontrollierte“ bzw. böswillige Ausführung von SQL-Befehlen. Das ist möglich, wenn die PHP-Skripte der Internetseite die HTML Befehle (HTTP GET oder HTTP POST) ungefiltert ausführen. Dabei wird eine MySQL Befehlssequenz als Parateter übergeben.

Die folgenden HTML Codes auf ein bestimmtes PHP-Skript wurde innerhalb von ca 30 Minuten ca.1500 mal ausgeführt:

Wenn man die ASCII Zeichen wie %20 und die anderen HEX-Zahlen wie 0x27 übersetzt und interpretiert, erhält man die injezierte MySQL Befehlskette:

Siehe auch: https://stackoverflow.com/questions/4600954/site-has-been-hacked-via-sql-injection

Viele weitere SQLI-angreifbare Seiten

Im PHP-Error-Log war zu erkennen, dass das Scanning auf SQLI-Schwachstellen kein Zufall war, sondern der oder die Angreifer passende Infos aus Internet erhalten haben:

05.02.2013 18:35:11 h___z.info [client 95.141.28.51] PHP Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /m___e/u___r.php on line 109, referer: https://pastebin.com/G___W

SQL-Injection_Pastebin

Pastebin, ein weiter Tummelplatz für Hacker

Die o.g. IP-Adresse 95.141.28.51 war also zunächst auf https://pastebin.com/G___W und hat nach 44 Sekunden begonnen die Internetseite mit SQL Injections zu knacken. Auf https://pastebin.com/G___W ist neben 5000 weiteren URL unter anderem die bereits erwähnte Schwachstelle unserer Internetseite aufgeführt. Ich habe mal nach de-Domains gefiltert und in dieser Datei alleine 480 URLs gefunden!

Wenn man bei https://pastebin.com die Suchfunktion nutzt, findet man auch andere angreifbare Seiten. Nicht jeder der dort veröffentlichten URLs sind angreifbar da sorgsame Administratoren ihre Seiten immer auf dem aktuellen Softwarestand halten. Aber ein Blick auf die „Gegner“ hilft immer. Mehr Infos unter: https://de.wikipedia.org/wiki/Pastebin

Scanning mit Netsparker

Wer seine Internetseite auf Schwachstellen „testen“ möchte, kann sich das Programm Netsparker herunter laden und brauch nur noch die „Opfer-URL“ eingeben. Netsparker hat eine breite Palette von typischen Angriffsmethoden parat und malträtiert die angegebene URL mit Anfragen. Falls die Internetseite antwortet bietet Netcrafter weitere Methoden zum Angriff an:

Im obigen Beispiel wurden einige Standardskripte angefragt. Die Quell-IP (95.141.29.44) gehört laut https://www.utrace.de/whois/95.141.29.44 zu Kaia Global Networks Ltd..

Kostenloser Webhoster

Jede Internetseite muss irgendwo auf einem Server gespeichert und mit dem Datennetz des Internets verbunden sein. Normalerweise erhält man bei seinem Internetprovider als Privatkunde eine freie Internetseite die man z.B. als „elektronische Visitenkarte“ nutzen kann. Für etwas aufwendigere Seiten zahlt man so zwischen 5 und 10€ pro Monat. Für den Angriff auf unsere Internetseite wurden die zwei Kostenlose WebHoster genutzt:

Beide Seiten gehören zur QE GmbH & Co. KG, Martinistraße 3, D-49080 Osnabrück. Bei den beiden Diensten erhält man nach Registrierung 10 GB kostenlosen Speicherplatz für Internetseiten oder Schadsoftware.

Am 15.02.2013 habe ich bei seite.com nach der Registrierungsdetails (Name…) der beiden Subdomains gefragt, um weitere Details für die Strafverfolgung zu erhalten:

Die für den Angriff benutzten Seiten wurden kurz nach dem Angriff gesperrt. Man kann diese Subdomains jedoch nicht neu registrieren da sie angeblich bei site.com noch registriert sind. Leider habe ich keine Antwort erhalten…

Gegenmaßnahmen

Die effektivste Gegenmaßnahme wäre das Abschalten der Internetseite;-) Bevor jedoch weiterer Schaden an der Opferseite oder den Besuchern deiner geknackten Internetseite entsteht, kann man die Seite vorübergehend offline nehmen.

Zugangsdaten ändern

Der Angreifer hat es oft auf die Zugangsdaten (Benutzername und Kennwort) abgesehen, um die Seite in aller Ruhe, still und heimlich, für andere Zwecke zu nutzen. Diese Zugangsdaten werden unter den Angreifern in windeseile weitergegeben. Es ist also wichtig dass alle Zugangsdaten geändert werden. Wenn möglich sogar die Benutzernamen! Dazu gehören meistens:

  • Administratorzugang beim Webhoster
  • Kennwörter der MySQL-Datenbanken
  • Kennwörter von FTP-Zugängen
  • Zugangsdaten vom CMS-Administrator (Benutzername und Kennwort!)
  • Zugangsdaten der CMS-Autoren

Leider wird der letzte Punkt oft unterschätzt. Wenn eine Seite auf einem CMS-System wie WordPress oder Joomla! basiert, ist der CMS-Administrator oft froh, dass die Autoren die Seite bedienen können. Wenn man die Autoren nun auch noch mit regelmäßigen Kennwortänderungen ärgert kippt evtl. die Stimmung ;-) Dabei sind individuelle Benutzernamen und „gute“ Kennwörter sehr wichtig.

Temporäre Umleitung der Domain

Der Webhoster bietet i.d.R. eine Umleitungsfunktion an. So kann die komplette Domain oder auch einzelne Subdomains auf eine „Baustellenseite“ umgeleitet werden. Der Besucher und die unzähligen Angreifer sehen dann die Baustellenseite und du kannst in Ruhe den entstandenen Schaden beseitigen. Denkt zur Beweissicherung an die Screenshots! Voraussetzung ist natürlich, dass dein Account beim Webhoster noch funktioniert und du dort andere Zugangsdaten als auf der geknackten Internetseite nutzt.

Daten sichern

Falls Sie nicht bereits regelmäßig die Daten ihrer Internetseite sichern so sollten Sie es jetzt tun. Bei einem CMS-basierten System sichern Sie die die Programmdateien und die Bild- bzw. Mediadateien. Dann sichern Sie die MySQL-Datenbank. Da Sie nicht ausschließen können das der Angreifen die Daten bereits verändert oder infiziert haben, kopieren die die Sicherungsdateien zunächst in einem separaten Ordner und nicht dort wo sich bereits die anderen Sicherungen befinden. Neben der Sicherung von Datenbanken, Bildern und CMS-Skripte sollten sie auch die Zugriffsprotokolle von ihrem Webhoster sichert oder anfordern, denn die Polizei benötigt die Daten um beim Webhoster die detaillierten Daten abzufragen.

Logfiles sichern

Jeder Webhoster protokolliert di Zugriffe auf die Internetseiten seiner Kunden. Einige Webhoster halten die Daten nur 7 Tage vor, andere bis zu 6 Wochen. Zum Glück sichert Strato die die Logfiles 6 Wochen. Siehe auch https://www.strato-faq.de/artikel.html?articleid=718Leider anonymisiert Strato die IP-Adressen

Die ersten 9 Bit der IP-Adresse des Eintrags werden in einen Hash-Wert umgewandelt. So könnte aus der IP-Adresse 123.123.123.123 die „anonyme“ IP-Adresse 123.123.122.243 werden. Eine anonymisierte IP-Adresse behält maximal 24 Stunden ihre Gültigkeit. Danach würde aus derselben Ausgangs-IP-Adresse eine andere „anonyme“ IP-Adresse werden.

Beispiele
Original: ascend-tk-p66.rhrz.uni-berlin.de
Anonym: anon-123-123-122-243.uni-berlin.de
Original: 123.456.789.001
Anonym: anon-123-456-165-41.invalid

Andere Webhoster wie Canhost anonymisieren die Logfiles nicht. Ich habe dazu meine WAN-IP Adresse am DSL-Router mit dem Logfile vom Webhoster verglichen:

Passt: Meine temporäre WAN-IP Adresse (87.143.123.56) taucht im Logfile vom Webhoster auf. Bei einer Strafverfolgung muss die Polizei also nicht erst den Webhoster fragen sondern kann mit den IP-Adresse direkt an den Internet Serviceprovider heran treten.

Schwachstellen beseitigen

Die Schwachstelle unserer Seite steckte in einem PHP Skript. Dieses Skript erwartet vom Benutzer Angaben und wertet diese Angaben aus. Dabei wurde leider nicht die Integrität der Angaben geprüft. Es wurde also keine Typprüfung vorgenommen und so wurden alle Angaben akzeptiert und weiter verwertet. Wenn diese Angaben nun „böswillig“ sind und statt eines Datums (z.B. skript.php?date='04.02.2013') eine MySQL Anweisung (z.B. skript.php?date='999999.9%27%20union%20all%20select%20%28select%20concat'...) enthält, so könnte die Datenbank ausgelesen werden. Diese Schwachstellen gilt es zu finden und zu beseitigen. Falls notwendig kann man das komplette Skript löschen oder durch ein Apache Zugriffsschutz (.htaccess) schützen.

Login Skript schützen

Ein CMS wäre kein CMS wenn sich die Autoren nicht an der Internetseite anmelden könnten. Bei WordPress heißt dieses Anmeldeskript wp-login.php und es ist für Hacker sehr interessant. Bei unseren Internetseiten wird ständig das wp-login.php angefragt, entweder als HTML GET oder HTML POST. Im Durchschnitt werde 3 % der Anmeldeversuch von Hackern ausgeführt. Im Falle einer DoS-Attacke fast 100%. Daher sollte man die Anmeldung für Autoren doppelt schützen. Erstens durch einen Dateischutz mit .htaccess und zweites durch sichere Kennwörter bei der eigentlichen Anmeldung. Der Autor muss sich also zwei Accounts merken. Erstens den Account für den Dateischutz und zweitens ein CMS-Account. Hier ein Beispiel für WordPress. Die Platzhalter samt den [eckigen] Klammern müssen natürlich durch sinnvolle Angaben ersetzt werden:

Die Datei .htuser enthält die Zugangsdaten für den Dateischutz und sieht z.B. so aus:

Das Kennwort können Sie online generieren. Bei Linux Webservern wird meistens die DES-Verschlüsselung verwendet.

WordPress sichern

WordPress ist das populärste CMS und da es so häufig eingesetzt wird versucht sich die Hackergemeinde auch zunächst an diesem System. Die Wahrscheinlichkeit eine veraltete WordPress Installation zu finden ist sehr hoch.

Strafanzeige stellen

Für uns ist es selbstverständlich bei der Polizei einen Einbruch oder Diebstahl zu melden. Ein Einbruch ist dabei das unbefugte Eindringen in die Wohnung. Der Einbrecher sucht rund um das Haus eine Schwachstelle die er ausnutzen kann und verschafft sich so Zugang zu der Wohnung. Ob die Schwachstelle nun ein schlecht gesichertes Kellerfenster oder die Trassentür ist, ist bei der Bewertung der Straftat uninteressant. Meistens ist mit dem Einbruch auch ein Diebstahl verbunden. Warum sollte man also bei einem Hackerangriff andere Maßstäbe setzten? Auch hier hat sich der Angreifer unbefugt, also ohne meine Erlaubnis, Zugang zu den Daten meiner Internetseite verschafft. Die Fingerabdrücke liegen in Form von Zugangsprotokollen etc vor. Über die E-Mail Adresse Ihre zuständigen Polizei können Sie online Hinweise oder Strafanzeigen stellen:

Wenn man den Angriff verfolgen möchte, so muss man ein paar Formulare ausfüllen und an die Polizei faxen. Auf dieser Grundlage kann die Polizei dann beim Webhoster die originalen, also nicht anonymisierten, Zugriffsprotokolle anfordern. Diese Anforderung läuft per Fax oder auf dem Postweg da es sich ja um ein Strafverfahren handelt. Ich habe also der Polizei die maßgeblichen Zeilen aus dem 91 MB großen und anonymisierten Logfile heraus kopiert und als PDF Datei zur Verfügung gestellt.

Zusammenfassung

Beweise sichern
Natürlich ist eine gehackte Seite nicht schön, aber Sie sollten zunächst möglichst viele Beweise sichern, bevor sie die Seite wieder reparieren. Dazu gehören Screenshots, HTML-Quelltexte, Wireshark-Traces, Error-Log, Access-Log, Datenbank, HTML & PHP Dateien usw. Wenn Sie auf Nummer Sicher gehen wollen, holen Sie sich einen Zeugen vor dem Rechner.
Über SQL-Injections an die Kennwörter
Der Angreifer hat zunächst über SQL-Injections die Zugangsdaten ausspioniert und dann ein „schwaches“ Kennwort genutzt und sich im Autorenbereich angemeldet.
Der Angreifer spricht deutsch
Die Internetseite ist komplett in deutscher Sprache programmiert. Der Angreifer hat sich Zugang zu den Administratorseiten verschafft, konnte sich dort orientieren und hat in der hoch geladenen Kennwortliste die Bezeichnung „Benutzername“ genutzt. Außerdem hat K3___K eine Weiterleitung auf eine deutsche Seite mit deutschem Inhalt eingebaut.
Der Angreifer hat es gut mit uns gemeint
Warum hat er nicht den Inhalt der Datenbank gelöscht sondern nur hier und da ein wenig verändert?
Die Internetseite hat Schwachstellen
Die Seite wurde im Herbst 2004 programmiert und läuft seit dem ohne große Probleme. Nun aber wurden einige Schwachstellen offenkundig. So ist nicht auszuschließen dass SQL-Injections auch an anderen Stellen erfolgreich sind. Auch die MD5-Verschlüsselung der Kennwörter ist obsolet.
Veröffentlicht in Internet Getagged mit: , , ,

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*