
Android adbd 무선 디버깅 TLS 인증 우회에 대한 개념 증명 익스플로잇으로, EC/RSA 키 유형 불일치를 이용해 인증 없이 원격 셸을 획득합니다.
면책 조항: 이 개념 증명(PoC)은 교육 및 승인된 보안 연구 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 모든 기기 또는 네트워크를 대상으로 테스트하기 전에 반드시 명시적인 허가를 받았는지 확인하십시오.
Android 기기에는 무선 디버깅(Wireless Debugging) 이라는 기능이 있으며, 이를 통해 개발자는 USB 케이블 없이 Wi-Fi를 통해 기기에 연결할 수 있습니다. 이 연결을 안전하게 유지하기 위해 기기는 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) 검사가 true로 평가되며, 기기는 연결을 인가된 것으로 표시합니다.delayed_ack 윈도를 사용하여 shell: 스트림을 열어, 인증되지 않은 원격 셸을 획득합니다.