Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
cve-2017-9822 | Kitploit
Инструменты/GitHubGitHub/tnot123/cve-2017-9822
Анализ уязвимостейАнализ КодаЭксплуатацияОбратная инженерияЭксплуатация веб-приложенийОтладчикиТестирование на ПроникновениеОбучение и ОбразованиеРазработка Полезной НагрузкиЭксплуатация Бинарных ФайловЛаборатории и Практика
10 месяцев назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHub
tnot123/cve-2017-9822

cve-2017-9822

Репозиторий
  • CVE-2017-9822
    • Основная информация
    • Настройка окружения
    • Настройка отладки
    • Анализ
    • Отладка
      • XmlSerializer
      • Gadget атаки
      • ObjectDataProvider
      • ResourceDictionary
      • От xml insecure deserialization к RCE

CVE-2017-9822

DNN (также известный как DotNetNuke) до версии 9.1.1 допускает удалённое выполнение кода через cookie, также известное как "2017-08 (Важно) Возможность удалённого выполнения кода на веб-сайтах DNN".

Основная информация

  • Затронутый продукт: DotNetNuke (DNN Platform) — популярная CMS/портал на .NET.
  • Дата публикации: июль 2017 года.
  • Степень критичности: Critical (CVSS ~9.8).
  • Тип уязвимости: XML External Entity (XXE) / Insecure Deserialization → Remote Code Execution (RCE).
  • Воздействие: до версии 9.1.1 возможно удалённое выполнение кода через cookie

alt

Что такое DotNetNuke?
DotNetNuke — это бесплатная CMS с открытым исходным кодом для веб-сайтов, написанная на C# и основанная на платформе .NET. DotNetNuke очень популярен и широко используется в интернете, поскольку вы можете развернуть веб-версию DNN всего за несколько минут, не имея глубоких технических знаний. Ещё одна важная функция DotNetNuke — возможность создавать или импортировать пользовательские сторонние модули, написанные на VB.NET или C#.
DNN можно установить на стек, включающий Windows Server, IIS, ASP.NET и SQL Server для Windows. DNN также поддерживает регистрацию новых пользователей с подтверждением по email, но для работы этой функции безопасности необходимо настроить корректный SMTP-сервер. Основные функции DNN
• Модульная архитектура: DNN позволяет легко расширяться за счёт установки дополнительных модулей, разработанных сообществом. Администратор может загружать новые модули через интерфейс администратора (загрузка .zip-пакетов) или распаковывать их непосредственно в папку на сервере.
• Управление пользователями: Система предоставляет функции безопасности и детального разграничения прав (роли/разрешения) для порталов и модулей. Учётные записи пользователей, роли и права централизованно управляются в DNN.
• Управление контентом: Поддержка WYSIWYG-редактирования, управление статьями, изображениями, документами и т. д. Имеется система workflow/публикации (публикация материалов по процессу рецензирования) и версионирование контента. Контент хранится в общей базе данных (SQL Server).
• API и расширенная интеграция: DNN предоставляет .NET API для разработчиков, позволяющий создавать пользовательские модули (WebForms, MVC, Razor) и интегрировать внешние сервисы. Множество готовых сторонних библиотек (темы оформления, модули электронной коммерции, форумы и т. д.) позволяют расширять функциональность.
• Интерфейс и темы: Система скинов (тем) отделяет контент от интерфейса, что позволяет гибко проектировать веб-сайты. Сайты, созданные на DNN, могут менять внешний вид путём смены скинов.
• Механизм установки модулей: Модули DNN упаковываются в ZIP-файлы и могут устанавливаться через интерфейс администратора или путём ручной распаковки. DNN поддерживает как скомпилированные модули (.NET DLL), так и динамические модули Razor; любому модулю можно предоставить или запретить доступ через настройки разрешений на каждой странице.

Настройка окружения

