Vorgeschichte:
In LabyMod gibt es sogenannte Daily Coins. Irgendwie wollte ich diese einfach haben, zudem hatte ich nicht viel zu tun. Also erst mal geschaut wie das funktioniert: Jeden Tag muss man Minecraft starten und sich im LabyMod Dashboard anmelden. Dort muss man auf den Button “Abholen” klicken und schon hat man 5 Coins mehr (5 sind nicht viel, Umgerechnet sind 1000 Coins 1€). Nach gewissen “login streaks” (10 Tage, 30, 100, …) bekommt man einen Boni. Um ehrlich zu sein, bin ich viel zu faul mich jeden Tag anzumelden und auf diesen Button zu drücken, außerdem vergesse ich das oft:). Also ging das weiter zum Bot:
Der Bot (und der Begin)
Los gegangen ist es mit Wireshark: Erst mal alle Pakete von und zu LabyMod gesnifft. Dort ist mir gleich aufgefallen, dass unverschlüsselte Verbindungen gesendet werden (mehr dazu später). Den Bot habe ich letztendlich geschrieben, in dem mir JD-GUI geholfen hat LabyMod zu dekompilieren und dann alles von net.labymod.labyconnect zu kopieren. Jetzt alles von der GUI raus und den References zu den anderen Klassen, Debug Output, eigentlich schon fertig. Jetzt nur noch einen Timer um 4 Uhr morgens und bei Mojang automatisch anmelden. Done. 2 Anmerkungen: 1. Ich würde liebend gerne den Bot Open Source zur Verfügung stellen, darf das allerdings nicht, da ich LabyMod nicht um Erlaubnis gebeten habe und nicht beten werde (ca. 90% des Codes stammt von LabyMod). 2. Der Bot ist nicht im Fokus dieses Blogsartikels und wird deswegen auch nicht groß erwähnt.
Die ersten Lücken
Wireshark: Ein sehr wichtiges Tool. Sofort sind bei mir die Alarmglocken auf rot gewesen, als dort der Updater an dl.labymod.net angefragt hat nach einem Download. http wird nicht verschlüsselt und nicht signiert. Das heißt: Jeder Hacker, der eine Man in the Middle Attacke macht (Ist nicht sehr schwer), kann diese Daten manipulieren, ein fake Update an den Client schicken. Der Hacker kann jedes x beliebige Java Programm (naja fast zumindest) schicken: Easy Remote Code Execution.
Zusätzlich habe ich auch gesehen, dass Cape Daten, … auch geschickt werden (nicht weiter schlimm, geht aber trotzdem niemanden an, was für Daten ein Client abfragt).
Schnell ein Issue auf LabyMod eröffnet und weiter gemacht (Zusätzlich habe ich eine Email geschickt um darauf speziell aufmerksam zu machen).
Was mich dann richtig aus der Fassung gebracht hat, war, dass die Socketverbindung unverschlüsselt ist! D.h. Ein Hacker kann ALLE Chatnachrichten lesen, den Client auf fremde Server schicken (Danke LabyParty), sich auf das Dashboard anmelden (Danke an das QuickLogin Zeug im Client), Freundschaften beenden, annehmen, …
Da schon eine Antwort in der zwischen Zeit da war (Zitat: Wenn es wichtig wäre, hätte LabyMod das ja gemacht,…) habe ich die Situation klargestellt und auf die nächsten Lücken aufmerksam gemacht. Ich habe noch eine 2. Antwort geschickt, die ich im nachhinein gelöscht habe: Mir war nicht klar, wie die Authentifizierung läuft und habe behauptet, dass es keine gäbe und man damit keine mitm Attacke machen müsse: Aber Achtung: Fake News von mir!
LabyMod Version 3.6.7
Changelog: “Fixed some important security issues”. So: Ich muss sagen: Fake news! Das einzige was behoben wurde ist (ein kleiner Schritt und immer noch viel zu wenig) die Remote Code Execution im LabyMod Client. Der Updater (der, der zum Updaten ausgeführt wird) fragt immer noch bei dl.labymod.net nach…Unverschlüsselt! Absolut unnötig dieses Update! Allerdings wurde mein Issue schon als erledigt markiert. Das Issue ist als privat markiert.
LabyMod Version 3.6.8
Im Changelog steht nichts brauchbares (zumindest für mich), allerdings hat LabyStudio auf mein Issue geantwortet und behauptet, dass jetzt alles gefixt wurde und sich bedankt für meine Hilfe. Ob das stimmt, lässt sich sehr schnell herausfinden und: Ja, die Remote Code Execution wurde gefixt (jetzt sendet auch der Updater die Anfragen verschlüsselt). Optifine schickt noch unverschlüsselt, Forge auch (OptiFine issue, Forge issue). LabyMod schickt immer noch eine Anfrage unverschlüsselt: disabled_addons.json: Diese Datei enthält eine Liste (sieht gehasht aus, habe aber aktuell keine Zeit, das heraus zu finden) von gebannten LabyMod Addons. Wenn ein Addon gebannt ist, löscht der Client dieses Addon (ich glaube sogar mit Configs). D.h. Wir können bei LabyMod Usern Addons löschen. Wie cool:)
Zusätzlich ist das Protokoll immer noch nicht verschlüsselt und der Changelog ist fehlerhaft.
kleines Update: Die Anfrage wurde anscheinend gefixt, es ist nicht mehr möglich. Komisch, dass ich eine solche Anfrage mitschneiden konnte. Auch wird das Protokoll teilweise verschlüsselt: Es wird ein symmetrischer Schlüssel von LabyMod verwendet und die Signatur vom originalen Server wird nicht überprüft. Die Verschlüsselung startet nach der Authentifizierung, was ich für falsch halte. Die Verbindung sollte vom Anfang an per RSA verschlüsselt sein.
Temporärer Fix
Da ich nicht ganz lebensmüde bin und einen simplen eigenen Fix wollte: Einfach diese Zeile in die Hosts Datei eintragen (Unter Linux: /etc/hosts; Unter Windows: C:\Windows\System32\drivers\etc\hosts):
0.0.0.0 dl.labymod.net mod.labymod.net
Das originale Issue
…ist hier zu finden: labymod.net. Im Falle, dass LabyMod das Issue löscht (Update: Ist mittlerweile passiert), hier ein Link von web.archive.org.
Die Lösung
- LabyMod muss das unverschlüsselte Protokoll auf mod.labymod.net:30336 sofort einstellen
Die Clients müssen “gezwangs” updatet werden- dl.labymod.net darf nicht mehr auf http Requests antworten
- Der Client und der Updater, … müssen von Haus aus nur noch an https schicken
- Das Socket Protokoll muss mit RSA verschlüsselt und signiert werden
Updates
Updates werde ich hier jederzeit hineinschreiben. Auch werde ich jedes neue Update von LabyMod umgehend testen und weiter meinen Senf dazugeben.
Ich werde den Blog weiter updaten, aber jetzt reicht es erst mal mit Frust und Wut.