Предисловие
Данная статья посвящена прокси Caido.
В русскоязычном пространстве довольно мало материалов, которые посвящены Caido, а в последнее время меня часто спрашивали, почему я использую Caido, а не Burp Suite. Поэтому в ответ на эти вопросы я решил написать эту статью.
Не одним бурпом едины
Я, как и многие, долгое время (5+ лет) использовал Burp Suite как основной прокси в багхантинге.
К сожалению, в 2024 году у меня в тысячный раз началась классическая проблема, с которой, думаю, встречались многие пользователи Burp — он начал есть память гигабайтами. Проблема системная и очень часто начинает вылезать в бурпе (особенно если у вас проект на миллион запросов). Да что уж там говорить, даже в чистом состоянии Burp ест 2 гигабайта оперативной памяти. Кто мог предположить, что так будет, если написать прокси на Java...

Тогда я решил попробовать проект, о котором давно слышал, но он находился в вечной бете — Caido.

Ключевую причину можно описать одной картинкой при запущенном проекте с 10к+ запросов:

Как можно заметить, результаты намного лучше, чем у Burp с пустым проектом, что обеспечивается за счёт того, что Caido Server написан на Rust и не требует запуска JVM для своей работы.
Client/Server архитектура
Как можно заметить, я отметил, что память ест "Caido Server". Приставка "Server" тут не случайна. В отличие от Burp, который по стандарту запускается в виде standalone приложения на вашей системе, Caido фактически всегда запускает CLI-приложение. А доступ к интерфейсу прокси осуществляется просто по HTTP через ваш браузер.

Это позволяет развернуть Caido на вашем сервере и даже использовать этот инстанс сразу с нескольких устройств. Вы можете подключиться к серверу с ноутбука днём, а вечером продолжить анализ уже на компьютере. При этом у вас не будет бесконечных проблем с перекидыванием проектов (которые возникли бы при использовании Burp) — всё хранится на сервере.
GraphQL API
Такая реализация породила несколько очень приятных особенностей.
Первая — это GraphQL.

Как было упомянуто ранее, управление Caido происходит через веб-интерфейс, так вот всё взаимодействие в нём и происходит через GraphQL.

Почему это круто? Потому что позволяет удобно интегрировать Caido-сервер с другими вашими приложениями, AI-моделями и т.д. В отличие от Burp, где для каждого такого взаимодействия вам скорее всего придётся написать плагин на Java, открывать нужный проект руками и т.д., в Caido через REST API вы просто выбираете нужный проект на вашем сервере, после чего через GraphQL можете делать с ним что хотите.
Простота разработки плагинов
Второе очевидное преимущество, которое частично вытекает из первого: при написании плагинов или просто попытках модификации интерфейса, добавлении нового визуального функционала — всё, что вам нужно, просто написать HTML/CSS/JavaScript фронтенд. Что, по моему опыту, значительно проще, чем пытаться изменить что-то в Burp.
Базовый функционал
HTTPQL
Первое, что вы увидите, запустив прокси и начиная перехватывать трафик, — в строке поиска написано "Enter an HTTPQL query".

