Kniga-Online.club
» » » » Коллектив авторов - Защита от хакеров корпоративных сетей

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

Читать бесплатно Коллектив авторов - Защита от хакеров корпоративных сетей. Жанр: Прочая околокомпьютерная литература издательство неизвестно, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Классическую удаленную уязвимость форматирующей строки можно найти в версиях программы rwhoisd 1.5.7.1 и более ранних. Она позволяла удаленному злоумышленнику после подключения к серверу выполнить произвольный код. Впервые об уязвимости стало известно благодаря сообщению списка рассылки Bugtraq. Заархивированное сообщение может быть найдено по адресу www.securityfocus.com/archive/1/222756.

Для того чтобы понять уязвимость форматирующей строки программы rwhoisd, следует внимательно изучить ее исходный текст. В главе рассмотрена версия программы 1.5.7.1. На момент написания книги ее можно было загрузить по адресу www.rwhois.net/ftp.

Уязвимость проявляется во время вывода сообщения об ошибке при неверном задании аргумента команды – soa в командной строке.

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

Исходный текст этой функции может быть найден в файле common/ client_msgs.c (путь указан относительно директории, созданной во время восстановления из архива исходного текста программы версии 1.5.7.1).

/* prints to stdout the error messages. Format: %error ### message

text, where ### follows rfc 640 */

void

print_error(va_alist)

va_dcl

{

va_list list;

int i;

int err_no;

char *format;

if (printed_error_flag)

{

return;

}

va_start(list);

err_no = va_arg(list, int);

for (i = 0; i < N_ERRS; i++)

{

if (errs[i].err_no == err_no)

{

printf(“%%error %s”, errs[i].msg);

break;

}

}

format = va_arg(list, char*);

if (*format)

{

printf(“: ”);

}

vprintf(format, list);

va_end(list);

printf(“n”);

printed_error_flag = TRUE;

}

В исходном тексте жирным шрифтом отмечено место передачи входных данных программы функции vprintf(). Причиной уязвимости форматирующей строки является не функция vprintf(), а то, как ее используют. Функция print_ error() полагается на то, что вызвавшая ее функция передаст ей правильные входные данные: форматирующую строку и соответствующие ей переменные.

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

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

Те из читателей, которые загрузили исходный текст программы, смогут найти разбираемый фрагмент кода в функции soa_parse_args() из файла с исходным текстом server/soa. Подготовительные действия функции сокращены до минимума. В 53-ей строчке вызывается функция print_error() (строка выделена жирным шрифтом), которая может стать источником серьезных ошибок:

..

auth_area = find_auth_area_by_name(argv[i]);

if (!auth_area)

{

print_error(INVALID_AUTH_AREA, argv[i]);

free_arg_list(argv);

dl_list_destroy(soa_arg);

return NULL;

}

При вызове функции print_error() ей передается параметр argv[i], который является не чем иным, как форматирующей строкой. В конечном счете эта форматирующая строка будет передана функции vprintf() для обработки, как об этом уже предварительно говорилось. Средствам контроля исходного текста программ это место должно показаться очень подозрительным и подходящим для организации атаки. Для безопасной передачи параметров следовало бы вызвать функцию print_error() следующим способом:

print_error(INVALID_AUTH_AREA, «%s», argv[i]);

При этом способе вызова i-й аргумент программы argv[i] передается функции print_error() как переменная, соответствующая спецификации преобразования %s. При этом исключается всякая возможность передачи функции print_error() злонамеренной спецификации преобразования, которая могла бы непредусмотренным образом обработаться функцией vprintf(), вызванной print_error(). Строка argv[i] — это не что иное, как аргумент команды – soa, передаваемой клиентом серверу.

Подводя итог, следует сказать, что когда клиент соединяется с сервером rwhoisd и передает неверную команду – soa, функция print_error() выводит сообщение об ошибке. При этом выполняется следующая последовательность действий.

1. Сервер получает аргумент команды – soa и вызывает для ее обработки функцию soa_directive().

2. Функция soa_directive() передает команду функции soa_parse_args() для обработки.

3. При обнаружении ошибки функция soa_parse_args() передает код ошибки и командную строку функции print_error() в качестве аргументов форматирующей строки.

4. Функция print_error() передает форматирующую строку с содержащимися в ней данными клиента функции vprintf(), о которой уже говорилось, и вызывает ее.

Теперь ясно, что удаленные клиенты могут передать функции vprintf() форматирующую строку, которая является аргументом команды – soa. При подключении к серверу и передаче ему злонамеренной форматирующей строки злоумышленник может записать нужные ему данные в память программы сервера.

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

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

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

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

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

[[email protected] 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.

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

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

[[email protected] 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

Перейти на страницу:

Коллектив авторов читать все книги автора по порядку

Коллектив авторов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


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

Отзывы читателей о книге Защита от хакеров корпоративных сетей, автор: Коллектив авторов. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*