
Writeup
ПРИМЕЧАНИЕ: Я полностью раскрыл эту ошибку команде Freenet и работал с ними над проверкой их исправления. Исправление уже развернуто в последней версии Freenet.
Недавно я обнаружил уязвимость в безопасности Freenet, которая может позволить злоумышленнику деанонимизировать цель или отправлять вредоносные документы через Freenet.
Эта уязвимость затрагивает пользователей Freenet, использующих Firefox в качестве браузера. Она позволяет деанонимизацию и другое вредоносное поведение на компьютере пользователя. Она присутствует во всех версиях до 1483 включительно.
Этот эксплойт работает, используя разрыв между Firefox и Freenet в обработке MIME-типов. Freenet поставляется с фильтрами для многих типов контента – было приложено много усилий, чтобы гарантировать, что только правильно сформированный и не содержащий скриптов контент может быть отображен без ряда предупреждений пользователю.
Freenet в целом хорошо справляется с обработкой данных так, как нужно, и позволяет пользователю указать, если он хочет обрабатывать их иным способом.
Firefox, с другой стороны, немного более нюансирован в том, как он определяет MIME-тип файла. В частности, как описано здесь. Большая часть процесса, описанного на этой странице, находится вне контроля злоумышленника, особенно если он должен атаковать через Freenet. Однако одна вещь, которая находится под контролем злоумышленника, – это MIME-тип вставляемых данных. Когда данные вставляются в сеть Freenet, пользователь может указать MIME-тип – когда это поле оставлено пустым, данные обрабатываются как application/octet-stream и получают все надлежащие предупреждения.
Однако, переходя к разделу HTTP документации Mozilla, мы видим, что Firefox на самом деле делает свои собственные предположения о MIME-типе данных, когда определенные условия не выполняются приложением, которое обслуживает контент. В частности, когда заголовок Content-Encoding не отправляется приложением, Firefox фактически «нюхает» контент, чтобы решить, что с ним делать. Если первый блок данных не является текстовым, Firefox будет обрабатывать файл как MIME-тип, указанный расширением.
Оказывается, Freenet не отправлял этот заголовок в своих ответах, что позволяет нам превратить это в нечто пригодное для использования. Поскольку наши данные могут быть вставлены как MIME-тип text/plain, который, очевидно, не получает сложной фильтрации, но могут быть доставлены как любой MIME-тип, указанный расширением файла, теперь у нас есть способ доставить нефильтрованный HTML-документ (или PDF, или .docx...). Это серьезно, потому что обычно весь опасный контент рекомендуется загружать в папку или временное пространство и открывать вне браузера.
Это короткое видео работы эксплойта – в данном случае для доставки нефильтрованного HTML-файла.
Для работающего примера установите 1483 или более раннюю версию и перейдите по адресу:
Для тех, кто хочет поиграть дома, вы можете получить самую последнюю уязвимую версию Freenet здесь.
Итак, как мы можем использовать это в реальном мире?
Оказывается, если вы ссылаетесь на свой вредоносный контент внутри Freenet на странице, которую уже просматривает пользователь, Freenet позаботится о том, чтобы обработать файл как тип, указанный его расширением. Freenet увидит, что наш первый бит данных является двоичным, и предупредит пользователя, что наш файл вредоносен.
:(
Это означает, что если мы хотим, чтобы наша цель просмотрела нашу вредоносную страницу с JS, мы должны ссылаться на нее извне. На самом деле это нормально, потому что самые популярные системы обмена сообщениями Freenet не работают через веб-прокси Freenet.
Если, например, демонстрационный URI из этой статьи был бы связан внутри FMS, никакой дополнительной проверки не было бы, и мы могли бы запустить нашу полезную нагрузку.
Все, что потребовалось бы для деанонимизации ряда пользователей Freenet, – это создать контент с интересным заголовком, вставить файл с первым блоком данных в виде двоичных данных, а затем создать убедительную веб-страницу, которая молча сообщает IP-адрес и активность в фоновом режиме. Комбинируйте это с набором инструментов, таким как BeEF, и вы получите интересные возможности.
Мы, конечно, также можем использовать это как вектор для доставки вредоносных PDF, .docx или других файлов и получить более постоянную точку опоры на машине пользователя.
Исправление этой ошибки довольно простое – отныне FProxy всегда будет передавать HTTP-заголовок Content-Encoding при доставке контента. Этот заголовок сообщает браузеру Firefox обрабатывать MIME-типы явно, как определено FProxy. В результате данные типа text/plain будут всегда отображаться как обычный текст и не обрабатываться как любой другой MIME-тип.
Эта ошибка, в общем и целом, была довольно простой – но она имела возможность существенно повлиять на функциональность Freenet. Проверка MIME-типов действительно важна, и главный урок, который можно извлечь из этой ошибки, заключается в том, что MIME-типы не всегда обрабатываются единообразно при передаче данных из одной программы в другую.
Просто вставьте некоторые данные в Freenet с MIME-типом text/plain, а первый блок должен содержать только двоичные данные. Firefox обработает их как тип, указанный расширением файла, и они будут доставлены пользователю напрямую, вместо того чтобы быть отфильтрованными Freenet. Отправляйте своим жертвам через FMS или Frost. Собирайте их IP-адреса или заставляйте их запускать двоичную полезную нагрузку. Профит!