Hallo und willkommen zurück! Da ihr über meine Umfrage auf Twitter ein weiteres Tutorial bzw. einen weiteren Beitrag zu dem Thema Phishing/Inventory Scam „gefordert“ habt, erfülle ich euch diesem Wunsch.

Heute geht es um Phishing durch Web Scraping. Ich weise darauf hin, dass ich keinerlei kriminelle Aktivitäten dulde, unterstütze oder fördere. Das hier soll nur eine Demonstration sein.

Was ist Web Scraping?

google scraping

Beim Web Scraping werden Daten von Webseiten extrahiert, um diese nutzbar zu machen. Das können unter anderem E-Mail-Adressen, Telefonnummern oder ähnliches sein. Eines der besten Beispiele für Web Scraping ist Google selbst.

Ich habe mal in der Google Suchleiste nach „Wetter“ gesucht und siehe da, Google zeigt mir direkt das Wetter in meinem Stadtteil in Magdeburg an. Wenn man genauer hinsieht, bemerkt man den kleinen Hinweis, dass diese Daten von weather.com bereitgestellt wurden. Das Gleiche macht Google zum Beispiel mit der Bundesliga Tabelle oder mit Hotelzimmerverfügbarkeiten.

Die Theorie

Im letzten Beitrag zu dem Thema Phishing, haben wir einen falschen Steam Login gebaut. Heute möchte ich nicht nur einen falschen Login bauen, sondern eine komplette Website kopieren. In diesem Beitrag zeige ich euch erstmal nur, wie einfach so etwas ist. Sollte euch der Beitrag gefallen, werde ich dieses Script mit Sicherheit in einem weiteren Beitrag erweitern und einen kompletten Login mit einbauen.

Kopieren möchte ich diesmal die 99Damage Website. Die 99Damage besitzt keine 2FA Authentication, sodass jeder beliebige Nutzer sich einloggen kann, sofern er den richtigen Benutzernamen und das richtige Passwort hat. Genug Theorie würde ich sagen, kommen wir zur Praxis!

Die Praxis

Wir legen uns erst einmal eine Datei an, welche wir index.php nennen. Unser Script ist wirklich extrem einfach und simpel gehalten. Wir nutzen die file_get_contents() Funktion, um unser Script zu realisieren. Auf die Idee dazu bin ich gekommen, weil ich gerade an einem WordPress-Plugin arbeite und diese Funktion dort nutze.

Überlegen wir mal kurz welche Seite sich lohnt zu kopieren. Ich denke in unserem Fall macht das keinen großen Unterschied, da ein Login auf jeder Seite der Website eingebaut ist. Ich entscheide mich mal für die Seite der Division 1. Dann öffnen wir mal unseren PHP Code und speichern unsere file_get_contents() Funktion in einer Variable ab.

<?php
   $html99damage = file_get_contents('https://liga.99damage.de/de/leagues/99dmg/2024-saison-17/group/526-gruppenphase/1167-division-1');
?>

Wenn wir uns das jetzt in unserem Browser angucken, sehen wir, dass wir folgende Fehlermeldung bekommen: „file_get_contents([…]) failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in […]„! Wir stellen also fest, dass die Anfrage fehlgeschlagen ist, weil sie „verboten“ ist. Wie kommt das?

Man könnte davon ausgehen, dass eine Konfiguration am Server diese Art von Verbindung bei einem Script unterdrückt, um genau so etwas zu verhindern. Ebenfalls könnte man annehmen, dass überprüft wird, ob ein Bot oder ein Mensch zugreift.

Ich finde die letzte Erklärung passend. Was macht uns als Mensch aus? Das Zauberwort heißt User-Agent. Ein User-Agent ist im Prinzip nichts anderes, als dein Browser. Wenn dich das Thema mehr interessiert, habe ich dir hier mal einen Artikel verlinkt.

Ich muss nun also vortäuschen, ein Mensch zu sein. Also muss ich irgendwie versuchen, einen User-Agent mit in meine HTTP Anfrage einzubauen. Vorher muss ich aber erstmal einen aktuellen User-Agent auslesen. Dafür gehe ich zum Beispiel auf die Website whatismybrowser.com und speichere mir den dort ausgegebenen String ab.

Wie bekomme ich meinen User-Agent nun in meine Anfrage eingebaut? Die Lösung dafür ist wirklich einfach. Das Besondere an der file_get_contents() Funktion ist der Parameter „context„. Über diesen kann man die stream_context_create() Funktion ansprechen. In dieser Funktion können weitere Werte, wie zum Beispiel der User-Agent gespeichert werden. Am einfachsten macht man das mit einem Array.

Erweitern wir nun unser eigentliches Script und fügen gleichzeitig stream_context_create() mit einem Array ein.

<?php
   $bypassFileGetContentsError = stream_context_create(
      array(
         "http" => array(
            "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36"
         )
      )
   );
   
   $html99damage = file_get_contents('https://liga.99damage.de/de/leagues/99dmg/2024-saison-17/group/526-gruppenphase/1167-division-1', false, $bypassFileGetContentsError);
?>

Laden wir nun unsere Seite neu und siehe da! Eine leere weiße Seite oder anders gesagt, keine Fehlermeldung mehr! Dementsprechend haben wir das Hindernis umgangen. Versuchen wir mit echo mal die Ausgabe der Website zu erzwingen.

<?php
   $bypassFileGetContentsError = stream_context_create(
      array(
         "http" => array(
            "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36"
         )
      )
   );
   
   $html99damage = file_get_contents('https://liga.99damage.de/de/leagues/99dmg/2024-saison-17/group/526-gruppenphase/1167-division-1', false, $bypassFileGetContentsError);

   echo $html99damage;
?>

Wie wir sehen, waren wir erfolgreich! Die komplette 99Damage Website erstrahlt in ihrem Glanz auf unserem Server. Sämtliche Bilder, Links Tabellen funktionieren. Eine perfekte 1 zu 1 Kopie der Website.

Sofern man keine Interaktionen mit dem Userlogin oder ähnliches versucht, ist die Kopie anhand der eigentlichen Website unmöglich zu bemerken. Was man mit dieser Methode aber unmöglich kopieren kann, sind private Informationen in der Datenbank (Passwörter oder ähnliches) und PHP Scripts.

99damage scraping

Was könnten wir damit jetzt theoretisch machen?

Die Möglichkeiten sind praktisch unbegrenzt. Da dies ja eine Phishing Website sein soll, könnte man jetzt zum Beispiel nach bestimmten Codebereichen wie dem Login Bereich suchen, den Code dort verändern und wiederum einen gefälschten Login einbauen.

Fazit

Ihr habt nun gesehen, dass eine exakte 1 zu 1 Kopie in nur 14 Codezeilen möglich ist. Klar, wenn man die Website noch verändern möchte, also zum Beispiel einen gefälschten Login einbauen, dann bedeutet das noch einiges an Arbeit, aber ihr wisst, was ich meine 🙂 ! Ich hoffe euch hat dieser Beitrag gefallen, bis zum nächsten Mal. Maurice!

Möchtest du immer aktuell bleiben und automatisch über neue Beiträge informiert werden? Dann melde dich doch für meinen kostenfreien Newsletter an!

DSGVO (Pflichtfeld) *