Русский
Русский
English
Статистика
Реклама

Двухфакторная аутентификация

Сколько стоит взломать почту небольшой анализ рынка хакеров по найму

03.08.2020 14:12:05 | Автор: admin


Адрес электронной почты ключевой элемент защиты личных данных. На него часто завязаны другие учетные записи пользователя. Завладев чужим e-mail, злоумышленник в состоянии восстановить или сбросить пароли связанных со взломанной учеткой сервисов. Если человек не использует двухфакторную аутентификацию (2FA), то он практически беззащитен. Двухфакторная аутентификация тоже не панацея, но здесь киберпреступнику потребуются дополнительные усилия нужно перевыпустить SIM-карту или перехватить код аутентификации. Реализовать перехват достаточно сложно, поскольку коды обычно присылают в SMS или приложении-аутентификаторе.


Скриншот одного из сайтов, предлагающих услуги по взлому почтовых аккаунтов
Как бы там ни было, взлом почтовых ящиков востребованная услуга. Интересно, что часто ее заказывают не прожженные преступники, а подозрительные супруги или влюбленные. Муж или жена просто хотят быть в курсе онлайн-переписки своей половинки, поэтому заказывают взлом. Используют подобную возможность и конкуренты по бизнесу ведь при успешном взломе можно получить доступ к секретам соперника.

Взлом почтового ящика в терминологии ИБ считается таргетированной или целевой атакой. Такими вещами занимается государственная разведка вроде АНБ и ГРУ, но есть и черный рынок услуг для простых смертных, где можно заказать взлом любого ящика за скромную плату. Это рынок хакеров по найму (hack-for-hire). Он активно процветает в РФ, поскольку здесь, в отличие от западных стран, за такие мелкие преступления не грозит уголовная ответственность.

Несмотря на популярность, инфраструктура этого рынка не слишком хорошо изучена. О том, как работают эти хакеры и насколько большую угрозу они представляют, известно мало. Но подробности постепенно появляются. Так, относительное небольшое исследование рынка провела Ариана Мириан из Калифорнийского университета в Сан-Диего. Результаты опубликованы на конференции WWW'19: The World Wide Web Conference и в научном журнале Communications of the ACM (December 2019, Vol. 62 No. 12, Pages 32-37, doi: 0.1145/3308558.3313489).

Сколько стоит такая услуга?


Команда проекта выявила и изучила 27 розничных сервисов по взлому учетных записей электронной почты. Большинство услуг рекламировалось на русском языке. Стоимость услуги от $23 до $500 за один аккаунт. Дешевле всего получить доступ к ящикам российских провайдеров. Западные стоят дороже, а взлом аккаунтов Facebook и Instagram обойдётся чуть дешевле, чем Yahoo и Gmail.

Цены на взлом почтовых ящиков и аккаунтов. Иллюстрация: Калифорнийский университет Сан-Диего
При помощи подставных учетных записей Ариана Мириан связалась с исполнителями и заказала взлом учеток подставных жертв. На каждом аккаунте была включена двухфакторная аутентификация по SMS.

Методика проведения эксперимента


Эксперимент неплохо продумали. Каждый из ящиков электронной почты, задействованных в исследовании, наполнили из базы электронных писем Enron. Кроме того, участники проекта создали веб-страницы, рекламирующие небольшой бизнес, которым владела или где работала жертва.

Домены купили с аукциона, чтобы обеспечить историю каждой подставной личности. Через базу WHOIS эту веб-страницу связали с адресом электронной почты жертвы, а также с адресом электронной почты вымышленного партнера. В общем, исследователи продумали и реализовали качественные ловушки для определения всех векторов атаки.

Дополнительно были созданы страницы в Facebook для каждой жертвы, чтобы узнать, будут ли хакеры использовать их в своих атаках. Все элементы на странице Facebook были приватными (сторонний пользователь не смог бы увидеть эти элементы), за исключением профиля с указанием веб-страницы жертвы (как реклама бизнеса).

Активность каждого почтового ящика автоматически логировалась. Благодаря помощи Google удалось получить логи любой активности входа в Google-аккаунты жертв. В этих логах записаны попытки входа в учетную запись и IP-адреса, попытки брутфорса, а также активация двухфакторной аутентификации при подозрительной попытке входа.

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

Действия хакеров, которые пытались взломать аккаунты, отслеживались в течение нескольких недель. На деле оказалось, что некоторые взломщики обычные мошенники, которые брали оплату и ничего не делали. Другие брали оплату постфактум, то есть соглашались на получение денег в случае успешного взлома. Но и они, получив задание, ничего не предпринимали. Исследователи отмечают также, что работа с клиентами у сервисов по взлому e-mail организована крайне слабо: кто-то вообще не отвечает на запросы, кто-то отвечает, но с большой задержкой.

Результаты


Только 5 из 27 хакеров стали выполнять условия задачи, поставленной заказчиком.



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

Злоумышленники тем или иным образом приводили жертву к фишинговой странице, где нужно было ввести пароль или код двухфакторной аутентификации от своей учетки. Участники проекта действовали как обманутые пользователи и вводили все необходимые данные. После этого хакеры бодро рапортовали об успехе.

Интересно, что ни один наемный киберпреступник не пытался брутфорсить учетки, не было обращений к учетным записям на Facebook или к электронной почте партнера. Один из пяти исполнителей отправил жертве вредоносный исполняемый файл по почте. Остальные использовали фишинг в качестве основного вектора атаки.

Приманки, которые использовали хакеры для фишинга: письма якобы от Google (выделены зеленым), государственной службы (красным), из банка (оранжевым), от незнакомца (темно-синим) или от знакомого человека (голубым). Крестик соответствует успешному взлому аккаунта. В правой колонке указано количество писем. Иллюстрация: Калифорнийский университет Сан-Диего

Пример поддельного письма из суда. Иллюстрация: Калифорнийский университет Сан-Диего

Фишинговая страница, похожая на окно ввода пароля Gmail. Источник: Калифорнийский университет Сан-Диего
Все атаки начинались с письма-приманки от авторитетной организации или лица. Это должно было успокоить жертву и привести ее к необходимому действию переходу по ссылке на фишинговый ресурс. Злоумышленники использовали разные подставные фигуры: знакомого человека жертвы, крупный банк, незнакомца, государственную организацию и Google. К письму прилагалось изображение или фишинговая ссылка.

В среднем злоумышленники отправили 10 сообщений в течение 25 дней, используя разные предлоги, как показано на диаграмме выше. Самый популярный прием подделать письмо Google, затем следуют письма от партнеров и подставные e-mail от незнакомцев.

Нажав на фишинговую ссылку, жертва попадает на целевую страницу, которая выглядит как страница входа в аккаунт Google. После ввода пароля открывается страница с запросом на ввод кода 2FA. Все взломщики, которые получили доступ к учетной записи, достигли желаемого при помощи фишинга. Никаких особенно сложных технических приемов и изощренных атак не было.

Как не стать жертвой киберпреступников


Любой почтовый ящик можно взломать, если жертва проявит неосторожность и перейдет по фишинговой ссылке. Возможно, профессионалы при условии острой необходимости или крупного вознаграждения способны взломать учетку без фишинга, но в ходе исследования подобные методы не использовались. Конечно, здесь и сама выборка была не очень большой.

Чтобы защитить себя и родственников от подобных атак, специалисты рекомендуют использовать для 2FA аппаратный USB-ключ безопасности, а также быть внимательными это стандартная рекомендация.

Предпринимают меры по защите пользователей и поставщики услуг электронной почты. Компания Google ввела дополнительную эвристику при логине пользователя. Также определяются и блокируются попытки автоматического входа в систему. К слову, после этих действий Google два сервиса по взлому, к которым ранее обращались исследователи, подняли цену на свои услуги вдвое.
Подробнее..

TOTP (Time-based one-time Password algorithm)

20.12.2020 18:08:28 | Автор: admin

С ростом числа угроз кибербезопасности, для разработчиков становится все более и более необходимым обновлять стандарты безопасности веб-приложений и быть при этом уверенными в том, что аккаунты пользователей в безопасности. Для этого в настоящее время многие онлайн-приложения просят пользователей добавить дополнительный уровень безопасности для своей учетной записи. Они делают это за счет включения двухфакторной аутентификации. Существуют различные методы реализации двухфакторной аутентификации, и аутентификация TOTP (алгоритм одноразового пароля на основе времени) является одним из них.

Чтобы понять, что из себя представляет TOTP и как он используется, необходимо сначала кратко рассмотреть более базовые понятия. Первое из них двухфакторная аутентификация. Двухфакторная аутентификация (или многофакторная аутентификация) это метод идентификации пользователя в каком-либо сервисе (как правило, в Интернете) при помощи запроса аутентификационных данных двух разных типов, что обеспечивает двухслойную, а значит, более эффективную защиту аккаунта от несанкционированного проникновения. Это означает, что после включения двухфакторной аутентификации пользователь должен пройти еще один шаг для успешного входа в систему. Стандартные шаги для входа в учетную запись это ввод логина и ввод пароля (рис.1).

Рисунок 1. Порядок входа в учетную запись без двухфакторной аутентификации Рисунок 1. Порядок входа в учетную запись без двухфакторной аутентификации

Включение двухфакторной аутентификации добавляет в порядок входа дополнительный шаг (рис.2). Этот метод более безопасен, поскольку преступник не может получить доступ к учетной записи пользователя, если у него нет доступа как к обычному паролю пользователя, так и к одноразовому паролю.

Рисунок 2. Вход в учетную запись с подключенной двухфакторной аутентификацией Рисунок 2. Вход в учетную запись с подключенной двухфакторной аутентификацией

В настоящее время существует два широко используемых метода получения одноразового пароля:

  1. На основе SMS. Каждый раз, когда пользователь входит в систему, он получает на указанный в учетной записи номер мобильного телефона текстовое сообщение, которое содержит одноразовый пароль.

  2. На основе TOTP. При включении двухфакторной аутентификации пользователю предлагается отсканировать QR-код с помощью специального приложения для смартфона, которое в дальнейшем постоянно генерирует одноразовый пароль для пользователя.

