Чтение онлайн

на главную

Жанры

Защита от хакеров корпоративных сетей

авторов Коллектив

Шрифт:

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

...

Инструментарий и ловушки

Больше стека меньшей форматирующей строкой

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

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

несколько способов.

Использование типов данных, требующих для своего размещения области памяти большего размера. Первое, что приходит на ум, – это использовать спецификации формата, которые для представления обрабатываемых данных используют поля большего размера. Другими словами, эти спецификации соответствуют более длинным данным. Одной из них является спецификация формата %lli, которая соответствует сверхдлинному целому числу (типу данных long long integer). В случае ее использования на 32-разрядной архитектуре Intel функция printf будет читать из стека очередные 8 байт при обработке каждой спецификации формата %lli форматирующей строки. Точно так же можно использовать спецификацию вывода длинного числа с плавающей точкой (long float) или длинных чисел с плавающей точкой двойной точности (double long float). Но следует иметь в виду, что при использовании этих спецификаций преобразования неверные данные стека могут привести к аварийному завершению программы из-за ошибок операций с плавающей точкой.

Использование длины выводимого аргумента. Некоторые версии библиотеки libc поддерживают в спецификации формата символ *. Символ * сообщает функции printf, что ширина поля вывода, соответствующего этой спецификации формата, задается параметром функции printf, который при вызове функции был записан в стек. Использование символов * приводит к тому, что для каждого из них в стеке будет дополнительно выделено 4 байта. Ширина поля вывода, записанная в стек, может быть отменена, если за символами * указать число. Например, использование спецификации преобразования %*******10i приведет к тому, что для представления целого числа будет использовано 10 символов. Но при обработке спецификации преобразования %*******10i функция printf все равно прочтет из стека 32 байта. Считается, что первым этот способ применил автор, известный под псевдонимом lorian.

Непосредственный доступ к параметрам. В ряде случаев возможен непосредственный доступ к параметрам функции printf. Для этого применяется спецификация преобразования вида %$xn, где x – порядковый номер параметра при вызове функции printf.

Этот способ применим только в библиотеках языка C, которые поддерживают непосредственный доступ к параметрам.

Если перечисленные уловки не помогли злоумышленнику добраться до нужного ему адреса, то он может попытаться найти любую другую доступную область стека, куда могли быть помещены нужные адреса памяти. Помните, что совсем необязательно нужные адреса связаны с форматирующей строкой. Иногда бывает удобным разместить их в соседнюю со стеком область данных. Для злоумышленника могут оказаться полезными входные данные программы, не связанные с форматирующей строкой. Уязвимость утилиты Screen проявилась в том, что в большинстве случаев злоумышленник мог получить доступ к данным, определенным переменной окружения HOME. Эти данные располагались ближе других к стеку, поэтому их легче было найти и воспользоваться ими.

Программа атаки с использованием форматирующей строки

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

Программа атаки была написана для уже упоминавшейся ранее программы rwhoisd версии 1.5.7.1, откомпилированной на системе i386 Linux. Как уже говорилось, для выполнения злонамеренного программного кода программа атаки должна подменить величину, которая в некоторый момент времени интерпретируется атакованным процессом как адрес выполняемых команд. В рассматриваемой программе атаки адрес возврата из функции подменяется на адрес злонамеренного программного кода, который при помощи функции exec запускает /bin/sh и обеспечивает доступ к клиенту.

Первое, что должна сделать программа атаки, – это подключиться к сервису сервера RWHOIS и найти форматирующую строку в стеке. После подключения к сервису функция brute_force программы атаки отсылает ему форматирующую строку. В начало форматирующей строки записана константа 0x6262626262, которая является признаком ее начала. Функция brute_force включает в форматирующую строку такие спецификации преобразования, которые увеличивают размер выводимой области стека. Сервис во время обработки переданной форматирующей строки последовательно извлекает из стека слова и возвращает их обратно программе атаки. Получив ответ сервера, программа атаки сравнивает полученные слова с признаком начала форматирующей строки и находит форматирующую строку. Использование константы 0x6262626262 в качестве признака начала форматирующей строки позволяет упростить алгоритм работы, не думая о возможных осложнениях из-за выравнивания данных в памяти.

Поделиться:
Популярные книги

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Последний попаданец

Зубов Константин
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Последний попаданец

Восход. Солнцев. Книга IX

Скабер Артемий
9. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга IX

Система Возвышения. Второй Том. Часть 1

Раздоров Николай
2. Система Возвышения
Фантастика:
фэнтези
7.92
рейтинг книги
Система Возвышения. Второй Том. Часть 1

Вторая невеста Драконьего Лорда. Дилогия

Огненная Любовь
Вторая невеста Драконьего Лорда
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Вторая невеста Драконьего Лорда. Дилогия

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

В ожидании осени 1977

Арх Максим
2. Регрессор в СССР
Фантастика:
альтернативная история
7.00
рейтинг книги
В ожидании осени 1977

Кровь, золото и помидоры

Распопов Дмитрий Викторович
4. Венецианский купец
Фантастика:
альтернативная история
5.40
рейтинг книги
Кровь, золото и помидоры

Последний реанорец. Том I и Том II

Павлов Вел
1. Высшая Речь
Фантастика:
фэнтези
7.62
рейтинг книги
Последний реанорец. Том I и Том II

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Помещица Бедная Лиза

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Помещица Бедная Лиза

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание