Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #104, АВГУСТ 2007 г.

Бесплатный кредит

Виталий «root» Чернов

Хакер, номер #104, стр. 078

(vr-soft@mail.ru)

Двухсерийный взлом банка

Как-то раз я ходил погашать кредит. Ожидая на кассе своей очереди, я вдруг подумал: «Сколько можно отрывать от сердца больше половины зарплаты и тратить нервы? Чем эти жадные уроды лучше других? Вот был бы способ погасить кредит досрочно и на халяву... А почему бы и нет?» С этой мыслью я уступил место в очереди какой-то бабульке и со спокойной совестью пошел домой... ломать банк, чтобы погасить кредит без очереди.

И делал я благое дело среди царящего здесь зла

Из всего набора необходимых данных у меня был только адрес сайта этого банка - www.abnk.kz. Ни белых адресов банковских сетей, ни схемы инфраструктуры... Я даже не знал, где находится главный офис и хостится сайт. Хотя... тут я вспомнил, что, когда заключал договор с банком, у них как раз на моей очереди случились какие-то проблемы с сетью. Естественно, мне это было небезынтересно хотя бы потому, что большую часть своей профессиональной жизни я отработал сисадмином. После нескольких социнженерных уловок добрые тетеньки менеджеры выложили мне практически полную топологию своей сети. Оказалось, что главный офис у них находится в столице, а несколько дочерних в нашем городе просто подсоединены к провайдеру по IDSL-каналам. Это означало, что если узнать белые IP-адреса главного офиса, то от взлома их сможет спасти только техника.

Недолго думая, я проверил сайт на domainsdb.net и сильно расстроился :(. Вместе с банком на сервере хостилось еще несколько контор, а это могло означать только одно: хостинг платный и не имеет никакого отношения к серверам банка. Как ни печально, но единственная зацепка оказалась пустышкой. Что ж, вариантов было немного, а потому, хорошенько затарившись на сэкономленные деньги зажигательной жидкостью в виде окрыляющего RedBull’а, я подключил GPRS, зарядил свежий анонимный прокси и отправился на сайт в поисках хотя бы чего-нибудь полезного.

А ларчик просто открывался

Немного посерфив cgi-странички, внимательно изучив исходники, я понял, что меня ждет долгий и интересный взлом с целью «погашения» кредита.

Обычные SQL-инъекции, XSS- или подобного рода уязвимости можно было и не пытаться искать. Движок сайта был написан вручную с нуля, причем, скорее всего, какой-то конторой под заказ. Уж больно грамотно все было сделано, хотя это и не исключало ошибок. Втыкать в случайном порядке одинарные кавычки в адресную строку мне быстро надоело. Решив не тратить время на «детские шалости», я натравил на сайт свой любимый Xspider. Через полчаса сканирование завершилось удачей для меня!

Можно было и самому догадаться почитать robots.txt в корне сайта, но раз уж это сделала программа, то...

Короче, среди десятка строк с каталогами, которые не обходятся поисковой машиной, лежали три самых интересных.

/cgi-bin/admintool/

/phpmyadmin/

/arch/

Чуешь чем пахнет? Правильно, админкой сайта, админкой базы данных и каталогом бэкапов :).

Да здравствует солнце, да скроется тьма!

Первым делом я пошел в админку и тут же сполз под стол. На странице висело приглашение, а также следующие поля ввода:

Фамилия

Имя

Логин

Мыло

Контрольное_Слово1

Контрольное_Слово2

Пароль

Интересно, к чему такая защита? В такие моменты сразу вспоминается народная мудрость, которая звучит примерно так: «Заборы и замки – от честных людей». Или так: «Если кто-то очень захочет что-то сломать, то его не остановят даже двадцать паролей». В общем-то, я и не надеялся, что удастся сразу зайти в админку, так что почти не расстроился... Открыв исходники страницы, я, хотя мне это и несвойственно, улыбнулся, поскольку в комментариях разработчик оставил такое послание: «В принципе, здесь нет ничего интересного... Но помни! Чрезмерное любопытство ведет к плагиату!» Юморист, блин.