Метод на основе SMS не требует пояснений. Несмотря на свою простоту, он имеет ряд проблем. Например, ожидание SMS при каждой попытке входа в систему, проблемы с безопасностью и т. д. Вследствие чего NIST еще в 2016 году рекомендовала не использовать его в новых системах аутентификации. В связи с минусами метода на основе SMS, метод на основе TOTP становится популярным из-за его преимуществ.

Также, стоит отметить, что в настоящий момент есть некоторые разногласия о том, что именно считать шагами, а что факторами аутентификации. Общепризнанным является существование трех факторов:

  • Знание, например, пароль

  • Обладание (в физическом смысле), например, смартфон

  • То, чем вы являетесь, например, биометрические данные

При этом шаги аутентификации являются субъединицами факторов, так, если для входа в систему необходимо введение двух паролей, то по сути мы используем только фактор знания. Если говорить о рассматриваемых нами методах, то метод на основе SMS принято относить к двухшаговой, но однофакторной аутентификации, т. к. пароль для SMS генерируется на сервере, а TOTP к двухфакторной, поскольку для генерации пароля необходимо наличие определенного приложения на смартфоне, что усложняет задачу доступа злоумышленников к этой информации.

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

Для реализации двухфакторной аутентификации с использованием TOTP необходимо учитывать основное требование пароль должен создаваться на стороне пользователя, а также постоянно меняться.

Решение данной задачи может выглядеть следующим образом:

Когда пользователь включает двухфакторную аутентификацию, происходит следующее

  1. Внутренний сервер создает секретный ключ для этого конкретного пользователя

  2. Затем сервер передает этот секретный ключ телефонному приложению пользователя

  3. Телефонное приложение инициализирует счетчик

  4. Телефонное приложение генерирует одноразовый пароль, используя этот секретный ключ и счетчик

  5. Телефонное приложение изменяет счетчик через определенный интервал и восстанавливает одноразовый пароль, делая его динамическим

Однако, у данной последовательности действий есть несколько проблем. Первая из них заключается в том, как приложение будет генерировать одноразовый пароль. С этой проблемой справляется предшественник TOTP метода алгоритм HOTP.

HOTP переводится как Одноразовый пароль на основе HMAC. Этот алгоритм был опубликован инженерной группой Интернета (IETF) как RFC4226. HOTP определяет алгоритм создания одноразового пароля из секретного ключа и счетчика.

Этот алгоритм включает в себя два этапа:

  • Создать хеш HMAC (используя алгоритм хеширования SHA-1) из секретного ключа и счетчика

hmacHash = HMAC-SHA-1 (секретный ключ, счетчик)
  • В этом коде на выходе будет строка длиной 20 байт. Эта длинная строка не подходит в качестве одноразового пароля. Итак, нам нужен способ обрезать эту строку. HOTP определяет способ обрезать эту строку до желаемой длины

hmacHash[19] means 19th byte of the string.offset = hmacHash[19] & 0xf;truncatedHash = (hmacHash[offset++] & 0x7f) << 24 | (hmacHash[offset++] & 0xff) << 16 | (hmacHash[offset++] & 0xff) << 8 | (hmacHashh[offset++] & 0xff);finalOTP = (truncatedHash % (10 ^ numberOfDigitsRequiredInOTP));

В этом алгоритме мы сначала получаем смещение, которое является последними 4 битами hmacHash [19]. После этого мы объединяем байты из hmacHash [offset] в hmacHash [offset + 3] и сохраняем последний 31 бит в truncatedHash. Наконец, используя простую операцию по модулю, мы получаем одноразовый пароль разумной длины.

Это в значительной степени определяет алгоритм HOTP. Документ RFA4226 объясняет, почему это наиболее безопасный способ получить одноразовый пароль из этих двух значений.

Итак, мы нашли способ получить одноразовый пароль с помощью секретного ключа и счетчика. А как следить за счетчиком? Ответ на этот вопрос находится в TOTP. TOTP переводится как Одноразовый пароль на основе времени. Он был опубликован IETF как RFC6238. TOTP использует алгоритм HOTP для получения одноразового пароля. Единственная разница в том, что здесь вместо счетчика используется время, и это дает решение нашей проблемы. Это означает, что вместо инициализации счетчика и его отслеживания мы можем использовать время в качестве счетчика в алгоритме HOTP для получения OTP. Поскольку и сервер, и телефон имеют доступ ко времени, ни один из них не должен отслеживать счетчик. Кроме того, чтобы избежать проблемы с разными часовыми поясами сервера и телефона, мы можем использовать временную метку Unix, которая не зависит от часовых поясов. Однако время Unix определяется в секундах, поэтому оно меняется каждую секунду. Это означает, что сгенерированный пароль будет меняться каждую секунду, что не очень хорошо. Вместо этого нам нужно добавить значительный интервал перед изменением пароля. Например, приложение Google Authenticator меняет код каждые 30 секунд.

counter = currentUnixTime / 30

