
PoC-эксплойт для обхода TLS-аутентификации в Android adbd Wireless Debugging, использующий несоответствие типа ключа EC/RSA для получения неаутентифицированной удалённой оболочки.
Отказ от ответственности: Данный Proof of Concept (PoC) предоставляется строго в образовательных целях и для авторизованных исследований в области безопасности. Несанкционированный доступ к компьютерным системам является незаконным. Всегда убеждайтесь, что у вас есть явное разрешение перед тестированием любого устройства или сети.
В устройствах Android есть функция под названием Беспроводная отладка (Wireless Debugging), которая позволяет разработчикам подключаться к устройству по Wi-Fi без USB-кабеля. Чтобы это соединение было защищённым, устройство использует шифрование TLS и требует, чтобы подключающийся компьютер подтвердил свою подлинность с помощью криптографического ключа.
Где кроется уязвимость?
Когда компьютер подключается, демон Android (adbd) проверяет, совпадает ли ключ компьютера с каким-либо из ранее авторизованных ключей. Для этого используется встроенная математическая функция (EVP_PKEY_cmp), которая возвращает одно из трёх чисел:
1 означает: «Ключи полностью совпадают».0 означает: «Ключи не совпадают».-1 означает: «Ошибка: ключи совершенно разных типов (например, сравнение ключа RSA с ключом EC)».Ошибка:
Программист написал простую проверку: if (result) { grant_access(); }.
В программировании и 1, и -1 считаются «Истиной» (True). Поэтому, если злоумышленник намеренно отправляет совершенно другой тип ключа (например, ключ эллиптической кривой вместо ожидаемого ключа RSA), функция возвращает -1 (ошибку). Ошибочный код видит -1, предполагает, что это означает «Истина», и всё равно предоставляет полный доступ.
Результат: Злоумышленник в той же сети Wi-Fi может полностью обойти аутентификацию и получить удалённую оболочку на устройстве, не нуждаясь в исходных ключах сопряжения и без того, чтобы пользователь увидел запрос на подтверждение.
Чтобы этот эксплойт сработал, целевое устройство Android должно соответствовать двум условиям:
Для работы этого скрипта требуются Python 3 и библиотека cryptography для генерации эфемерных сертификатов на лету.
Установить необходимую библиотеку можно с помощью apt (в Debian/Ubuntu/Kali) или pip:
С помощью apt (рекомендуется для Linux):
sudo apt update
sudo apt install python3-cryptography
Использование pip (кроссплатформенно):
pip3 install cryptography
В отличие от отладки по USB, Android назначает случайный порт с большим номером для беспроводной отладки при каждой перезагрузке устройства или смене сети Wi-Fi.
Если вы не знаете текущий порт, его можно легко просканировать с помощью nmap. Порты беспроводной отладки обычно находятся в диапазоне от 30000 до 50000.
Выполните следующую команду, заменив <hostname> на IP-адрес целевого устройства:
nmap -Pn -p T:30000-50000 <hostname>
Как читать вывод:
Ищите порт, отображаемый как open. Например:
PORT STATE SERVICE
41234/tcp open unknown
В этом примере 41234 — это порт, который вы будете использовать на следующем шаге.
Как только у вас есть целевое имя хоста/IP и правильный порт, вы можете запустить эксплойт.
Чтобы открыть полноценную интерактивную удалённую оболочку (аналогично SSH):
python3 adb_bypass.py <hostname> <port>
Пример:
python3 adb_bypass.py 192.168.1.50 41234
После подключения вы попадёте в приглашение пользователя shell. Нажмите Ctrl+C, чтобы выйти.
Если вы хотите просто выполнить определённую команду и увидеть вывод, не входя в интерактивную оболочку, используйте флаг --cmd:
python3 adb_bypass.py <hostname> <port> --cmd "id"
Чтобы увидеть базовый сетевой трафик и детали рукопожатия для отладки или исследований, добавьте флаг -v:
python3 adb_bypass.py <hostname> <port> -v
CNXN и STLS, чтобы договориться о переходе на TLS.cryptography, скрипт генерирует эфемерный закрытый ключ EC P-256 и самоподписанный сертификат X.509 в памяти.EVP_PKEY_cmp возвращает -1, проверка if (cmp) вычисляется как истинная, и устройство помечает соединение как авторизованное.shell:, используя большое окно delayed_ack, что приводит к неаутентифицированной удалённой оболочке.