Схема работы “Black hat” хакеров стара как мир: найти цель, взломать, заработать денег. С течением последних лет было реализовано очень много хитроумных атак по новейшим техникам, которые вызвали переломные изменения во всей цифровой инфраструктуре. 

Некоторые утверждают, что нынче атаки стали однообразными, но я считаю, что это не так. Люди не могут понять, что самые лучшие и наиболее креативные нападения  —  это те, которые мы не замечаем. Этим летом я решил провести своеобразное исследование, чтобы узнать, каким образом хакеры обходят системы защиты. Начал я с пары форумов, включая nulled и cracked, где к своему удивлению обнаружил множество сервисов с тысячами просмотров. 

На этих ресурсах зачастую одновременно находилось до 15 000 пользователей, просматривающих маркетплейс и активно обменивающихся информацией. Мое же внимание привлек онлайн-магазин, продающий подарочные карты Starbucks. Мне стало искренне любопытно, как можно заполучить такие украденные карты различных магазинов. Это было удивительно, потому что продавец предлагал их без PIN-кода. Скажу наперед, приключение в итоге выдалось интересное!

Начал я с того, что “прикинулся” разработчиком и отправил продавцу сообщение, поинтересовавшись, как можно перед покупкой проверить карточки на наличие баланса. В ответ мне сообщили, что я могу это сделать по горячей линии магазина, чья карта меня интересует. Такой ответ меня смутил. С чего бы я стал использовать горячую линию? Может продавец эксплуатировал ее? Может у него был доступ? В итоге я решил отложить идею с проверкой схемы работы и на неделю об этом вообще забыл. Однако чуть позже, когда я был занят поиском SMS-провайдера, до меня дошло. Он каким-то образом получал огромный список подарочных карт и проверял их баланс по горячей линии, используя провайдера телефонной связи. Я тут же направился на форум и вбил в поиске бота подарочных карт. Сайт выдал ветку новой программы easycards.io. В процессе ее чтения я нашел, что искал:

Телефонный бот

Когда я прочел информацию, все встало на свои места. Бот совершал звонки, используя телефонного провайдера (в данном случае Twilio), а затем возвращал баланс, используя сервис преобразования речи в текст (Assembly). Тогда я решил взять свою старую, когда-то подаренную мне на день рождения карточку Starbucks и самостоятельно проверить ее баланс по телефону. Я ввел ее данные через систему тонального набора, на что получил весьма неожиданную просьбу ввести капчу. В тот момент я понял, что все куда сложнее, чем мне изначально казалось.

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

Я снова позвонил на горячую линию, чтобы проверить, сколько продлиться ожидание ввода капчи. При этом я также сначала ввел добавочный номер, потом номер карты, после чего возникло предложение ввести капчу. Далее, спустя примерно 7 секунд, всплыло сообщение “Sorry, that’s incorrect”. То есть у программы было всего 7 секунд на то, чтобы получить капчу, записать ее, транскрибировать и отправить. Меня поистине поражало, что продавцы каким-то образом с помощью этой методики умудрялись получать 1 500 подарочных карт с балансами выше $5. Будучи шокирован уровнем сложности, я сделал то, что сделал бы любой хороший программист  —  создал такую программу сам.

Первые пару дней я разбирался в документации Twilio, изучая программную реализацию этих звонков. В Twilio есть вспомогательные/оберточные библиотеки функций практически на каждом возможном языке, так что задача была несложной. Через POST-запрос к маршруту создания вызова бот набирал номер, затем вводил добавочный номер и после номер карты. В этом подходе для совершения связанных с вызовом действий требуется так называемый Twiml (корпоративное имя для XML). Выглядит этот Twiml так:

<Response>
    <Pause length="70"/>
</Response>

А код Python так:

# Скачать вспомогательную библиотеку с https://www.twilio.com/docs/python/install
import os
from twilio.rest import Client

# Получить SID вашей учетной записи и токена авторизации с #twilio.com/console
# с последующей установкой переменных среды. Подробности здесь #http://twil.io/secure
account_sid = os.environ['TWILIO_ACCOUNT_SID']
auth_token = os.environ['TWILIO_AUTH_TOKEN']
client = Client(account_sid, auth_token)

call = client.calls.create(
                        url='http://demo.twilio.com/docs/voice.xml',
                        to=gift_card_hotline_phone_number,
                        from_=bought_phone_number
                        send_digits=extension + card_number                    
)

print(call.sid)

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

"WWW1WWW"

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

recording = client.calls(sid)
.recordings
.create()

Спустя примерно 5 секунд нужно будет с помощью того же Twilio API остановить запись и передать URL в службу транскрибирования, например Assembly.

import requests

endpoint = "https://api.assemblyai.com/v2/transcript"

json = {
  "audio_url": recording url from twilio
}

headers = {
    "authorization": "YOUR-API-TOKEN",
    "content-type": "application/json"
}

response = requests.post(endpoint, json=json, headers=headers)

print(response.json())

В завершении можно использовать регулярное выражение для парсинга транскрипции и отправки цифр обратно через Twilio API. Вот псевдокод:

x = [3-9]\d\dsend_digits(x)

Сразу после отправки нужно будет снова начать запись, после чего в определенный момент (по истечении элемента Pause в Twiml) транскрибировать возвращенные данные и отправить их клиенту. Прежде чем передавать их клиенту следует очистить ввод до простых возвращаемых значений VALID или INVALID, чтобы облегчить восприятие. Добытую информацию лучше всего будет сохранить в текстовый файл. На выполнение всей этой процедуры проверки затрачивается $0,015  —  весьма незначительное количество в сравнении с тем, сколько можно заработать с позиции Black Hat-хакера, крадущего подарочные карты. 

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

Уверен, что о мире безопасность можно очень многое узнать, просто заглянув под поверхность и углубившись в суть. Надеюсь, эта статья вдохновит некоторых из вас на обнаружение своего типа атаки “телефонным ботом”, ведь развитие будущей безопасности зависит от стремления исследователей проводишь больше времени в изучении внутренностей системы, а не в общении друг с другом. 

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Al3x9a: How hackers are finding creative ways to steal gift cards using artificial intelligence

Предыдущая статьяСостояния потоков в Java
Следующая статьяАнализ социальных сетей: от теории графов до приложений на Python