Итак, мы решили проблему счетчика. Теперь нам нужно решить нашу третью проблему: поделиться секретным ключом с приложением телефона. Здесь нам может помочь QR-код. Хотя есть возможность попросить пользователей вводить секретный ключ напрямую в приложение телефона, безопасность ключа зависит от его длины, и пользователю будет неудобно вводить такую длинную строку. Поскольку большинство смартфонов оснащено камерой, пользователь может использовать ее для того, чтобы отсканировать QR-код, и получить от него секретный ключ. Все, что для этого нужно преобразовать секретный ключ в QR-код и показать его пользователю. В настоящее время есть несколько бесплатных телефонных приложений (например, Google Authenticator App, Authy и т.д.), которые могут генерировать одноразовый пароль для пользователя. Поэтому в большинстве случаев создавать собственное телефонное приложение не нужно. Следующие псевдокоды объясняют способ реализации двухфакторной аутентификации на основе TOTP в веб-приложении.

When user request to enable 2-factor authentication// Generate a secret key of length 20.secretKey = generateSecretKey (20);// Save that secret key in database for this particular user. SaveUserSecretKey (userId, secretKey);// convert that secret key into qr image.qrCode = convertToQrCode (secretKey);// send the qr image as responseresponse (qrCode);

Пользователя просят отсканировать этот QR-код. Когда приложение телефона сканирует QR-код, оно получает секретный ключ пользователя. Используя этот секретный ключ, текущее время Unix и алгоритм HOTP, приложение телефона сгенерирует и отобразит пароль. Затем система просит пользователя ввести сгенерированный код после сканирования QR-кода. Это необходимо, чтобы убедиться, что пользователь успешно отсканировал изображение и приложение для телефона успешно сгенерировало код.

User types the code displayed in the application.// Fetch secret key from database.secretKey = getSecretKeyOfUser (userId);if (codeTypedByUser == getHOTP (secretKey, currentUnixTime / 30)) {enableTwoFactorAuthentication (userId);}

Здесь используется алгоритм HOTP на стороне сервера, чтобы получить аутентификацию на основе OTP по секретному ключу и текущему времени Unix. Если этот OTP совпадает с введенным пользователем, то появляется возможность включить двухфакторную аутентификацию для этого пользователя. Теперь, после каждой операции входа в систему, проверяется, включена ли для этого конкретного пользователя двухфакторная аутентификация. Если да, то запрашивается одноразовый пароль, отображаемый в приложении телефона. И если этот набранный код правильный, только тогда пользователь аутентифицируется.

User types the code displayed in the phone application to login// Fetch secret key from database.secretKey = getSecretKeyOfUser (userId);if (codeTypedByUser == getHOTP (secretKey, currentUnixTime)) {signIn (userId);}

Если пользователь потеряет код, есть несколько способов помочь пользователю восстановить его. Обычно, когда они включают двухфакторную аутентификацию, есть возможность показать секретный ключ вместе с QR-кодом и попросить их сохранить этот код в безопасном месте. Такие приложения, как Google Authenticator App, позволяют сгенерировать пароль путем прямого ввода секретного ключа. Если пользователь потеряет код, он может ввести этот надежно сохраненный секретный ключ в приложение телефона, чтобы снова сгенерировать одноразовый пароль. При наличии номера телефона пользователя возможно использовать метод на основе SMS, чтобы отправить пользователю одноразовый пароль, чтобы помочь ему восстановить код.

Двухфакторная аутентификация набирает популярность. Многие веб-приложения реализуют его для дополнительной безопасности. В отличие от метода на основе SMS, метод TOTP также не требует особых усилий. Так что эту функцию стоит реализовать для любого приложения.

Подробнее..

Как мы боролись с фейковыми аккаунтами на сайте знакомств

18.02.2021 22:12:39 | Автор: admin

С ростом популярности сервиса мы столкнулись с нереально большим количеством мошенников, которые регистрировали фейковые аккаунты и спамили других пользователей (порно, наркотики и вся остальная запрещёнка). Дошло до того, что таких регистраций стало в несколько раз больше, чем настоящих пользователей. Жалобы и отток нормальных посетителей положили начало нашей борьбе.

Изначально подтверждение регистрации было через email (сервис существует с 2007 года), но с ростом посещаемости мы заметили аномально резкий всплеск подозрительных регистраций. Решили внедрить подтверждение ключевых действий с аккаунтом, привязав их к мобильному телефону.

Отправка SMS на короткий номер

Первый вариант верификации был через отправку пользователем исходящего sms на короткий номер. Люди отправляли сообщение на самый дешевый короткий номер, тем самым подтверждали свой. В 2010 году это казалось решением проблемы, не требующим существенных затрат. Мы были одни из первых, кто это внедрил, а тогда больше половины пользователей принципиально не хотели светить свой номер мобильного телефона. Мало того, отправка на номер для пользователя была платной, хоть и минимальной стоимости около 2 (сумму забирал себе оператор), и требовала дополнительного действия. Вдобавок: поддерживались не все операторы, а сами короткие номера тогда часто ассоциировались с мошенниками. Хлынули жалобы, конверсия регистраций упала. Стало понятно, что решение выбрано неудачно.

Подтверждение SMS с кодом

Решили внедрить отправку клиенту sms с кодом. Несмотря на существенные расходы в пределах 50000 (около 1,500$ по тому курсу) на подтверждения и восстановления паролей, команда вздохнула с облегчением и о проблеме надолго забыли. Время и трудозатраты на борьбу со спамерами изматывали сильнее, чем дополнительные расходы.

