Статья только в электронной версии журнала
Панкай Чоудри (PC Week Labs)
Первым хакером, которому удалось взломать Web-узел www.hackpcweek.com, по иронии судьбы стал житель Гибралтара. Ирония в том, что этот мыс славится неприступностью своей скалы, которая даже пишется с большой буквы - Скала Гибралтара.
Взлом сервера Linux на нашем узле был проведен через CGI. Он тщательно планировался и весьма методично осуществлялся. Злоумышленник, представший под именем Jfs, оказался не заурядным хакером, 95% которых просто не в силах преодолеть хороший брандмауэр. Jfs явно входит в остальные 5%, представляющие наибольшую опасность для организаций.
Удачливый взломщик даже рассказал, сколько времени у него ушло на всю операцию, - она длилась сравнительно недолго, всего 20 часов. Мы проанализировали его подход и убедились, что администраторам есть чего опасаться (см. www.hackpcweek.com/exploit.html).
Прежде всего Jfs с помощью сканера портов провел стандартный анализ уязвимости. Наши серверы были надежно блокированы, поэтому улов оказался невелик - только порт 80, предназначенный для НТТР-подключений. После этого хакер обратил внимание на серверные “отпечатки пальцев”, надеясь с их помощью определить, какое ПО установлено на узле. Однако наш брандмауэр канального уровня оказался на высоте и надежно скрыл эту информацию.
Взломщику пришлось обратиться к общедоступным данным: он начал изучать открытую структуру узла, прежде всего схему его каталогов. Используя HTML-страницы, он смог легко представить себе, с чем имеет дело.
Более того, Jfs идентифицировал коммерческое приложение, установленное в системе, как PhotoAds, исходный текст которого поставляется вместе с продуктом. Не найдя никаких брешей в сетевых компонентах, откликнувшийся на наш призыв злоумышленник решил ближе присмотреться к коммерческим сценариям.
Имея на руках исходный текст PhotoAds, он попытался провести стандартный просмотр конфигурации, однако параметры настройки сервера не позволили этого сделать. Единственное, что смог получить Jfs, - сценарий конфигурации среды, который, впрочем, ничего ему не дал.
Но это не заставило хакера опустить руки, и он принялся за изучение серверных вставок и встроенных команд mod_PERL. Проверка всех полей показала, что PERL-утилита regexp фильтрует почти весь входящий трафик еще до того, как он попадет в HTML-редактор. Правда, хакеру удалось найти одну пользовательскую переменную, которая не проверялась на наличие вредоносных последовательностей. Только этого ему и было нужно!
Обнаружив, что переменная ENV из НТТР-блока REFERER оставлена открытой, Jfs перешел к следующему этапу взлома. Он попытался проникнуть в систему с помощью встроенных серверных команд include и mod_PERL, но ему не повезло - ни одна из этих служб в конфигурацию нашей машины не входила.
Jfs не обескуражило и это. Он приступил к поиску брешей в CGI-сценариях PhotoAds. Продемонстрировав глубокое знание PERL, хакер обратился к вызовам open() и system().
Проверка всех переменных показала, что надежды подает только одна, предназначенная для получения имен графических файлов. А ведь отредактировав такое имя, Jfs получил бы возможность записать в систему любой файл, включая index.html - базовую страницу узла.
Заинтересовавший хакера элемент имел две составляющих: переменную каталога и переменную имени файла. Первая была жестко заложена в файл конфигурации и по этой причине оказалась совершенно для него бесполезной.
Что же касается переменной имени файла, то она проходила фильтрацию в regexp, так что с ее помощью Jfs не смог ничего передать в сервер: фильтр пропускал только файлы с расширениями .gif и .jpg. Тогда хакер обратился к www.phrack.com и нашел там строку, выводящую на базовую страницу index.html.
Воспользоваться для передачи этой строки командой post ему не удалось, так как та удаляет все знаки процента, без которых взломщик оказывается безоружен. В резерве оставалась только команда get. При конфигурации системы мы указали нулевой размер принимаемых графических файлов, поэтому Jfs мог манипулировать только gif-разделом исходного текста.
Проверка кода этого сценария показала, что размер графического изображения должен быть менее 350 пикселов по ширине и 250 пикселов по высоте. Чтобы обойти такое ограничение, Jfs вручную присвоил байтам с шестого по девятый значение 0 в коде ASCII.
Окрыленный успехом, он устремился вперед, однако быстро остановился. Оказалось, что все полученные файлы автоматически помещаются в другой каталог и переименовываются.
Тогда Jfs решил обойти функцию rename. Проверив сценарий, он обнаружил, что в нем не предусмотрена проверка данной функции на ошибки. Это вновь воодушевило его. Знание Linux позволило хакеру найти способ исключить переименование файла. Если присвоить сценарию “неправильное” имя, рассудил он, функция rename просто не сработает и файл пройдет в систему под своим исходным именем.
Jfs знал, что в системе Linux имена файлов могут иметь длину до 1024 байт, следовательно, нужно было найти номер, который соответствовал бы длинному имени файла. Сделать это было несложно благодаря все той же бреши при проверке поступающей информации.
Взломщик уже был готов торжествовать победу. Ведь перед ним открывалась возможность изменить в этой файловой системе любой файл, принадлежащий пользователю, который владел данным процессом CGI. Но Jfs ждало разочарование: процессом CGI владел “никто” (nobody), а все документы HTML принадлежали корневому каталогу. Опять тупик...
На этот раз помогло отличное знание языка Си. Опираясь на него, Jfs попытался с помощью команды get ввести в сервер исполнимый код ELF, для чего ему пришлось заняться коррекцией двоичных элементов вручную. Дело в том, что команда get накладывает ограничения на длину переменной. Jfs нужно было уложиться в 8190 байт, из которых 1024 байта уже были использованы для номера. Таким образом, на исполнимый код оставалось всего-навсего около 7000 байт.
Убрав из программы все, что только можно, Jfs сумел вписаться в нужные пределы.
Правда, это тоже не открыло ему доступа к нужным файлам, и взломщик попытался получить доступ к корневому каталогу - палочке-выручалочке хакеров. С помощью службы bugtraq ему удалось найти элемент, не защищенный “заплатой”. Дальше все было просто. Модифицировав этот элемент, Jfs получил доступ к корневому каталогу, а вместе с ним и возможность оставить на базовой странице свой след - пугающую администратора надпись: “Узел взломан. Здесь был Jfs”.
Game over.
С техническим директором Панкаем Чоудри можно связаться по адресу: pankaj_chowdhry@zd.com.
Хороший брандмауэр служит непреодолимой преградой для 95% хакеров, однако остальные 5%, такие, как Jfs, представляют серьезную опасность для компаний.