1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Downloads
  4. Galerie
    1. Alben
  5. Toolbox
    1. Passwort Generator
    2. Portchecker
  6. Mitglieder
    1. Mitgliedersuche
    2. Benutzer online
    3. Trophäen
    4. Team
Fr: 16 Mai 2025
  • Anmelden oder registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Forum
  • Dateien
  • Seiten
  • Bilder
  • Erweiterte Suche

Schön, dass du den Weg zu NodeZone.net gefunden hast! Aktuell bist du nicht angemeldet und kannst deshalb nur eingeschränkt auf unsere Community zugreifen. Um alle Funktionen freizuschalten, spannende Inhalte zu entdecken und dich aktiv einzubringen, registriere dich jetzt kostenlos oder melde dich mit deinem Account an.

Anmelden oder registrieren
    1. Nodezone.net Community
    2. Forum
    3. Entwicklung & Scripting
    4. Scriptsprachen & Automation
    5. Python, Lua, JavaScript

    NodeJS - Spaß beim basteln und der Entdeckung von einer XSS Lücke via TeamSpeak Query

    • Multivitamin
    • 23. November 2016 um 23:17
    • Multivitamin
      aka Saft
      Reaktionen
      201
      Trophäen
      11
      Beiträge
      352
      • 23. November 2016 um 23:17
      • #1

      Hallo,

      heute möchte ich eine Kleinigkeit vorstellen die mir doch ein wenig Spaß erbracht hatte

      Im Prinzip hatte ich vor einen TeamSpeak Telnet komplett zu emulieren und potentiellen Query abfragen komplett absurde Ergebnisse zu liefern,
      da das jedoch ein enormer Aufwand geworden wäre um die ganzen Commands mit deren dazugehörigen Parametern zu parsen
      habe ich mir einen richtigen TeamSpeak Server hergenommen um ledeglich einige Response Parameter auszutauschen.


      Die NodeJS App Funktioniert im Prinzip so:
      Ein Telnet Client baut die Verbindung zum NodeJS Server auf
      Der NodeJS Server baut daraufhin eine Verbindung zum TeamSpeak Server via Query auf
      Jede Request welche der NodeJS Server entgegen nimmt wird ohne weiteres zur TeamSpeak Query weitergeleitet
      Jede Response welche von der TeamSpeak Query empfangen wird läuft durch eine String Replacer Function und wird dann zum Telnet Client gesendet


      klingt doch relativ harmlos?
      Durch das dass ich zuerst bei der Slot Anzahl dann 10 Millionen belegte Slots zurück gesendet habe hatte es zuerst bei TSViewer/TS3Index deren Graphen ein wenig zerschossen (war ziemlich Lustig mit anzusehen)
      Natürlich kamen durch die manipulation durch den Graphen auch Ideen eines nicht so fremden Native Network Forum Nutzers

      Spoiler anzeigen

      jedoch ist mir das aus Zeitlichen gründen dann nicht ausgegangen :(


      XSS (https://en.wikipedia.org/wiki/Cross-site_scripting)
      Ein anderer meinte dann zu mir ich solle versuchen JavaScript Code in deren Seite einzufügen
      Da über Server Name / Server Welcome Text das sicher escaped wird habe ich es zuerst über den Betriebssystem Namen versucht auszugeben (ohne Erfolg)
      danach über die Versions Nummer (ERFOLG!), es wurde beim Laden der Server Seite ein einfaches alert getriggert welches auf der Seite ein harmloses "Hi!" anzeigte

      Natürlich habe ich sofort einen TS3Index Supporter angeschrieben,
      scheinbar ein wenig inkompetent weil er nicht wusste wie Schwerwiegend eine derartige Lücke sein kann wenn man diese richtig ausnutzen würde weil eh nur ~70 Zeichen in das Server Versions Feld reinpassen würden
      und hat aber nicht gewusst dass du da auch externe Scripts einbetten könntest und von einem externen Script so wesentlich mehr Code ausführen könntest.
      Nichts desto trotz wurde die Lücke dann zügig innerhalb von ~4 Stunden geschlossen


      Hier noch ein Bild von veränderten Daten welche von TS3Index ausgegeben wurden (Versions Nummer und Betriebssystem)

      Spoiler anzeigen

      Und von TS3Viewer.com habe ich noch ein Bild der falschen Slotzahlen

      Spoiler anzeigen


      Nun ein wenig zum eigentlichen Script welches ich gebaut hatte um dies zu ermöglichen,
      teils gibts noch Probleme mit dem richtigen schließen einer Verbindung (TSViewer hat die Request zwar verarbeitet aber Fehler gebracht dass die Abfrage nicht in Ordnung war)

      Ich habe hierbei die NodeJS Version v6.4.0 genutzt

      JavaScript
      /*--------------------------------------------------------------------------
      	"THE BEER-WARE LICENSE" (Revision 42):
      	<[email protected]> wrote this thing. As long as you retain this notice you
      	can do whatever you want with this stuff. If we meet some day, and you think
      	this stuff is worth it, you can buy me a beer in return - David K.
      --------------------------------------------------------------------------*/
      var net = require("net");
      const CONFIG = {
      	listenport: 10011,		//External Port on which this Scripts listen to
      	ts3: ["10.10.12.102", 10011]	//TeamSpeak Connection Data IP + Query Port
      }
      var repl = {
      	virtualserver_name:"Hi",
      	virtualserver_platform:"NodeJS",
      	virtualserver_version:"1.3.3.7\\s[Build:\\s1234567890]",
      	virtualserver_maxclients:"1",
      	virtualserver_clientsonline:"2048",
      	virtualserver_uptime:"98921412412",
      	virtualserver_total_ping:"1.0000"
      }
      var replacer = (str) => {
      	for (var k in repl) {
      		var regex = new RegExp(k+"=[\\S]{1,}", "g")
      		str = str.replace(regex, k+"="+repl[k]);
      	}
      	return str;
      }
      net.createServer((socket) => {
      	console.log("Query Connected! ("+socket.remoteAddress+")")
      	var remote = net.connect(CONFIG.ts3[1], CONFIG.ts3[0]);
      	socket.on('data', (stream) => {
      		remote.write(stream);
      	})
      	remote.on('data', (stream) => {
      		socket.write(replacer(String(stream)));
      	})
      	socket.on('end', () => {
      		remote.end();
      		console.log("Query Disconnected! ("+socket.remoteAddress+")")
      	});
      	remote.on('end', () => {
      		socket.end();
      	});
      	remote.on('error', () => {});
      	socket.on('error', () => {});
      }).listen(CONFIG.listenport);
      Alles anzeigen


      JavaScript
      const CONFIG = {
      	listenport: 10011,		//External Port on which this Scripts listen to
      	ts3: ["10.10.12.102", 10011]	//TeamSpeak Connection Data IP + Query Port
      }

      Ist eigentlich selbst erklärend^
      Es sollte ebenfalls ein TeamSpeak Whitelist Eintrag aktiv sein damit der NodeJS Server nicht gebannt wird


      JavaScript
      var repl = {
      	virtualserver_name:"Hi",
      	virtualserver_platform:"NodeJS",
      	virtualserver_version:"1.3.3.7\\s[Build:\\s1234567890]",
      	virtualserver_maxclients:"1",
      	virtualserver_clientsonline:"2048",
      	virtualserver_uptime:"98921412412",
      	virtualserver_total_ping:"1.0000"
      }
      var replacer = (str) => {
      	for (var k in repl) {
      		var regex = new RegExp(k+"=[\\S]{1,}", "g")
      		str = str.replace(regex, k+"="+repl[k]);
      	}
      	return str;
      }
      Alles anzeigen

      Hier ist der eigentliche Teil welcher die ganzen Responses filtert und ggf abändert und dann in der Funktion ausgegeben wird

      In der Variable "repl" werden die keywords angegeben mit der Variable die ersetzt werden soll (die Liste kann also nach belieben angepasst werden)

      Bei TeamSpeak müssen "Leertasten" bzw Whitespaces mit "\s" escaped werden, durch das dass NodeJS ein einfaches "\" selber noch im String verarbeitet muss das Backslash ebenfalls mit einem weiteren Backslash escaped werden
      > "\\s" um ein Leerzeichen anzeigen zu lassen


      JavaScript
      net.createServer((socket) => {
      	console.log("Query Connected! ("+socket.remoteAddress+")")
      	var remote = net.connect(CONFIG.ts3[1], CONFIG.ts3[0]);
      
      
      
      
      	socket.on('data', (stream) => {
      		remote.write(stream);
      	})
      
      
      
      
      	remote.on('data', (stream) => {
      		socket.write(replacer(String(stream)));
      	})
      
      
      
      
      	socket.on('end', () => {
      		remote.end();
      		console.log("Query Disconnected! ("+socket.remoteAddress+")")
      	});
      
      
      
      
      	remote.on('end', () => {
      		socket.end();
      	});
      
      
      
      
      	remote.on('error', () => {});
      	socket.on('error', () => {});
      }).listen(CONFIG.listenport);
      Alles anzeigen

      Hier werden die einzelnen Requests von TeamSpeak Server und dem Telnet Client abgefertigt
      in der Variable "remote" ist die Verbindung zum TeamSpeak Server "abgespeichert"
      danach registriere ich events um die Daten zu bekommen
      beim socket.on empfange ich die Daten vom Telnet Client und sende diese weiter an die TeamSpeak Query
      bei remote.on empfange ich Daten von der TeamSpeak Query, parse die Response und schicke sie zurück an den Telnet Client


      baut nicht zu viel Scheisse ;)
      happy Slot Faking ;)

    • BountyXY
      Anfänger
      Reaktionen
      68
      Trophäen
      11
      Beiträge
      54
      • 24. November 2016 um 12:29
      • #2

      Wenn ich nur eine Frage stellen dürfte: Wie viel Langeweile braucht man um sowas heraus zu finden? :thumbup:

      Und das mit dem Mittelfinger wäre eine megageil Aktion gewesen! :D Aber trotzdem Respekt hast du das zufällig auch schon mal bei anderen Serverlisten probiert?

      index.php?forum=true

    • Multivitamin
      aka Saft
      Reaktionen
      201
      Trophäen
      11
      Beiträge
      352
      • 24. November 2016 um 18:54
      • #3
      Zitat von BountyXY

      Wie viel Langeweile braucht man um sowas heraus zu finden?

      Kommt sich darauf an was du damit meinst^
      Die Injection Möglichkeit war eher ungewollt und spontan von einer Idee aus einem Telegram Chat^


      Da ich allgemein nie wirklich viel mit Sockets gearbeitet hab war das nun der erste Anlauf um ein wenig Erfahrung zu sammeln ;)

    Registrieren oder Einloggen

    Du bist noch kein Mitglied von Native-Servers.com? Registriere dich kostenlos und werde Teil einer großartigen Community!

    Benutzerkonto erstellen

    Benutzer online in diesem Thema

    • 1 Besucher

    Wichtige Links & Informationen

    Server & Hosting-Ressourcen

      Server Administration & Hosting Basics

      Windows Server Support & Guides

      Linux Server Configuration & Help

      Setting up TeamSpeak 3 & VoIP Servers

      Domains & Web Hosting for Beginners & Professionals

      Cloud Hosting, Docker & Kubernetes Tutorials

    Gameserver & Modding-Ressourcen

      ArmA 3 Tutorials & Script Collection

      Renting & Operating Gameservers

      DayZ Server Management & Help

      FiveM (GTA V) Server & Script Development

      Rust Server Modding & Administration

      Setting up & Optimizing ARK Survival Servers

    NodeZone.net – Deine Community für Gameserver, Server-Hosting & Modding

      NodeZone.net ist dein Forum für Gameserver-Hosting, Rootserver, vServer, Webhosting und Modding. Seit 2015 bietet unsere Community eine zentrale Anlaufstelle für Server-Admins, Gamer und Technikbegeisterte, die sich über Server-Management, Hosting-Lösungen und Spielemodding austauschen möchten.


      Ob Anleitungen für eigene Gameserver, Hilfe bei Root- und vServer-Konfigurationen oder Tipps zu Modding & Scripting – bei uns findest du fundiertes Wissen und praxisnahe Tutorials. Mit einer stetig wachsenden Community findest du hier Antworten auf deine Fragen, Projektpartner und Gleichgesinnte für deine Gaming- und Serverprojekte. Schließe dich NodeZone.net an und werde Teil einer aktiven Community rund um Server-Hosting, Gameserver-Management und Modding-Ressourcen.

    Wer jetzt nicht teilt ist selber Schuld:
    1. Nutzungsbestimmungen
    2. Verhaltensregeln
    3. Datenschutzerklärung
    4. Impressum
    5. Urheberrechts- oder Lizenzverstoß melden
  • Trimax Design coded & layout by Gino Zantarelli 2023-2025©
    Community-Software: WoltLab Suite™