Всё изменилось ближе к 2015 году, когда сотовые операторы ввели интерконнект. До этого исходящие сообщения стоили очень дешево (от 10 копеек) из-за возможности отправлять смски через региональных операторов в обход прямых подключений, не теряя в качестве доставки. После интерконнекта операторы стали блокировать отправку sms из других сетей своим абонентам, если она происходила от незарегистрированного имени отправителя. У заказчиков и агрегаторов не было выхода, кроме как подключаться напрямую и отправлять через прямые официальные каналы, которые в целом были всегда, но стоили до 10 раз дороже. Для усиления эффекта основные операторы выкупили почти всех тех мелких, через которых можно было отправлять сообщения дешево. Когда рынок стал монополизирован, операторы еще сильнее подняли цены на смски и продолжают это делать каждый год.

После повышения цен затраты увеличились на порядок: до 300000-400000 в месяц. Рост количества пользователей и платные плюшки ещё позволяли нести такие издержки, но шутки про то, что затраты на sms превышают затраты на несколько десятков серверов уже перестали быть смешными. Но других вариантов не было: безопасность аккаунта и блокировка спамеров важнее, приходилось платить.

Тем временем география пользователей расширилась за пределы России, в первую очередь за счет СНГ. А это, в свою очередь, совпало с желанием заработать и у операторов соседних стран: Украина, Беларусь, Казахстан, Киргизия и других. Они решили, что 1-2 за sms это не предел, давайте повысим до 7-13! Так было введено разделение трафика на национальный и международный с разницей в несколько раз.

Примеры:

Страна\Стоимость SMS

Национальные

Международные

Казахстан

1,5

7

Беларусь

0,75

11

Украина

1

5

Под международный трафик автоматически попадают все известные международные бренды, все проекты, которые не имеют в данной стране юр.лица и национального домена. Некоторые страны (особенно Казахстан) еще изобретательнее подошли к вопросу: если у проекта есть сайт в другой доменной зоне (например, не только site.kz, но еще и .ru), проект не может быть согласован по национальному тарифу, несмотря на то, что sms отправляются от имени местного проекта и только по Казахстану местным жителям. Попробуешь обойти огромный штраф и блокировка имени.

Звонок с кодом голосом

Расходы на sms перевалили за психологический барьер 1 млн в месяц, что само по себе всерьез заставляло задуматься над альтернативами. Но вместе с ростом расходов вернулась и старая проблема в новом обличии. Теперь благодаря куче ?сервисов по приему sms в выдаче Яндекса на виртуальные номера стало легко зарегистрировать аккаунт для любой социальной сети, включая VK и Facebook.

Так мы начали работать над аутентификацией через звонки. Идея пришла к нам несколько лет назад и была внедрена как дополнительный резервный способ подтверждения номера для некоторых стран. Действие от клиента требовалось такое же, как с sms ввести код, который мы отправляем, только в случае со звонками код диктовался голосом при ответе на звонок.

Как это выглядело на сайтеКак это выглядело на сайте

Но и тут есть подводные камни: по России и некоторым странам звонки работают хорошо, но из-за международной тарификации стоимость минуты по некоторым направлениям превышает 20-30 (например: Беларусь, Украина и др). Вторая проблема качество доставки: операторы могут фильтровать трафик по длительности соединения. Звонки определяются операторами, как спам и фильтруются, а значит пользователь не получает свой код подтверждения.

Еще был Viber :)

И предупреждение с угрозой штрафа в 5000 евро за отправку запрещенного контента. Пока мы тестировали новый способ и часть пользователей получали приветственное сообщение при регистрации вида Здравствуйте, %username%!, пранкеры подсуетились и начали оформлять левые регистрации на чужие номера. Людям пришли сообщения вида Здравствуйте, Жопа:

Детализация из кабинета оператораДетализация из кабинета оператора

Заметили быстро и лавочку прикрыли, но собрали негатив. Сам же Viber показал низкое проникновение (порядка 15-25%) и экономическую нецелесообразность из-за минимального платежа в ~30000, который сгорает в конце месяца, если пакет услуг на эту сумму, при цене сервисного сообщения в ~50 копеек, не был использован.

Звонок с кодом в номере

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

Как выглядит форма в мобильном приложенииКак выглядит форма в мобильном приложении

Манила цена сервисов: от 10 копеек за такой звонок. Протестировав их оказалось, что за эту стоимость звонки доставляются не всегда, в некоторые страны звонки через них в принципе не работают. Интересно, что у некоторых провайдеров звонок стоит от 4, что даже дороже sms. Как выяснилось позже - дешевые сервисы использовали серые каналы, подменяли исходящие номера на чужие или несуществующие и сами не платили за трафик. Клиент, перезвонивший по такому номеру, мог обнаружить на другом конце прачечную или секс-шоп.