HTTPQL — это специальный язык запросов в Caido, который довольно интуитивен (учитывая, что подсказки по синтаксису отображаются при составлении запросов, документацию можно даже не открывать — очень просто разобраться по ходу).
Например, чтобы выделить "Все GET-запросы к поддоменам google.com/youtube.com" кроме JS-файлов, вам нужно написать:
(req.host.regex:/\.google\.com$/ or req.host.regex:/\.youtube.com$/) and req.method.eq:"GET" and req.ext.ne:"js"
В Burp же для аналогичного запроса придётся перейти в script mode и начать писать на Java:
var request = requestResponse.request();
return (
request.header("Host").value().matches(".*\\.google.com$") ||
request.header("Host").value().matches(".*\\.youtube\\.com$")
)
&& request.fileExtension().equals("js")
&& request.method().equals("GET");
В целом HTTPQL в обычных случаях удобнее, чем дефолтный поиск бурпа, и быстрее, чем писать скрипты в Burp. К сожалению, есть 1% случаев, когда поиск проще осуществить в бурпе, например: "Найти все запросы, в которых присутствует строка qwerty, а query-параметр id=md5(значение хедера x-slonser)" (пример очевидно синтетический, так как не смог в точности воспроизвести в уме реальный пример из своих страданий).
В таких случаях я просто доставал ответ от GraphQL на более широкий HTTPQL-запрос и уже сам в JS это фильтровал. К сожалению, в интерфейсе пока не предусмотрели отдельной кнопки для этого...
Полезная возможность: вы можете сохранить этот запрос как
preset, что позволит использовать и комбинировать его в будущем с дополнительными правилами вместе.
Основные разделы интерфейса
Остальные окна в Caido вам окажутся, скорее всего, до боли знакомы из бурпа, но выделю те, которые отличаются:
Filter — настройка фильтров, о которых говорилось ранее
Automate — аналог Intruder
Workflows — скрипты, которые будут выполняться при определённых условиях (подробнее в следующей главе)
Environment — переменные окружения для плагинов/workflows
Workflows
Workflows — способ автоматизировать ваши задачи и расширить функционал других секций в Caido.
Workflows бывают трёх видов:
Passive
Запускаются автоматически на всех запросах, которые приходят в прокси. Их полезно использовать, когда вам нужно автоматически выделять запросы по какому-то сложному принципу. Или, например, вы хотите сохранять определённые данные — все встреченные UUID определённой сущности сразу же сохранять в Environment, чтобы потом можно было быстро их достать.
Active
Соответственно, то же самое, что и Passive, но запускаются вручную или плагинами.
Convert
Это workflow, который (как можно догадаться) используется для трансформации одного определённого значения или запроса. Например, чтобы закодировать параметр в base64 и т.д.
Выглядит это примерно так:

Как можно заметить, workflow составляется посредством блок-схем. Доступных блоков довольно много, однако зачастую вам хватит такой простой схемы:

Как можно догадаться, такая схема просто преобразует запрос с помощью JS и возвращает его дальше в цепочку.
В данном случае использовался вот такой простой кусок кода, который просто преобразует число в Unicode-символ по его charcode:
export function run(input, sdk) {
let parsed = sdk.asString(input);
return String.fromCharCode(parseInt(parsed));
}
После чего мы, например, можем использовать его в Automation, выбрав перебор запроса со всеми вариантами на числах от 0 до 100:

Запустив код, вы увидите, что он подставил все символы с чаркодами от 0 до 100 соответственно:

Использование других языков программирования
Также, предвосхищая возгласы людей, которым противно писать на JS — это не проблема, ведь есть логический блок shell:

Например, вы можете передать:
exec /bin/go run /home/slonser/md5/main.go
И он запустит в workflow ваш Go-код, передав данные на stdin (а вы в свою очередь должны вернуть данные через stdout).
Пример Go-скрипта:
package main
import (
"crypto/md5"
"fmt"
"io"
"os"
)
func main() {
h := md5.New()
_, err := io.Copy(h, os.Stdin)
if err != nil {
fmt.Fprintln(os.Stderr, "error reading stdin:", err)
os.Exit(1)
}
fmt.Printf("%x\n", h.Sum(nil))
}
Фактически это позволяет сделать через workflow что угодно и как вам удобно, что очень ускоряет процесс автоматизации рутинных задач.
Подробнее расписывать отдельные сценарии не буду — если кто-то из прочитавших решит начать пользоваться Caido, я думаю, он сам придумает множество таковых.
Полезные примеры workflow
Из своих элегантных примеров могу предоставить workflow eval:
export function run(input, sdk) {
let parsed = sdk.asString(input);
parsed=eval("`"+parsed.replace('`','\\`')+"`")
return parsed;
}
Он позволяет мне делать запросы вида:
GET /admin/${btoa('123')} HTTP/1.1
Host: localhost
То есть прямо внутри HTTP-запроса вставлять JS (иногда бывает полезно, когда нужно руками пройтись в replay по сложным значениям).
Примечание: стоит отметить, что существует отдельный плагин, который реализует магазин workflows, откуда можно скачать workflows, созданные кем-то из community.
Плагины
Хоть Caido и довольно силён из коробки, без плагинов от community вы вряд ли им будете пользоваться. Тут бы хотелось рассказать о тех, которые мне особо нравятся:
Omnioast