Тем не менее не останавливаясь на достигнутом, я пошел по ссылке www.abnk.kz/arch. Как и следовало из имени, каталог действительно оказался файловой помойкой. Куча html’ок, zip- и tar.bz2-архивов. Вот это уже интереснее :). Широкая русская душа заставила меня найти наиболее тяжелый файл и скачать его. Этот файл имел самое неприметное название – source.tar.bz2 и весил 250 метров. Удача на этот раз была явно на моей стороне! Естественно, качать такой объем по GPRS я не собирался. Открыв асю и полистав контакты, я нашел ближайшего знакомого с выделенкой, попросил скачать архив и пошел спать со спокойной совестью. Наутро заболваненный файл был уже у меня.

Архив был свежий.

# bunzip2 source.tar.bz2

# tar -xf source.tar

Посредством этих двух строчек я получил точную копию сайта интересующего меня банка. Самое время погрузиться в дебри CGI.

Все, что меня сейчас интересовало, – это админка, а точнее, два кодовых слова, которые надо было ввести помимо личных данных пользователя. Искать пришлось недолго. В исходнике зеленым по черному стояла проверка этих полей с двумя конкретными MD5-хешами. Вот они:

1. b9726e0992371e1ad37bf1e47d280c61

2. d41d8cd98f00b204e9800998ecf8427e

Не знаю, может, кто-то и подберет их, но у меня терпения хватило ровно на два дня. Не дождавшись своих паролей, я отрубил брутфорс и перешел по следующей, третьей ссылке: www.abnk.kz/phpmyadmin.

То, что я увидел здесь, ввело меня в ступор! Несколько минут я сидел как вкопанный... Нет, я, конечно, понимал, что встречу здесь админку базы данных, но то, что она будет с правами админа, я никак не думал!

Ну админ... Надо быть либо гением, либо полным идиотом, чтобы оставить такую дыру. Наверное, ему было приятно заходить на сайт и, не заморачиваясь с паролем, сразу редактировать базу. Хотя, кто знает, обычно такой софт предоставляет сам хостер, так что, скорее всего, это его вина. Жаль, что идея полазить по другим сайтам хостера и немного «подправить» их не пришла мне в голову сразу.

Сейчас моей задачей был не банальный дефейс. Мне даже неинтересно было заглядывать в таблицу users. Я нашел кое-что поинтереснее :). Среди гор таблиц в базе лежало около десятка с названием «что-то_там_watcher». Это были счетчик посетителей, логгер айпишников и т.п.

В первых же строках я нашел и адрес своего прокси :). Значит, эта штука реально работала. Только как теперь оттуда вытащить нужные банковские адреса? Я решил посчитать.

Отделяем мух от котлет

IDSL-линии в нашем городе тянет только одна контора. В столице есть еще несколько, но, как правило, крупные организации заключают договоры о предоставлении каких-либо услуг с одной организацией для всех филиалов. И интернет здесь не исключение. Какой смысл заключать договоры с разными провайдерами и платить каждому в отдельности, если «Казахтелеком» работает на всю страну? Но это были лишь логические доводы. И как потом оказалось, я двигался в правильном направлении.

Я вспомнил о соседе, у которого был протянут IDSL. Выцепив его в аське, я попросил его зайти на www.myip.ru. Он тут же скинул мне результат: 85.102.53.78 (повторюсь: реальные адреса я по понятным причинам не указываю; все совпадения случайны). Логично было предположить, что все, что начинается с 85, – это пул одного и того же провайдера. В результате экспортирования и простой фильтрации cat ipwatcher | grep 85 я получил нехилый списочек диапазонов IP-адресов.

Перед тем как начать копать, я нашел в таблице users пользователя с неприметным именем admin и настрочил ему увесистое письмецо с описанием уязвимостей на сайте и способами их устранения. А в качестве бонуса я прикрепил к письму хеши паролей админки и его личный ;).

Передо мной стояла сложная задача – разгрести около 5000 строк в поисках одного диапазона IP-адресов. Как можно было упростить эту задачу? Я вышел на каталог казахстанских сайтов (www.site.kz) и открыл страничку с хостерами. Мне повезло, и, кроме ссылок, там лежали физические адреса и телефоны организаций. Выбрав несколько хостеров из столицы, я начал пинговать всех по очереди. Каково же было мое удивление, когда я обнаружил, что айпишники больше половины из них начинаются с 85.104. Конечно, все они использовали IDSL-линии. Еще одна фильтрация - и список уменьшился сразу в несколько раз. Рассортировав список в порядке убывания и пробежав его взглядом, я отсеял адреса, которые встречались 1-2 раза, после чего удалил повторяющиеся строки из оставшихся. В результате этих нехитрых манипуляций база айпишников стала содержать в себе чуть более 40 строк.

