
PoC для запуска переполнения буфера через CVE-2020-0796
./CVE-2020-0796.py servername
Этот скрипт подключается к целевому хосту и сжимает запрос аутентификации с установленным некорректным полем offset в заголовке преобразования, что приводит к переполнению буфера в декомпрессоре и падению целевой системы.
Он содержит модификацию отличного smbprotocol с добавленной поддержкой сжатия/декомпрессии SMB 3.1.1 (только LZNT1). Большинство дополнений находятся в smbprotocol/connection.py. Включена версия lznt1, модифицированная для поддержки Python 3.
Заголовок преобразования сжатия находится в классе SMB2CompressionTransformHeader. Функция _compress вызывается для сжатия запросов дерева. Именно здесь поле offset устанавливается в максимальное значение для инициирования падения.
def _compress(self, b_data, session):
header = SMB2CompressionTransformHeader()
header['original_size'] = len(b_data)
header['offset'] = 4294967295
header['data'] = smbprotocol.lznt1.compress(b_data)
CVE-2020-0796 – это ошибка в новой возможности сжатия SMB3 в Windows 10 1903/1909. Протокол SMB версии 3.1.1 вводит возможность для клиента или сервера объявлять возможности сжатия и выборочно сжимать сообщения SMB3 по необходимости. Для этого при согласовании сеанса SMB клиент и сервер должны включить SMB2_COMPRESSION_CAPABILITIES, как описано в MS-SMB2 2.2.3.1.3.
После согласования сеанса с этой возможностью клиент или сервер могут выборочно сжимать определённые сообщения SMB. Для этого весь пакет SMB сжимается, а в начало добавляется преобразованный заголовок, как описано в MS-SMB2 2.2.42. Этот заголовок представляет собой небольшую структуру (16 байт) с магическим значением, размером несжатых данных, используемым алгоритмом сжатия и значением смещения.
CVE-2020-0796 вызвана отсутствием проверки границ этого размера смещения, который напрямую передаётся в несколько подпрограмм. Передача большого значения приводит к переполнению буфера и падению ядра. При дальнейшей доработке это может быть развито в эксплойт для удалённого выполнения кода (RCE).