
Инструмент обнаружения MITM (чудовище-посредник). Используется для создания MALCOLM:
Цель этого проекта — обеспечить точное обнаружение перехвата HTTPS и надёжное формирование отпечатков TLS. Проект основан на The Security Impact of HTTPS Interception и начинался как порт на Go их скриптов обработки и отпечатков.
Дополнительный контекст о MITMEngine доступен в этой статье в блоге Cloudflare. Быстрые ссылки:
wireshark -v для проверки)Подробная документация находится вместе с кодом (сначала скопируйте пакет в $(GOPATH)/src/github.com/cloudflare/mitmengine).
godoc -http=:6060
http://localhost:6060/pkg/github.com/cloudflare/mitmengine
В этом проекте отпечатки сопоставляются с конкретными экземплярами объекта, в то время как сигнатуры могут представлять несколько объектов. Мы используем эту конвенцию, потому что отпечаток обычно является неотъемлемым свойством объекта, а сигнатуру можно выбрать. Аналогично, реальный запрос клиента, полученный сервером, будет иметь отпечаток, тогда как программное обеспечение, генерирующее запрос, может выбрать свою собственную сигнатуру (например, выбирая, какие наборы шифров оно поддерживает).
Отпечаток запроса клиента выводится из запроса клиента к серверу и содержит как особенности TLS, так и HTTP. Сигнатура запроса клиента представляет все возможные отпечатки, которые может сгенерировать программное обеспечение. Цель состоит в том, чтобы сделать каждую сигнатуру достаточно специфичной, чтобы она могла однозначно идентифицировать часть программного обеспечения.
Сигнатура User Agent представляет собой набор User Agent'ов, генерируемых браузером. Сигнатура User Agent для браузера допускает диапазон версий браузера и позволяет указывать имя ОС, платформу ОС, диапазон версий ОС и тип устройства для создания более детализированных сигнатур.
Сигнатура браузера содержит как сигнатуру User Agent, так и сигнатуру запроса клиента. Это позволяет сигнатуре представлять все возможные отпечатки, генерируемые, например, Chrome 31-38 на Windows 10.
Сигнатура MITM содержит сигнатуру запроса клиента вместе с дополнительными деталями о программном обеспечении MITM, включая уровень безопасности, на который могут влиять факторы, выходящие за рамки запроса клиента, например, проверяет ли программное обеспечение сертификаты.
Мы считаем HTTPS-соединение перехваченным, когда существует несоответствие между ожидаемой сигнатурой запроса клиента, соответствующей браузеру, идентифицированному по User Agent, и фактическим отпечатком запроса клиента.
Если сигнатура неточна или устарела для данного клиентского программного обеспечения, возможно, что сигнатура ложно пометит соединение как перехваченное.
Если прокси тесно имитирует запрос клиента, мы можем не ожидать обнаружения несоответствия. Если сигнатуры браузера слишком широки, мы также не сможем обнаружить перехват.
Эталонные отпечатки браузера и MITM-программного обеспечения, используемые в MALCOLM, можно найти в reference_fingerprints/mitmengine/.
Этот набор отпечатков представляет собой комбинацию того, что извлечено из TLS Client Hello pcaps в reference_fingerprints/pcaps/, а также 500 лучших пар User Agent + TLS Client Hello,
наблюдаемых в сети Cloudflare и помеченных высокой степенью доверия (то есть трафик, соответствующий активности людей и дружественных ботов).
В идеале мы не должны полагаться на эталонные отпечатки, взятые из сети Cloudflare; вместо этого у нас должен быть полный набор pcaps для построения нашего набора эталонных TLS Client Hello. Заинтересованы в помощи по расширению набора данных? Узнайте, как вы можете внести вклад!
Сначала пользователь должен создать структуру mitmengine.Config для передачи в mitmengine.NewProcessor. Структура mitmengine.Config
может указывать имена файлов, содержащих отпечатки браузеров, отпечатки MITM и заголовки
MITM. Альтернативно, она может также указывать файл конфигурации для чтения вышеупомянутых файлов из любого
другого источника; сейчас MITMEngine поддерживает чтение этих файлов из баз данных, совместимых с Amazon S3 (включая
Amazon S3 и Ceph). Дополнительные средства чтения файлов для баз данных (которые мы называем "загрузчиками") могут быть определены в пакете loaders,
и пока новые загрузчики реализуют интерфейс Loader, они должны работать с остальной частью MITMEngine "из коробки".
Предполагаемая точка входа в пакет MITMEngine — это функция Processor.Check, которая принимает User Agent и отпечаток запроса клиента и возвращает отчёт об обнаружении MITM. В будущем будут добавлены дополнительные функции API, например, для добавления новых сигнатур в работающий процесс.
Пример использования API приведён ниже. Более полное приложение доступно в cmd/demo/main.go и может быть собрано выполнением make bin/demo.
rawUa := "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"
requestFingerprintString := "303:dada,1301,1302,1303,c02b,c02f,c02c,c030,cca9,cca8,c013,c014,9c,9d,2f,35,a:aaaa,0,17,ff01,a,b,23,10,5,d,12,33,2d,2b,1b,dada,15:9a9a,1d,17,18:0::"
uaFingerprintString := "1:72.0.3626:2:3:10.14.3:1:"
requestFingerprint, _ := fp.NewRequestFingerprint(requestFingerprintString)
uaFingerprint, _ := fp.NewUAFingerprint(uaFingerprintString)
report := mitmProcessor.Check(uaFingerprint, rawUa, requestFingerprint)
TLS requestFingerprintString имеет следующий формат:
<tls_version>:<cipher_suites>:<extension_names>:<curves>:<ec_point_fmts>:<http_headers>:<quirks>
uaFingerprint имеет следующий формат:
# <browser_name>:<browser_version>:<os_platform>:<os_name>:<os_version>:<device_type>:<quirks>
Пример разбора User Agent'ов в формат uaFingerprint находится в файле cmd/demo/main.go.
Чтобы использовать MITMEngine, не забудьте подтянуть его зависимости. Вероятно, вам захочется запустить логику vendoring или gomod перед запуском тестов на MITMEngine.
Для тестирования выполните make test, а для просмотра покрытия кода — make cover.
Поскольку отпечатки браузеров и MITM быстро устаревают, мы активно ищем способы обновления репозитория отпечатков новыми образцами.
Предоставляя образец отпечатка ("Образец"), вы (от своего имени или от имени организации, которую вы представляете или которая спонсирует вас (если таковая имеется)) предоставляете Cloudflare, Inc. и её дочерним и аффилированным компаниям бессрочную, безотзывную, неисключительную, освобождённую от роялти, всемирную лицензию на все права интеллектуальной собственности на Образец: (1) копировать, публиковать, отображать и распространять Образец; и (2) создавать производные работы, основанные на Образце или являющиеся его частью.
Чтобы внести образцы отпечатков, пожалуйста, выполните следующие шаги:
(протестировано на macOS Mojave 10.14.3)
Создайте сертификат RSA сервера и пару ключей:
openssl req -new -x509 -sha256 -out server.crt -nodes -keyout server.pem -subj /CN=localhost
Запустите сервер на порту 4433:
openssl s_server -www -cipher AES256-SHA -key server.pem -cert server.crt
Запустите захват TShark для расшифровки HTTP-заголовков (TShark >= 3.0.0):
tshark -i loopback -o tls.keys_list:"127.0.0.1,4433,http,server.pem" -Tjson -e http.request.line -Y http > header.json
Запустите захват TShark для TLS Client Hello:
tshark -i loopback -f "tcp port 4433" -w handshake.pcap
Посетите https://localhost:4433 с TLS-клиента, который вы хотите снять отпечаток. Например,
echo -e "GET /test HTTP/1.1\r\nHost:example.com\r\n\r\n" | openssl s_client -connect localhost:4433
Создайте образец отпечатка (header.json, handshake.pcap), как описано выше, и поместите его в каталог reference_fingerprints/pcaps/<desc>, где <desc> — уникальное и описательное имя.
Добавьте строку в reference_fingerprints/fingerprint_metadata.jsonl со следующими полями. Распознанные варианты для полей os, device, platform и browser — это те, что определены в пакете uasurfer. Распознанные варианты для mitm_fingerprint.type перечислены ниже. Примеры смотрите в reference_fingerprints/fingerprint_metadata.jsonl; любые неизвестные поля можно оставить пустыми или пропустить.
{ "desc": "", "comment": "", "handshake_pcap": "", "header_json": "<(optional) path to file containing the client HTTP request", "ua_fingerprint": {"raw_ua": "", "os": "<WindowsPhone|Windows|MacOSX|iOS|Android|...>", "os_version": "..", "device": "<Windows|Mac|Linux|...>", "platform": "<Computer|Tablet|Phone|...>", "browser": "<Chrome|IE|Safari|Firefox|...>", "browser_version": ".."}, "mitm_fingerprint": { "name": "", "type": "<Antivirus|FakeBrowser|Malware|Parental|Proxy>" }}
Другие PR и запросы функций приветствуются!
mergeDB (в cmd/mergedb) — это утилита для объединения похожих отпечатков TLS ClientHello для нескольких близких версий браузеров или MITM-программного обеспечения.
Используйте mergeDB для консолидации больших списков отпечатков User Agent / Client Hello:
go run cmd/mergedb/main.go
По умолчанию mergeDB работает с отпечатками из каталога reference_fingerprints/mitmengine.
Отправьте pull request с указанными изменениями.