
Упрощенный канал управления и контроля на основе FTP для соединения удаленных систем.
SharpFtpC2 — это небольшой экспериментальный проект, направленный на исследование возможности использования FTP(S) для ретрансляции команд и ответов между двумя удалёнными компьютерами. Он использует протокол FTP в качестве импровизированного туннеля, через который компьютеры, выступающие в роли клиентов, подключённых к FTP-серверу, могут обмениваться данными. Для отслеживания обмена запросами и ответами применяется простая схема управления сеансами.
SharpFtpC2 использует базовую систему управления сеансами. Хотя она довольно элементарна, она служит цели синхронизации и соотнесения сообщений, что необходимо для двусторонней связи между удалёнными системами.
Стоит отметить, что этот проект можно без труда портировать, используя системы контроля версий, такие как git, svn или аналогичные протоколы.
Если вас интересуют тонкости сетевого взаимодействия или вы просто хотите поэкспериментировать с C# и .NET Core, SharpFtpC2 может стать интригующей отправной точкой. Не ждите отполированного драгоценного камня, но, возможно, вы узнаете что-то интересное, возясь с ним.
SharpFtpC2 — это экспериментальный проект, созданный в образовательных целях для исследования использования FTP(S) в качестве канала связи между двумя удалёнными компьютерами. Важно понимать, что проект задуман как учебный ресурс для людей, интересующихся сетевым взаимодействием, C#, симуляцией противника, Red Team и вредоносным ПО. Как создатель, я настоятельно прошу не отправлять запросы на добавление новых функций и не использовать этот проект для каких-либо форм оружия или вредоносных целей. Основное намерение — образовательное, и пользователи должны взаимодействовать с содержимым ответственно и этично.
SharpFtpC2 родился из желания внести вклад в проект Unprotect, особенно в его категорию Network Evasion.
Идея использования FTP в качестве «туннеля» имеет глубокие корни. На самом деле, она вызывает приятные воспоминания примерно с 2005 года, когда я ещё только начинал осваивать программирование. Тогда я познакомился с невероятно креативным французом, который работал под псевдонимом BlasterWar. Он придумал проект под названием BlasterX, который, хотя и канул в лету, был довольно авангардным для своего времени.
Гениальность BlasterWar в его проекте заключалась в том, чтобы предложить альтернативу традиционному обратному соединению, когда агенту необходимо установить соединение с управляющим или взламывающим устройством.
Вместо этого BlasterWar решил использовать FTP (File Transfer Protocol) в качестве альтернативного носителя и построил вокруг этого полноценный инструмент удалённого доступа. Инструмент включал такие функции, как захват экрана, кейлоггинг и управление системой, передаваемые через FTP-туннель. В то время FTP был очень популярен, и множество сайтов предлагали бесплатные FTP-серверы для всех желающих. Это делало его идеальной альтернативой обратным или прямым соединениям, которые требовали проброса портов. Кроме того, это обеспечивало дополнительный уровень маскировки для командного центра (C2), так как IP-адрес машины хакера не раскрывался напрямую.
Сегодня использование FTP в качестве туннеля не является новой концепцией, так как некоторые фреймворки для управления и контроля (C2) приняли этот протокол. Однако использование FTP таким образом сопряжено с рисками. В частности, передача учётных данных в открытом виде по сети, а также необходимость для обеих сторон иметь эти учётные данные, делает его уязвимым для множества атак. Хотя FTP-серверы добились определённого прогресса в решении этих проблем безопасности, всё чаще внедряя FTPS, который использует шифрование SSL/TLS, это не стало панацеей от всех присущих рисков.
Проявив немного изобретательности и черпая вдохновение из существующих протоколов, можно преодолеть значительную часть существующих рисков.
Для компиляции этого проекта вам понадобятся два компонента: Visual Studio и зависимость для контроллера под названием CommandLineUtils.
Поскольку этот проект использует .NET Core, его можно легко скомпилировать для различных платформ без необходимости изменения кода. Однако вам может потребоваться реализовать определённые функции, характерные для целевой платформы.
Чтобы быстро начать тестирование этого проекта, я рекомендую использовать Docker с образом stilliard/pure-ftpd. Этот образ поддерживает множество опций, позволяя вам легко и быстро настроить собственный FTP-сервер.
docker pull stilliard/pure-ftpd
docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST: 127.0.0.1" -e "ADDED_FLAGS=-E -A -X -x" -e FTP_USER_NAME=dark -e FTP_USER_PASS=toor -e FTP_USER_HOME=/home/dark stilliard/pure-ftpd
docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST: 127.0.0.1" -e "ADDED_FLAGS=-E -A -X -x --tls=2" -e FTP_USER_NAME=dark -e FTP_USER_PASS=toor -e FTP_USER_HOME=/home/dark -e "TLS_CN=localhost" -e "TLS_ORG=maislaf" -e "TLS_C=FR" stilliard/pure-ftpd
Не стесняйтесь настраивать параметры по своему усмотрению. Однако я настоятельно рекомендую не открывать этот тестовый FTP-сервер для локальных или общедоступных сетей. Разумнее ограничить доступ к этому контейнеру только вашей хост-машиной.
Опция ADDED_FLAGS позволяет точно настроить сервер pure-ftpd. Объяснения всех флагов можно найти здесь.
Некоторые флаги могут потребовать изменения работы протокола C2. Например, если вы используете опцию -K для сохранения всех файлов, возможность удаления файлов через FTP будет отключена. Поскольку текущий протокол C2 использует эту функцию, вам, возможно, придётся рассмотреть альтернативные подходы, такие как переименование или перемещение файлов.
Для обеспечения целостности и конфиденциальности всех сообщений между агентами и C2 шифрование было бесшовно внедрено в протокол связи с использованием алгоритмов RSA и AES-GCM с длиной ключа 256 бит. Основная цель этой функции — предотвратить возможность передачи вредоносных команд скомпрометированным FTP-сервером. Благодаря шифрованию внедрение команд становится невозможным без доступа к открытому ключу агента. Аналогично нельзя подделать ответы агента без possession открытого ключа C2.
Чтобы упростить процесс генерации собственных пар ключей (одна пара для агента и одна для C2), я включил сторонний инструмент под названием RSAKeyHelper. Каждый раз при запуске приложения он будет показывать свежесгенерированную пару открытого и закрытого ключей, которые можно использовать в программе, если вы решите применить шифрование.

Чтобы убедиться, что всё работает как задумано, я также встроил в тот же инструмент функцию, позволяющую тестировать шифрование строк.

Выпуск версии «3.0 Final» означает завершение этого проекта. Я не буду добавлять новые функции; цель этого PoC заключалась в демонстрации создания надёжного и безопасного C2 с использованием FTP(S). Вы можете разработать свою версию с необходимыми функциями. В качестве упражнения можно рассмотреть реализацию многопоточной обработки задач, чтобы предотвратить зависание приложения во время длительных операций.
Тем не менее, я продолжу оказывать поддержку проекта в плане устранения возможных ошибок или возможностей оптимизации.
(Список агентов)

(Выполнение команды активному (контекстному) агенту)

(Окно отладки консоли агента с подтверждением опасного действия пользователем)
