From dc7ac1e226f47f30b0862ac2ab75badf41d97d10 Mon Sep 17 00:00:00 2001 From: ProgramX Date: Fri, 20 Mar 2026 10:25:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=81=D1=82=D0=B5=D0=BD=D0=B4=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__init__.py | 0 src/core.py | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ src/main.py | 25 +++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 src/__init__.py create mode 100644 src/core.py create mode 100644 src/main.py diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/core.py b/src/core.py new file mode 100644 index 0000000..a21937d --- /dev/null +++ b/src/core.py @@ -0,0 +1,74 @@ +import json +import os +import smtplib +from email.message import EmailMessage + +from loguru import logger + + +class AttackManager: + def __init__(self): + # Загружаем настройки и сразу проверяем их наличие + self.webhook_url = os.getenv("WEBHOOK_URL") + self.sender_email = os.getenv("EMAIL_SENDER") + self.sender_password = os.getenv("EMAIL_PASSWORD") + self.smtp_server = os.getenv("SMTP_SERVER", "smtp.yandex.ru") + self.smtp_port = int(os.getenv("SMTP_PORT", 465)) + + # ПРОВЕРКА: Если чего-то не хватает, бросаем ошибку + # Это уберет ошибку Pylance, так как после этого блока переменные точно str + if not all([self.webhook_url, self.sender_email, self.sender_password]): + logger.critical( + "❌ Ошибка: Проверьте файл .env! Отсутствуют обязательные параметры." + ) + raise ValueError("Missing environment variables") + + self.payloads_path = os.path.join("data", "payloads.json") + + def get_payloads(self) -> list[dict]: + """Загружает все доступные атаки из JSON.""" + with open(self.payloads_path, "r", encoding="utf-8") as f: + return json.load(f) + + def prepare_message(self, target_email: str, attack: dict) -> EmailMessage: + """Подготавливает письмо на основе шаблона атаки.""" + # Заменяем плейсхолдер на реальный URL + # Мы уверены, что self.webhook_url это str благодаря проверке в __init__ + final_body = attack["body"].replace("{{WEBHOOK_URL}}", str(self.webhook_url)) + + msg = EmailMessage() + msg.set_content(final_body) + msg["Subject"] = attack["subject"] + msg["From"] = self.sender_email + msg["To"] = target_email + + return msg + + def execute_attacks(self, target_email: str, payload_ids: list[str] | None = None): + """ + Отправляет выбранные атаки (или все сразу, если payload_ids не указан). + """ + payloads = self.get_payloads() + + # Если список ID не передан, берем все атаки из файла + to_send = [p for p in payloads if payload_ids is None or p["id"] in payload_ids] + + if not to_send: + logger.warning("Нет атак для отправки. Проверьте ID.") + return + + try: + logger.info(f"Connecting to {self.smtp_server}...") + with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server: + # Теперь Pylance спокоен, так как мы гарантировали, что это str + server.login(str(self.sender_email), str(self.sender_password)) + + for attack in to_send: + msg = self.prepare_message(target_email, attack) + server.send_message(msg) + logger.success(f"✅ Attack '{attack['id']}' sent to {target_email}") + + logger.info(f"All attacks completed. Monitor Webhook: {self.webhook_url}") + + except Exception as e: + logger.error(f"Failed to execute attacks: {e}") diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..0ba3bd1 --- /dev/null +++ b/src/main.py @@ -0,0 +1,25 @@ +from dotenv import load_dotenv +from loguru import logger + +from core import AttackManager + +load_dotenv() + + +def run(): + manager = AttackManager() + TARGET = "ПОЧТА-АГЕНТА@yandex.ru" + + logger.info("--- Lambda Red Team Toolkit ---") + + # Просто закомментируй/раскомментируй нужную строку перед запуском: + + # 1. Тестируем всё сразу: + manager.execute_attacks(TARGET) + + # 2. Или тестируем только конкретную (например, новую про лицензии): + # manager.execute_attacks(TARGET, payload_ids=["pirated_software_keys"]) + + +if __name__ == "__main__": + run()