Upload
positive-hack-days
View
6.019
Download
5
Embed Size (px)
Citation preview
Сергей ЩербельPositive Technologies
Future NowУязвимости ДБО на примере PHDays I-Bank
PHDays I-Bank НЕ ЯВЛЯЕТСЯ системой ДБО, которая действительно работает в каком-либо из существующих банков.
Система разрабатывалась специально для конкурса
на PHDays 2012
PHDays I-Bank содержит уязвимости, которые мы
находили в реальных системах ДБО
Причем, многие из уязвимостей встречаются очень
и очень часто
Future NowИдентификация
Предсказуемые идентификаторы пользователей – куда более опасная проблема, чем может показаться на первый взгляд!
В PHDays I-Bank, как и почти во всех реальных ДБО, идентификатор пользователя состоит из цифр.
Примеры идентификаторов: 1000001, 1000002, …
В чем проблема? Об этом чуточку позже
Future NowПарольная политика
Слабая парольная политика – извечная проблема!
Пароль по умолчанию сложный, но при этом
пользователь может установить простой пароль
И даже, состоящий из 1 цифры!
Проверяется только длина пароля
В таком случае, обязательно можно будет встретить пароли:
1234567 и 12345678
Проверка по регулярному выражениюПроблема – словарные пароли, например P@ssw0rd
Future NowBrute Force?
Brute Force в интернет-банке? А как же защита?
Защита от атак, направленных на подбор:
Блокирование учетной записи
Блокирование IP-адреса
Использование технологии CAPTCHA
Future NowБлокирование – не решение!
Обойти такую защиту совсем не сложно
Учетная запись или IP-адрес блокируются после
нескольких (обычно 3 или 5) неудачных попыток
аутентификации.
Предсказуемые идентификаторы
Слабая парольная политика
???????
Profit!!!!111
Future NowБлокирование – не решение!
Собираются идентификаторы
Выбирается 1 или 2 пароля
Подбирается не пароль к
идентификатору, а идентификаторы к
паролю
100000110000021000003
…
12345678
P@ssw0rd
1234567
qwerty
1001421:123456781002236:123456781002313:12345678
…
Future NowБлокирование – причина отказа в обслуживании!
После нескольких неудачных попыток аутентификации учетная запись блокируется.
Можно осуществлять атаки на целевого пользователя
А если известны все идентификаторы…
Можно реализовать масштабную DOS-атаку
И как правило, чтобы учетная запись была
разблокирована нужно позвонить в офис банка.
У кого-то день может получиться не легким
Future NowБлокирование IP-адреса
Блокирование IP-адреса не менее опрометчивое решение.
Во многих фирмах все сотрудники сидят за одним внешний
IP-адресом
Множественные попытки аутентификации могут выглядеть
как попытка подбора пароля, и как итог – блокирование
внешнего IP-адреса
Future NowПроблемы реализации CAPTCHA
Возможна повторная отправка одного и того же
значения
Значение передается в скрытом поле HTML-формы
Можно передавать пусто значение
Некорректная проверка – достаточно чтобы совпала
длина или присутствовали некоторые символы
CAPTCHA не проверяется при передача
определенного заголовка
Future NowПроблемы реализации CAPTCHA у PHDays I-BANK
Значение передается в скрытом поле HTML-формы
public function encodeCaptchaCode($code) {
return @base64_encode(@strrev(@base64_encode($code)));
}
Для шифрования не используются временные значения –
расшифровать строку проще простого.
PUlUTndVVE0= =ITNwUTM MTUwNTI= 15052
Future NowПроблемы реализации CAPTCHA у PHDays I-BANK
Кроме того, можно повторно отправлять одно и тоже
значение
А значит, возможно проведение
атаки, направленной на подбор
пароля к учетной записи!
Future NowВосстановление пароля
Возможность восстановления забытого пароля
присутствует почти в каждом веб-приложении, PHDays
I-Bank не исключение.
Future NowВосстановление пароля, проблемы
Если для восстановления пароля нужно ввести
идентификатор, а не email-адрес, то можно узнать
существующие с системе идентификаторы
Future NowВосстановление пароля, проблемы
Для некоторых пользователей I-Bank предусмотрена
возможность восстановления пароля через веб-
форму
Остальные пользователи по замыслу могут
восстановить пароль только обратившись в
отделение банка
«Please contact any office of the PHDays bank for
password recovery.»
Future NowВосстановление пароля, проблемы
Ключ, который необходимо ввести для
восстановления пароля, генерируется с
недостаточной энтропией
private function addDataInTable($login) {
$key = md5($login.rand(1, 250));
Чтобы подобрать ключ, необходимо перебрать не более
250 значений!
После чего будет установлен новый пароль.
Future NowСлабая энтропия идентификатора сессии
В случаях, когда используются собственные механизмы
сессии, надежность идентификатора играет важную
роль
В PHDays I-Bank идентификаторы ключевых
клиентов генерируются по специальному алгоритму
private function getSpecialHash($password) {
$hash = sprintf("%u", crc32($password));
if(strlen($hash) > 4) {
$hash = substr($hash, 0, 4);
Future NowСлабая энтропия идентификатора сессии
Как видно, идентификатор сессии состоит всего из 4
символов
Все символы – цифровые, что значительно
уменьшает энтропию
Кроме того, идентификатор сессии статичный, и
изменяется только если пользователь меняет пароль
Future NowСлабая энтропия идентификатора сессии
Cookie: auth=1000001|2|3016
Future NowПроблемы с разграничением привилегий
Если возможность переводить деньги с чужих счетов -
совсем редкое явление, то возможность обращаться к
другим пользовательским данным еще можно
встретить.
Встречалась возможность отправки сообщений в
тех. поддержку от лица любого пользователя ДБО
Возможность редактирования шаблонов платежей
других пользователей ДБО
Такие уязвимости в PHDays I-Bank включены не были.
Future NowOne-time password
Одноразовые пароли используются для защиты от
несанкционированных пользователем действий
(выполнение транзакций, изменение пароля,
редактирование личных данных).
OTP может запрашиваться или после первичной
аутентификации (логин и пароль)
Или перед выполнением каждой транзакции (или
другом действии)
Future NowOne-time password в PHDays I-Bank
В PHDays I-Bank было реализовано 2 типа OTP:
Эмуляция использования внешнего устройства
OTP на скретч-картах:
В коде это было реализовано в классе TransactionA
В коде это было реализовано в классе TransactionB
Future NowOne-time password, проблемы
OTP не запрашивается при переводе небольших
сумм (например, до 100$)
Возможна повторная отправка одного и того же OTP
Возможность предугадать OTP
Некоторые пользователи отключают OTP
В PHDays I-Bank за выполнение транзакций без OTP отвечал класс TransactionC.
Можно обойти шаг проверки OTP и сразу выполнить
транзакцию
Future NowOne-time password, TransactionA
Предугадать OTP невозможно
Но при этом можно обойти шаг проверки и
выполнить транзакцию напрямую!
Future NowOne-time password, TransactionA
Заменяем step3 на step4
Future NowOne-time password, TransactionA
Profit!!11
Как видно из сообщения, транзакция успешно
выполнена. Простой обход надежной защиты.
Future NowOne-time password, TransactionB
Алгоритм генерации OTP ненадежный
protected function generateOTP() {
$OTPs = array();
$s = 44553 + $this->userInfo["id"]; // переменная зависит только
// от номера пользователя
for($n = 10; $n < 24; $n++) { // генерируется 14 OTP
$OTP = "";
$j = rand(20,39); // переменная $s может принимать
$j = substr($j, 0, 1); // только два значения – 2 или 3
$OTP = $n*$s*$j;
$OTP = substr($OTP, 0, 5); // OTP состоит из 5 символов
$OTPs[] = $OTP;
Future NowOne-time password, TransactionB
OTP может принимать только 2 значения
Future NowOne-time password, TransactionC
OTP не запрашивается – можно выполнять
транзакции без каких-либо препятствий и
ограничений
В PHDays I-Bank пользователей для который OTP не
запрашивался было не много
Но кому-то из участников конкурса повезло
Future NowДействия без OTP
Бывает так, что OTP запрашивается только при
проведении транзакций, но другие действия можно
сделать без ввода OTP:
Отправить сообщение в тех. поддержку
Изменить пароль
Изменить шаблон платежа
Создать шаблон платежа
Открыть новый счет
Future NowИзменение шаблона платежа
Использование шаблонов платежей позволяет
сократить время на ввод однотипных данных:
Номер счета получателя
ФИО получателя
Если у злоумышленника есть возможность изменять
данные шаблона, то он без труда сможет заменить счет
получателя, указав свой.
Пользователь скорее всего не заметит и подтвердит
выполнение транзакции.
Future NowКак все было
Призовой фонд 20.000 рублей
За сутки участникам конкурса был дан исходный
код систем, а так же виртуальная машина с
установленным PHDays I-Bank
За 20-30 минут участники должны были
воспользоваться найденными уязвимостями
Ключ к победе – автоматизация!
Многопоточность играла решающую роль!
Future Now2 задачи на пути к успеху
По сути прохождение конкурса можно было разделить
на 2 задачи:
Получить доступ к учетной записи
Простые и словарные пароли
Слабая энтропия ключа, используемого для восстановления пароля
Слабая энтропия идентификатора сессии
Обойти OTP
OTP не запрашивался
Можно пропустить шаг проверки OTP
Предугадываемый OTP
Future NowРаспределение уязвимостей
30
18
52
100
Распределение уязвимостей
Простой парольСловарный парольИдентификатор сессииКлюч восстановления
Future NowРаспределение уязвимостей
Деньги были распределены по принципу – чем
сложнее получить доступ, тем больше денег
Учетные записи, с которых осуществлялась
демонстрация имели слабые пароли – 1234567 и
password
Учетные записи участников тоже были уязвимыми –
идентификатор сессии обладал слабой энтропией
Оптимальная стратегия – ближе к завершению конкурса
перевести деньги со счетов других участников.
Future NowРаспределение уязвимостей
Деньги были распределены по принципу – чем
сложнее получить доступ, тем больше денег
Учетные записи, с которых осуществлялась
демонстрация имели слабые пароли – 1234567 и
password
Учетные записи участников тоже были уязвимыми –
идентификатор сессии обладал слабой энтропией
Оптимальная стратегия – ближе к завершению конкурса
перевести деньги со счетов других участников.
Future NowHelpDesk
Помимо системы ДБО был реализован примитивный
HelpDesk:
HelpDesk – система для сотрудников банка
Основная мысль – попав в систему «не для всех»,
можно получить достаточное количество
информации, которая значительно упростит взлом
целевой системы
На практике: парольная политика, информация о
механизмах защиты и даже пароли пользователя
Future NowHelpDesk в PHDays I-Bank
Обсуждения, которые намекали на что нужно
обратить внимание
Ссылка на систему, которая отображала
пользователей с простыми паролями
Future NowHelpDesk, обход аутентификации
Уязвимость системы HelpDesk – обход аутентификации:
Знать логин или пароль не нужно
Достаточно передавать в каждом HTTP-запросе
заголовок
if(isset($_SERVER["HTTP_BANKOFFICEUSER"])) {
$userId = base64_decode($_SERVER["HTTP_BANKOFFICEUSER"]);
$userInfo = $this->user->getUserInfoById($userId);
$this->user->setupUserInfo($userInfo);
return $this->user;
}
Future NowHelpDesk, обход аутентификации
Для эксплуатации удобно использовать Modify Headers:
Future NowRace condition
Если отправлять много запросов, то возможна ситуация,
когда запросы будут выполняться одновременно:
Запрос N Запрос N + 1
Проверка наличия
необходимой суммы
Проверка наличия
необходимой суммы
Зачисление денег
Зачисление денег
Profit! $$$
Future NowRace condition, nginx
Чтобы защититься от Race condition и исключить
ситуацию появления денег из неоткуда, nginx был
настроен на блокирование слишком частых обращений.
А именно – не более 3-х запросов в секунду к сценарию,
осуществляющему транзакции.
На виртуальных машинах nginx установлен не был, и
один из участников нашел проблему Race condition.