Как протокол RDP (почти) вырвался из проприетарного рабства

cqf_1ioiklyfedgnfwxomwcfyym.png


Remote Desktop Protocol (протокол удалённого рабочего стола, RDP) — проприетарный протокол, разработанный Microsoft примерно в 1998 году. Начиная с XP каждая версия Windows включает системный компонент mstsc.exe.

Благодаря RDP, можно подключиться к другой системе и работать за ней словно за своим компьютером. То же самое делают, например, AnyDesk и TeamViewer, у которых протоколы схожей функциональности.

▍ Как работает RDP


В общих словах, базовая функция протокола удалённого рабочего стола — передача видеопотока от сервера клиенту. На сервере стоит устройство видеозахвата, которое записывает видео, сжимает его кодеком H.264 — и отправляет клиенту с минимальной задержкой по TCP/IP.

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

r7qpyqq-d_uz1uv7mucag4ifzyg.png
Информация между клиентом и сервером в RDP передаётся параллельно по тысячам виртуальных каналов

На сервере RDP использует собственный видеодрайвер для рендеринга вывода изображения на экран, внедряя информацию о рендеринге в сетевые пакеты с помощью протокола RDP и отправляя их по сети на клиент. На клиенте RDP получает данные рендеринга и интерпретирует пакеты в соответствующие вызовы API интерфейса графических устройств Microsoft Windows (GDI). На сервере у RDP собственный драйвер клавиатуры и мыши для приёма этих событий от клиента.

В сеансе удалённого рабочего стола все переменные среды — например, определяющие глубину цвета, включение и отключение обоев — определяются настройками отдельного соединения RCP-Tcp. Все функции и методы для описания переменных описаны в справочнике по веб-подключению к удалённому рабочему столу и интерфейсе поставщика WMI служб удалённых рабочих столов.

Если вдаться в детали, то в рамках стека RDP интерес представляют четыре ключевых компонента:

  • служба многоточечной связи (MCSMux)
  • Generic Conference Control (GCC)
  • Wdtshare.sys — драйвер для передачи пользовательского интерфейса, сжатия, шифрования, кадрирования и т. д.
  • Tdtcp.sys — транспортный драйвер для упаковки контента RDP в пакеты TCP/IP


MCSmux и GCC являются частью семейства стандартов T.120 Международного союза электросвязи (ITU). В частности, MCSmux представляет два стандарта:

  • T.122: Определяет многоточечные услуги
  • T.125: Определяет протокол передачи данных


5mn6vlrlgs_ebcu0o6lshjhs1ns.png
Стек протоколов

MCSMux управляет:

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


Примерно так работает система, в двух словах. И, видимо, не только RDP, но и во всех остальных программах для удалённого управления компьютером, в том числе в проприетарных протоколах AnyDesk или TeamViewer.

▍ Версии RDP


Microsoft продолжает планомерно дорабатывать протокол RDP. В последние годы версии RDP соответствую версиям операционной системы, с которой он выходит.

Например, версия 7.0 вышла вместе с Windows 7 и Windows Server 2008 R2, версия 8 — с Windows 8 и Windows Server 2012 и так далее. Ниже небольшая табличка с перечислением нескольких последних версий RDP и новых функций для каждой. Что характерно, большинство новых функций RDP было доступно только в версиях Windows Enterprise or Ultimate.

Актуальная версия RDP — 10.0.

Как видим, в серверных версиях Windows RDP гораздо функциональнее, чем в клиентских. Кстати, это касается и некоторых других компонентов Windows. Это одна из причин, почему админы часто ставили Windows Server даже на персоналки. Они тогда говорили, что Windows Server 2012 даже работает стабильнее, чем обычная Windows 7, почти никогда не падает.

В Windows 10/11 стабильность клиентских версий Windows повысили, так что эта проблема уже не так актуальна. Сейчас про «синий экран смерти» мало кто вспоминает (тем более он уже не синий), а раньше BSOD случался чуть ли не ежедневно от банальных причин…