Следующим шагом собранные «сливки» попали под обработку командой host, которая, как известно, возвращает имя хоста по заданному IP-адресу. Результаты не могли не радовать – похоже, я нашел то, что искал!

# host 88.104.193.193

88.104.193.193.in-addr.arpa domain name pointer gw1.abnk.kz.

# host 88.104.192.181

88.104.192.181.in-addr.arpa domain name pointer mail.gw1.abnk.kz

От предвкушения дальнейших действий захватывало дух.

Время – деньги!

Почтовый ящик трещал по швам от спама, но ответа от админа не было, хотя прошло уже два дня. Копии моего послания админу полетели еще на два ящика: support@abnk.kz и info@abnk.kz. В конце писем я как бы невзначай добавлял, что, в случае если от них не последует реакции в течение суток, их сайт будет зверски взломан ;).

Я не спешил атаковать центральный сервер – на этот счет у меня была немного другая идея. Если в течение суток они не ответят или не закроют дыры, сами виноваты. Их сайт подвергнется дефейсу, а пока они там всем банком будут его восстанавливать и искать виновника, у меня будет больше шансов проникнуть на сервер незамеченным. Ведь админы - тоже люди :). Вся фишка в том, что они должны прекрасно понимать отсутствие связи сайта с сервером, а значит, все внимание будет приковано к сайту, а не к головному серверу. Никто и не подумает, что сайт был взломан только для того, чтобы проникнуть на сервер. Что ж, теперь остается только ждать.

Молчание – знак согласия

Как ты уже понял, мои письма они проигнорировали. Что и требовалось доказать! Именно это мне и было нужно. Не хотят закрывать дыры – заставим, не умеют – научим. Перед тем как дефейсить сайт, я натравил nmap на gw1.abnk.kz. Из имени хоста можно было сделать вывод, что это шлюз центрального офиса (gw – gateway, цифра 1 – головной). Результаты сканирования не заставили себя ждать:

21/tcp open ftp

22/tcp open ssh

53/tcp open domain

139/tcp filtered netbios-ssn

443/tcp open https

1720/tcp filtered H.323/Q.931

1723/tcp open pptp

3306/tcp open mysql

Вот такое интересное кино получается. На сервере стоят никсы, открыт FTP для служебного пользования, работает DNS. Также, возможно, стоит LDAP, если уж они внутри сети используют никсовый DNS. Https, скорее всего, используется для безопасного обмена данными с другими офисами. MySQL есть, но, вероятно, не для базы клиентов банка. Если стоит https и идет обмен данными с другими офисами, то какой смысл тут же держать открытой базу? Наверняка, там висит какой-то сервис, который обрабатывает POST-запросы, а сам уже работает с базой данных, расположенной на специально отведенном сервере.

Вломиться на FTP не получилось. Анонимного юзера посылали на Lost Connection. Долбиться на SSH было бесполезно. На большинстве крупных серверов суперпользователь фильтруется, и зайти можно только под обычным с последующим повышением прав. А логины обычных пользователей взять, конечно, было неоткуда. Оставался лишь pptp.

За неимением логинов я решил долбиться под рутом. Сгоняв на www.thc.org, я обновил свой старенький pptp-брутер до версии 0.1.4. Потом достал из заначки 200-метровый словарик, подготовил командную строку к бою и еще раз проверил мыло. Письма по-прежнему не было. В консоли висела строка «cat * | ./distr/pptp/pptp_bruter 88.104.193.193».

Настало время действовать

Обновив прокси, я зашел в админку базы данных. Бэкап делать я даже и не думал. Настало время играть по-взрослому. Чем больше у них будет головной боли, тем больше я выиграю времени. Конечно, ты можешь сказать, что это противоречит принципам хакера, но когда речь идет о серьезных намерениях, а не о простом дефейсе, то тут уже не до благородства. Если учесть, что было послано три письма, которые остались без ответа, моя совесть чиста :).

Легким движением руки таблицы одна за другой обнулились. После этого на главную страницу стало невозможно смотреть без слез. Остались только картинки, да и те были как-то криво раскиданы ;). Но торопиться было нельзя, нужно было дать им время, чтобы они успели сообразить, что к чему. Через полчаса указательный палец опустился на <Enter>. Посмотрев несколько минут на процесс перебора, я пошел спать.

