Добавил интерактивный ввод

This commit is contained in:
ProgramX 2026-03-25 18:37:18 +03:00
parent 7401dc9849
commit 2ebdf5ba1c
2 changed files with 85 additions and 66 deletions

View file

@ -2,73 +2,47 @@ import json
import os import os
import smtplib import smtplib
from email.message import EmailMessage from email.message import EmailMessage
from loguru import logger from loguru import logger
class AttackManager: class AttackManager:
def __init__(self): def __init__(self, vesion: int):
# Загружаем настройки и сразу проверяем их наличие self.dir_version = f"v{vesion}"
self.webhook_url = os.getenv("WEBHOOK_URL") self.webhook_url = os.getenv("WEBHOOK_URL")
self.sender_email = os.getenv("EMAIL_SENDER") self.sender_email = os.getenv("EMAIL_SENDER")
self.sender_password = os.getenv("EMAIL_PASSWORD") self.sender_password = os.getenv("EMAIL_PASSWORD")
self.target_email = os.getenv("TARGET_EMAIL")
self.smtp_server = os.getenv("SMTP_SERVER", "smtp.yandex.ru") self.smtp_server = os.getenv("SMTP_SERVER", "smtp.yandex.ru")
self.smtp_port = int(os.getenv("SMTP_PORT", 465)) self.smtp_port = int(os.getenv("SMTP_PORT", 465))
# ПРОВЕРКА: Если чего-то не хватает, бросаем ошибку if not all([self.webhook_url, self.sender_email, self.sender_password, self.target_email]):
# Это уберет ошибку Pylance, так как после этого блока переменные точно str logger.critical("❌ Ошибка: Проверьте .env!")
if not all([self.webhook_url, self.sender_email, self.sender_password]):
logger.critical(
"❌ Ошибка: Проверьте файл .env! Отсутствуют обязательные параметры."
)
raise ValueError("Missing environment variables") raise ValueError("Missing environment variables")
self.payloads_path = os.path.join("data", "payloads.json") # Пути к двум файлам
self.benign_path = os.path.join("experiments", self.dir_version, "benign.json")
self.malicious_path = os.path.join("experiments", self.dir_version, "malicious.json")
def get_payloads(self) -> list[dict]: def load_payloads(self, path) -> list[dict]:
"""Загружает все доступные атаки из JSON.""" with open(path, "r", encoding="utf-8") as f:
with open(self.payloads_path, "r", encoding="utf-8") as f:
return json.load(f) return json.load(f)
def prepare_message(self, target_email: str, attack: dict) -> EmailMessage: def send_payload(self, payload: dict):
"""Подготавливает письмо на основе шаблона атаки.""" """Логика отправки одного письма."""
# Заменяем плейсхолдер на реальный 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: try:
logger.info(f"Connecting to {self.smtp_server}...") # Заменяем плейсхолдер на реальный Webhook URL
body = payload["body"].replace("{{WEBHOOK_URL}}", str(self.webhook_url))
msg = EmailMessage()
msg.set_content(body)
msg["Subject"] = payload["subject"]
msg["From"] = self.sender_email
msg["To"] = self.target_email
with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as 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)) server.login(str(self.sender_email), str(self.sender_password))
server.send_message(msg)
for attack in to_send: return True
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: except Exception as e:
logger.error(f"Failed to execute attacks: {e}") logger.error(f"Ошибка отправки: {e}")
return False

View file

@ -1,25 +1,70 @@
import os
import sys
from dotenv import load_dotenv from dotenv import load_dotenv
from loguru import logger from loguru import logger
from core import AttackManager from core import AttackManager
VERSION = 2
load_dotenv() load_dotenv()
def main():
manager = AttackManager(VERSION)
def run(): # Загружаем списки
manager = AttackManager() benign_list = manager.load_payloads(manager.benign_path)
TARGET = "ПОЧТА-АГЕНТА@yandex.ru" malicious_list = manager.load_payloads(manager.malicious_path)
logger.info("--- Lambda Red Team Toolkit ---") while True:
print("\n" + "="*50)
print("🚀 LAMBDA RED TEAM TOOLKIT: INTERACTIVE CONSOLE")
print("="*50)
print(f"Цель: {manager.target_email}")
print(f"Отправитель: {manager.sender_email}")
print("-" * 50)
# Просто закомментируй/раскомментируй нужную строку перед запуском: print("\n🟢 ОБЫЧНЫЕ ПИСЬМА (BENIGN):")
for i, p in enumerate(benign_list):
print(f" [B{i}] {p['name']}")
# 1. Тестируем всё сразу: print("\n🔴 ИНЪЕКЦИИ (MALICIOUS):")
manager.execute_attacks(TARGET) for i, p in enumerate(malicious_list):
print(f" [M{i}] {p['name']}")
# 2. Или тестируем только конкретную (например, новую про лицензии): print("\n[Q] Выход")
# manager.execute_attacks(TARGET, payload_ids=["pirated_software_keys"])
choice = input("\nВыберите ID письма (например, B0 или M0): ").strip().upper()
if choice == 'Q':
logger.info("Выход из системы.")
break
# Логика выбора из нужного списка
target_list = None
idx = -1
try:
if choice.startswith('B'):
target_list = benign_list
idx = int(choice[1:])
elif choice.startswith('M'):
target_list = malicious_list
idx = int(choice[1:])
if target_list and 0 <= idx < len(target_list):
selected = target_list[idx]
print(f"\nВыбрано: {selected['name']}")
confirm = input("Отправить письмо? (y/n): ").lower()
if confirm == 'y':
if manager.send_payload(selected):
logger.success(f"Успешно отправлено: {selected['subject']}")
else:
logger.error("Не удалось отправить письмо.")
else:
print("❌ Ошибка: Неверный ID письма.")
except ValueError:
print("❌ Ошибка: Введите корректный ID (буква + число).")
if __name__ == "__main__": if __name__ == "__main__":
run() main()