
Разбор машины Steel Mountain с TryHackMe.com и эксплойт для CVE-2014-6287
Разбор по машине Steel Mountain с TryHackMe.com и эксплойт для CVE-2014-6287
Я не присваиваю себе заслуги за первоначальное обнаружение и эксплуатацию этой уязвимости. Спасибо следующим людям!
Обнаружение: Daniele Linguaglossa
Автор модуля Metasploit: Muhamad Fadzil Ramli
Комната TryHackMe и автор: https://tryhackme.com/room/steelmountain https://tryhackme.com/p/tryhackme
Ссылки: https://nvd.nist.gov/vuln/detail/CVE-2014-6287 https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/http/rejetto_hfs_exec.rb https://subscription.packtpub.com/book/networking_and_servers/9781786463166/1/ch01lvl1sec20/vulnerability-analysis-of-hfs-2-3 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6287 https://www.tutorialspoint.com/pascal/pascal_functions.htm
Я ни в коем случае не опытный специалист по безопасности. Это значит, что я могу предоставить неверную информацию. Если вы опытный специалист/исследователь и видите что-то некорректное, пожалуйста, сообщите мне, чтобы я мог вернуться, изучить свои ошибки и предоставить правильную информацию. Это будет полезно и мне, и другим начинающим исследователям, которые могут наткнуться на этот разбор. Если вы найдёте неверную информацию, которую я написал, свяжитесь со мной по адресу [email protected], чтобы я мог её исправить. Спасибо!
Rejetto file server (также известный как HFS) — это программа для обмена файлами, используемая для публикации и обмена файлами по сети. В версии 2.3 была обнаружена уязвимость, которая позволяла злоумышленнику выполнять системные команды, вставляя нулевой байт в параметр поиска, как описано в CVE-2014-6287. Код некорректно обрабатывает нулевой байт в своей конфигурации регулярных выражений (RegEx), что приводит к удалённому выполнению кода.
Уязвимость находится в функции findMacroMarker, которая происходит из файла parserLib.pas. Расширение .pas — это расширение файлов для языка программирования Pascal. На момент написания этого текста я ничего не программировал на Pascal. Давайте посмотрим на фрагмент кода и разберём, что он делает!
function findMacroMarker(s:string; ofs:integer=1):integer; begin result:=reMatch(s, '{[.:]|[.:]}||', 'm!', ofs) end;
Первая строка кода — это объявление функции с именем findMacroMarker, которая принимает два параметра. В Pascal тип данных параметров должен быть объявлен, поэтому s:string означает, что переменная s является строкой (string). То же самое для переменной ofs с типом integer. Справа от параметров мы видим двоеточие, за которым следует integer. Это называется типом функции. Точка с запятой обозначает конец этой строки кода. Первое слово в следующей строке кода — begin. Оно сообщает компилятору, где начинается функция. Далее мы видим переменную с именем result, за которой следует оператор присваивания :=. Переменная result присваивается функции reMatch. Мне не удалось найти ничего о reMatch в интернете, поэтому я предполагаю, что это пользовательская функция, написанная где-то ещё в HFS. К счастью для нас, функция говорит сама за себя. reMatch явно является сокращением от "regular expression match" (соответствие регулярному выражению), за которым следует шаблон регулярного выражения, который она ищет. Этот шаблон указывается в параметрах функции , а также в исходных параметрах переменных, определённых в первой строке кода. В конце второй строки используется слово , чтобы обозначить для компилятора конец функции.
Уязвимость находится в шаблоне регулярного выражения, как описано выше в функции reMatch. Регулярное выражение неправильно обрабатывает нулевой байт %00. Когда мы передаём системную команду с предваряющим нулевым байтом, функция сталкивается с ошибкой и выполняет команду на хост-компьютере. Чтобы использовать эту уязвимость, нам нужно просто передать нулевой байт в параметр поиска GET-запроса, после чего указать {.exec|code.} (где code — это команда, которую нужно выполнить) через URL следующим образом:
http://(IP-Адрес/ИмяДомена)/?search==%00{.exec|КомандаЗдесь.}
Начнём со сканирования портов с помощью rustscan. Я предпочитаю rustscan для быстрого получения информации о поверхности атаки.

У нас довольно много открытых портов. Теперь мы углубимся с помощью nmap и выясним, какие службы прослушивают этот набор портов, чтобы найти эксплуатируемую службу.

У нас есть служба Microsoft Windows RPC, работающая на более высоких портах. RPC — это удалённый вызов процедур. Это позволяет процессам Windows взаимодействовать по сети или внутри самого компьютера. Далее, у нас есть несколько различных веб-серверов, работающих на портах 80 и 8080. На портах 5985 и 47001 присутствует Microsoft Httpapi Httpd, который позволяет приложениям взаимодействовать по HTTP без необходимости в Microsoft IIS (Internet Information Server). Nmap обнаруживает потенциальный веб-сервер на порту 3389, однако я не смог подключиться ни по HTTP, ни по SSL. Давайте подключимся к веб-серверу на порту 80, так как это стандартный порт для протокола HTTP.

