
RevSuit — это гибкая и мощная платформа для обратных соединений, предназначенная для приема соединений от целевого хоста при пентесте.
English |简体中文
RevSuit — это гибкая и мощная платформа для обратного подключения, предназначенная для приема соединений от целевого хоста во время пентеста. В настоящее время поддерживаются протоколы HTTP, DNS, RMI, LDAP, MySQL и FTP.
Гибкость:
Мощность:
Скачайте последний релиз напрямую или соберите самостоятельно, следуя инструкциям:
git clone https://github.com/Li4n0/revsuit.git
cd revsuit/frontend && yarn install && yarn build
cd ../ && go build ./cmd/revsuit/revsuit.go
RevSuit сгенерирует файл конфигурации по умолчанию при первом запуске. Измените файл конфигурации в соответствии с вашими потребностями, затем перезапустите. Подробное описание файла конфигурации можно найти здесь: Примечания к конфигурации
Для определения местоположения по IP требуется база данных IP-адресов. По умолчанию используется QQwry, также можно изменить конфигурацию для использования GeoIP. Если выбранная база данных недоступна в текущем каталоге или обновлялась более недели назад, RevSuit автоматически загрузит последнюю версию. Если загрузка не удалась, поле IpArea всегда будет пустым.
$ ./revsuit
2021/05/16 22:55:10 [ INFO] Загрузка qqwry.dat...
____ _____ _ __
/ __ \___ _ __/ ___/__ __(_) /_
/ /_/ / _ \ | / /\__ \/ / / / / __/
/ _, _/ __/ |/ /___/ / /_/ / / /_
/_/ |_|\___/|___//____/\__,_/_/\__/
vBeta0.1
https://revsuit.pro
2021/05/16 22:55:22 [ INFO] Запуск HTTP-сервера на :80, токен:your_token
2021/05/16 22:55:22 [ INFO] Начало прослушивания FTP PASV-порта на :2020, PasvIP = 10.9.8.7
2021/05/16 22:55:22 [ INFO] Запуск FTP-сервера на :21
2021/05/16 22:55:22 [ INFO] Запуск MySQL-сервера на :3306
2021/05/16 22:55:22 [ INFO] Запуск RMI-сервера на :1099
2021/05/16 22:55:22 [ INFO] Запуск DNS-сервера на :53
После запуска вы можете перейти по пути /revsuit/admin/ HTTP-сервера и ввести токен для доступа к панели управления.
Рассмотрим на примере создания HTTP-правил:
Несколько примечаний:
name и flagFormat правила уникальны.FlagFormat использует синтаксис регулярных выражений, и для разных протоколов поля, совпадающие с flagFormat, различаются. Вы можете проверить соответствующие подсказки при создании правил для получения подробностей.flagFormat, и результат совпадения группы также будет использоваться как переменная шаблона.Как показано ниже, мы создаем правило, использующее встроенные переменные шаблонов и пользовательские переменные шаблонов для HTTP-протокола, и называем его test_create_rule:

Затем делаем запрос, удовлетворяющий правилу, и просматриваем ответ.

Запрос также будет зарегистрирован на платформе.

Если вы хотите получать уведомления о новых соединениях в вашем офисном ПО, вы можете настроить webhook-адрес соответствующего программного обеспечения в файле конфигурации и включить переключатель Notice для соответствующего правила. В настоящее время поддерживаются только четыре типа ПО: dingtalk, wechat, lark, slack. (Поддержка Discord и Telegram запланирована.)
Если вы переносите платформу или очищаете данные, повторное создание правил может быть утомительным. Поэтому платформа поддерживает импорт и экспорт правил.
Точка входа для этой функции находится в Settings > RULES.
Правила хранятся в формате yaml для импорта/экспорта, например:
http:
- name: test_create_rule
flag_format: (?P<what>\w+)\?
rank: 0
push_to_client: false
notice: false
response_status_code: "302"
response_headers:
Location: ${query.url}
response_body: ${header.say} ${what}
- name: other_rule
flag_format: other
rank: 1
push_to_client: false
notice: true
response_status_code: "200"
response_headers: { }
response_body: Hello Revsuit!
dns:
... ...
RevSuit был выделен из моего проекта сканера, поэтому его нативная поддержка работает со сканерами.
С точки зрения RevSuit, сканер называется клиентом.
RevSuit использует Server-sent Events (SSE) HTTP для установления одностороннего канала связи с клиентом.
API для канала: /revsuit/api/events?message. Клиент должен сначала добавить заголовок Token: your token в заголовок, а затем обратиться к API для установления канала. Когда платформа получает новый запрос, flag, захваченный правилом, передается клиенту через этот канал.

