Привет, расскажу про квест $natch на минувшем PHDays 2013.
$natch - ДБО-система, реализованная на php с использованием ООП и паттерна MVC.
Участники конкурса получили исходный код приложения и виртуальную машину за 24 часа до соревнования.
В исходниках были: папки Application, library, logs, public, sql-скрипт ibank.sql и readme-users.txt
В папке logs хранились 2 файла: messages.log и changePassword
Подробнее о сервисе:
Существовал десктопный и мобильный вариант сервиса.
Пользователи различались по способу отправки денег:
1 вид - Mobile bank - Отправка денег не требовала подтверждения;
2 вид - SMS-tokens - На наш номер "отправлялась" СМСка с кодом подтверждения;
3 вид - Transaction authentication numbers - было 10 (14?) одноразовых паролей, которые запрашивались
для подтверждения транзакции.
У некоторых контактов при входе требовалась смена пароля.
Пользователь мог создавать контакты, экспортировать и импортировать их в xml.
Так же пользователь мог создавать шаблоны для отправки денег.
Сорцы тут:
"Вы
не можете прикреплять вложения", поэтому сорцы выложит Beched или Orb
или я =)
сорцы
Сразу скажу, что анализ приложения проходил в режиме blackbox 2 whitebox, потому что достаточно тяжело
удерживать и отлаживать в голове такой громоздкий код. Вопрос встал не столько в поиске, сколько в грамотной автоматизации
Уязвимости:
1) Обход Captcha:
Самая простая уязвимость, при логине с мобильной версии не запрашивалась captcha:
Устанавливалась кука "mobileInterface=true";
2) XXE в шаблонах и чтение файлов:
Картинка с шаблонами
Так как сервис локальный, сообщения для подтверждения транзакций не отправлялись, а складывались в /var/www/logs/messages.log. Смена пароля логировалась в changePassword.log
К этим файлам не было доступа напрямую, они были выше корня.
Пример импортируемого файла, который читал бы логи:
PHP код:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE name [<!ENTITY xxe1 SYSTEM "php://filter/convert.base64-encode/resource=///var/www/logs/changePassword.log" ><!ENTITY xxe2 SYSTEM "php://filter/convert.base64-encode/resource=///var/www/logs/messages.log" >]>
<contacts>
<contact><name>1</name><account>2</account><description>&xxe1;</description></contact>
<contact><name>2</name><account>3</account><description>&xxe2;</description></contact>
</contacts>
base64-кодирование осуществлялось для валидации xml.
Пример (xxe в поле name)
Код:
atob("WzIwMTMtMDUtMjYgMjI6MTI6NTBdICMyIG5ldyBwYXNzd29yZCBpYmFuawo=")
"[2013-05-26 22:12:50] #2 new password ibank
"
atob("WzIwMTMtMDUtMjYgMjI6MTI6MThdICMyIDk4MS03NjUtNDMtMjEgT1RQIGNvZGU6IDQ4NDY2Cg==")
"[2013-05-26 22:12:18] #2 981-765-43-21 OTP code: 48466
"
К сожалению, поле description не отображалось в браузере, а поле name вмещало только 255 символов, поэтому xml пришлось выкачивать и парсить как xml. Я использовал python ElementTree
Таким образом я получал доступ ко всем измененным паролям и сообщениям для подтверждения.
3) Возможность редактирования шаблона, не принадлежащего конкретному аккаунту
Предполагалось, что боты будут слать друг другу деньги, значит взломщики должны отредактировать шаблоны.
host/transactions/editTemplate/id/$id
К сожалению, и я, и beched допустили смешные и непростительные ошибки в автоматизации шаблонов, поэтому оба не сняли около 7к рублей.
4) Слабые пароли. Просто брут.
Настоящий список паролей:
PHP код:
qwerty
11111 12345 123456 1234567
12345678 654321 123123 password
root toor superman dragon
ninja iloveyou sex abc123
qweasd asdzxc letmein jesus
monkey master welcome shadow
baseball phdays
В моем списке совпали не все.
Автоматизация:
Для автоматизации я использовал python 2.7 на kali linux и следующую логику:
В основном будут аккаунты 1 и 2го вида, так как tan пробрутить сложно (угадал, tan были только у людей)
Пароли будут меняться, надо их постоянно парсить.
Удобно создать sqlite таблицу, в которой я буду держать информацию о пользователях.
В итоге было 5 основных скриптов и 1 дополнительный, инициализирующий БД.
Их я никому не покажу по причине стыда за код, я плохо пишу на питоне.
1 скрипт постоянно загружал и считывал контакты, выставлял значения в базе.
2 - брутилка
3 - логинится под известным паролем, определяет тип контакта и запускает
4 - хакающий скрипт. Он коммитил транзакции, а еще ждал смски. И на всякий случай брутил tan, если не оставалось аккаунтов 1 и 2го вида
5 - скрипт, меняющий шаблоны. Не работал корректно
Из-за своего кода я запустился минут на 5 позже Beched`a, который успел пробрутить почти все пароли.
У него не работал валидно xxe, поэтому я забрал все аккаунты, которые пароли меняли.

Победители конкурса
Остальным восьми участникам конкурса не удалось вывести из PHDays iBank ни одного рубля.

Вопросы?