Содержание статьи
Тропический анлим
В последние годы среди наших соотечественников стали крайне популярны путешествия в разные далекие страны. Вот и я не стал исключением, отправившись в конце прошлого года в Таиланд. Сам отдых, конечно же, проходил легко и беззаботно… Однако все омрачало одно большое «но» — интернет в отеле был крайне дорогой и отнюдь не безлимитный.
Завязка
Итак, оказавшись в одной из прекраснейших локаций Таиланда, я крайне удивился, когда на ресепшене отеля мне сказали, что коннект к их Wi-Fi-сетке стоит 900 бат (один бат примерно равен одному рублю) за шесть часов! Но так как я приехал не ругаться, а просто отдыхать от суеты повседневной жизни, то с миной сожаления на лице все-таки купил логин и пароль для доступа к интернету на эти пресловутые шесть часов. Инструкция по коннекту выглядела примерно так:
- Подключите ваш ноутбук или любое другое устройство к сети, доступной в вашем номере.
- Откройте ваш браузер и перейдите по адресу http://1.1.1.1.
- Введите ваши имя пользователя и пароль, откроется попап-окошко с вашим IP и обратным отсчетом оставшегося времени.
- После завершения работы в интернете выйдите из системы с помощью ссылки http://1.1.1.1/logout.php.
Как видишь, все банально и просто. Однако через два дня активного отдыха все время для честно приобретенных аутентификационных данных вышло. Дальше я решил купить еще одни логин и пароль, которые также очень быстро закончились. Тут меня одолела обида и злость на столь жадный отель, и я решил во что бы то ни стало выбить себе нормальный доступ в интернет :).
Что в сетке?
WARNING!
Вся предоставленная информация является плодом больного воображения автора. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
Первым делом я обратил внимание на приведенную выше инструкцию. Из нее были ясны по крайней мере две простые вещи: вся их система крутилась на php, а 1.1.1.1 — это основной сервер сетки отеля для аутентификации. Сначала стоило потестить форму авторизации на банальные SQL-инъекции вроде «1' or 1=1 –», но, конечно же, сразу ничего не вышло. Дальше я решил оставить в покое эту самую форму и посканить аутентификационный сервер с помощью всем известного DirBuster’а. Каково же было мое удивление, когда спустя всего минуту после начала скана была найдена директория со скромным названием ./phpmyadmin! Быстренько перейдя с помощью браузера в эту директорию, я удивился еще больше, ведь версия phpMyAdmin за номером 3.3.2 была вполне хакабельной! Оставалось только найти нужный сплоит. Таковым оказался «phpMyAdmin < 3.3.10.2 & < 3.4.3.1 Session Serializer arbitrary PHP code execution exploit» от M4g’а. Для начала я просто проверил, действительно ли данная версия скрипта уязвима, настроив эксплойт следующим образом:
/*Settings*/
$pmaurl = 'http://1.1.1.1/phpmyadmin/'; //full PMA url
$payload = '<?php phpinfo(); ?>'; //PHP code to execute
После запуска всего этого непотребства на экран моего ноутбука вылез вполне корректный вывод информационной функции phpinfo(). Таким образом, все мои догадки подтвердились, и можно было действовать дальше!
Действуем
После небольшого вояжа по серверу я понял, что мне необходимы доступы к админкам и доступы к БД. Для нахождения оных я разведал, где на сервере находятся все файлы с префиксом config, и вывел их содержимое на экран вот так (сразу оговорюсь, доступных на запись директорий на тот момент я не нашел):
print htmlspecialchars(exec("cat ./3rd/phpsysinfo/config.php ./php/include/config.php ./php/lib/class/class.config.php ./php/templates/tpl.dev/admin/aaa/* ./php/wwwadmin/aaa/*"));
В одном из таких конфигов лежали данные для подключения к БД:
driver = mysql
host = localhost
port = 3306
name = authgw6
user = authgw6
pass = 3e930d569a
А также где-то тут находился и URL некой админки (http://1.1.1.1:8080).
Админка номер раз
Пошерстив немного по найденной базе с помощью все того же phpMyAdmin, я нашел табличку под названием admins c паролями в открытом виде :).
Взяв для примера самый очевидный логин admin с паролем P@ssword, я авторизовался в той самой админке. В ней были следующие секции:
- Home;
- Status;
- Online session;
- Network;
- Firewall;
- Radius config;
- License;
- Services;
- Local account;
- System.
Побродив немного по обнаруженной административной части, я понял, что ничего интересного она из себя не представляет. Единственным более или менее забавным разделом админки был «Online session» — здесь было видно всех авторизованных пользователей, причем любого из них можно было кикнуть из сети в любой момент с помощью соответствующей кнопки «Kick» :). Но я этого делать не стал и задумался над дальнейшими действиями.
Итак, найденная админка представляла собой всего лишь что-то типа настроек самого сервера или роутера. Однако я узнал, что вся сетевая инфраструктура отеля крутится на протоколе RADIUS (Remote Authentication in Dial-In User Service). Дальше я вспомнил о вышеупомянутых конфигах и о таких вот строчках в них:
88 system radiusqueuewait 1
89 system radiusqueuefailwait 1
90 system afterlogin_static_arp 1
91 gateway myip_url http://kkthai.com/myip.json.php
92 gateway myip_enable
93 license url http://licensekey.kkthai.com/license.php
94 license customer_serial тут_номер
95 license customer_password тут_пассворд
Зайдя на сайт kkthai.com, я увидел, что эта тайская фирма является поставщиком различных RADIUS-решений для отелей, в частности «KKkthai LISG Hotspot Software». Здесь, конечно, было бы логичным зайти под известными мне логином и паролем в аккаунт моего отеля на их сайте, поискать исходники установленных программ, но я оставил этот вариант на потом. Из описаний на сайте KKthai я узнал самое главное — их продукт поставлялся в виде двух модулей: того, что я нашел (Core Gateway), и собственно биллинга. Он-то мне и был нужен!
Админка номер два
Теперь необходимо было найти биллинг. Для этого я сделал две вещи: зарядил DirBuster на произвольный брут по символам 0-9a-z_ и принялся с помощью сплоита для phpMyAdmin шерстить подконтрольный сервер (напоминаю, залиться мне так и не удалось, так что это выглядело не совсем тривиальной задачей). Вскоре работу DirBuster’а мне пришлось прервать, так как я встретил очень знакомое название в имени директории — lisg_v2. Там же находился и еще один конфиг БД:
<?php
$dbhost="localhost";
$dbusername="lisg";
$dbpassword="e4526a0f6e";
$dbname="lisg";
$logfile = '/var/log/lisg/lisg_v2.log'
?>
Дальше, натравив свой браузер на http://1.1.1.1/lisg_v2/, я увидел авторизационное окошко (кстати, посмотреть на демку биллинга ты сможешь по адресу www.kkthai.com/demo/). Введя в это окошко уже знакомые тебе данные admin; P@ssword, я очутился в администраторском аккаунте биллинга своего отеля :).
Здесь разделы уже выглядели повеселее:
- Admin User;
- Generate Account;
- User Manager;
- Group Manager;
- Database Misc.;
- Refill Day;
- MRTG Monitor;
- Billing Report;
- LAW Report;
- On line User;
- Log Out.
Побродив по биллингу и осознав свою всесильность (легко можно было создавать/удалять/редактировать юзеров, просматривать финансовые отчеты, редактировать «крутость» групп пользователей и так далее), я нашел ссылку на MySQL Squid Access Report 2.1.4 (http://1.1.1.1:8080/mysar/). Эта веселая софтина позволяла легко и просто искать по IP или MAC-адресу логи пользования интернетом постояльцев отеля. Причем эти логи представляли собой полный (!) подробный (!) отчет о том, на какую ссылку, когда и на какое время заходил юзер! И кто тут говорит о конфиденциальности пользовательской информации?!
Самое главное
Ладно, оставим логи и вспомним о моей основной цели — бесплатном интернете в отеле. Сначала я, естественно, попробовал добавить безлимитного пользователя через сам биллинг. Однако этот пользователь при просмотре списка юзеров (и в некоторых других списках тоже) находился на самом верху, так что администраторы системы вполне могли спалить непонятного анлимщика :). Удалив тестовый аккаунт, я отправился в phpMyAdmin с данными для аутентификации в БД биллинга. Успешно авторизовавшись и немного побродив по базе данных, я обратил внимание на табличку radcheck:
INSERT INTO 'radcheck' ('id', 'UserName', 'Attribute', 'op', 'Value', 'check_time') VALUES
(1, 'XXX', 'Password', '==', 'p@ssw0rd', 0),
(5, 'XXX', 'Password', '==', 'DgaXnu', 0),
(4, 'test1', 'Password', '==', '1234', 0),
(6, 'XXX', 'Password', '==', 'WqHaCA', 0),
(7, 'XXX', 'Password', '==', 'yAnjMW', 0),
...
Эта абракадабра до боли напоминала выданные мне ранее на ресепшене логин и пароль. Бинго!
Дальше я немного глубже поизучал эту табличку и понял, что безлимитные аккаунты в ней создаются путем замены значения «Password» в поле «Attribute» на значение «Expire-Disabled», а также путем подстановки какой-нибудь прошедшей даты в поле «check_time». Для незаметности я нашел где-то посередине (это важно, мой аккаунт тогда не был бы виден сразу ни в каких списках биллинга) таблицы старый просроченный аккаунт с «Password», изменил его имя, пароль и другие поля, описанные выше, и сохранил новый, проапгрейженный вариант пользователей в базу. 🙂
Напутствие
Ну вот и все. Я достиг своей цели, получил бесплатный безлимитный интернет (который и так по дефолту должен быть во всех отелях) и тайно наказал за жадность админов моего резорта. Все оставшиеся дни отдыха я спокойно мог выходить в Сеть, не боясь, что часы на моем аккаунте внезапно закончатся. Надеюсь, что тебе понравилась эта история и ты вынесешь из нее какую-нибудь пользу. На этом разреши откланяться.
WWWW
DirBuster: bit.ly/oG5JW2;
phpMyAdmin < 3.3.10.2 & < 3.4.3.1 Session Serializer arbitrary PHP code execution exploit: bit.ly/Jiel2k;
немного про RADIUS: ru.wikipedia.org/wiki/RADIUS.