На порту 80 перед нами веб-страница с логотипом компании Steel Mountain и фотографией с подписью "Сотрудник месяца". Если мы откроем инструменты разработчика веб-браузера, то увидим, что фотография называется BillHarper.png, что даёт нам ответ на первый вопрос. Давайте подключимся к другим прослушивающим службам и посмотрим, что можно найти.

При подключении к службе на порту 5985 мы получаем HTTP-код ошибки 404. Код ошибки 404 означает, что сервер не может найти запрашиваемый ресурс. Здесь нет ничего интересного. Переходим к следующему.

ДА! Вот это уже интересно. На порту 8080 у нас какая-то служба обмена файлами. Давайте осмотримся и попробуем найти дополнительную информацию об этой службе. Если мы посмотрим в левый нижний угол, то увидим имя и что-то похожее на номер версии: HttpFileServer 2.3. Продолжим разведку.

Если мы нажмём на ссылку с надписью HttpFileServer 2.3, мы перейдём на веб-страницу с названием программного обеспечения, работающего на порту 8080. В данном случае это Rejetto HFS HTTP File Server. Давайте проверим другой порт на 47001, чтобы охватить все возможности. Если мы не найдём ничего полезного, вернёмся к Rejetto и начнём искать известные CVE.

Похоже, у нас ещё одна 404 на порту 47001. Давайте начнём искать CVE для Rejetto HFS 2.3.

Быстрый поиск показывает, что у нас есть известная запись CVE для HFS 2.3. Мы отойдём от руководства THM и не будем использовать проприетарный metasploit. Я написал эксплойт, который даст нам оболочку. Чтобы его использовать, вам нужно зайти на revshells.com, ввести правильные сетевые данные и выбрать PowerShell #3 (Base 64). Когда у вас будет полезная нагрузка, скопируйте и вставьте её в переменную payload в строке 13 и запустите эксплойт. Прослушиватель откроется автоматически, и вы должны получить доступ к системе. Примечание: возможно, потребуется запустить эксплойт несколько раз, чтобы поймать оболочку.

Бум! Мы в системе, и в качестве бонуса у нас оболочка PowerShell. Это означает, что у нас будет доступ к командлетам .NET. С этим мы можем быть гораздо опаснее, чем со стандартной оболочкой командной строки. Переходим к повышению привилегий. Руководство THM предоставляет нам полезный инструмент под названием PowerSploit, в котором есть инструмент для перебора машины на предмет потенциальных векторов повышения привилегий. Мы собираемся загрузить PowerUp.ps1 на машину и использовать его, чтобы помочь нам получить контроль над машиной.

Сначала мы запускаем простой HTTP-сервер в каталоге, где находится наш файл PowerUp.ps1, на нашей системе. Затем на целевой системе мы используем командлет Invoke-Webrequest, чтобы скачать файл с нашего сервера на целевую машину. Теперь мы установим и запустим один из командлетов, входящих в состав PowerUp.

Чтобы установить PowerUp.ps1, выполните команду: . .\PowerUp.ps1. Далее нам нужно использовать наш новый командлет Invoke-AllChecks. После его выполнения мы получаем огромное количество вывода. Я сократил его до того важного, который нам нужен. Мы видим, что PowerUp сообщил нам, что у нас есть права на изменение файла. Давайте проверим работающие службы, чтобы остановить её, если она запущена. Это нужно сделать, потому что мы не можем ничего сделать с файлом, если он используется службой.

Используя командлет Get-Service, мы получаем список служб, присутствующих на машине. Поскольку наша целевая служба запущена, нам нужно будет остановить её, чтобы изменить и перезаписать двоичный файл.

Чтобы остановить службу, мы используем командлет Stop-Service, за которым следует имя службы. Теперь нам нужно перепроверить, что служба остановлена, с помощью командлета Get-Service. Как показано выше, мы можем подтвердить, что служба действительно остановлена. Давайте перейдём в каталог, содержащий наш целевой двоичный файл. Каталог — C:\Program Files (x86)\IObit\Advanced SystemCare.

Обратите внимание на размер файла двоичного файла, который находится слева от имени двоичного файла в самой правой колонке.

Создайте полезную нагрузку meterpreter и разместите её с помощью модуля веб-сервера Python, как мы делали раньше.

Запустите прослушиватель meterpreter, используя те же сетевые данные, которые вы использовали для создания полезной нагрузки.

Используйте командлет Invoke-Webrequest, чтобы скачать нашу полезную нагрузку meterpreter на целевую систему с нашей машины. Убедитесь, что вы назвали её ASCService.exe, чтобы мы могли использовать слабые права доступа к файлам и перезаписать обычный двоичный файл нашим вредоносным.

Подтвердите, что двоичный файл был перезаписан, выведя список каталога и проверив, изменился ли размер файла. В данном случае он изменился с шестизначного числа на пятизначное, что подтверждает успешную загрузку нашего вредоносного двоичного файла!

Когда вредоносный двоичный файл заменил обычный, всё, что нам нужно сделать, это перезапустить службу с помощью командлета Start-Service. Когда мы это сделаем, машина выполнит нашу полезную нагрузку и предоставит нам оболочку meterpreter! Мы можем выполнить getuid в meterpreter, чтобы проверить, есть ли у нас NT AUTHORITY/SYSTEM. После выполнения getuid мы действительно видим, что мы завладели этой машиной! Хорошего дня!
reMatchend