Современные информационные технологии/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