Гидрой по базе

Проснувшись примерно через 4 часа, я первым делом подошел к компу. Брутфорс поработал на славу. Пароль был подобран. Банально: Gladiator. Банку явно не повезло - а нечего процент на кредит заоблачный ставить :)!

IP-адрес моего соединения был 192.168.7.41. Недолго думая, я попинговал 7.1, 7.254, а также диапазон от 7.1 до 7.50. Несколько адресов были живыми, и почти все они оказались виндовыми машинами. Как показал nmap, 7.1 был шлюзом, а 7.10 – сервером с базой данных MSSQL. Вот результаты nmap.

PORT STATE SERVICE

42/tcp open nameserver

53/tcp open domain

88/tcp open kerberos-sec

100/tcp open newacct

135/tcp open msrpc

139/tcp open netbios-ssn

389/tcp open ldap

445/tcp open microsoft-ds

464/tcp open kpasswd5

593/tcp open http-rpc-epmap

636/tcp open ldapssl

1026/tcp open LSA-or-nterm

1027/tcp open IIS

1433/tcp open ms-sql-s

3268/tcp open globalcatLDAP

3269/tcp open globalcatLDAPssl

3389/tcp open ms-term-serv

Вот такие ужасы творятся на виндовых серваках. Надо полагать, что если на сервере настроен MSSQL, значит, это кому-то нужно :). Я полагал, что то, что хранится в этой базе, нужно как раз мне :). Через пару минут thc-hydra была скомпилирована и готова к работе. Эта замечательная программка служит для подбора паролей по словарю по многим протоколам. Протокол MSSQL также присутствует, причем компилируется по умолчанию. Для него не нужны дополнительные библиотеки, как для SSH (libssh).

Для того чтобы запустить Гидру, нужно знать логин и иметь хороший словарик с паролями. Как известно, на MSSQL-сервере существует пользователь SA (System Administrator), по умолчанию обладающий правами админа. Вот для него-то я и подбирал пароль. Сразу скажу, что пароль Glagiator не подошел :).

# hydra -l sa -P allwords2.dic -t 50 192.168.7.1 mssql

Словарь для перебора я взял на диске одного из прошлых выпусков журнала. Через пару часов работы Hydra выдала сообщение:

[1433][mssql] host: 192.168.7.1 login: sa password: metall

[STATUS] attack finished for 192.168.7.1 (waiting for childs to finish)

Ура! Пароль был подобран. Админам явно не хватало фантазии на более серьезные комбинации :). Пока пароль подбирался, я успел скомпилить VMWare Server и установить на него винду, после чего воткнул туда Enterprise Manager из стандартной поставки MSSQL Server.

Сильно тормозя, Enterprise Manager подконнектился к базе. Быстро пролистав ее, я понял, что нашел то, что искал. Кроме стандартных Master, Mist, на сервере крутилось еще несколько баз данных, и одна из них называлась Credits. Сделав выборку из базы, я нашел всю подноготную своего кредита и кредитов нескольких своих друзей, которые тоже имели дело с этим банком.

И был взлом!

В этот момент я задумался: а стоит ли идти дальше? Банк можно считать взломанным, кредит погашенным, но если я удалю себя из базы, где гарантия, что работники банка не поднимут бумажные документы? Ведь кредитный договор-то оставался в силе!

Я опять вошел на сайт... Он по-прежнему был задефейсен, и никто, по-моему, не спешил его поднимать. Немного поразмыслив, я закрыл pptp-соединение. Через несколько минут было готово письмо админам. В нем я описал всю процедуру взлома и предсказал возможные последствия. Я предложил им только одно: ставить пароли не менее 16 символов, состоящие из букв разного регистра, цифр и спецсимволов. К примеру, Fg#.]{76Hjk;!iGS.

INFO

Кстати говоря, баг закрыли только через две недели, пароли к серверу поменяли тогда же :).

WAING

Уясни себе хорошенько, что все действия, описанные в статье и относящиеся, естественно, к области фантастики, подпадают под 272-ю статью УК РФ. Не вздумай совершать нечто подобное, иначе можешь поплатиться свободой.

Содержание
ttfb: 44.939041137695 ms