Вот простой пример с использованием библиотеки sse на Golang.
Как показано выше, RevSuit поддерживает несколько клиентов, и каждый клиент в состоянии соединения получает push-уведомление с flag, что позволяет поддерживать распределенное сканирование.
Если вы не хотите, чтобы каждый клиент получал все push-уведомления flag, вы можете использовать заголовок запроса Flag-Filter при создании SSE-соединения, чтобы задать формат (регулярное выражение) flag, который должен получать этот клиент:

RevSuit будет временно хранить flag в очереди, когда нет клиентского соединения, и отправлять его, когда клиент подключается, так что вам не нужно беспокоиться о пропуске уязвимости из-за отключения клиента. (Это особенно полезно для обнаружения уязвимостей с задержкой срабатывания.)
В реальном сценарии сканирования уязвимостей вы можете отправлять множество различных полезных нагрузок для одной точки уязвимости, и все они могут быть валидными, что приведет к получению платформой обратного подключения множества запросов, но все они вызваны одной и той же уязвимостью. Если вы не хотите, чтобы клиент получал так много flag для одной уязвимости, вы можете воспользоваться функцией flagGroup в правиле flagFormat.
FlagGroup — это контент, соответствующий анонимной группе в поле flagFormat правила. Платформа проверяет контент, полученный в группе, и отправляет flag клиенту только тогда, когда контент (flagGroup) захвачен впервые.
Например, сканирование SSRF.
Сначала создайте правило, как показано ниже:
http:
- name: ssrf
flag_format: (ssrf[a-z0-9]{6})[0-9]{1,3}
rank: 0
push_to_client: false
notice: false
response_status_code: "200"
response_headers: { }
response_body: "Here is a SSRF!"
Предположим, наша цель — https://www.testvuln.com?url=api.com&p=useless, и для SSRF у нас есть 5 полезных нагрузок. Итоговый запрос, отправленный сканером, может быть: ['https://www.testvuln.com?url=http://revsuit.com/ssrfa98oni1&p=useless','https://www.testvuln.com?url=http://revsuit.com/ssrfa98oni2&p=useless', ... ,'https://www.testvuln.com?url=//revsuit.com/ssrfa98oni5&p=useless']. Все они могут сработать успешно.
Однако, поскольку в flagFormat правила используется анонимная группировка, платформа будет запрашивать уже полученный flagGroup, в данном случае ssrfa98oni, и отправлять flag клиенту только при его первом появлении, поэтому клиент получит только один флаг: ssrfa98oni1. Это уже доказывает, что параметр url цели уязвим.
В реальных сценариях пентеста некоторые задачи могут быть легко и быстро выполнены за счет комбинирования различных модулей RevSuit. Ниже приведен пример слепого XXE в Java Web, показывающий, как использовать модули HTTP и FTP RevSuit вместе с переменными шаблонов для быстрого сканирования портов.
Сначала создайте HTTP-правило для возврата evil.dtd, настройте ответ на содержимое dtd так, чтобы оно подключалось к FTP-сервису RevSuit, и используйте переменные шаблонов для передачи Host и Port для сканирования через FTP путём их использования в качестве пользователя и пароля FTP.

Затем создайте FTP-правило, которое принимает Host и порт для сканирования из переменных шаблонов пользователя и пароля, и устанавливает их в качестве Pasv Address.

Затем используйте BurpSuit для запуска сканирования, задав параметры host и port в URL-адресе evil.dtd, чтобы установить цель сканирования портов.

Результат работы выглядит следующим образом:

Поскольку соединение FTP будет разорвано, если Passive Address недоступен, можно определить, открыт ли порт, на основе того, нормально ли завершается соединение. В этом примере мы успешно обнаружили, что порты 8005 и 8080 открыты.
Готовится более подробная вики, а пока вы можете исследовать самостоятельно.
Создайте issue или свяжитесь со мной через Weixin: TGk0bjA2Cg==
Этот проект использует код следующих выдающихся проектов:
Спасибо моему другу @E99p1ant за всю помощь и советы, полученные в ходе разработки этого проекта.
@Apache License 2.0