Угон ящиков на e-mail.ru ncroot Xakep, номер #066, стр. 066-062-1 (ncroot@rambler.ru, www.mayday-online.ru) Большая радость от почтовой службы Давно ли ты слышал о реальных дырах в почтовых системах? Я не имею в виду CSS-уязвимости, использование которых часто вызывает затруднения: не все пользователи ставят галочку напротив “сохранить пароль”, а перехватить чужую сессию не так-то просто. Да что там, многие юзеры вообще не используют web-интерфейс для проверки почты. В этой статье я расскажу о том, как можно получить доступ к любому ящику популярного российского почтового сервиса E-Mail.ru. Как все начиналось Один неизвестный парень (назовем его Петр), которого часто видели пьяным на домашних вечеринках пользователей "компота", однажды вспомнил о том, как 3 года назад другой хакер по асе предлагал за деньги мыльники службы e-mail.ru. На долгие уговоры намекнуть на баг он отвечал отказом. Затем просто пропал. Уж очень деятельный был парень. Через 2 года на форуме carderplanet.cc услуга была представлена жирной строкой в разделе, посвященном хакингу. Так как у Петра был аккаунт на том же e-mail.ru, ему стало обидно, что его ящики могут читать все кому не лень. Кроме того, наш герой и сам был парень не промах: ему очень хотелось почитать чужую почту и увести красивый icq uin. Под музыку "Members of MayDay - Sonic Empire" Петро начал поверхностное исследование сервера. Одно он знал точно: в форумах не было ни слова о краже всей базы e-mail.ru, что облегчало задачу - ведь тогда отпадал вариант взлома MySql или, скажем, Oracle базы. неШелковый путь Значит, дело в скриптах. Их расширение (.dll, .exe) наводит страх на обычных юзеров, но взломщик знал, что это, скорее всего, обычные сценарии для CGI - просто так настроен web-сервер. Когда же Петя ввел заведомо неверные сведения в диалоге восстановления пароля, выскочило следующее сообщение: “Cannot open file '/webmail/netauth/profiles/e-mail_ru/u_kh/notexist@e-mail_ru/notexist.dat' {No such file or directory}” (рис.2). Конечно, ничего сверхъестественного не произошло: скрипт просто ругался, что не обнаружил файла notexist.dat – notexist в данном случае это имя несуществующего аккаунта, к которому мы пытаемся “вспомнить пароль”. Полученная информация была бы полезна, если бы мы могли работать с файловой системой, но такой возможности пока не было. Судорожно нажимая на все ссылки, Петя нашел-таки скрипт, который принимал в качестве одного из параметров имя некоторого файла. Но использовать эту брешь не получилось, поскольку программа не выводила пользователю ни строчки из подключаемого файла. Что же делать дальше? Петя уже было отчаялся, как внезапно его осенило! Он вспомнил про значение параметра cmd скрипта, отвечающего за восстановление пароля – “passwd4”. Логично, если cmd может принимать значение “passwd4”, то, по-видимому, сюда можно подставить и “passwd3”, “passwd2”, “passwd1”! Так и получилось. Зверски банальная ошибка Суть баги ясна даже пятикласснику. Если passwd4 отвечал за восстановление пароля, то passwd1 отвечает за его замену. Получается, если скрипту передается параметр cmd=passwd1, то он производит смену пароля. Интересно, а старый пассворд он при этом запрашивает? Оказалось, что нет! То есть строка http://www.e-mail.ru/scripts/netauth.exe?cmd=passwd1&name=ncroot&vhost=www.e-mail.ru&pass=ncroot&repass=ncroot устанавливает пароль “ncroot” на ящик ncroot@e-mail.ru. Думаю, понятно, что переменная name - логин, vhost - домен, pass - пароль и repass - подтверждение пароля. Названия параметров pass и repass Петр получил, порывшись в настройках специально созданного для опытов ящика. Кстати, интересный факт: если менять пароль у собственного аккаунта при помощи предоставляемого интерфейса, используется скрипт netauth.dll, а не netauth.exe. Получается, что этот баг присутствует только из-за невнимательности и забывчивости программистов, которые при написании netauth.exe описали блок кода, который выполняется, когда cmd=passwd1. Причем внешних ссылок, которые этот блок вызывают, нет. Если бы программисты назвали его “jciksdjichi”, то до этой баги никто и никогда бы не докопался. |