
249
Пентест – это не просто запустить Metasploit и ждать шелла. Это исследование, анализ, написание кастомных пейлоадов под конкретную цель. И вот тут AI начинает реально рвать шаблоны. Современные LLM-модели умеют анализировать код на уязвимости, генерировать PoC-эксплойты, писать обходы WAF и автоматизировать рутину, которая раньше жрала часы твоего времени.
Но есть нюанс: чистый ChatGPT через официальный интерфейс – зажатый и трусливый. Поэтому профи строят свои AI-пайплайны через API, подключают локальные модели типа Mistral или CodeLlama, и получают инструмент без цензурных ограничений.
Смотри, как это выглядит на высоком уровне:
|
1 2 3 4 5 |
[Цель: URL/IP/Код] → [AI Анализатор] → [Генератор пейлоадов] → [Авто-тестировщик] → [Репорт] |
Каждый блок – отдельный модуль. Давай разберём по-настоящему.
Берём кусок кода, скармливаем модели, получаем анализ. Вот простой пайплайн на Python с OpenAI API:
|
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 |
from openai import OpenAI client = OpenAI(api_key="YOUR_KEY") def analyze_code_for_vulns(code_snippet: str) -> str: system_prompt = """Ты - эксперт по безопасности и пентесту. Анализируй предоставленный код и находи уязвимости: SQL-инъекции, XSS, SSRF, Path Traversal, RCE и другие. Для каждой уязвимости укажи: 1. Тип уязвимости (CVE-класс если применимо) 2. Строку кода с проблемой 3. Готовый PoC-пейлоад для демонстрации 4. Рекомендацию по фиксу""" response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": f"Проанализируй этот код:\n\n{code_snippet}"} ], temperature=0.2 # Меньше творчества, больше точности ) return response.choices[0].message.content # Тест на очевидно уязвимом PHP-коде vuln_code = """ <?php $id = $_GET['id']; $query = "SELECT * FROM users WHERE id = " . $id; $result = mysqli_query($conn, $query); ?> """ print(analyze_code_for_vulns(vuln_code)) |
AI сразу выдаст: SQLi через GET-параметр id, пейлоад 1 OR 1=1--, и даже предложит параметризованный запрос как фикс. Профит.
Самая мощная часть. Допустим, ты нашёл точку XSS, но WAF блокирует стандартные пейлоады. Просишь AI сгенерировать обходы:
|
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 |
def generate_waf_bypass_payloads(vuln_type: str, context: str, waf_info: str) -> list: prompt = f""" Уязвимость: {vuln_type} Контекст внедрения: {context} Обнаруженный WAF: {waf_info} Сгенерируй 10 вариантов пейлоадов с обходом WAF. Используй: unicode encoding, HTML entities, JS obfuscation, double encoding, case manipulation. Верни только список пейлоадов в JSON-формате. """ response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], response_format={"type": "json_object"} ) import json return json.loads(response.choices[0].message.content) payloads = generate_waf_bypass_payloads( vuln_type="XSS Reflected", context="HTML attribute value", waf_info="Cloudflare" ) |
На выходе получаешь структурированный список пейлоадов под конкретный контекст. Руками такое делать – часы работы.
Официальный OpenAI API иногда отказывается генерировать определённые вещи. Решение – поднять локальную модель. Ollama + CodeLlama – твой лучший друг:
|
1 2 3 4 5 6 7 8 |
# Ставим Ollama curl -fsSL https://ollama.com/install.sh | sh # Тянем модель заточенную под код ollama pull codellama:13b # Или WizardCoder - реально хорош для security задач ollama pull wizardcoder:python |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import requests import json def ask_local_llm(prompt: str, model: str = "codellama:13b") -> str: response = requests.post( "http://localhost:11434/api/generate", json={ "model": model, "prompt": prompt, "stream": False, "options": { "temperature": 0.3, "num_predict": 2048 } } ) return response.json()["response"] # Никаких ограничений, никакого телефона домой result = ask_local_llm( "Write a Python script that demonstrates buffer overflow concept for educational CTF challenge" ) print(result) |
Локально, приватно, без логов на серверах OpenAI.
Классический fuzzing – это брутфорс. AI-fuzzing – это умный брутфорс. Модель анализирует ответы сервера и адаптирует следующие запросы:
|
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
import requests from openai import OpenAI client = OpenAI(api_key="YOUR_KEY") class AIFuzzer: def __init__(self, target_url: str): self.target_url = target_url self.history = [] self.findings = [] def fuzz_iteration(self, response_history: list) -> str: """AI генерирует следующий пейлоад на основе предыдущих ответов""" context = "\n".join([ f"Запрос: {h['payload']} → Ответ: {h['status']} {h['length']} байт" for h in response_history[-5:] # Последние 5 попыток ]) prompt = f""" Target: {self.target_url} История запросов: {context} Проанализируй паттерны ответов и предложи следующий пейлоад. Ищи аномалии в длине ответа, статус-кодах, временных задержках. Верни только пейлоад, без объяснений. """ response = client.chat.completions.create( model="gpt-4o-mini", # mini достаточно для этой задачи messages=[{"role": "user", "content": prompt}], max_tokens=100 ) return response.choices[0].message.content.strip() def run(self, iterations: int = 20): print(f"[*] Запускаем AI Fuzzer на {self.target_url}") for i in range(iterations): if len(self.history) < 3: # Стартовые пейлоады payloads = ["'", '"', "<script>", "../", "{{7*7}}"] payload = payloads[i % len(payloads)] else: payload = self.fuzz_iteration(self.history) try: r = requests.get( self.target_url, params={"q": payload}, timeout=5 ) entry = { "payload": payload, "status": r.status_code, "length": len(r.content) } self.history.append(entry) # Детектим аномалии if r.status_code == 500: self.findings.append(f"[!] 500 Error с пейлоадом: {payload}") print(f"[!] НАХОДКА: {payload} → {r.status_code}") print(f"[{i+1}] {payload[:30]:<30} → {r.status_code} ({len(r.content)} bytes)") except Exception as e: print(f"[-] Ошибка: {e}") return self.findings # Запуск fuzzer = AIFuzzer("http://testphp.vulnweb.com/search.php") results = fuzzer.run(iterations=15) |
После нахождения уязвимостей – пишем репорт. AI делает это за секунды:
|
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 |
def generate_pentest_report(findings: list, target: str) -> str: findings_text = "\n".join([f"- {f}" for f in findings]) prompt = f""" Составь профессиональный отчёт о пентесте в формате Markdown. Цель: {target} Дата: {__import__('datetime').date.today()} Найденные уязвимости: {findings_text} Структура отчёта: 1. Executive Summary (для менеджмента, без технических деталей) 2. Технические находки с CVSS-оценками 3. Proof of Concept для каждой уязвимости 4. Рекомендации по устранению 5. Приоритизация по критичности """ response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], max_tokens=3000 ) return response.choices[0].message.content # Генерируем и сохраняем report = generate_pentest_report( findings=["SQLi в параметре id", "XSS в поле поиска", "Открытый Redis порт 6379"], target="example-target.com" ) with open("pentest_report.md", "w", encoding="utf-8") as f: f.write(report) print("[+] Отчёт сохранён в pentest_report.md") |
Собираем Всё Вместе: CLI-Тулза
|
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 |
#!/usr/bin/env python3 """ AI Pentest Assistant v1.0 Usage: python ai_pentest.py --mode [analyze|fuzz|report] """ import argparse import sys def main(): parser = argparse.ArgumentParser(description="AI-Powered Pentest Assistant") parser.add_argument("--mode", choices=["analyze", "fuzz", "report", "payload"], required=True) parser.add_argument("--target", help="URL или файл с кодом") parser.add_argument("--vuln-type", help="Тип уязвимости для генерации пейлоадов") parser.add_argument("--model", default="gpt-4o", help="Модель для использования") parser.add_argument("--local", action="store_true", help="Использовать локальную модель (Ollama)") args = parser.parse_args() print(f"[*] AI Pentest Assistant | Режим: {args.mode}") print(f"[*] Модель: {'Ollama/Local' if args.local else args.model}") if args.mode == "analyze": with open(args.target, "r") as f: code = f.read() result = analyze_code_for_vulns(code) print(result) elif args.mode == "fuzz": fuzzer = AIFuzzer(args.target) findings = fuzzer.run() print(f"\n[+] Итого находок: {len(findings)}") elif args.mode == "payload": payloads = generate_waf_bypass_payloads( args.vuln_type, "generic", "unknown" ) print(payloads) if __name__ == "__main__": main() |
0.1-0.3, для брейнштормінга – 0.7-0.9Всё описанное выше – исключительно для авторизованного пентеста, CTF-соревнований и обучения. Применение против систем без письменного разрешения владельца – уголовная статья в большинстве стран. Бро, не надо сажать себя из-за глупости. Используй в легальном контексте: bug bounty программы, собственная инфраструктура, лаборатории типа HackTheBox и TryHackMe.