Добавил интерактивный ввод
This commit is contained in:
parent
7401dc9849
commit
2ebdf5ba1c
2 changed files with 85 additions and 66 deletions
78
src/core.py
78
src/core.py
|
|
@ -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
|
||||||
73
src/main.py
73
src/main.py
|
|
@ -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():
|
||||||
def run():
|
manager = AttackManager(VERSION)
|
||||||
manager = AttackManager()
|
|
||||||
TARGET = "ПОЧТА-АГЕНТА@yandex.ru"
|
|
||||||
|
|
||||||
logger.info("--- Lambda Red Team Toolkit ---")
|
|
||||||
|
|
||||||
# Просто закомментируй/раскомментируй нужную строку перед запуском:
|
|
||||||
|
|
||||||
# 1. Тестируем всё сразу:
|
# Загружаем списки
|
||||||
manager.execute_attacks(TARGET)
|
benign_list = manager.load_payloads(manager.benign_path)
|
||||||
|
malicious_list = manager.load_payloads(manager.malicious_path)
|
||||||
|
|
||||||
# 2. Или тестируем только конкретную (например, новую про лицензии):
|
while True:
|
||||||
# manager.execute_attacks(TARGET, payload_ids=["pirated_software_keys"])
|
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']}")
|
||||||
|
|
||||||
|
print("\n🔴 ИНЪЕКЦИИ (MALICIOUS):")
|
||||||
|
for i, p in enumerate(malicious_list):
|
||||||
|
print(f" [M{i}] {p['name']}")
|
||||||
|
|
||||||
|
print("\n[Q] Выход")
|
||||||
|
|
||||||
|
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()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue