Настройка цели:

Еще достаточно много внешних и внутренних сетевых узлов находятся под угрозой старой критической уязвимости, идентифицированной как CVE-2019-0708, также известной как BlueKeep. Согласно первоначальному сообщению Microsoft®, уязвимость была обнаружена в службе RDS (Remote Desktop Service), доступ к которой осуществляется через протокол RDP (Remote Desktop Protocol), и затрагивает следующие версии Windows: Windows 2000, Windows 2003, XP, Vista, Windows 7, Windows Server 2008 и Windows Server 2008/R2. Степень риска составляет 9,8 из 10, что делает уязвимость критической.

Microsoft® предупредила, что BlueKeep - это критическая уязвимость Remote Code Execution с предварительной аутентификацией, и для ее успешной эксплуатации не требуется вмешательство пользователя.

RDP по умолчанию имеет открытый порт 3389: злоумышленники могут удаленно воспользоваться этой уязвимостью, отправляя специально созданные пакеты на целевую машину через порт 3389. Успешная эксплуатация может привести к беспрепятственному доступу к целевым компьютерам (выполнению произвольного кода с максимальными привилегиями) или отказу в обслуживании (BSOD).

Можно увидеть по статистике из шодана, что данная вулна до сих пор актуальна по всему миру.

В ЧЕМ УНИКАЛЬНОСТЬ ЭТОЙ УГРОЗЫ? BlueKeep - это уязвимость «use-after-free» в драйвере ядра Windows под названием termdd.sys, используемом протоколом RDP (Remote Desktop Protocol). Соединение по RDP начинается с пары последовательных сообщений. На экране показано полное рукопожатие между клиентом и сервером.

[Client] --------X.224 Connection Request------------> [Server]
[Client] <-------X.224 Connection Confirm------------- [Server]
[Transport may switch over to TLS at this point]
[Client] --------MCS Connect Initial and GCC Create--> [Server]
[Client] <-------MCS Connect Response and GCC Response- [Server]
[Client] --------MCS Erect Domain Request------------> [Server]
[Client] --------MCS Attach User Request-------------> [Server]
[Client] <-------MCS Attach User Confirm-------------- [Server]
[Client] --------MCS Channel Join Request------------> [Server]
[Client] <-------MCS Channel Join Confirm------------- [Server]
[Client] --------Security Exchange-------------------> [Server]
[Client] --------Client Info-------------------------> [Server]
[Client] <-------License Error------------------------ [Server]
[Client] <-------Demand Active------------------------ [Server]
[Client] --------Confirm Active----------------------> [Server]
[Client] --------Synchronize-------------------------> [Server]
[Client] --------Control - Cooperate-----------------> [Server]
[Client] --------Control - Request Control-----------> [Server]
[Client] --------Persistent Key List----------------> [Server]
[Client] --------Font List--------------------------> [Server]
[Client] <-------Synchronize-------------------------- [Server]
[Client] --------Control - Cooperate-----------------> [Server]
[Client] <-------Control - Granted Control------------ [Server]
[Client] <-------Font Map----------------------------- [Server]

Уязвимость связана с запросом «MCS Connect Initial and GCC Create», который содержит информацию, связанную с безопасностью, информацию о создании виртуальных каналов и другие поддерживаемые возможности клиента RDP. Протокол RDP поддерживает статические виртуальные каналы, которые предназначены для использования в качестве каналов связи для различных компонентов RDP и пользовательских расширений. Эти каналы известны по их 8-байтовым именам и включают стандартные каналы, предлагаемые Microsoft, такие как «rdpdr» (перенаправление), «rdpsnd» (звук) и «cliprdr» (обмен буфером обмена), а также другие.Microsoft® создает два канала по умолчанию: MS_T120 (используется для самого RDP) и CTXTW (используется в Citrix ICA). Клиенты не должны создавать их по сети; вместо этого они инициализируются внутри системы Windows RDP при установлении соединения.

Виртуальные каналы создаются с помощью функции IcaCreateChannel() внутри драйвера termddkernel, которая сначала проверяет, существует ли конкретный канал. Если он не существует, то для его создания выделяется структура канала.

Указатель на структуру канала, которую мы называем ChannelControlStructure, хранится в таблице, также известной как ChannelPointerTable. Все RDP-соединения начинаются с такого представления ChannelPointerTable (первые пять слотов не контролируются пользователем и поэтому не отображаются. Вместо этого слот под номером 0 принимается за первый записываемый клиентом канал):

Slot Number    ChannelControlStructure pointer
-----------    ------------------------------
0              Empty
1              Empty
2              Empty
3              Empty
4              Empty
5              Empty
6              Empty
7              Pointer to CTXTW
8              Empty
...
0x1F           Pointer to MS_T120

Как видно из таблицы, каждый слот может хранить указатель ChannelControlStructure. Когда RDP-клиент подключается и открывает каналы, создаются соответствующие ChannelControlStructures, а их указатели хранятся в ChannelPointerTable, начиная со слота 0. Обратите внимание, что CTXTW всегда присутствует в слоте 7, а MS_T120 в слоте 0x1F.Если указан канал с именем «MS_T120\x00» (например, в слоте 10), IcaCreateChannel() вызывает IcaFindChannelByName() и возвращает ChannelControlStructure, на которую указывает структура MS_T120 в слоте 0x1F. Этот указатель (тот же, что и в слоте 0x1F) сохраняется в указанном пользователем слоте. После этого, когда каналы открываются с помощью «MCS Channel Join Request», канал MS_T120 также успешно открывается. Если злоумышленник отправляет в канал MS_T120 поддельные данные, termdd.sys пытается ответить на сообщение, отправляя сообщение об ошибке и закрывая канал с помощью IcaCloseChannel(), которая в свою очередь вызывает_IcaFreeChannel(), освобождая структуру MS_T120 ChannelControlStructure и очищая указатель на контролируемый пользователем слот в ChannelPointerTable. Однако тот же указатель в слоте 0x1F не очищается. Впоследствии при разрыве соединения вызывается RDPWD!SignalBrokenConnection(), которая, в свою очередь, вызывает IcaChannelInputInternal() и пытается записать в освобожденную структуру ChannelControlStructure указатель в слоте 0x1F. Это приводит к возникновению условия use-after-freecondition.

Нашей целью была устаревшая 64-разрядная машина Windows 2008 R2, установленная на Virtual Box 6.

Untitled

Untitled

Вот вывод системной информации:

Untitled

Целевая виртуальная машина имела следующие свойства:

2 ГБ ОЗУ
1 ядерный процессор
Жесткий диск объемом 30 ГБ

Подготовка к эксплуатации: