该靶场为勒索病毒专场,靶场环境介绍参考:https://mp.weixin.qq.com/s/ZO-SXw5rvpLrjmcjcN9_6w

简要概述

  • 客户在阿里云部署的业务环境
  • 今天突然发现首页变成了一个勒索的界面,要求用户支付赎金以解密数据
  • 客户发现其中部分重要文件被加密为.vulntarget结尾
  • 已知Ubuntu服务器账密:root/Vulntarget@123

要求

  • 分析攻击事件是如何发生的,请给出攻击画像
  • 解密勒索
  • 恢复原来的index.jsp页面,恢复正常的web服务
  • 找到隐藏在其中的3个flag

搭建

提供的环境是raw格式,需要安装qemu将raw文件转换成vmdk格式的虚拟磁盘,这样才好在VMware上面操作

1
qemu-img.exe convert -p -f raw vuln_m-j6cegcrhehdcba0r5h4v_system.raw -O vmdk vuln_m-j6cegcrhehdcba0r5h4v_system.vmdk

这样就可以到VMware上新增虚拟机了

启动成功之后建议打一个快照

解题

攻击画像

从日志获取信息

通过ps aux查看到有tomcat的服务

到tomcat的目录下面找访问日志

导出到本机看,发现2024-06-04,攻击IP:123.123.123.123扫描当前机器,并且获得一个flag

从访问日志筛选GET、POST、PUT等方法,发现两处PUT上传成功

验证该漏洞,发现真实存在

漏洞编号为CVE-2017-12615Apache Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)

证明vulntargetn.jsp文件为攻击者上传到目标机的文件,接下来找攻击者对这个机器干了啥

首先看了权限,但是之后对这个jsp文件进行扫描,也没在日志里面看到其他的手法,放弃这个路线

从本机获取信息

进来先看计划任务、历史执行,看看是否有线索,发现history有记录到操作记录

这里先拿一个flag,往下看,发现加密命令

这样看好像只留下了私钥,前往/opt/tomcat/webapps/ROOT/.vulntarget/keys文件夹查看,发现公钥和私钥都知道了,从history里面还可以知道加密方式为rsa

业务恢复

从本机获取信息处可以,加密方式为rsa,尝试拿flag.jsp.vulntarget和私钥来解密

尝试解密index.jsp.vluntarget,但由于长度问题,只能编写脚本进行解密,编写脚本参考了:https://bbs.chaitin.cn/topic/2294

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
46
47
48
49
50
51
52
53
54
55
56
'''
Description:
version:
Author: William
Date: 2024-12-22 13:54:06
LastEditors: William
LastEditTime: 2024-12-22 14:21:48
'''
import rsa
import base64

# 假设这是你的私钥文件路径和文件名
PRIVATE_KEY_FILE = "private_key.pem"

# 假设这是你的加密文件路径和文件名
ENCRYPTED_FILE = "encrypted_file.txt"

# 解密后的数据将保存的文件名(这里我们简单地移除了".encrypted"后缀)
DECRYPTED_FILE = ENCRYPTED_FILE.replace(".encrypted", "")

# 加载私钥
with open(PRIVATE_KEY_FILE, mode='rb') as file:
private_key = rsa.PrivateKey.load_pkcs1(file.read())

# 读取加密数据(假设是Base64编码的)
with open(ENCRYPTED_FILE, mode='r') as file:
encrypted_data = file.read()
decoded_data = base64.b64decode(encrypted_data)

# RSA解密通常不直接用于大文件,但这里我们假设数据被分成小块进行加密
# 注意:实际中,你可能需要知道每个数据块的确切大小,这取决于你的加密协议
BLOCK_SIZE = 128 # 假设每个数据块是128字节,但这不是RSA的标准做法

# 初始化结果列表
decrypted_blocks = []

# 按块解密数据
for i in range(0, len(decoded_data), BLOCK_SIZE):
block = decoded_data[i:i + BLOCK_SIZE]
# 注意:这里可能需要处理块大小不是密钥长度整数倍的情况
try:
decrypted_block = rsa.decrypt(block, private_key)
decrypted_blocks.append(decrypted_block)
except rsa.pkcs1.DecryptionError:
# 如果解密失败(例如,块大小不正确),则可能需要适当的错误处理
print(f"Decryption failed for block at index {i}")
break # 或者你可以选择继续处理其他块

# 将解密后的块连接成完整的解密数据
decrypted_data = b''.join(decrypted_blocks)

# 将解密后的数据写入新文件
with open(DECRYPTED_FILE, mode='wb') as file:
file.write(decrypted_data)

print(f"{DECRYPTED_FILE} 文件解密成功")

解密出来可以看到index.jsp的原貌

解密404.jsp.vulntarget,解密完就报毒了

解密出来是webshell,查看history发现就是404.jsp被篡改

删掉即可,按照相同方式解密即可恢复业务

攻击画像总结

修复建议

参考:https://www.nsfocus.com.cn/html/2017/39_0920/690.html,禁用conf/web.xml中的org.apache.catalina.servlets.DefaultServlet的初始化参数以缓解,即将此参数修改为true