写点什么

震网(Stuxnet)病毒深度解析:首个攻击真实世界基础设施的病毒

  • 2023-01-16
    中国香港
  • 本文字数:4100 字

    阅读完需:约 13 分钟

震网(Stuxnet)病毒深度解析:首个攻击真实世界基础设施的病毒

本文分享自华为云社区《【安全技术】震网(Stuxnet)病毒深度解析:首个攻击真实世界基础设施的病毒(1)【原创分析】》,作者:云存储开发者支持团队 。

第一章 震网病毒背景【源自网络】


2006 年,伊朗重启核计划,在纳坦兹建立核工厂,安装大量离心机生产浓缩铀。2010 年 1 月,联合国负责核查伊朗核设施的国际原子能机构(IAEA)发现纳坦兹核工厂出现问题,原本预期使用寿命 10 年的 IR-1 型离心机大规模故障,但是谁都说不清楚到底是什么原因导致的。


伊朗纳坦兹核工厂


2010 年 6 月,白俄罗斯一家小型反病毒公司 VirusBlockAda 的技术负责人舍基·乌尔森(Sergey Ulasen),在分析伊朗计划上上的恶意文件时,发现该恶意文件异常复杂,不仅有效利用了"内核极"后门来躲过反病毒引擎的扫描,还利用了多个"零日漏洞"(zero-day) 来突破 Windows 系统,但是由于力不从心,没有完全破译该恶意代码。2010 年 7 月 12 日,乌尔森将该发现发布在一个英文安全论坛上。


舍基·乌尔森(SergeyUlasen)


全球安全业界开始对这个病毒进行分析和破译。同时,微软将该病毒命名为:震网(Stuxnet)。通过分析发现,该病毒的隐蔽性、先进性和复杂性远远超过人们的想象。


据国外一些报道称,该病毒是由美国和以色列的程序员共同编写,其中攻击的西门子工控系统的技术规范由德国提供,西门子工控系统被广泛应用于伊朗核设施中。在以色列的迪莫诺,构建了西门子控制器和 IR-1 型离心机的试验系统,对该病毒进行了测试,英国政府也参与了试验,试验完成后,荷兰情报人员作为离心机的技术咨询工程师,将病毒植入到核设施中。


震网病毒主要是通过改变离心机的转速,来破坏离心机,并影响生产的浓缩铀质量。


离心机被故障


震网病毒原本的设计是定向攻击,作为网络武器来使用,算是 APT 攻击的鼻祖。之所以被发现,是因为开发震网病毒的程序员在编程的时候,错误的将 and 和 or 用错,导致病毒可以感染任何版本的 Windows 系统,最终在 2010 年 6 月被捕获。

第二章 震网病毒逆向深入分析【个人原创分析,非授权请勿转载


震网病毒结构与运行流程


震网病毒主要包含 6 个文件,4 个快捷方式图标文件,利用 LNK 漏洞从 U 盘自动感染计算机,两个 tmp 文件,用于初始化和安装震网病毒。


震网病毒共利用了 7 个漏洞,其中 4 个 0 Day 漏洞:


  • CVE-2008-4250(MS-08-067)-Windows Server Service NetPathCanonicalize()

  • CVE-2010-2772 WinCC default password

  • CVE-2012-3015 Step 7 Insecure Library Loading

  • CVE-2010-2568(MS-10-046)-Windows Shell LNK Vulnerability (O day)

  • CVE-2010-2743(MS-10-073)-Win32K.sys Local Privilege Escalation (O day)

  • CVE-2010-3888(MS-10-092) Task Scheduler vulnerability (O day)

  • CVE-2010-2729(MS-10-061)-Windows Print Spooler Service Remote Code Execution (O day)


震网病毒隐藏在 U 盘中,当 U 盘插入到计算机上时,利用 LNK 漏洞会自动感染 Windows 系统,感染执行后,通过 Ring3 Hook Ntdll 实现在内存中加载~WTR4141.tmp 文件,Ring3 Hook Kernel32、Ntdll 实现*.tmp 和*.lnk 文件隐藏。进而通过内存 LoadLibrary 加载~WTR4132.tmp 文件,提取出核心的 Main.dll,在内存中加密、脱壳、加载 Main.dll,初始化安装震网病毒,注入进程、注册服务,释放资源文件,最终震网病毒以服务运行。服务运行时,会攻击西门子 WinCC 工控系统软件,通过该软件最终攻击 PLC,让离心机异常工作,导致离心机快速故障。


Call#15 初始化安装 Stuxnet


当 Main.dll 被加载的时候,导出表 #15 第一个被调用。#15 主要负责检查 Stuxnet 是否运行在一个合适的系统中,检测当前系统是否已被感染,把当前进程权限提升到系统权限,检测系统中安装的杀毒软件版本,选择把 DLL 注入到哪个进程中;把 DLL 注入到选择的进程中,然后调用 #16。


#15 的第一个任务是检查配置数据(configuration data)是否是最新的。配置数据可以被存储到两个位置。Stuxnet 检查最新的配置数据并且执行。然后 Stuxnet 检查是否运行在一个 32 位的系统中,如果运行在 64 位系统中则退出,同时也检查操作系统的版本,Stuxnet 只能运行在以下版本的操作系统中:


  • Win2K

  • WinXP

  • Windows 2003

  • Vista

  • Windows Server 2008

  • Windows 7

  • Windows Server 2008 R2


接着检查当前进程是否具有 Administrator 权限,如果没有则会利用 0-day 漏洞提升运行权限。如果当前操作系统是 Windows Vista、Windows 7、Windows Server 2008 R2,则利用 Task Scheduler Escalation of Privilege 来提升权限;如果操作系统是 Windows XP、Win2K 则利用 Windows Win32k.sys Local Privilege Escalation(MS10-073)漏洞提升权限。


如果代码运行成功,如果利用 win32k.sys 漏洞,主 DLL 文件作为一个新进程运行,如利用 Task Scheduler,主 dll 运行在 csrss.exe 进程中。


Win32k.sys 漏洞利用的代码在资源文件 #250 中,当导出表 #15 运行检查都通过后,#16 运行。#16 是 Stuxnet 的主安装程序。它检查日期和操作系统的版本,解密、创建并安装 rootkit 文件和注册表项;并把自己注入到 services.exe 中,以便感染移动存储设备;把自己注入到 Step7 的进程中感染所有的 Step7 工程;建立全局互斥量(mutexes)用于不同组件之间的通信;连接 RPC 服务器。


Call#16 安装 Stuxnet


#16 首先检查配置数据是否有效,然后检查注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MS-DOS Emulation 中的 NTVDM TRACE 值是否是 19790509,如果是则退出。该项应该是是否允许感染的标识。然后读取配置数据中的日期(配置数据偏移 0x8c 处)和当前系统日期对比,如果当前日期比配置数据中的时间晚,则退出;配置数据中的日期是 2012-6-24。


Stuxnet 的各个组件之间的通信采用全局互斥信号量,当在 Windows Xp 中时调用 SetSecurityDescriptorDacl 创建这些互斥信号量;在 Windows Vista、Windows 7 和 WindowsServer2008 中调用 SetSecurityDescriptorSacl 创建,用此方法可以降低系统完整性检测,保证代码写操作被拒绝。


然后 Stuxnet 创建 3 个加密的文件,这些文件来自.stub 节。然后将他们保存到磁盘。


Ø Stuxnet 主要攻击载荷文件保存为 Oem7a.pnf;

Ø 一个 90 个字节的数据被保存到 %SystemDrive%\inf\mdmeric3.PNF 中;

Ø 配置数据被拷贝到 %SystemDrive%\inf\mdmcpq3.PNF 中;

Ø 一个日志文件被拷贝到 %SystemDrive%\inf\oem6C.PNF 中;


接着 Stuxnet 检查系统时间,确保它在 2012 年 6 月 24 号以前。然后通过读取存并解密储到硬盘中的版本信息,来检查自己和保存到磁盘上的加密代码是否是最新的。此功能是通过 #6 实现的。


版本检查通过后,Stuxnet 从资源文件中(#201、#242)释放、解码并将内容写 2 个文件中:Mrxnet.sys 和 Mrxcls.sys;它们是两个驱动文件:一个用于 Stuxnet 的加载点(Load point),另一个用于隐藏磁盘中恶意文件。并且这两个文件的时间和系统目录中的其他文件时间一致,以免引起怀疑;然后创建注册表项指向这两个驱动文件,将它们注册为服务项,以便开机的时候就启动这 2 个服务。一旦 Stuxnet 创建的这个 Rootkit 正确安装后,会产生一些全局信号量,表明安装成功。


Stuxnet 接着采用另外的 2 个导入函数(exports)继续完成安装和感染(infection)过程。


(1)然后把 payload .dll 注入到 services.exe 中并且调用 #32(感染可移动存储设备和启动 RPC 服务);


(2)把 payload .dll 注入到 Step7 的进程:S7tgtopx.exe 中并且调用 #2(用于感染 Step7 工程文件),为使这一步成功,Stuxnet 可能需要杀掉 explorer.exe 和 S7tgtopx.exe 进程,如果他们在运行中的话。


Stuxnet 的通过上述的两种 payload .dll 注入和创建的服务及驱动文件运行起来。


Stuxnet 将等待一段短暂时间后才试图连接 RPC 服务(#32 开启的),将调用 0 号函数检查连接是否成功并且调用 9 号函数接收一些数据存储到 oem6c.pnf 中。


至此,所有默认的传播方式和攻击载荷已经被激活。


Stuxnet 攻击西门子 PLC 流程


攻击 PLC 过程


(1) 恶意 DLL 将 s7otbxdx.dll 重命名为 s7otbxsx.dll,用定制的 DLL 替代 s7otbxdx.dll,该定制 DLL 主要重写 s7otbxsx.dll 109 个中的 16 个涉及读、写和枚举代码块的导出函数,其他导出函数还是由 s7otbxdx.dll 提供;


(2) 震网根据不同目标系统的特征选择不同的代码来感染 PLC,一个感染的序列包含注入到 PLC 中的代码块和数据块,来改变 PLC 行为,主要有三种感染序列,其中两种比较相似,功能相同,标记为序列 A 和 B,另外一种标记为序列 C;


(3) 如果 s7otbxdx.dll 是运行在 ccrtsloader.exe 文件中,替换后的 s7otbxdx.dll 启动两个线程感染特定的 PLC:


线程 1:(每 15 分钟运行一次;感染含有特定 SDB 特征的 6ES7-315-2 PLC)


(a) 通过 s7ag_read 检测 PLC 类型,必须为 6ES7-315-2;


(b) 检测 SDB 块来确定 PLC 是否被感染以及选择写入哪个序列(A 或 B);


Ø 枚举、解析 SDB(系统数据块),寻找一个偏移 50h DWORD 的地方等于 0100CB2Ch 的 SDB;(说明使用的是 Profibus communications processor module CP 342-5。)


Ø 在 SDB 中搜索特定的值 7050h 和 9500h,只有当两个值出现在总数大于等于 33 时才满足感染要求;(7050h 代表 KFC750V3 变频驱动器,9500h 代表 Vacon NX 频率转换驱动器。)


(c) 按照序列 A 或 B 进行感染:


Ø 拷贝 DP_RECV 块到 FC1869,然后用定制的块替换 DP_RECV 块;(DP_RECV 是网络协处理器使用的标准代码块的名称,用来接收 Profibus 上的网络帧。每次接收包时,定制块会调用 FC1869 中原始的 DP_RECV 进行处理,然后对包数据进行一些后处理。)


Ø 将一些定制块写入到 PLC(20 个);


Ø 感染 OB1,使每个周期开始先执行恶意代码;(首先增加原始块的大小;然后将定制代码写入到块的开头;最后将原始的 OB1 代码插入到定制代码后面。)


Ø 感染 OB35;(和 OB1 相同,采用 code-prepending 感染技术)


线程 2:(每 5 分钟查询一次;保证攻击同时进行)


(a) 监控、查询总线上的每个特定 PLC(如 S7-315)中被线程 1 成功注入的数据块 DB890;


(b) 当达到特定条件,启动破坏例程时,该线程向所有监控的 PLC 中的 DB890 写入数据,使同一总线上的 PLC 同时发起破坏攻击。


(4) 某些条件下,会将序列 C 写入 PLC,针对 6ES7-417,更为复杂;


(5) 破坏:(在不同时间降低或增加马达频率)


(a) 确定正常的操作频率:807-1210Hz;


(b) 将频率设定为 1410Hz;


(c) 恢复正常操作;


(d) 大约 27 天后,先将频率设为 2Hz,然后设为 1064Hz;


(e) 恢复正常操作;


重复上述过程。

第三章 震网病毒重现


【篇幅原因,请关注后续文章】


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
震网(Stuxnet)病毒深度解析:首个攻击真实世界基础设施的病毒_安全_华为云开发者联盟_InfoQ写作社区