Операционные системы: Windows 10
.NET Framework: 4.5.1+
Веб-сервер: Microsoft IIS 10
Сервер базы данных: Microsoft® SQL Server® 2019 Express, SQL Server Management Studio
Версия DotNetNuke: 9.1.0
Для поиска доступных в интернете развёрнутых версий DotNetNuke можно использовать следующие Google dorks и проверить их на сайте:
inurl:dnn.js
inurl:dnn.modalpopup.js
inurl:dnn.servicesframework.js
inurl:dnn.xml.js
inurl:dnncore.js
inurl:/Portals/0/
inurl:/DesktopModules/
inurl:/DNNCorp/
inurl:/DotNetNuke
inurl:/tabid//Default.aspx
inurl:/tabid/
/language/*/Default.aspx
intext:"by DNN Corp "
Для создания окружения можно следовать этой статье

Настройка отладки

Измените атрибуты сборки на «отлаживаемые»; это очень важно, поскольку во время выполнения применяются некоторые оптимизации, которые могут мешать отладке: некоторые точки останова могут не срабатывать, а некоторые переменные — не существовать.
Загрузите DotNetNuke.dll в dnSpy (32 bit), затем выберите Edit Assembly Attributes (C#)

alt

Измените строку
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
на
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]

alt

Затем выберите Compile и сохраните этот модуль обратно в прежнее место.
Далее запустите dnSpy с правами администратора и выберите Debug -> Attach to Process

alt

Выберите процесс w3wp.exe

alt

Причина, по которой для отладки нужно подключиться к этому процессу, в том, что веб-приложения на IIS обычно используют рабочие процессы (worker process). Они обрабатывают веб-запросы, поступающие на веб-сервер IIS, для каждого пула приложений; рабочих процессов на одной машине может быть несколько, и все они называются w3wp.exe. Небольшое примечание: может наступить момент, когда процесс w3wp не запущен, — IIS не запускает рабочие процессы, пока не получит первый веб-запрос.

alt

Вернёмся к отладке: после подключения к процессу выберите: Debug -> Windows -> Modules

alt

Нажмите на один из модулей и выберите Open All Modules

alt

Теперь в окне Assembly можно увидеть все связанные модули

alt

Анализ

Десериализация — это процесс интерпретации байтовых потоков и преобразования их в данные, которые может исполнять приложение.
Основная проблема десериализации в том, что в большинстве случаев она может использовать пользовательские входные данные. Это означает, что вы можете внедрить вредоносные payload'ы в ожидаемый приложением формат и манипулировать логикой, раскрывать данные или даже выполнять код удалённо.
DotNetNuke использует cookie DNNPersonalization для хранения настроек персонализации анонимных пользователей (настройки аутентифицированных пользователей хранятся через их страницу профиля). Согласно отчёту, уязвимость находится в обработке cookie DNNPersonalization. Этот cookie используется для загрузки профиля пользователя, однако его можно вызвать без аутентификации при обращении к несуществующей странице (ошибка 404). Точка входа этой уязвимости находится в функции LoadProfile модуля DotNetNuke.dll; декомпилируем этот модуль с помощью dnSpy и проанализируем подробнее:
В PersonalizationController#LoadProfile(int, int)

alt

Если userId не равен null, переменная text получит значение cookie DNNPersonalization из запроса, после чего будет вызвана Globals#DeserializeHashTableXml

alt

Globals#DeserializeHashTableXml вызывает XmlUtils#DeSerializeHashtable

alt

Процесс обработки выглядит следующим образом:

  • LoadXml из xmlSource
  • Проходит по каждому узлу item в корневом profile.
  • Для каждого item берёт тип объекта, определённый на основе атрибута type, и инициализирует XmlSerializer в соответствии с этим типом объекта, как в строках 160-161
  • Десериализует этот элемент в объект в строке 163 и сохраняет его в hashtable
  • Возвращает hashtable
    Мы полностью контролируем значение cookie DNNPersonalization, поэтому можем изменять десериализуемый объект.

Отладка

Используем Burp для отправки запроса, вызывающего статус 404 + cookie DNNPersonalization

alt

Здесь видно, что функция обработки 404 — Handler404OrException — запустила цепочку вызовов и обратилась к Personalization.LoadProfile(int,int).

alt

В приведённом выше коде примечательно условие if, проверяющее, аутентифицирован ли текущий запрос (IsAuthenticated), хотя очевидно, что отправленный нами запрос был неаутентифицированным и направлялся к несуществующей точке входа. Так почему же текущий запрос выполняется как аутентифицированный пользователь?
Продолжаем отладку: в конце стека, в AdvancedUrlRewriter#Handle404OrException, виден блок else if следующего вида:

alt

Здесь проверяется, равен ли context.User текущего запроса null; если это так, context.User присваивается пользователь текущего потока. Установив точку останова, можно увидеть следующий результат:

alt

Теперь переменная IsAuthenticated имеет значение true, а пользователь, назначенный запросу, — это пользователь текущего потока, принадлежащий группе IIS APPPOOL сервера IIS, поэтому запрос выполняется как аутентифицированный. Эта логика существует потому, что обработчик 404 вызывается до того, как устанавливается HttpContext.User, а дальнейший поток обработки зависит от User.IsAuthenticated; чтобы избежать ошибок NullReference, разработчики присваивают объекту User объект WindowsPrincipal текущего потока.

XmlSerializer

XmlSerializer — это собственный класс сериализации Microsoft, используемый для преобразования между строками и XML-объектами. Его namespace: System.Xml.Serialization.
Пример использования XmlSerializer:

alt

alt

Условие атаки RCE через XmlSerializer — обязательный контроль над типом данных, передаваемым в конструктор XmlSerializer. То есть типы данных, ведущие к gadget, должны быть переданы в свойство XmlSerializer.mapping

Gadget атаки

Самый популярный gadget для атаки на десериализацию XML — ObjectDataProvider. Этот gadget можно создать с помощью инструмента ysoserrial .net

ObjectDataProvider

По сути, используя этот класс, можно вызвать любой метод любого класса.

alt

Например, мы можем вызвать Process.Start с параметрами, как показано ниже:
ObjectDataProvider o = new ObjectDataProvider(); o.MethodParameters.Add("cmd.exe"); o.MethodParameters.Add("/c calc"); o.MethodName = "Start"; o.ObjectInstance = new Process(); Console.ReadKey();
Создадим XML payload для десериализации с приведённым выше кодом:

alt

alt

ResourceDictionary

ResourceDictionary используется для разработки WPF, а поскольку это WPF, он должен использовать язык XAML. Сначала рассмотрим payload, использующий ResourceDictionary для выполнения команд.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:b="clr-namespace:System;assembly=mscorlib" xmlns:c="clr-namespace:System.Diagnostics;assembly=system"> <ObjectDataProvider d:Key="" ObjectType="{d:Type c:Process}" MethodName="Start"> <ObjectDataProvider.MethodParameters> <b:String>cmd</b:String> <b:String>/c calc</b:String> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </ResourceDictionary>
Объяснение этого XAML:

  1. xmlns:c ссылается на namespace System.Diagnostics и обозначает его как c
  2. d:Key="" — пустое имя. В синтаксисе XAML значение ключа Key обязательно.
  3. ObjectType представляет тип объекта
  4. d:Type эквивалентен typeof()
  5. MethodName — это свойство ObjectDataProvider. Передача значения Start эквивалентна вызову метода Start.
  6. c:Process эквивалентен System.Diagnostics.Process
    После полного разбора XAML это эквивалентно созданию объекта ObjectDataProvider, который автоматически вызовет System.Diagnostics.Process.Start("cmd.exe","/c calc")

alt

Выполнение приведённого выше кода эквивалентно ObjectDataProvider -> Person.Evil(). Если выполнять атаку RCE через XmlSerializer, поток будет выглядеть так: ObjectDataProvider -> XamlReader.Parse() -> ObjectDataProvider -> System.Diagnostics.Process.Start("cmd.exe","/c calc")

От xml insecure deserialization к RCE

Теперь цель — найти объект, который может выполнять код при десериализации. В POC функция PullFile из DotNetNuke.Common.Utilities.FileSystemUtils используется для эксплуатации "arbitrary file upload"

alt

alt

Получаем obj.xml:

alt

Отправляем payload

alt

alt

После того как DNN десериализует cookie, на HTTP-сервере появляется запрос к /cmd.aspx — десериализация прошла успешно, веб-шелл загружен на DNN

alt

Аналогичным образом можно использовать функцию WriteFile из DotNetNuke.Common.Utilities.FileSystemUtils для чтения файла

alt

alt

Скачать инструмент