19 Марта, 2019

Domain fronting

Артем Агеев

Domain fronting
В кратце суть такова:

Как работает HTTPS:

curl -H "Host: " "https://www.host.com/path"

Весь пакет HTTP целиком со всеми хэдэрами шифруется. При этом "www.host.com" копируется в открытом виде в SNI header (это, кстати, опционально). Именно SNI хэдэр - это то, что вы видите на файрволе/прокси если не заглядываете в HTTPS.

Если вам нужен любой из сервисов Гугла (Ютюб, Драйв, ДНС..) - вы кидаете пакеты на один и тот же центральны сервер-терминатор SSL Гугла, и он уже дальше роутит траффик внутри локальной сети ГуглоДЦ. Этот SSL терминатор использует "Host" хэдэр из тела HTTP пакета чтобы определить, куда отправить пакет дальше.

Вот мы и добрались к самому интересному: СЗИ работает с SNI хэдэром (который есть копия домена из URL), а сервера Гугла работают с Хост хэдэром (который часть HTTPS пакета и зашифован по пути до ).

То же самое справедливо для всех крупных облачных провайдеров.

Для чего оно надо?
  • во-первых для малвари чтобы скрытно качать/выкладывать файлы с/на Google Drive, маскируя траффик под YouTube (я такое, пока что, не встречал)
  • во-вторых для DNS-over-HTTPS если компания блокирует гуглоDNS (8.8.8.8).  Можно спокойно достучаться до гуглоДНС так:
curl -s -H 'Host: dns.google.com' 'https://youtube.com/resolve?name=internetbadguys.com'

такой запрос сгенерирует один DNS пакет с доменом youtube.com, в ответ вебсервер вернёт вам IP заблокированного сайта internetbadguys.com. К сожалению/к счастью, браузеры пока такой фокус не поддерживают :( / :)