Началась эта история ранним осенним вечером. И началась она с того что, что одна из компаний, занимающихся решением контрольных работ и написанием дипломов для нерадивых студентов, полностью решила перенести свою деятельность в сетевое пространство. Уже загодя закрывались офисы по городу, и все исполнители работ приглашались на новый веб сайт. Получил это приглашение и герой нашей истории. Из всего произошедшего он сделал вывод – теперь он Фрилансер. По многим причинам его новая роль ему не нравилась. Невзлюбил он и сайт, благодаря которому лишился привычной для него подработки, прилично помогающей бедному студенту, и был вынужден платить уже за возможность оставить предложение по заказу. А что нам порой хочется сделать с ненавистными нам вещами? Правильно, сломать! Такая мысль пришла в голову и нашему Фрилансеру. Вечер обещал быть интересным.
Начнем!
Вот теперь Фрилансеру и пригодились все его знания принципов веб-безопасности. Даром не прошли ни чтение профильного хаба, ни многочисленные статьи из интернета, ни небольшие практические опыты. Теперь он был уже не Фрилансером, а Пентестером, как мы и будем называть его в нашем повествовании. Начать было решено с формы поиска на одной из первых же страниц. Так… Sqli, нет, а XSS… Возможно! Фильтрация в поле присутствовала, но была не строгой, можно что-то и провести. Вот здесь и начинается настоящий интерес исследования ресурса! Около 15 минут было потрачено на разработку вектора атаки и вот он – на экране появилось такое долгожданное “Oops!” в окошке алерта. Но дальнейшие события Пентестера даже немного расстроили – в поле имени пользователя была устойчивая активная XSS. Обидно было биться над обычной пассивной XSSкой столько времени, когда на соседней странице была ничем не прикрытая возможность инжекции кода в ленту заказов – на главную страницу сайта! Злые мысли закрутились в голове, а что если… Нет. Пентестер не собирался эксплуатировать найденные дыры. Довольный собой он сел писать репорт администрации ресурса. Но это была бы слишком скучная история, если бы ей было суждено закончится именно здесь.
Дальше интереснее
Человек, заведовавший новым фрилансерским сайтом, и которого мы назовем просто Админ, прекрасно знал, что форма обратной связи на ресурсе отключена, а почтовый ящик не работает. Поэтому его не удивил телефонный звонок, касавшийся именно этого сайта. В ответ на заявление о проблемах безопасности он лишь сказал, что очень заинтересован этим вопросом и дал свой контактный e-mail. Пентестер же записал его любимой гелиевой ручкой в блокноте и спустя полчаса уже ждал ответного письма. Ответ заставил себя подождать. В нем говорилось, что уязвимость будет в кратчайшие сроки устранена, а Пентестеру обещалось небольшое денежное вознаграждение. Бедного студента сей факт порадовал, честные деньги за честную работу это то, чего ему сейчас не хватало. Он оставил свои реквизиты и стал ждать. Два дня. Неделю. Месяц. День становился все короче, а администрация сайта про него как будто бы забыла. Админ, а читал письма именно он, даже отказывался отвечать на почту. И здесь уже Пентестер решил серьезно заняться анализом фрилансерской биржи. Он даже еще не знал зачем, просто ему понравилась эта работа.
Сделка, господа!
Исследование началось. Беглый осмотр показал, что сайт был построен на сторонней CMS, идентифицировать которую сразу не получилось. Просмотр форм на страницах поиска и личной информации ни дал ровным счетом ничего. Модификация всех остальных данных, передаваемых в POST и GET запросах, тоже не раскрыла ничего нового. Но оставался еще один аспект работы сайта, которому не было уделено внимание – процедура оформления заказа. И в ней оставался момент, который вызывал особый интерес. Оставалось только проверить… И да! Файл готовой работы в момент обмена между исполнителем и заказчиком просто помещался в папку со стандартными правами доступа и не фильтровался по расширению. Совсем уж детская ошибка, подумал Пентестер, ему даже не верилось, что биржа, оборот которой измерялся многими сотнями тысяч рублей, могла себе позволить такую оплошность. И новоявленный взломщик не мог ею не воспользоваться. После небольшой войны с антивирусом, который упорно вытирал php-шелл с диска, скрипт был удачно загружен на сервер. Несколько кликов мышкой и Пентестер увидел на своем мониторе такое желанное меню шелла и файлы корневого каталога сайта.
Что же внутри?
Что же за CMS была так добра к Пентестеру и спокойно пустила его туда, куда вход был строго запрещен?
/**
* Home page loader
*
* @package Cotonti
* @version 0.0.3
* @author Neocrome, Cotonti Team
* @copyright Copyright (c) Cotonti Team 2008-2009
* @license BSD
*/
Так гласили первые же строчки первого открытого файла. Вот и ответ – это была Cotonti, которая если верить Википедии «обеспечивает защиту от большинства известных видов сетевых атак: PHP-инъекции, загрузка файлов, не соответствующих их типу, внедрение SQL-кода, межсайтового скриптинг (XSS), подделка межсайтовых запросов (CSRF) и др.». Как видим, не стоит верить всему, что пишут в свободной энциклопедии, хотя для любого хоть немного подкованного студента технической специальности это и так очевидно. Анализ базы данных показал, что md5 стандартных восьмизначных паролей был достаточно стоек для бесплатных баз хешей. А вот заданные юзерами пароли такой проверки не выдержали и раскололись как орехи. Цифры похожие на даты и даже одна девятизначная фамилия, написанная в английской раскладке. Как оказалось при детальном рассмотрении результатов работы, цифровые пароли принадлежали тестовым пользователям, а один единственный действительно смененный на абсолютно некриптостойкий пароль – кому бы вы думали? Сотруднице фирмы, которая все так же сидя в одном единственном оставшемся офисе оформляла заказы приходивших к ней студентов, правда уже в более непривычной ей форме. К слову сказать, на счету ее учетной записи было несколько сотен тысяч рублей, которые наш Пентестер даже не тронул пальцем. У него созрел другой план.
Трюк на миллион баксов
Админ жил своей жизнью и, судя по обновляемости сайта, совершенно забыл обо всех проблемах, связанных с ним. Сайт работал и приносил деньги. Но в тот солнечный день случилось что то непредвиденное. Судя по логам вывода средств, кто-то из пользователей, о котором в базе данных не содержалось не то что ФИО, а даже записи о последнем посещении, в которую автоматически заносился ip адрес, пытался вывести из системы достаточно крупную сумму средств. Пользователь был как тень – лишь id и соответствующий его поведению ник, например Тень. Копнув глубже, Админ понял, что никаких денег Тень вывести не может, многозначная сумма была столь же призрачна, как и сам пользователь. По факту ее просто не существовало. Но неопровержимые машинные записи говорили об обратном – деньги есть и должны быть уплачены. Паника начинала нарастать. Пентестер же в этот момент спокойно допивал свою чашку кофе, и когда на донышке оставалось совсем немного полуостывшего напитка, его взгляд упал на индикатор новых сообщений. Одно непрочитанное – письмо от так давно забывшего его Админа. «Это не вы на нас практикуетесь?» — наивно гласил текст письма. Подождав несколько минут Пентестер взял еще одну чашку кофе и набрал номер Админа.
— Здравствуйте, — произнес он спокойно, — судя по вашему последнему письму, я понимаю, что у вас проблемы и даже знаю, что могло произойти. Дело в том, что я раскрыл вам не все бреши в безопасности ресурса до того момента, как вы обо мне забыли. Можете подробнее рассказать, что у вас стряслось?
В ответ в трубке послышалась сбивчивая речь Админа, пытавшегося объяснить ситуацию. Спустя несколько минут ему это удалось.
— Вероятно, я понимаю, как у злоумышленника это вышло, — сказал Пентестер, а про себя подумал, что всего несколько правильно сформированных SQL запросов могут творить чудеса. – Я бы даже мог вам помочь, но вы поступили очень нехорошо в момент нашего первого сотрудничества…
Разговор продолжался еще несколько минут и содержал много извинений. А спустя сутки на счет Пентестера поступила символическая 1000 рублей. Но ему уже не нужны были деньги – ему хватило того растерянного и напуганного голоса из трубки чтобы решить для себя – справедливость восторжествовала. Спустя еще двое суток уязвимость, о которой Админ был уведомлен, была устранена путем отключения функционала обмена файлами, который был восстановлен еще спустя сутки. Тень же растворилась так же, как и появилась на сайте. Никто даже не заметил того момента, когда пользователь со злополучным id просто исчез, не оставив за собой ни единого байта в таблице.
Вместо выводов и заключений
Пентестер еще долго задавался вопросом: правильно ли он поступил? Можно ли было поддаваться минутному порыву, или вся эта история должна была выглядеть иначе? В любом случае, для себя он решил, что развязка была как нельзя удачна. Сайт больше не испытывал проблем с безопасностью и стал достаточно хорошо защищен, а Пентестер получил свой маленький бонус. Теперь уже точно Пентестер, а не Фрилансер, на биржу, оставившую в душе столько впечатлений, он так и не вернулся.
Автор: anlas