Современные информационные технологии/4. Информационная
безопасность
асп. Штеренберг
С.И (к.т.н. Красов А.В)
Федеральное
государственное образовательное бюджетное учреждение высшего профессионального
образования "Санкт-Петербургский государственный университет
телекоммуникаций им. проф. М.А. Бонч-Бруевича"
Методы скрытого
вложения информации в исполнимых скриптах.
Федеральное
государственное образовательное бюджетное учреждение высшего профессионального
образования "Санкт-Петербургский государственный университет
телекоммуникаций им. проф. М.А. Бонч-Бруевича"
В статье рассматриваются особенности форматов исполнимых файлов под
операционные системы Linux и методика
выбора наиболее подходящих форматов файлов для скрытого вложения информации.
Обычно скриптом называется программа или программный
файл сценарий. Ну а если быть предельно точным, то скриптом называется
практически любая исполняемая процедура. Если говорить об Интернет-технологиях,
то понятие "скрипт" уже несколько сужается и его можно охарактеризовать,
как исполняемую процедуру, написанную на каком либо языке, которая запускается
на выполнение со стороны сервера по запросу поступившему с конкретно
определенной веб-страницы. Сценарный язы́к (англ. scripting language, в
русской литературе принято название язык сценариев) — высокоуровневый язык
программирования для написания сценариев — кратких описаний действий,
выполняемых системой. Разница между программами и сценариями довольно размыта.
Сценарий — это программа, имеющая дело с готовыми программными компонентами.
Местоположение исполняемого скрипта в сети может быть
разным. Например, скрипт может располагаться на том же сервере, где расположена
вызывающая его страница. Как вариант - скрипт размещается на другом, т.е.
удаленном, www-сервере. Поскольку посредством запуска скрипта "где-то
там" происходит совершение какого-либо действия, то надо всегда помнить,
что такая процедура может быть не всегда полезной (т.е. это небезопасно для
владельца сервера). В частности, по этой причине, не на всех серверах разрешается
выполнение скриптов - обычно, провайдеры специально оговаривают условия
предоставления такой возможности.
Выполнение скриптов на удаленном сервере может
оказаться небезопасным - CGI-скрипты не являются исключением из этого правила.
Поскольку хостинг-провайдеры могут запрещать выполнение cgi на своих серверах,
то перед тем, как начинать свой Интернет проект, следует точно убедиться, что
такого ограничения не предусмотрено.
Общая цель CGI-скриптов - позволить посетителю
получать доступ лишь к определенной части информации, находящейся у вас на
сервере. Такое определение сразу должно навести вас на мысли о безопасности и
предотвращения действий, направленных на получение вашей информации и
некорректного вмешательства в работу вашей системы. Если вы будете достаточно
беспечны и легкомысленны в этом вопросе, вы предоставите посетителям доступ к
тем участкам сервера, которые предпочтительнее было бы скрыть от посторонних
глаз. Хотя ни один web-узел нельзя считать на 100% защищенным, снизить уровень
риска при применении CGI-программ довольно просто. Далее мы рассмотрим наиболее
характерные уязвимости в скриптах и попробуем свести риск к минимуму.
Командные файлы CGI часто
используются для выполнения основных веб-сценариев. Примером может служить
отправка электронных писем из веб-форм (также называемых "formmail")
и вращающиеся в пределах веб-сайта рекламные объявления.
Использование PHP как двоичного CGI это
опция установки, когда, по некоторым соображениям, нет желания интегрировать
PHP как модуль в программу-сервер (такую как Apache) или когда PHP будет
использоваться с различными видами CGI-оболочек для создания для скриптов
безопасной среды chroot и setuid. Такая инсталяция обычно заключается в
установке исполняемого файла PHP в директорию cgi-bin web-сервера. CERT
advisory CA-96.11 рекомендует не помещать никакие
интерпретаторы в директорию cgi-bin. Даже если исполняемый файл PHP
используется как самостоятельный интерпретатор, PHP разработан таким образом,
чтобы предотвратить атаки при таком варианте установки:
·
Доступ к
системным файлам: http://my.host/cgi-bin/php?/etc/passwd
Информация запроса в url после знака
вопроса (?) передаётся интерпретатору как аргументы командной строки
CGI-интерфейсом. Обычно интерпретаторы открывают и выполняют файл, специфицированный
как первый аргумент командной строки.
При вызове как исполняемый CGI, PHP не
выполняет аргументы командной строки.
·
Доступ к
любому web-документу на сервере: http://my.host/cgi-bin/php/secret/doc.html
Информация пути/path в url после имени
PHP-экзешника, /secret/doc.html, используется по соглашению для
специфицирования имени файла, открываемого и исполняемого CGI -программой.
Обычно некоторые директивы конфигурации web-сервера (Apache: Action)
используются для перенаправления запросов документа, например, http://my.host/secret/script.php,
интерпретатору PHP. При такой установке web-сервер сначала проверяет права
доступа к директории /secret, а затем создаёт перенаправленный запрос http://my.host/cgi-bin/php/secret/script.php.
К сожалению, если запрос в оригинале задан
в этой форме, проверка доступа к файлу /secret/script.php web-сервером не выполняется, и он
делает её только для файла /cgi-bin/php. Этим способом любой пользователь
может получить доступ к /cgi-bin/php и
к любому защищённому документу на web-сервере.
Прежде чем осуществить непосредственно скрытое
вложение информации, необходимо выделить для себя следующие пункты:
1)
Поддержка
разных форматов исполнимых файлов
2)
Поддержка
хотя бы базового уровня шифрования
3)
Возможность
застеганографировать файл любого формата в стег-контейнер.
4)
Модульность,
т.е. возможность пользователю с навыками программирования на Perl написать
модули для работы данной программы с другими форматами.
В качестве языка следует
выбрать Perl. Причины выбора которого сугубо субъективные – язык заимствует ряд
свойств из языков программирования командных оболочек UNIX. Все переменные маркируются ведущими знаками, которые
точно выражают тип данных переменной в этом контексте (например, скаляр,
массив, хеш). Важно, что эти знаки позволяют переменным быть интерполированным
в строках. Perl обладает множеством встроенных функций, которые обеспечивают
инструментарий, часто используемый для программирования оболочки, например
сортировку или вызов системных служб.
В PHP опция конфигурации времени
компиляции --enable-force-cgi-redirect и директивы времени выполнения doc_root и user_dir могут использоваться для
предотвращения таких нападений, если дерево документов сервера содержит
директории с ограниченным доступом. См. далее рассмотрение различных
комбинаций.
Наиболее часто встречающяяся уязвимость - это
отсутсвие проверки посылаемых скрипту данных на метасимволы (такие, к примеру,
как &;`'\"|*?~<>^()[]{}$), что приводит к выводу скриптом
содержимого файла или самого файла, которое администратор сервера предпочел бы
скрыть. Элементарным решением этой проблемы есть фильтрация вводимого набора
символом, выглядящая на Perl следующим образом:
$in =~
s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'"\n])/\\$1/g;
Почему же так важна проверка на метасимволы ? Потому,
что к примеру у вас есть скрипт view.pl ( www.your_host.com/cgi-bin/view.pl )
который показывает какой-то файл (подобный пример часто встречается в поисковых
скриптах и в файлах различных web-форумов) т.е.
www.your_host.com/cgi-bin/view.pl?site.htm покажет вам site.htm.
Но если мы передадим скрипту запрос вида:
www.yor_host.com/cgi-bin/view.pl?../../../../etc/passwd
То данная команда выведет нам в качестве результата
файл с паролями *nix системы. Это происходит из-за того, то скрипт, получая
данные ../../.. исполняет команду перехода по директориям. Получается, что он
доходит то корня диска, оттуда переходит в директорию etc/ и показывает на файл
passwd, расположенный там же.
$file=s/\.\.//g; - вот такой маленький кусочек кода
perl намного облегчит жизнь администратора.
Вот лишь несколько скриптов, в которых встречается эта
уязвимость:
www.your_site.com/cgi-bin/htmlscript?../../../../etc/passwd
www.your_site.com/cgi-bin/shopper.cgi?newpage=../../../etc/passwd
www.your_site.com/cgi-bin/Web_Store/web_store.cgi?page=../../../etc/passwd%00ext
Возникает вопрос, а что такое за /etc/passwd%00ext?
Это тоже один из примеров уязвимости cgi-скриптов. Но эта уязвимость не столько
зависит от скрипта, сколько от операционной системы. Система неадекватно
реагирует на символ 0.( не только именно на 0, но я привел лишь самый
элементарный пример.
К примеру, page.cgi?index.htm покажет вам документ. А
page.cgi?index.htm%00 покажет вам исходный код документа.
Самый простой вариант решения этой проблемы, это
поставить фильтр на этот символ, на perl этот будет выглядеть примерно так :
$insecure_data=~s/\0//g;
Также в языке Perl, добавление символа "|"
засталяет программу, которая должна открывать файл - запустить его.
К примеру: open(FILE, "/bin/ls") - даст вам
бинарный код, а если подставить "|"
open(FILE, "/bin/ls|") - будет выполнена
команда, в данном случае ls.
s/(\|)/\\$1/g - такая вставка в Perl-код предотвратит
это. (Perl
скажет - 'unexpected end of file').
Также скрипты активно используются для создания
многочисленных списков рассылок и тому подобных вещей, применяемых для более
тесного взаимодействия сайта и посетителя. Обычно данные скрипту передаются в
виде html-формы.
Злоумышленник может запросто сохранить исходный код
html-формы, модифицировать его, а затем открыть страницу, уже модифицированную
у себя в браузере. Хакер может изменить значения и имена полей, модифицировать
или удалить скрытые поля ( Input type=hidden ), после чего предъявить форму
целевой CGI-программе. Кроме того, ничто не помешает ему вызвать вашу программу
прямо из командной строки браузера и передать в нее информацию в строке
запроса.
Типичный пример, алгоритм которого вы можете еще
применить во многих других скриптах = это уязвимость в очень старом скрипте
formmail 1.0
Когда скрипт получает данные, он составляет письмо и,
пользуясь полученными данными, дает примерно следующую команду:
$ mail some_email $recipient
Предположим, что в документе html, параметр recipient
(hidden) содержит адрес admin@server.com Тогда в итоге после выполнения всех
команд он завершится посылкой письма по этому адресу командой
httpd$ mail <информация> admin@server.com
Но нам ничего не мешает сохранить документ, немного
подредактировать его, добавив свои команды ( к примеру
";cat /etc/passwd | mail hacker@hacker.com")
и затем отправить данные скрипту. Тогда скрипт все внимательно обработает,
составит письмо м выполнит команду httpd$ mail <информация>
hacker@hacker.com; cat /etc/passwd | mail hacker@hacker.com.
Нужно присвоить скрипту атрибут
"исполняемый" (скрипт - это программа). Если ваш скрипт пишет
поступающую информацию в файл, то файл необходимо сделать доступным для записи.
Теперь создается файл
input.cgi. Файлы формата cgi могут быть написаны на любом языке
программирования, и они являются шлюзами между веб-сервером и остальной
системой. Этот файл будет у нас представлять обычный исполняемый файл шела
(/bin/sh). Для удобства это может быть файл perl'a (/usr/bin/perl) (если он
установлен), можно использовать даже откомпилированный ELF. При нажатии на
ссылку Input этот файл .cgi выполнится, и если не хотим смотреть на пустой
экран или ошибки, он должен вывести страницу. Наш файл input.cgi будет
опрашивать АЦП с переменным резистором, установленным на плате, и кнопки,
находящиеся там же, и выводить на экран веб-страничку с данными.

Рисунок 1 - файл input.cgi будет опрашивает АЦП с
переменным резистором.

Рисунок 2 - создаем файл заготовка веб страницы:
temp.template для удобства вывода страницы
Заготовок - немного измененная
заглавная страница. Осталось только упомянуть использованые программы adctest и
buttonstest. Они были взяты из исходников и были откорректированны, для работы
с веб интерфейсом. Это то что осталось от обработки АЦП.

Рисунок 3 – Обработка АЦП.

Рисунок 3 – Вторая обработка АЦП.
Особенностью является, что обе
программы выполняются не в цикле, а один раз, и в проге кнопок пришлось
добавить в некоторые места <br> для перевода строки в HTML'е. После
копирования файлов обязательно сделать
chmod
+x adctest
chmod
+x buttonstest
chmod +x input.cgi
Вот результат с получившейся страницы
input:
ADC
Value: 404
Key
1 is up
Key
2 is up
Key
3 is down
Key
4 is up
Key
5 is down
Key
6 is up
Подведем итог:
Для запуска файлов достаточно сделать
исполняемый файл .cgi, и вызывать его по ссылке из html'а.
Файл .cgi может быть написан как на
любом скриптовом языке, так и на нормальном C++.
Файл .cgi может вызывать любые
исполняемые файлы в ОС.
Файл .cgi может обмениваться данными с
помощью стандартного вывода, а так же через сторонние файлы с приложениями ОС,
а затем выводить их на веб-страницу.
Выводы
Скрипты активно используются для создания многочисленных списков
рассылок и тому подобных вещей, применяемых для более тесного взаимодействия
сайта и посетителя. В статье были перечисленные основные способы вложения
информации на примере скриптового метода,
которые могут оказаться небезопасными. Рекомендуется создать Исполнимый командный файл, записанный в Perl формата .cgi. Общая цель CGI-скриптов - позволить посетителю
получать доступ лишь к определенной части информации, находящейся у вас на
сервере. Если вы будете достаточно беспечны и легкомысленны в этом вопросе, вы
предоставите посетителям доступ к тем участкам сервера, которые
предпочтительнее было бы скрыть от посторонних глаз.
Список используемой литературы:
1)
Ousterhout J. Scripting: Higher-Level Programming for the 21st Century (англ.) // IEEE
Computer. —
1998. — Т. 31. —
№ 3. — P. 23-30.
2) Георгиев В.О.,
Еникеев А.И. Сценарный подход в создании диалоговых систем // Программные
продукты и системы. — 1991. — № 3.
3)
Трофимов М. И., Трофимова М. П. В поисках
компьютерного эсперанто // Открытые системы. — 1997. —
№ 3.
4)
Красов А.В., Верещагин
А.С., Цветков А.Ю. Аутентификация программного обеспечения при помощи вложения
цифровых водяных знаков в исполняемый код. // М. Телекоммуникации Спецвыпуск
2013, с.27-30