Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Сергей Щербель
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 Now
Brute Force?


Brute Force в интернет-банке? А как же защита?


Защита от атак, направленных на подбор:



    Блокирование учетной записи

    Блокирование IP-адреса

    Использование технологии CAPTCHA
Future Now
Блокирование – не решение!


   Обойти такую защиту совсем не сложно

Учетная   запись   или       IP-адрес    блокируются   после
нескольких   (обычно     3    или   5)   неудачных   попыток
аутентификации.

   Предсказуемые идентификаторы

   Слабая парольная политика

   ???????

   Profit!!!!111
Future Now
Блокирование – не решение!

                        1000001
    Собираются          1000002
  идентификаторы        1000003
                        …



                       Выбирается 1 или 2
                            пароля



                   1001421:12345678          Подбирается не
                   1002236:12345678             пароль к
                   1002313: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 Now
One-time password


Одноразовые   пароли   используются   для    защиты   от
несанкционированных       пользователем        действий
(выполнение     транзакций,      изменение      пароля,
редактирование личных данных).

   OTP может запрашиваться или после первичной
   аутентификации (логин и пароль)

   Или перед выполнением каждой транзакции (или
   другом действии)
Future Now
One-time password в PHDays I-Bank


В PHDays I-Bank было реализовано 2 типа OTP:

   Эмуляция использования внешнего устройства

            В коде это было реализовано в классе TransactionA



   OTP на скретч-картах:



               В коде это было реализовано в классе TransactionB
Future Now
One-time password, проблемы



    OTP не запрашивается при переводе небольших
    сумм (например, до 100$)

    Возможна повторная отправка одного и того же OTP

    Возможность предугадать OTP

    Некоторые пользователи отключают OTP
В PHDays I-Bank за выполнение транзакций без OTP отвечал класс TransactionC.


    Можно обойти шаг проверки OTP и сразу выполнить
    транзакцию
Future Now
One-time password, TransactionA



   Предугадать OTP невозможно

   Но   при   этом   можно   обойти   шаг   проверки   и
   выполнить транзакцию напрямую!
Future Now
One-time password, TransactionA



   Заменяем step3 на step4
Future Now
One-time password, TransactionA



   Profit!!11




Как   видно     из   сообщения,   транзакция   успешно
выполнена. Простой обход надежной защиты.
Future Now
One-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 Now
One-time password, TransactionB




   OTP может принимать только 2 значения
Future Now
One-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 Now
2 задачи на пути к успеху

По сути прохождение конкурса можно было разделить
на 2 задачи:

    Получить доступ к учетной записи
    Простые и словарные пароли

    Слабая энтропия ключа, используемого для восстановления пароля

    Слабая энтропия идентификатора сессии


    Обойти OTP
    OTP не запрашивался

    Можно пропустить шаг проверки OTP

    Предугадываемый OTP
Future Now
Распределение уязвимостей

            Распределение уязвимостей

                      30
                                  Простой пароль
                             18
                                  Словарный пароль

100
                                  Идентификатор
                                  сессии
                                  Ключ восстановления
                            52
Future Now
Распределение уязвимостей

   Деньги были распределены по принципу – чем
   сложнее получить доступ, тем больше денег

   Учетные    записи,   с   которых    осуществлялась
   демонстрация имели слабые пароли – 1234567 и
   password

   Учетные записи участников тоже были уязвимыми –
   идентификатор сессии обладал слабой энтропией

Оптимальная стратегия – ближе к завершению конкурса
перевести деньги со счетов других участников.
Future Now
Распределение уязвимостей

   Деньги были распределены по принципу – чем
   сложнее получить доступ, тем больше денег

   Учетные    записи,   с   которых    осуществлялась
   демонстрация имели слабые пароли – 1234567 и
   password

   Учетные записи участников тоже были уязвимыми –
   идентификатор сессии обладал слабой энтропией

Оптимальная стратегия – ближе к завершению конкурса
перевести деньги со счетов других участников.
Future Now
HelpDesk

Помимо системы ДБО был реализован примитивный
HelpDesk:

   HelpDesk – система для сотрудников банка

   Основная мысль – попав в систему «не для всех»,
   можно     получить     достаточное     количество
   информации, которая значительно упростит взлом
   целевой системы

   На практике: парольная политика, информация о
   механизмах защиты и даже пароли пользователя
Future Now
HelpDesk в PHDays I-Bank

   Обсуждения,     которые   намекали   на   что   нужно
   обратить внимание

   Ссылка     на     систему,   которая      отображала
   пользователей с простыми паролями 
Future Now
HelpDesk, обход аутентификации

Уязвимость системы 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 Now
HelpDesk, обход аутентификации

Для эксплуатации удобно использовать Modify Headers:
Future Now
Race condition

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

           Запрос N                   Запрос N + 1


           Проверка                    Проверка
            наличия                     наличия
          необходимой                 необходимой
             суммы                       суммы

          Зачисление                  Зачисление
             денег                       денег


                        Profit! $$$
Future Now
Race condition, nginx

Чтобы    защититься     от   Race   condition   и   исключить
ситуацию появления денег из неоткуда, nginx был
настроен на блокирование слишком частых обращений.



А именно – не более 3-х запросов в секунду к сценарию,
осуществляющему транзакции.



На виртуальных машинах nginx установлен не был, и
один из участников нашел проблему Race condition.
sscherbel@ptsecurity.ru

More Related Content

Типовые уязвимости систем ДБО

  • 2. Future Now Уязвимости ДБО на примере PHDays I-Bank PHDays I-Bank НЕ ЯВЛЯЕТСЯ системой ДБО, которая действительно работает в каком-либо из существующих банков. Система разрабатывалась специально для конкурса на PHDays 2012 PHDays I-Bank содержит уязвимости, которые мы находили в реальных системах ДБО Причем, многие из уязвимостей встречаются очень и очень часто
  • 3. Future Now Идентификация Предсказуемые идентификаторы пользователей – куда более опасная проблема, чем может показаться на первый взгляд! В PHDays I-Bank, как и почти во всех реальных ДБО, идентификатор пользователя состоит из цифр. Примеры идентификаторов: 1000001, 1000002, … В чем проблема? Об этом чуточку позже 
  • 4. Future Now Парольная политика Слабая парольная политика – извечная проблема! Пароль по умолчанию сложный, но при этом пользователь может установить простой пароль И даже, состоящий из 1 цифры! Проверяется только длина пароля В таком случае, обязательно можно будет встретить пароли: 1234567 и 12345678 Проверка по регулярному выражению Проблема – словарные пароли, например P@ssw0rd
  • 5. Future Now Brute Force? Brute Force в интернет-банке? А как же защита? Защита от атак, направленных на подбор: Блокирование учетной записи Блокирование IP-адреса Использование технологии CAPTCHA
  • 6. Future Now Блокирование – не решение! Обойти такую защиту совсем не сложно Учетная запись или IP-адрес блокируются после нескольких (обычно 3 или 5) неудачных попыток аутентификации. Предсказуемые идентификаторы Слабая парольная политика ??????? Profit!!!!111
  • 7. Future Now Блокирование – не решение! 1000001 Собираются 1000002 идентификаторы 1000003 … Выбирается 1 или 2 пароля 1001421:12345678 Подбирается не 1002236:12345678 пароль к 1002313:12345678 идентификатору, а идентификаторы к … паролю
  • 8. Future Now Блокирование – причина отказа в обслуживании! После нескольких неудачных попыток аутентификации учетная запись блокируется. Можно осуществлять атаки на целевого пользователя А если известны все идентификаторы… Можно реализовать масштабную DOS-атаку И как правило, чтобы учетная запись была разблокирована нужно позвонить в офис банка. У кого-то день может получиться не легким 
  • 9. Future Now Блокирование IP-адреса Блокирование IP-адреса не менее опрометчивое решение. Во многих фирмах все сотрудники сидят за одним внешний IP-адресом Множественные попытки аутентификации могут выглядеть как попытка подбора пароля, и как итог – блокирование внешнего IP-адреса
  • 10. Future Now Проблемы реализации CAPTCHA Возможна повторная отправка одного и того же значения Значение передается в скрытом поле HTML-формы Можно передавать пусто значение Некорректная проверка – достаточно чтобы совпала длина или присутствовали некоторые символы CAPTCHA не проверяется при передача определенного заголовка
  • 11. Future Now Проблемы реализации CAPTCHA у PHDays I-BANK Значение передается в скрытом поле HTML-формы public function encodeCaptchaCode($code) { return @base64_encode(@strrev(@base64_encode($code))); } Для шифрования не используются временные значения – расшифровать строку проще простого. PUlUTndVVE0=  =ITNwUTM  MTUwNTI=  15052
  • 12. Future Now Проблемы реализации CAPTCHA у PHDays I-BANK Кроме того, можно повторно отправлять одно и тоже значение А значит, возможно проведение атаки, направленной на подбор пароля к учетной записи!
  • 13. Future Now Восстановление пароля Возможность восстановления забытого пароля присутствует почти в каждом веб-приложении, PHDays I-Bank не исключение.
  • 14. Future Now Восстановление пароля, проблемы Если для восстановления пароля нужно ввести идентификатор, а не email-адрес, то можно узнать существующие с системе идентификаторы
  • 15. Future Now Восстановление пароля, проблемы Для некоторых пользователей I-Bank предусмотрена возможность восстановления пароля через веб- форму Остальные пользователи по замыслу могут восстановить пароль только обратившись в отделение банка  «Please contact any office of the PHDays bank for password recovery.»
  • 16. Future Now Восстановление пароля, проблемы Ключ, который необходимо ввести для восстановления пароля, генерируется с недостаточной энтропией private function addDataInTable($login) { $key = md5($login.rand(1, 250)); Чтобы подобрать ключ, необходимо перебрать не более 250 значений! После чего будет установлен новый пароль.
  • 17. Future Now Слабая энтропия идентификатора сессии В случаях, когда используются собственные механизмы сессии, надежность идентификатора играет важную роль В PHDays I-Bank идентификаторы ключевых клиентов генерируются по специальному алгоритму private function getSpecialHash($password) { $hash = sprintf("%u", crc32($password)); if(strlen($hash) > 4) { $hash = substr($hash, 0, 4);
  • 18. Future Now Слабая энтропия идентификатора сессии Как видно, идентификатор сессии состоит всего из 4 символов Все символы – цифровые, что значительно уменьшает энтропию Кроме того, идентификатор сессии статичный, и изменяется только если пользователь меняет пароль
  • 19. Future Now Слабая энтропия идентификатора сессии Cookie: auth=1000001|2|3016
  • 20. Future Now Проблемы с разграничением привилегий Если возможность переводить деньги с чужих счетов - совсем редкое явление, то возможность обращаться к другим пользовательским данным еще можно встретить. Встречалась возможность отправки сообщений в тех. поддержку от лица любого пользователя ДБО Возможность редактирования шаблонов платежей других пользователей ДБО Такие уязвимости в PHDays I-Bank включены не были.
  • 21. Future Now One-time password Одноразовые пароли используются для защиты от несанкционированных пользователем действий (выполнение транзакций, изменение пароля, редактирование личных данных). OTP может запрашиваться или после первичной аутентификации (логин и пароль) Или перед выполнением каждой транзакции (или другом действии)
  • 22. Future Now One-time password в PHDays I-Bank В PHDays I-Bank было реализовано 2 типа OTP: Эмуляция использования внешнего устройства В коде это было реализовано в классе TransactionA OTP на скретч-картах: В коде это было реализовано в классе TransactionB
  • 23. Future Now One-time password, проблемы OTP не запрашивается при переводе небольших сумм (например, до 100$) Возможна повторная отправка одного и того же OTP Возможность предугадать OTP Некоторые пользователи отключают OTP В PHDays I-Bank за выполнение транзакций без OTP отвечал класс TransactionC. Можно обойти шаг проверки OTP и сразу выполнить транзакцию
  • 24. Future Now One-time password, TransactionA Предугадать OTP невозможно Но при этом можно обойти шаг проверки и выполнить транзакцию напрямую!
  • 25. Future Now One-time password, TransactionA Заменяем step3 на step4
  • 26. Future Now One-time password, TransactionA Profit!!11 Как видно из сообщения, транзакция успешно выполнена. Простой обход надежной защиты.
  • 27. Future Now One-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;
  • 28. Future Now One-time password, TransactionB OTP может принимать только 2 значения
  • 29. Future Now One-time password, TransactionC OTP не запрашивается – можно выполнять транзакции без каких-либо препятствий и ограничений В PHDays I-Bank пользователей для который OTP не запрашивался было не много Но кому-то из участников конкурса повезло 
  • 30. Future Now Действия без OTP Бывает так, что OTP запрашивается только при проведении транзакций, но другие действия можно сделать без ввода OTP: Отправить сообщение в тех. поддержку Изменить пароль Изменить шаблон платежа Создать шаблон платежа Открыть новый счет
  • 31. Future Now Изменение шаблона платежа Использование шаблонов платежей позволяет сократить время на ввод однотипных данных: Номер счета получателя ФИО получателя Если у злоумышленника есть возможность изменять данные шаблона, то он без труда сможет заменить счет получателя, указав свой. Пользователь скорее всего не заметит и подтвердит выполнение транзакции.
  • 32. Future Now Как все было Призовой фонд 20.000 рублей За сутки участникам конкурса был дан исходный код систем, а так же виртуальная машина с установленным PHDays I-Bank За 20-30 минут участники должны были воспользоваться найденными уязвимостями Ключ к победе – автоматизация! Многопоточность играла решающую роль!
  • 33. Future Now 2 задачи на пути к успеху По сути прохождение конкурса можно было разделить на 2 задачи: Получить доступ к учетной записи Простые и словарные пароли Слабая энтропия ключа, используемого для восстановления пароля Слабая энтропия идентификатора сессии Обойти OTP OTP не запрашивался Можно пропустить шаг проверки OTP Предугадываемый OTP
  • 34. Future Now Распределение уязвимостей Распределение уязвимостей 30 Простой пароль 18 Словарный пароль 100 Идентификатор сессии Ключ восстановления 52
  • 35. Future Now Распределение уязвимостей Деньги были распределены по принципу – чем сложнее получить доступ, тем больше денег Учетные записи, с которых осуществлялась демонстрация имели слабые пароли – 1234567 и password Учетные записи участников тоже были уязвимыми – идентификатор сессии обладал слабой энтропией Оптимальная стратегия – ближе к завершению конкурса перевести деньги со счетов других участников.
  • 36. Future Now Распределение уязвимостей Деньги были распределены по принципу – чем сложнее получить доступ, тем больше денег Учетные записи, с которых осуществлялась демонстрация имели слабые пароли – 1234567 и password Учетные записи участников тоже были уязвимыми – идентификатор сессии обладал слабой энтропией Оптимальная стратегия – ближе к завершению конкурса перевести деньги со счетов других участников.
  • 37. Future Now HelpDesk Помимо системы ДБО был реализован примитивный HelpDesk: HelpDesk – система для сотрудников банка Основная мысль – попав в систему «не для всех», можно получить достаточное количество информации, которая значительно упростит взлом целевой системы На практике: парольная политика, информация о механизмах защиты и даже пароли пользователя
  • 38. Future Now HelpDesk в PHDays I-Bank Обсуждения, которые намекали на что нужно обратить внимание Ссылка на систему, которая отображала пользователей с простыми паролями 
  • 39. Future Now HelpDesk, обход аутентификации Уязвимость системы 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; }
  • 40. Future Now HelpDesk, обход аутентификации Для эксплуатации удобно использовать Modify Headers:
  • 41. Future Now Race condition Если отправлять много запросов, то возможна ситуация, когда запросы будут выполняться одновременно: Запрос N Запрос N + 1 Проверка Проверка наличия наличия необходимой необходимой суммы суммы Зачисление Зачисление денег денег Profit! $$$
  • 42. Future Now Race condition, nginx Чтобы защититься от Race condition и исключить ситуацию появления денег из неоткуда, nginx был настроен на блокирование слишком частых обращений. А именно – не более 3-х запросов в секунду к сценарию, осуществляющему транзакции. На виртуальных машинах nginx установлен не был, и один из участников нашел проблему Race condition.