Многие могли заметить, что в Caido нет коллаборатора — так вот это плагин, который его заменяет и делает это даже лучше. В нём можно добавить несколько различных видов провайдеров запросов, но я, конечно, советую либо использовать публичный interactsh, либо (что лучше) развернуть свой инстанс interactsh и подключаться через него. Сможете по аналогии с коллаборатором бурпа получать всё — от DNS до SMTP.
Drop

Плагин, который позволяет перекидывать любые объекты в Caido на инстанс другого человека.
Как это работает:
Добавляетесь в друзья посредством отправки PGP fingerprint (обычно используется публичный сервер Caido, но вы можете поднять свой)
После этого вы можете отправлять другу: запросы, пресеты фильтров, скоуп и т.д.
Ультимативное решение для совместного багхантинга, аналогов которого в бурпе я не знаю.
Так что если вы прошли оба условия:
У вас есть друзья
Вы заставили их использовать Caido
Вы обязаны его установить!
Notes++

Плагин, который позволяет красиво вести заметки про ваши находки. Можно создавать папки, линковать запросы из Replay и т.д. Ничего особенного, строго и сердито — must have.
Ebka AI

В названии данного расширения можно уловить русский след — всё потому, что написал его автор данной статьи. Функционал плагина позволяет использовать Caido как MCP-tool, он имеет доступ к большей части функционала Caido. Вы можете подключить его к Claude/Cursor и написать:
Найди мне все ручки API, разбей их на логические блоки, создай для каждого блока replay-коллекцию...
Основная цель плагина — помочь автоматизировать рутинные задачи и уменьшить времязатраты на создание красивого Caido Workspace.
Также существует множество других плагинов — от детекта мисконфига JWT до CSP auditor. Описывать каждый отдельно нет смысла. Можете ознакомиться с ними в магазине плагинов.
Ложка дёгтя
Очевидно, что всё не может быть хорошо. Так в чём же главная проблема Caido?
Проблема довольно проста — отсутствие нормального аналога Active Scan из бурпа. Фактически в Caido есть плагин со сканером, но его начали писать только в этом году, и он пока что имеет жалкий детский уровень по сравнению с бурповым.
Если вы, как и я, используете прокси в основном только для ручного тестирования — можно пережить, иначе, возможно, Caido пока не для вас.
Ценообразование
Также нужно понимать, что бесплатная версия Caido ограничена по количеству проектов и установленных плагинов. Платная версия стоит 200$ в год (что дешевле 500$ за Burp Suite, но всё же может кого-то отпугнуть).
Финал
Я попытался кратко описать все что является ключевым для меня в выборе Caido перед бурп.
Чтобы проникнуться Caido нужно время, но думаю после этой статьи если вы дочитали до сюда - вы знаете какую проксю установите когда в следующий раз надоест бурп.
mtixt
Что скажешь по основным фичам, аналогичным бурповым: repeater, intruder, etc. Норм ли работать с ними после бурпа, сильно ли отличается UX в плане просмотра/редактирования запросов? Как строит карту сайта, и есть ли пассивный сканер?
Slonser Автор
Repeater нравится больше, Intruder как Intruder (Из-за применения workflow мне Automation в Caido больше чем Intruder в бурпе правда нравится), тут не вижу отличий со всем. Сканнер есть и пасивный и активный, но крайне плох по сравнению с бурпом. Они сканер добавили только летом этого года, думаю им надо дать время чтобы они нормально его допилили