Наверное, ты думаешь, что сайты популярных проектов сломать нелегко. Отчасти ты прав, но случается и такое, что якобы безопасный портал содержит в себе массу дыр. Один из них -
cygwin.com.
Дырявый cygwin
Все началось очень банально. Как ты знаешь, на cygwin.com или sourceware.org находятся бинарники РедХатового Cygwin (эмулятора Linux под Win32). Мне и в голову не приходило ломать этот чудесный портал, я просто хотел скачать пару обновленных бинарей. Зашел на главную пагу, затем посетил соответствующий раздел и решил ознакомиться со списком новых частей проекта. В этом мне с радостью помог скрипт package-cat.cgi, находящийся в каталоге /cgi-bin2. Я уже все изучил и почти нажал кнопку Download, но меня остановила одна деталь. Я бы даже сказал, мелочевый нюанс. Ясен перец, что скрипт понимал входные параметры, а точнее один параметр - file. Его значение равнялось патчу к необходимому дескрипшну. Опции с названием file, file_name или filename я не мог просто проигнорировать. Тем более, часом раньше я объяснял одному скрипткидису принцип WWW-бага, когда вместо thisiscoolarticle подставляется /etc/passwd. Подумав, мол, что тут такого особенного, я заменил значение projects/python на ../../../../../../../../../etc/passwd. Я ожидал, что в ответ на запрос появится надпись о выезде ко мне бригады ФБР. Но ошибся. Без какого-либо промедления я получил полноценный passwd. В течение минуты я находился в шоке! Вот уж не думал, что в cygwin работают плохие программеры. Возможно, ты мне не веришь, что я так быстро научился читать файлы, но я тебе это докажу :). Можешь сам изучить
их /etc/passwd. Ты думаешь, что на этом история заканчивается? :). Это не совсем так.
Слушай мою команду...
Как здравый человек, я решил, что раз скрипт умеет читать файлы, то и команды исполнять он тоже должен. Подставив в качестве параметра
|uname -a| я офигел по полной программе. Ведь системные команды тоже выполнялись :). Правда, ядрышко было патченным, но никто мне не мешал ознакомиться с содержимым сервера.
При взгляде на онлайн-юзеров были обнаружены 2 онлайновых рутовых аккаунта (с логином zroot), бдящих за безопасностью. Моя рука не дрогнула, несмотря на небольшой idle-time, ведь поломать cygwin можно только раз в жизни :).
Несмотря на бажный скрипт, я подумал, что админы не тратят время, а действительно мониторят сервер. Я не ошибся, это ты узнаешь чуть позже. А пока, пришло время выполнить команду cat `locate .bash_history`. Времени на изучение пермишенов у меня не было, админ мог в любую минуту заметить мое пребывание на тачке. Через несколько секунд на экране появились строчки команд. Не знаю, что я хотел в них увидеть: рутовый пароль, редактирование важных документов, аккаунт к mySQL... Результат меня порадовал, среди команд были коннекты к apple.com и ibm.com :). Наконец, я узрел строчку "mysql -u root -h localhost". Она
говорила о том, что mySQL вообще не был запаролен! Тремя командами ниже нашлась строка, дампящая базу bugs. Не знаю, что это были за баги, но очень уж я хотел с ними ознакомиться. Заюзав mysqldump, я задампил всю БД в каталог /tmp с мыслью - "ночью поизучаю". Однако ждать ночи мне не пришлось...
Первая тревога
Процесс дампа закончился нормально. База весила 450 метров, что не могло не радовать :). Такой улов я давно не получал. Теперь, когда процедура бэкапа завершена, я запаковал файл /tmp/base.sql в архив tar.gz. После запаковки я получил 250 метров. Уже ничего! Только как это добро выкачать я не знал. Пришлось составлять ftp-сценарий и заливать базу на FTP-сервер доверенного сервера. Уже через 5 минут я запустил процесс аплоада. Сначала все шло без сбоев, однако через 10 минут закачка прервалась. Просто прервалась, без каких-либо причин. Вначале я подумал, что скрипт завершил команду по таймауту и хотел повторно составлять сценарий. Но все было гораздо хуже. Не знаю почему, но я выполнил w и увидел, что zroot запустил утилиту top. Видимо он и кильнул процесс заливки файла. В этой борьбе я хотел одержать победу - слить злополучную базу данных.
На последнем дыхании
У меня в голове созрел новый план. Я подумал, что скачивание полугиговой базы займет не менее 10 минут. За это время рут засекет посторонний процесс и прервет его kill'ом. Нужно было пойти другим путем. Я захотел проверить права на WWW-каталоге. Скомандовал ls -lad .. и узнал, что в корень WWW заливать может только рут, однако пермишены на /images разрешали nobody скидывать в него файлы. Уже что-то. Но тут я вспомнил, что удалил базу из /tmp. Пришлось снова запускать mysqldump. Скрестив пальцы, я надеялся, что рут не прибьет важный процесс. Слава Богу, этого не случилось. Случилось другое :). Я выполнил команду w и увидел, что админ добрался до access.log и старательно его изучал. Действовать нужно было без
промедления, я знал, что буквально через пару минут рут удалит бажный скрипт. Процесс дампа завершился, и тогда было решено перенести базу в файл /images/title.gif. Получилась прикольная полугиговая картинка :), которую я тут же стал вытягивать. Параллельно мне удалось следить за действиями рута, он уже закончил просмотр лога. Я понимал, что админ уже знает о роковом WWW-баге. Через 2 минуты я уже не мог подключиться к 80 порту. В ход пошла защита
файрволом :). Однако скачивание "картинки" продолжалось, почти половину базы к тому времени мне удалось слить. Я заюзал другой прокси и подчистил /tmp. Примерно через 5 минут база полностью скачалась, после этого без промедлений я удалил /images/title.gif. И вот спустя несколько мгновений на запрос к скрипту сервер выдал ошибку 404 - видать рут побеспокоился о безопасности и стер бажный сценарий к чертовой матери :).
Админ предпринял все меры против нежданного хакера. Он
зафайрволил все хосты, с которых я посещал cygwin.com (не забыл даже про хост доверенной машины с FTPD), но лишился базы данных с багами в продукте gcc. Внутри БД были таблицы с перепиской юзеров и программеров, вплоть до последнего дня. Помимо этого, в таблицах хранились интересные аккаунты на какие-то сервисы и список всех cygwin-продуктов. В общем, неплохой улов. В данный момент я изучаю эту базу и вникаю в смысл переписки :).И не жалею о том, что провернул хорошую атаку. Думаю, что если бы залез на машину ночью, данных было больше. Хотя кто знает, может за сервером дежурит целая бригада злых администраторов :).