Стало понятно, что гарантия доставки может быть лишь при наличии своих пулов номеров и белых каналов, а значит и экономии в 20 раз не получится. В партнерстве с greensms.ru под нас запустили сервис со своими номерами и резервными каналами, а позже добавили в API и выложили SDK к нему на разных языках на GitHub. В процессе оказалось, что даже при нулевой продолжительности соединения с абонентом, вышестоящие операторы связи произвольно тарифицируют количество секунд разговора (кстати, кто сталкивался с подобным и смог решить это с оператором или на стороне Asterisk напишите, пожалуйста, в комментариях).В итоге удалось добиться стабильных результатов при стоимости в 40-60 копеек.

Сначала пользователи встретили нововведения замешательством. Конверсия при использовании sms >95%, звонки сейчас показывают ~85%. Еще год назад конверсия была, примерно на 10% хуже, но стала расти по мере распространенности метода и с изменениями в интерфейсе.

Статистика конверсии по странам в админкеСтатистика конверсии по странам в админке

Люди не понимали, где брать 4 цифры, в каком номере, сбрасывали вызов, запрашивали повторный и потом всё равно обращались в поддержку, приходилось всё объяснять, показывать.

Сейчас проще: всё больше проектов используют этот способ, люди привыкли и не так удивляются. Кстати, теперь еще и Яндекс их внедрил для подтверждения номера при входе на новом устройстве в свой аккаунт.

Совет: обязательно размещать рядом с полем ввода цифр скриншот телефона с выделенными 4 цифрами, которые нужно будет ввести пользователю.
Где допустимо стоит подключать автоматическое считывание цифр номера при регистрации из приложения.

Количество фейковых регистраций упало до минимума. Но новый метод привлекает новые попытки использовать его в своих целях: спам звонками, попытки спарсить базу телефонов пользователей и прочее непотребство, требующее превентивных мер.

Финальная битва между добром и интернетом

А не будет её финальной. Чем популярнее становится сервис, тем больше желающих использовать его в плохих целях. И на новые методы защиты находятся новые методы нападения. Так что ждем новых ухищрений, может с помощью eSIM?

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

Подробнее..

Из песочницы Двухфакторая аутентификация VPNMikrotik просто и масштабируемо

15.06.2020 12:08:41 | Автор: admin
Здравствуйте!

На написание данной статьи меня побудило прочтение аналогичного содержания статьи пользователя nkusnetsov. По количеству просмотров видно, что сообществу интересна данная тема.

Поэтому я решил поделиться с вами собственным решением, которое было ранее реализовано мной и в базовом виде обладает:

  • Низким уровнем вхождения и простотой кода (для понимания/отладки другим сотрудником)
  • Простые скрипты ROS не создают никакой нагрузки и работают даже на hAP Lite
  • Масштабируемость возможность подключения большого количества VPN-шлюзов с целью снижения нагрузки или географического распределения
  • Возможность использования Mikrotik CHR в качестве VPN-сервера
  • 1хN 1 SMS-шлюз на неограниченное количество роутеров с возможностью расширения при росте нагрузки
  • Возможность привязки отдельного роутера к конкретному модему (для чего? об этом позже)
  • Использование всего одного php скрипта на удаленном сервере
  • Не важно какое устройство инициировало VPN-соединение, авторизация по ссылке из SMS

При несложной доработке кода:

  • Возможность вести log авторизаций сотрудников на сервере (возможность реализована в расширенной версии, если есть интерес выложу)
  • Увеличить отказоустойчивость и снижение нагрузки системы путем отправки SMS рандомно с нескольких модемов


Постановка задачи и решение


Задача 1


В процессе разработки данного решения была поставлена задача минимизировать количество usb-модемов уменьшив стоимость владения, упростить администрирование, локализовать модемы в одном месте и тем самым улучшить ремонтопригодность системы.

Было решено использовать один роутер установленный на надежном канале как базовый SMS-шлюз. Единственное я не знал какова будет нагрузка на систему, справятся модемы и не заблокирует ли оператор. Поэтому я заложил возможность подключения нескольких модемов и дальнейшего разбиения системы на группы. Причем дополнительные модемы могут быть подключены к базовому шлюзу через простой usb-hub. Но для полноценного функционирования, в минимальном функционале, нужен один модем в не зависимости от количества роутеров.

Задача 2


Предусмотреть возможность использования локальных сим-карт в зоне установки роутера.
Пример: широкая филиальная сеть с несколькими магазинами в Казахстане. Отправка sms-сообщения из РФ будет стоить достаточно дорого. Данное решение позволяет сотрудникам из РК получать sms с локального номера.

Но в процессе размышлений оказалось, что решение уже было найдено и реализовано в Задаче 1.

Задача 3


Авторизация туннеля с мобильного устройства без необходимости физически находиться на авторизуемом устройстве.

Цель возможность авторизовывать не только пользовательские туннели, но и любые vpn-соединения: Mikrotik->Mikrotik, Сервер->Mikrotik и т.д При этом пользователю, ответственному за данные туннели, необходимо просто перейти по ссылке из SMS сообщения, в которой также отображается какой туннель хочет авторизоваться.

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

Решение данной задачи уже однозначно подразумевало использование RouterOS API (или SSH). Победу одержало API, как наиболее простой вариант.

