Перейти к содержимому


От сообщения об ошибке, до эксплоита за час


  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 Гость_Exmo_*

Гость_Exmo_*
  • Gosti
  • 0

Отправлено 23 Ноябрь 2017 - 17:53

От сообщения об ошибке, до эксплоита за час.

1) Введение
Как и начинаются большинство приключений - дело было вечером, делать было нечего, пиво кончилось, да и деньги на пиво тоже начали кончатся. Но не работать же... Хотя - прилетело письмецо с интересным содержанием - рассылали exe с именем "trustme#i_am_dolphin.exe". Ну и естественно я не мог пройти мимо. В итоге открываем виртуалку с убунтой, делаем снапшот, качаем нагрузку из письма, не долго думая кликаем прямо из строки загрузок - ??? - и происходит ошибка : файл не найден. Хм... В папке файл находится, а с браузера же написано что файл не найден. И как ни странно ничего не закриптовано, wine не открылся - значит и локер не сработал - так откуда ошибка? 
Внимательный читатель наверное заметил, что действие происходит в ubuntu ( а конкретно версия 16.04 ), но в качестве desktop manager стоит xfce - однако рядом и kde и gnome валяются. Браузер chromium. Но на скриншотах я буду использовать ubuntu 16.04 + kde, чтобы показать что не только xfce подвержено этой ошибке - а любой браузер, который для запуска использует эти утилиты.


2) Исследование
Как мы знаем - любые сообщения об ошибках - это либо предусмотренные разработчиком поведения, либо наоборот - и уже из последних можно сделать что-нить интересное. Но к сожалению здесь был не стектрейс с ошибками - а просто сообщение о том что файл не найден. Но и это однако можно раскрутить как нам требуется. Ну чтож, давайте тогда найдем pid процесса, и посмотри - правильно ли его вызвали. 
Не закрываем окно с описанием ошибки, и идем в консоль. 

Код
ps axvf  | grep trustme -A 4 -B 4

Команда показывает нам вместе с частью дерева - кто ваще пытался открыть : и аргументы верные - а процесс виновник : kde-open/xdg-open или любой другой, который у вас(под спойлером картинка большая)

 

tAYov10.png

 

 

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

Код
strace kde-open file:///home/rabies/Downloads/trustme#i_am_dolphin.exe 2> trace_log

Это командой собираем информацию по работе процесса. Как видим сообщение об ошибке - нажимаем Ok, и идем в trace_log. Но так как информации там ОЧЕНЬ много, выделим только то, что надо надо : 

Код

$grep trustme trace_log
stat("file:///home/rabies/Downloads/trustme#i_am_dolphin.exe", 0x7ffec4bf1710) = -1 ENOENT (No such file or directory)
stat("/home/rabies/Downloads/trustme", 0x7ffec4bf1080) = -1 ENOENT (No such file or directory)

Весьма неплохо - неправдали? 
Как видим, он пытается получить доступ сразу по URI - который получает на вход, но ествественно не получает данных. А далее работает как с обычным URL - хотя на самом деле ему прилетает URI - и это немного разные вещи. Для начала вспомним как в WEB устроенны ссылки : 

Код
<scheme>://<HOST><PATH>?<ARGS>#<FRAGMENT> 
scheme = HTTP/HTTPS/FTP....
HOST = [email protected]:DNS_NAME_OR_IP:PORT
PATH = /<PATH>/
ARGS = <NAME>=<VALUE>&
FRAGMENT = все остальное - обычно используется скриптами для позиционирования вашего экрана на нужном участке страницы

Описание ну очень грубое, и у вас сейчас поднимается волна возмущения наверняка, но кто хочет полную документацию : 
+ URL - https://www.ietf.org/rfc/rfc1738.txt 
+ URI - https://tools.ietf.org/html/rfc3986

Давайте посмотрим что у нас тут происходит. 

Код
scheme = file - т.е. файл локальный
HOST у нас отсутствует
PATH = /home/rabies/Downloads/trustme
ARGS у нас отсутствует
FRAGMENT - i_am_dolphin.exe

Учитывая что FRAGMENT у нас для загрузки файлов и не требуется, то оно по видимому отбрасывается. Давайте проверим этот момент. 

Код

$touch /home/rabies/Downloads/trustme
$kde-open  file:///home/rabies/Downloads/trustme#i_am_dolphin.exe 

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


3)Эксплуатация дыры
Итак, если вы дошли сюда, я думаю вам уже понятно в чем заключалась ошибка разработчиком, и какие возможности нам это дает? На самом деле практически никаких, можно показать сиськи вместо нужного файла, и по сути все, потому что правилами безопасности запрещается открытие таким образом всяких .sh/.bash/.py/.php - они либо не открываются по правилам безопасности, либо открываются в kate на редактирование ( причем открыватся файл c FRAGMENT ). Однако после небольшого ручного fuzz, и тут получилось найти уязвимость - deb пакеты! 
Давайте затестим! Для начала найдем в своем кеше пакет - у меня это оказался firefox и попробуем выполнить команду: 

Код

$kde-open file:///var/cache/apt/archives/firefox_57.0+build4-0ubuntu0.16.04.5_amd64.deb#hello_world

На что нам вежливо предлагают установить пакет. 
Чтож, мы получили полноценный RCE - остается только заставить незадачливого линуксоида установить пакет, который мы заставим его скачать. Думаю не стоит повторять что во время установки у нас есть рутовые права? Так что post хуки могут вполне нам помочь установить в автозагрузку наш ратник, криптолокер на рандомный крипт файлов и выплатой по 10$ за файл( криптовать 1 файл за перезагрузку ), и так далее - все опять таки зависит от вашей фантазии.

Получается для эксплуатации надо лишь : 
+ взять линускоида - хомячкового, не красноглазика, ибо последний просечет момент думаю быстро.
+ впарить ему 2 файла ( важно чтобы он сохранил их в одном и том же месте, идеально если у него автосохранение, идеально чтобы на сервере у нас ограничение было - что пока не скачается наша полезная нагрузка, не отдаем фейковый файл )
+ какой бы файл он не открыл - у нас 100% откроется наш payload - в котором можно доставить deb пакет, или все, на что у вас хватит фантазии. 

Но есть и минусы : 
- я не изучал как работают аргументы, и как они фильтруются. Но через браузер передать аргументы никак нельзя. 
- 2 файла... 
- атака только через СИ
- очень специализированный трафик : у хомячков брать нечего, а прошаренные сообразят в чем дело и ничего устанавливать не будут.

И это собственно все, наверняка спросите вы - можно эксплуатировать только через двойную загрузку и ничего более? Я думаю нет : 
+ любые программы, которые запускают что-то через эти программы
+ можно заставить открыть payload - который лежит на вашем сервере, если получить доступ к scheme 
+ если работа идет в web - и у нас есть форма заливки файла, то залив такие 2 файла(name, name#fragment), мы скроем в логах нашу нагрузку, хоть частично, обращаясь к второму. 
+ можно показать сисяндры вместо "типо" оплаченного счета. 

 

copyright


Сообщение отредактировал Exmo: 23 Ноябрь 2017 - 17:55





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных