Взлом WWW-сервера на
основе WebSite v1.1x
Начало.
Как-то на HackZone я встретил
заметочку о том, что взломан web-сервер фирмы IdSoftware с помощью стандартных примеров
скриптов, идущих в поставке с WebSite'ом, - args.bat и uploader.exe. А так
как в нашем университете довольно много www серверов на основе
WebSite (ну если штук 5-6 это много), то я решил вплотную занятся
ими :)
Итак, взлом осуществляется
через стандартные примеры, идущие в поставке с web-сервером,
а так как люди еще не сильно задумываются о защите своего сайта,
считая это не очень большой проблемой, и часто оставляют все
на Авось, то просто ставят WebSite, ничего не предпринимая для
его настройки и обеспечения достаточной защиты. Все пять найденных
мной сайтов под управлением WebSite v1.1 имели лазейку, описанную
ниже, которая обеспечивала почти полный доступ к машине, на
которой они находились, в том числе и мой :)
Необходимое.
Как у нас ставят WebSite? Просто
давят кнопку Install, и потом прога говорит, что web-сервер
поставлен. Люди находят, где находится корень web-сайта, закачивают
туда свою информацию, и все так и живет, пока не наступает время
дельта Тэ (с) Zeus. Что же появляется в таком состоянии? По
умолчанию отображается (мапится, mapping) куча ненужных для
работы сервера каталогов /java/, /publish/, /wsdocs/, /cgi-dos/,
/cgi-win/. Конечно, в какой-то момент времени они, возможно,
и понадобятся, но вначале они просто не нужны. Это с одной стороны,
с другой стороны создателям WebSite со всех сторон нужно показать
возможности этого сервера, что они с успехом и делают, открывая
потециальные дырки в защите web сайта и заполняя эти каталоги
разнообразными примерами, так радующими глаз потенциального
взломщика.
Сперва я поставил себе на машину
WebSite v1.1f в дефолтовой конфигурации и приступил к исследованию
его на дырки.
Задача перед нами стоит такая:
закачать на ломаемый сервер какое-нибудь средство удаленного
администрирования и управления типа ВО или NetBus и запустить
его (я использовал по-быстрому найденный в нашей локалке NetBus
v1.6 с именем файла серверной части Patch.exe).
Этап закачки для нас не представлял
никакого интереса т.к. по умолчанию WebSite позволяет удаленно
запустить /cgi-win/uploader.exe и закачать кому угодно что угодно.
В принципе, так даже можно положить эту самую НТ: закачивать
туда всякой фигни, пока место на диске не кончится. Скорей всего,
тут ей кранты и придут - это если WebSite стоит на том же диске,
где стоит система или валяется своп-файл (но я в этих вопросах
не сильно силен, пусть меня поправят более знающие люди, да
и речь сейчас не об этом).
Вторым этапом является выяснение
месторасположения каталога с WebSite'ом. Это делается тоже отчень
легко, просто удаленно запускаем файл /cgi-dos/ args.bat, на
что нам в ответ приходит сообщение типа
Empty output from CGI program D:/WebSite/cgi-dos/args.bat
, что однозначно определяет каталог с WebSite'ом. Тогда отображаемый
каталог /cgi-dos/ будет находится в каталоге D:/WebSite/cgi-dos/,
а путь к файлу Patch.exe, который мы закачиваем будет D:/WebSite/UploadS/Patch.exe
Итак, момент к которому мы
подошли - это исследование на предмет возможности запуска файла,
который мы закачали. Почитывая разные статьи по этому поводу,
например, выяснилось, что у web-сервера Apache есть уязвимость
на счет тестовых скриптов /cgi-bin/test-cgi и /cgi-bin/nph-test-cgi,
которые аналогичны присутствующему в WebSite примеру Args.bat.
Эта уязвимость заключается в том, что возможна распечатка передаваемой
строки в таком виде, в каком она присутствует, и это обычно
делается строчкой скрипта
echo QUERY_STRING = $QUERY_STRING
т.е. если мы передаем строчку типа "> 1.bat", то
по логике вещей строчка "QUERY_STRING =" будет перенаправлена
в файл 1.bat, путь к этому файлу мы могли бы указать на каталог
/cgi-bin/, он бы туда записался, и далее уже удаленно мы могли
бы его запустить из этого каталога. В args.bat находится строчка
echo QUERY_STRING="%QUERY_STRING%" >> %of%
т.е. кто не слеп и видит, что строчка, передаваемая нами заключена
в кавычки, и все, что мы надумали, просто-напросто обламывается.
Обламывается-то обламывается, но все дело в том, что мы можем
засылать специальные непечатные символы типа CR (код 0dh), LF(
код 0ah). Улавливаете? :) Появление таких символов в командной
строке приведет к переводу строки в скрипте и вполне возможно,
что следущей строчкой вдруг ни с того ни с сего окажется наш
файл лежащий в каталоге /uploads/ . Уф, такие мысли просто будоражат
кровь! :)
Так, сейчас мы ее маленько
остудим, рассмотрев немного теории, поясняющей как запускаются
.bat скрипты на web сервере на основе WebSite. :)
При обработке bat-скрипта во временном каталоге
WebSite /cgi-temp/ создаются 4 файла xxxxx.acc, xxxxx.bat, xxxxx.inp,
xxxxx.out. Нам в глаза сразу бросается файл xxxxx.bat. Так,
при удаленном запуске /cgi-dos/args.bat получается такой файл
xxxxx.bat:
@ECHO OFF&&TITLE WebSite CGI
D:\WebSite\cgi-dos\args.bat
D:\WebSite\cgi-temp\xxxxx.out
если этому .bat файлу кинуть в командной строке аргументов,
например, /cgi-dos/args.bat?africa.bat, то получим xxxxx.bat:
@ECHO OFF&&TITLE WebSite CGI
D:\WebSite\cgi-dos\args.bat africa.bat
D:\WebSite\cgi-temp\xxxxx.out
Кто знает, что такое перенаправление потока данных (значки ">"
и "<"), сразу поймет, что здесь к чему. По-простому, WebSite
создает временный xxxx.bat файл, результаты деятельности которого
перенаправляются в файл xxxxx.out. Этот файл xxxxx.out отдается
удаленному клиенту результатом работы скрипта, если в работе
скрипта не произошло ошибки. Во временных файлах вместо символов
xxxxx подставляется случайная последовательность символов.
Запускаем вот так /cgi-dos/args.bat?>d:/Website/cgi-shl/1.bat
получаем xxxxx.bat:
@ECHO OFF&&TITLE WebSite CGI
D:\WebSite\cgi-dos\args.bat africa.bat ^>D:/WebSite/cgi-shl/1.bat
D:\WebSite\cgi-temp\xxxxx.out
Видите, как нехорошо поступил
WebSite - перед символом перенаправления ">" поставил
какую-то гадость "^", от которой всякое перенаправление
перестает быть перенаправлением. Если немного помучится, то
можно выяснить, что эта фигня ставится перед символами >,<и |. Кстати, если залезть внутрь исполняемого файла сервера httpd32.exe, то вы увидите как раз стоящие отдельной группой данные символы. Обломс! p>
Как я уже писал выше, мы можем
в командную строку вставлять спецсимволы, делается это так %0a.
"%" - символ, говорящий о том, что следующие за ним
два символа являются шестнадцатиричным представлением передаваемого
в командной строке символа.
Запускаем /cgi-dos/args.bat?%0d%0aafrica.bat.
Получаем xxxxx.out:
@ECHO OFF&&TITLE WebSite CGI
D:\PROGRA~1\WebSite\cgi-dos\args.bat
africa.bat D:\WebSite\cgi-temp\xxxxx.out
Вот тут я подумал что они попали
:), но жестоко обманулся! :( По моим мыслям, сначала управление
передастся их батчику, а потом моему исполняемому файлу, который
я закачал в /uploads/. Меня жестоко обманули, управление, переданное
файлу args.bat, там и оставалось. Моему файлу africa.bat оставалось
лишь смотреть, как управление было всего в одной строчке сверху
его! :)
Cнова думаем! Вернемся к перенаправлению,
если забивать много много перенаправлений типа ">",
то вполне возможно, что в какой-то момент времени на каждый
значок ">" не хватит значка "^", так
как вполне возможно, что буфер у WebSite не резиновый. :) Стандартными
средствами тут я уже обходится не мог, так как не мог ввести
слишком много значков в строке адреса Internet Explorer'a, поэтому
пришлось воспользоваться программой NetCat v1.10 for NT, ох
и рульная же это вещица, при всем при том, что о большинстве
функций я вообще не знаю, для чего они нужны. В моем случае
она просто брала из файла запрос и отсылала его серверу.
nc.exe -v ИмяЛомаемогоСервера 80
Zapros.txt:
GET /cgi-dos/args.bat?>>>>>>>>>>....>>>africa.bat
Вот такой файл, где значков
">" около 700 штук после запуска NetCat'a с такими
параметрами у меня повесил WebSite :) Хорошенькая нашлась фича,
и, главное, обнаружилась фича, что если число значков равно
512, то вместо строк в темповом батчике xxxxx.bat
@ECHO OFF&&TITLE
WebSite CGI D:\PROGRA~1\WebSite\cgi-dos\args.bat?^>^>^>^>...^>^>
africa.bat D:\WebSite\cgi-temp\xxxxx.out
Получается файл xxxxx.bat:
@ECHO OFF&&TITLE
WebSite CGI africa.bat^>^>^>^^>^>^>^^>^>^>^^>^>^>^....^>^>^>^^>^>^>^^>^>^>^
D:\WebSite\cgi-temp\xxxxx.inp > D:\WebSite\cgi-temp\xxxx.out
Классное переполнение буфера
получилось!!!!! Затем я после africa.bat поставил символы перевода
строки 0dh,0ah (%0d%0a) и africa.bat поменял на regedit.exe,
запустил NetCat, и что бы вы думали, у меня получилось? :) Угу,
запустился regedit!!!!
Я еще немного потренировался,
и выяснилось, что она не хочет, или не желает пускать програмки
с длинными именами и с длинными путями к ним. Хорошо, что Website,
где я его встречал, стоит прямо в корне, и доступ к каталогу
/uploads/ получаем без проблем. И еще хорошо, что я начал с
символа ">", если подставлять другие нормальные
символы типа буковок или циферок, то WebSite на это никак не
реагирует, просто не принимает их, если их довольно большое
количество, и выдает ошибку, если они все поместились в буфер.
Ну, вот так я запустил на другой
машинке NetBus, и дальше уже дело техники (почти).
Выкачиваем все нужное с Хакнутой
машины. Закачиваем в каталог /cgi-shl/ с помощью NetBus'а еще
одну копию серверной части этого самого NetBus'a под каким-нибудь
дурацким именем. Я, например, закачиваю под именем win-c-example.exe
т.к. он в этом каталоге уже есть, только соответственно старый
файл нужно убить. Убиваем логи сервера access.log, error.log,
upload.log. Вы думаете их просто убить? =) Фиг там, WebSite
держит их открытыми, тут-то нам и пригодится умение ронять WebSite
обнаруженный в начале нашего исследования. т.е. роняем WebSite,
и только затем удаляем все логи. Нехорошо, если после нас в
каталоге /uploads/ останется бяка в виде серверной части NetBus'a,
ее нужно убить, но увы, она держится системой открытой поэтому
мы просто перезагружаем всю машинку с WebSite'ом, перед этим
сказав NetBus'у "Remove Server". Вот эта часть плана
у меня не очень чисто проходила, в NetBuse я использовал и Reboot
и Shutdown, и все равно удаленный сервер сам по себе не поднимался,
не знаю почему, а пробовать на своей машине было влом. Тем не
менее когда-нибудь ту машинку поднимали, считая что Винда это
Сакс, и он сам может из-за пылинки вылететь в даун. Когда сервер
снова поднялся, быстренько из /cgi-shl/ запускаем снова Netbus
и чистим /uploads/ (Позже я выяснил, что NetBus копирует себя
в системный каталог операционнки, и оттуда загружается в следующий
раз, поэтому описанные действия немного неточны, и необходимо
просто перезагрузить сервер)
Фу! Ну вот и все, дальше все
ясненько, можно ломать дальше, отслеживая пароль Administrator'a
т.к. обычно на тех тачках, где весит WebSite, находится и PDC
(Primary Domain Controler). Можно, балуясь NetBus'ом, создать
ситуацию, когда Administrator будет вынужден подойти к своему
детищу и набрать заветное слово, которое нам и покажет Netbus
:) Короче, все остальное лирика.
Был произведен "дружественный
взлом" двух серверов, выкачана с них нужная информация,
ну и затем сообщено о существующей дырке. В WebSite v2.xxx эта
дыра закрыта, так как отсутствует каталог /cgi-dos, но присутствуют
другие файлы типа guestbook, которая позволяет писать тэги,
плюс присутствуют сырцы этих файлов, что меня очень радует и
дает возможность заниматься таким интересным делом! :)
Наверх