Логика


  1. Пользователь авторизуется с заранее добавленным логином и паролем
  2. VPN-шлюз заносит его ip в адресный лист ожидания и отправляет POST запрос на сервер
  3. Сервер получает данные, проверяет, формирует код-авторизации и отправляет на контактный номер SMS вида: To autorize user 79001112233 connection open http_://synome.ru/?ruid=vrG7yYMbZ6&auth=YU6zc
  4. Пользователь переходит по ссылке с любого устройства
  5. Сервер делает запрос на роутер, проверяет наличие в адрес-листе записи с кодом авторизации в комментарии. Если запись найдена, удаляет ее, а пользователю отображает страницу удачной авторизации

Во всех остальных случаях, если что-то не прошло проверку пользователь получит Request error.

Настройка и код


Теперь перейдем от идейной части к настройке Mikrotik, коду и их описанию

Добавляем на Mikrotik:


Firewall


Обязательно создаем список разрешенных ресурсов, среди которых: собственный адрес MT, любой публичный DNS, адрес сервера на котором будет происходить авторизация
/ip firewall address-listadd address=10.10.0.1 list=Allow-listadd address=8.8.8.8 list=Allow-listadd address=synome.ru list=Allow-list


Добавляем правило блокирующее трафик VPN-пользователей из списка ожидания на любой хост кроме разрешенных
/ip firewall rawadd action=drop chain=prerouting dst-address-list=!Allow-list src-address-list=VPN-blocked disabled=no


PPP Profile


Создаем профиль в котором устанавливаем idle-таймаут соединения. Время должно быть меньше чем указанное в следующем скрипте On Up, в противном случае, если авторизация не была произведена, то после удаления списка из address-list пользователь получит доступ на время равное разнице (idle-таймаут минус address-list timeout)

Добавляем профиль
/ppp profileadd dns-server=10.10.0.1 idle-timeout=59m local-address=10.10.1.100 name=2F-VPN use-compression=no use-encryption=no use-mpls=no


Далее на последней вкладке Script добавляем:

On Up
:global pass "19RuOU89";:global ruid "vrG7yYMbZ6";:local userip [/ppp active get [find name=$user] address];# if phone number stored in comment#:local userphone [/ppp secret get [find name=$user] comment];# if phone number = username:local userphone $user;:local authkey [/tool fetch http-method=post http-data="ruid=$ruid&pass=$pass&tel=$userphone" url="http://personeltest.ru/away/synome.ru/" mode=http as-value output=user];/ip firewall address-list remove [find address=$userip];/ip firewall address-list add address=$userip list=VPN-blocked timeout=1h comment=($authkey->"data");:log info message="User connect:";:log info message=$userphone;:log info message=$userip;:log info message=($authkey->"data");


On Down
:local userip [/ppp secret get [find name=$user] remote-address];/ip firewall address-list remove [find address=$userip];:log info message="User disconnect:";:log info message=$user;:log info message=$userip;


Смысл скриптов

При подключении: в самом начале мы задаем логин и пароль роутера, которые будут проверяться на сервере. При авторизации пользователя получаем его номер телефона (может быть в имени или в комментарии) и локальный ip-адрес. Отправляем POST-запрос на сервер и получаем в ответе код авторизации. Добавляем ip-адрес в address-list VPN-blocked с кодом авторизации в комментарии и тайм-аутом на 1 минуту больше чем в профиле. Выводим все в лог.

При отключении: получаем ip-адрес пользователя, находим его в address-list и удаляем. Все выводим в лог.


PPP Secrets


Добавляем пользователя
/ppp secretadd comment="70001112233" name=70001112233 password=testuser profile=2F-VPN remote-address=10.10.1.100


Номер телефона можно указать прямо в name, но если хотим иметь возможность задавать один номер на несколько аккаунтов (для авторизации нескольких туннелей), то номер указываем в комментарии, при этом в скрипте On Up нужно изменить закомментированность строк

Изменение (вторую открываем, четвертую закрываем)
# if phone number stored in comment:local userphone [/ppp secret get [find name=$user] comment];# if phone number = username#:local userphone $user;


Ну и самое главное включаем PPTP или L2TP сервер.

На этом с Mikrotik работа закончена.

Серверная часть на PHP


Ниже приведен код. Он достаточно подробно комментирован, поэтому не буду писать лишний текст. Самое главное заменить данные в $host и $ruid_data на свои.