Впрочем, мы отвлеклись.

▍ Официальный клиент


Как уже говорилось — начиная с Windows XP, все версии Windows включают системный компонент службы терминалов mstsc.exe. Вызвать его можно прямо из консоли. Команда mstsc.exe /? выводит справку:

9jo0rngicbpmxsdy2x9xex7sl7a.png


В справке перечислены все допустимые параметры и команды mstsc.exe. Количество параметров зависит от версии операционной системы (см. таблицу выше). Как видим, все команды можно вводить в консоли, то есть работать с клиентом полностью из командной строки. Например:

mstsc /v:192.168.1.1

mstsc /w:1024 /h:768

mstsc /edit D:\RDPfiles\user2.rdp — редактировать параметры удалённого подключения в файле D:\RDPfiles\user2.rdp.

Как понятно из последней команды, все настройки подключения хранятся в файле .rdp, так что их легко переносить с компьютера на компьютер, просто копируя файл.

Если запустить из командной строки mstsc.exe, то откроется окошко с графическим интерфейсом.

v6kgn02blmrwk2r1ilbo96bb9uo.png


В этом GUI доступны все основные параметры запуска, как из командной строки. Хотя в консоли всё-таки свободы больше: например, можно установить произвольный размер окна для удалённого рабочего стола, а не выбирать из ограниченного списка шаблонов.

6vdaw6a1-xeeyyche8kvuj9ged8.png


▍ Свободные реализации


Хотя протокол сугубо проприетарный, существует множество сторонних реализаций клиентов и серверов RDP, которые отличаются от проприетарного оригинала Microsoft. К сожалению, из-за закрытости протокола они реализуют не всю функциональность RDP.

Из интересных проектов можно упомянуть Xdrp — опенсорсный RDP-сервер под Linux. Xrdp обеспечивает графический вход на удалённые машины по RDP и принимает соединения от различных клиентов:

  • FreeRDP
  • rdesktop
  • KRDC
  • NeutrinoRDP
  • Windows MSTSC (Microsoft Terminal Services Client, он же mstsc.exe), то есть нативный клиент, описанный выше
  • Microsoft Remote Desktop (находится в Microsoft Store, отличается от MSTSC).


Многие из них работают на некоторых или всех ОС Windows, Mac OS, iOS и/или Android.

Транспорт RDP по умолчанию шифруется с помощью TLS.

baqbmtxbop7wpdm5aqw8wtuljsw.gif

Кроме доступа к удалённому рабочему столу Linux, поддерживается и доступ к удалённым ресурсам, включая двустороннюю передачу клипборда, редирект звука, микрофона и диска (монтирование локальных дисков на удалённый компьютер).

В описании Xrpd упомянуты популярные опенсорсные RDP-клиенты: FreeRDP (macOS, Windows, Linux), rdesktop, KRDC, NeutrinoRDP. Есть десяток GUI-клиентов поверх rdesktop, коммерческий клиент Thincast на базе FreeRDP, а также GTK-клиент Remmina.

▍ Уязвимости


В связи со сложностью проприетарного протокола и внедрением новых функций и закрытым исходным кодом в RDP постоянно находят новые уязвимости. Обычно это критические уязвимости с удалённым исполнением кода. Конечно, RDP притягивает злоумышленников, ведь дыра в нём почти сразу предоставляет полный доступ к удалённому компьютеру. Наверное, и сейчас существуют 0day-уязвимости в RDP, о которых не сообщают общественности, но знающие люди ими пользуются.

В целом же приятно видеть, что проприетарный протокол Microsoft обрастает опенсорсным софтом и библиотеками, так что постепенно интегрируется в открытую экосистему — и выбирается из проприетарного рабства. В рамках новой политики Microsoft по поддержке Open Source можно ожидать, что она и сама когда-нибудь откроет исходный код RDP.

hc88sbzi7apcmcvqt2icby4azas.jpeg

© Habrahabr.ru