За последние годы ландшафт вредоносного ПО заметно изменился. Всё реже атакующие пишут «классические» трояны с самописными протоколами и агрессивной обфускацией. Всё чаще они используют легитимные инструменты, написанные на современных языках и предназначенные для DevOps-задач, удалённого администрирования и проброса портов.

Один из таких примеров — бинарник open.exe, написанный на Go и формально являющийся клиентом сервиса Openport. В рамках расследования инцидента этот файл был обнаружен в роли постоянного агента удалённого доступа, что делает его типичным представителем класса dual-use malware.

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

Хеши исследуемого образца

  • MD5: 212AEBCC151CCE67FCC3D9F2AE6FC2C6

  • SHA-1: B86913F78023426FE6F2BD441AE288340F360845

  • SHA-256:
    AE34DA228224B0B28D8842D20D2674AFD4229789244D9863B4DCA0ED49AB1B4F

Первое впечатление: ничего подозрительного?

На первый взгляд open.exe не выглядит как вредонос:

  • бинарник не упакован;

  • отсутствует обфускация строк;

  • имена функций, пакетов и логов читаемы;

  • используются популярные Go-библиотеки с GitHub;

  • присутствует CLI с документацией.

Именно за счёт этого такие инструменты часто проходят мимо сигнатурных средств защиты — они выглядят как обычное инфраструктурное ПО.

Общая архитектура

open.exe — это Go-клиент Openport, предназначенный для:

  • поднятия прямых и обратных TCP-туннелей;

  • управления сессиями через WebSocket и HTTP/2;

  • проброса портов через SSH;

  • автоматического восстановления соединений;

  • работы через прокси (включая SOCKS5).

В легитимном сценарии это удобно для разработчиков. В атаке — идеально подходит для роли C2-агента.

Используемые зависимости

В бинарнике явно присутствуют следующие пакеты:

  • github.com/openportio/openport-go

  • github.com/gorilla/websocket

  • golang.org/x/crypto/ssh

  • golang.org/x/net/proxy

  • github.com/jinzhu/gorm

  • github.com/sirupsen/logrus

  • gopkg.in/natefinch/lumberjack.v2

  • github.com/spf13/pflag

Отдельно стоит отметить отсутствие кастомных криптографических реализаций — всё построено на стандартных и проверенных библиотеках.

Инициализация и работа с файловой системой

При запуске open.exe выполняет стандартный bootstrap:

  • создаёт домашние каталоги (EnsureHomeFolderExists);

  • генерирует криптографические ключи (CreateKeys);

  • создаёт конфигурационные файлы через os.Create;

  • инициализирует локальную базу данных;

  • настраивает логирование с ротацией (lumberjack).

В бинарнике встречаются строки вида:

Created directory %s

Важно: никаких эксплойтов, подмен системных файлов или попыток эскалации прав здесь нет. Всё выглядит как обычная инициализация сервиса.

Хранение состояния: SQLite внутри агента

Для хранения состояния используется SQLite. Это ещё один признак «нормального» софта, но именно здесь кроется важная деталь.

В базе данных хранятся:

  • активные туннели;

  • параметры сессий;

  • история подключений;

  • флаги автоперезапуска.

Реализованы методы:

  • InitDB

  • Save

  • DeleteSession

  • GetSession

  • GetAllActive

  • GetSessionsToRestart

  • EnrichSessionWithHistory

База перечитывается при старте, что позволяет восстанавливать удалённый доступ после перезагрузки системы без классических механизмов автозапуска.

Сетевое взаимодействие: как выглядит C2

Протоколы

open.exe использует сразу несколько стандартных протоколов:

  • WebSocket (WSS) — основной канал управления;

  • HTTP/2 — подтверждается сигнатурами PRI * HTTP/2.0;

  • TLS — с поддержкой session tickets;

  • SSH — для форвардинга и keep-alive.

В бинарнике присутствуют строки, связанные с TLS-рукопожатием:

  • key expansion

  • client finished

  • server finished

  • unable to generate random session ticket key

Это обычная TLS-логика, но для средств мониторинга трафика такой канал выглядит как обычный зашифрованный HTTPS.

Туннели и управление каналами

Ключевые функции:

  • Connect

  • CreateTunnel

  • ForwardPort

  • InitForward

  • StartReverseTunnel

  • KeepAlive

Поддерживаются:

  • прямые и обратные туннели;

  • отмена форвардинга (cancel-tcpip-forward);

  • автоматический рестарт соединений.

Фактически агент предоставляет оператору полноценный удалённый сетевой доступ к хосту.

Локальные управляющие HTTP-эндпоинты

Интересная деталь — open.exe поднимает локальные служебные эндпоинты:

Они используются для получения информации о состоянии агента и корректного завершения работы. Для защиты это дополнительный поведенческий индикатор.

Регистрация и привязка к инфраструктуре

В бинарнике явно присутствует ссылка:

https://openport.io/user/keys

Регистрация агента осуществляется через токен. После регистрации система привязывается к аккаунту, и оператор получает возможность:

  • создавать и удалять туннели;

  • просматривать активные сессии;

  • перезапускать соединения;

  • управлять несколькими хостами централизованно.

CLI: удобство, которое работает против защиты

open.exe — это полноценная CLI-утилита с командами:

  • forward

  • list

  • restart-sessions

  • kill

  • kill-all

  • register <token>

  • register-key <token>

  • rm

  • version

Поддерживаются флаги вроде --restart-on-reboot, что превращает агент в персистентный компонент, даже без автозагрузки через реестр или планировщик.

Почему это можно считать вредоносом

Важно подчеркнуть: Openport сам по себе не является вредоносным ПО.
Однако в анализируемом случае он:

  • был установлен без ведома пользователя;

  • использовался для постоянного удалённого доступа;

  • работал как C2-агент;

  • маскировался под служебный компонент;

  • не требовал эксплуатации уязвимостей.

Это классический пример dual-use malware и подхода Living-off-the-Land.

Признаки компрометации (IoC)

Процессы

  • open.exe

Файлы

  • каталоги Openport (home/config)

  • SQLite-база с сессиями

  • логи lumberjack

Сеть

  • TLS/WSS-соединения с инфраструктурой openport.io

  • локальные эндпоинты /info, /exit

Поведение

  • автоматическое восстановление туннелей

  • отсутствие файлов-дропперов

  • длительные зашифрованные соединения

Почему таких инструментов будет больше

Go-утилиты вроде open.exe идеально подходят атакующим:

  • кроссплатформенность;

  • статическая сборка;

  • минимум зависимостей;

  • нормальный TLS;

  • легитимный сетевой профиль;

  • отсутствие «красных флагов» в коде.

Для защитников это означает одно: сигнатурный подход больше не работает. Важнее контекст, поведение и понимание того, зачем процессу нужен тот или иной функционал.

Заключение

open.exe — отличный пример того, как современное вредоносное ПО перестаёт выглядеть как вредоносное. Это не эксплойт, не троян и не вирус в классическом понимании, а аккуратно встроенный инструмент удалённого доступа, использующий доверенные технологии.

Именно такие случаи показывают, что граница между «админским инструментом» и «вредоносом» сегодня проходит не по коду, а по контексту применения.