index.php
<?php// ------------------------------------------------------------------------------//  Copyright (с) 2020//  Author: Dmitri Agababaev, d.agababaev@duncat.net////  Copyright by authors for used RouterOS PHP API class in the source code files////  Redistributions and use of source code, with or without modification, are//  permitted that retain the above copyright notice// ------------------------------------------------------------------------------require_once('routeros_api.class.php');// Адрес по которому доступен данный скрипт$host = 'http://synome.ru/';// МАССИВ ДАННХ ВСЕХ РОУТЕРОВ, А ТАКЖЕ РОУТЕРА ЯВЛЯЮЩЕГОСЯ SMS-ШЛЮЗОМ$ruid_data = array(    // роутеры учавствующие в авторизации    // пароль в md5 , глобальный ip-адрес, логин входа на роутер, пароль, SMS-шлюз через который происходит отправка SMS    'vrG7yYMbZ6' => array('mdpass' => '5568ba82f332494d9ff8754b51e7b28a', 'ip' => '10.10.0.1', 'login' => 'user_vpn', 'password' => 'kji&@11az', 'smsgw' => 'SMS_gw1'),    // SMS-шлюзы    // ip-адрес шлюза (глобальный или локальный если в одной сети с сервером), логин, пароль, порт USB-модема, канал USB-модема    'SMS_gw1' => array('ip' => '172.16.1.3', 'login' => 'sms2F', 'password' => 'skIU8w!0', 'port' => 'usb1', 'channel' => '0'));// ВХОДНЕ ПРОВЕРКИ ЗАПРОСОВif (!$_REQUEST) die('Request error'); // если запроса нет  сбросif (!$_REQUEST['ruid']) die('Request error'); // если не указан ruid - сбросif (!array_key_exists($_REQUEST['ruid'], $ruid_data)) die('Request error'); // если роутер не существует  сбросif ($_REQUEST['auth']) autorize(); // если запрос на авторизацию, то пускаем без пароля и проверяем авторизациюif (!ruid_auth()) die('Request error'); // проверяем пароль роутера для отправки SMSif ($_REQUEST['tel']) send_authcode(); // если задан номер телефона, отправляем SMS// ПРОВЕРКА НА НАЛИЧИЕ РОУТЕРА В СПИСКЕ РАЗРЕШЕННХ и пароля авторизацииfunction ruid_auth() {  global $ruid_data;  if (!$_REQUEST['pass']) return false; // если пароль не задан  сброс  // проверяем md5-хэш пароля  if (md5($_REQUEST['pass']) == $ruid_data[$_REQUEST['ruid']]['mdpass']) return true;  return false;}// ФУНКЦИЯ ОТПРАВКИ ССЛКИ С КОДОМ АВТОРИЗАЦИИ ЧЕРЕЗ ROS APIfunction send_authcode() {  global $ruid_data;  global $host;  $sms_gw = $ruid_data[$_REQUEST['ruid']]['smsgw']; // данные sms-шлюза  // генерируем код авторизации  $auth_code = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ123456789'), 0, 5);  // подключаем класс  $API = new RouterosAPI();  // Формируем сообщение отправляемое пользователю  только eng или транслит  $message = 'To autorize user '.$_REQUEST['tel'].' connection open  '.$host.'?ruid='.$_REQUEST['ruid'].'&auth='.$auth_code;  // если подключились отправляем SMS  if ($API->connect($ruid_data[$sms_gw]['ip'], $ruid_data[$sms_gw]['login'], $ruid_data[$sms_gw]['password'])) {      // Команда отправки SMS      $ARRAY = $API->comm("/tool/sms/send", array(      "port"=>$ruid_data[$sms_gw]['port'],      "channel"=>$ruid_data[$sms_gw]['channel'],      "phone-number"=>$_REQUEST['tel'],      "message"=>"To autorize user ".$_REQUEST['tel']." connection open  ".$host."?ruid=".$_REQUEST['ruid']."&auth=".$auth_code,));      // если отправка не удалась и получили ошибку модема, то выполняем сброс питания usb для перезагрузки модема      if($ARRAY['!trap']) {        $API->comm("/system/routerboard/usb/power-reset");        die('Stop with error: '.$ARRAY['!trap'][0]['message'].' Making power reset of usb-port');}  }  $API->disconnect();  die($auth_code);}function autorize() {  global $ruid_data;  // подключаем класс  $API = new RouterosAPI();  if ($API->connect($ruid_data[$_REQUEST['ruid']]['ip'], $ruid_data[$_REQUEST['ruid']]['login'], $ruid_data[$_REQUEST['ruid']]['password'])) {    // если подключились отправляем команду    $API->write('/ip/firewall/address-list/print', false);    $API->write('?comment='.$_REQUEST['auth'], false);    $API->write('=.proplist=.id');    // получаем ответ    $ARRAYS = $API->read();    // ЕСЛИ ЗАПИСЬ НЕ СУЩЕСТВУЕТ В АДРЕС-ЛИСТЕ - СБРОС    if (!$ARRAYS[0]) die('Request error');    // удаляем запись    $API->write('/ip/firewall/address-list/remove', false);    $API->write('=.id=' . $ARRAYS[0]['.id']);    $READ = $API->read();  }  $API->disconnect();  // ИНФОРМИРУЕМ ПОЛЬЗОВАТЕЛЯ ОБ УСПЕШНОЙ АВТОРИЗАЦИИ  die('      <html>      <body style="background-color: #282c34; color: #fff; height: 100vh; display: flex;">        <div style="margin: auto; max-width: 50%;">          <p style="font-size: 24pt; font-weight: bold; margin: -300px 0 50px;">            VPN-соединение установлено и авторизовано, можете продолжить работу          </p>          <p style="font-size: 14pt; color: #aaa;">             В случае недоступности сервисов обратитесь к вашему системному администратору<br/>          </p>        </div>      </body>      </html>');}?>


RouterOS API class PHP используемый в коде можно взять на GitHub.

Благодарю за внимание. Буду рад любым комментариям.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru