Как обойти проверку SSL-сертификата в приложении Go (Golang)

Безопасность SSL

В данной статье покажу, как обойти проверку SSL-сертификатов в скомпилированных приложениях Go (Golang). Эта задача часто возникает при анализе безопасности и перехвате HTTPS-запросов, когда нет доступа к исходному коду. Я рассмотрю способы изменения бинарника для отключения проверки сертификатов, а также автоматизацию этого процесса с помощью Python-скрипта.

Еще по теме: Обход SSL Pinning в Android-приложениях

Как обойти проверку SSL в Golang

Когда впервые столкнулся с задачей перехвата HTTPS-запросов приложения Go, я попытался использовать Burp Suite, настроив переменную окружения HTTPS_PROXY. Однако, при попытке перехвата приложения столкнулся с ошибкой «Certificate signed by unknown authority (неизвестный сертификат)».

Неудачная попытка обойти проверку SSL Golang

Первая мысль — добавить сертификат Burp в хранилище сертификатов компьютера, чтобы устранить ошибку, но это не сработало. Дело в том, что Go не полагается на хранилище сертификатов компьютера и проверяет каждый сертификат самостоятельно. Попытка выполнить атаку «человек посередине» (MITM) на приложении Go была бы затруднительной из-за этой самопроверки.

В сетевых библиотеках и при обработке HTTP-запросов программист обычно может отключить проверку SSL, изменив конфигурацию или добавив флаги в обработчик HTTP. Я решил, что это может сработать и в этом случае. В процессе поиска обнаружил параметр InsecureSkipVerify в конфигурации, который по умолчанию установлен на false. Чтобы отключить проверку SSL, нужно было добавить следующий код в приложение:

или так:

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

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

В результате поиска по коду Go, обнаружил, что флаг InsecureSkipVerify используется в файле crypto/tls/handshake_client.go в функции verifyServerCertificate:

Изучив эту функцию, стало ясно, что при установке флага в true, проверка серверного сертификата пропускается. Таким образом, я мог обойти проверку сертификата, изменив соответствующее условие или ассемблерный код.

Для демонстрации я написали простое приложение на Go, которое создает GET-запрос на ipinfo.io и выводит результат:

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

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

  1. Проверка наличия сервера в кэше.
  2. Проверка флага InsecureSkipVerify.
  3. Проверка публичного ключа и сертификата.

Нас интересует вторая часть. В бинарнике это условие может быть представлено двумя командами ассемблера: cmp и jn.

Моя цель заключалась в том, чтобы изменить условие таким образом, чтобы программа пропускала проверку SSL. Это можно сделать, изменив команду jnz на jz, которая означает «переход, если ноль». В ассемблере x86 это изменение представляет собой замену одного байта (с 85 на 84).

Для выполнения этого патча использовал IDA Pro. В IDA нашел соответствующий кусок кода и изменили байт 85 на 84, затем применили изменения к файлу. После этого программа перестала выполнять проверку SSL.

Удачная попытка обойти проверку SSL Golang

Для автоматизации процесса был написан небольшой Python-скрипт, который ищет инструкции cmp и jnz в бинарнике и заменяет их на jz. Вот код скрипта:

Этот скрипт позволяет быстро и эффективно изменять скомпилированные бинарные файлы Go, обходя проверку SSL-сертификатов. Теперь перехват HTTPS-запросов и анализ приложений на Golang становится значительно проще.

ПОЛЕЗНЫЕ ССЫЛКИ:

QUASAR

Этичный хакер и компьютерный ниндзя. Новые статьи в нашей Телеге!

Добавить комментарий