受影响系统:未安装补丁程序的微软IIS Web服务器 描述 事实上这是一种全新的蠕虫。它使用了第一代红色代码蠕虫 所利用的同类系统缺陷(.ida漏洞),然而,第二代蠕虫和第一代蠕虫的具体行为完全不同。因此,这种第二代蠕虫并不是第一代红色代码蠕虫的变体,而是一种全新的蠕虫。 这种新版本蠕虫就象原来的红色代码蠕虫一样,仅仅利用了Windows 2000 Web服务器的缺陷,它重写了Windows 2000、NT4.0等系统的EIP,最终获得了某些系统函数的代码偏移地址,而这些被控制的地址和第1类蠕虫所控制的并不一样,所以新蠕虫的功能只是摧毁系统而不是感染系统和扩散自身。
本文就是对红色代码II(即红色代码版本2.0)的分析。分析报告分成3个部分:1、感染,2、繁殖,3、特洛伊木马。您可以在IDA中装载蠕虫的二进制代码,然后根据本文的介绍逐段阅读代码对其进行分析。
为了检查您的系统是否已经被感染,您可以查找系统中是否存在文件c:\explorer.exe或d:\explorer.exe。您还可以检查您的IIS脚本文件夹和msadc文件夹查看文件root.exe是否存在。如果这些文件确实存在,那么您的系统很可能被这种蠕虫感染了。注意:以前的sadmin unicode蠕虫也会把cmd.exe重命名为root.exe,对此您要稍加留意。
请在此处下载分析报告和全部反汇编代码文件。 用于防范红色代码蠕虫的补丁同样适用于新蠕虫。您可以从此处获得微软的安全补丁程序。 感染 A.蠕虫首先设置一个函数表以便它能得到需要的函数。
seg000:000001D0
B.然后蠕虫继续得到它的本地IP地址。这个地址以后用来处理子网掩码(复制)并且保证蠕虫不再重新感染本地系统。 seg000:000001D5
C.接着,蠕虫获得本地系统的语言信息,查看本地系统是否配置为中文。
seg000:000001F9
D.现在蠕虫检查它在以前是否被执行过,如果曾被执行,蠕虫就继续进行自我复制(参看复制部分)。
seg000:0000021A
E.接下来,蠕虫会查看红色代码II原子是否已经填写(GlobalFindAtomA)。这一功能可以让蠕虫保证不再重新感染本地系统。如果原子存在,蠕虫就会进入永久休眠状态。
seg000:00000240
F.蠕虫增加一个红色代码II原子。这一功能让蠕虫检查系统是否已经被蠕虫感染了。
seg000:0000027D
G.现在蠕虫针对非中文系统将它的线程数设置为300。如果系统默认语言是中文则把线程数设为600。
seg000:00000286
H.蠕虫产生一个线程,该线程的执行从A步骤重新开始。蠕虫将根据在G步骤被设置的数字产生线程。每个新线程都是复制线程。
seg000:000002BA
I.蠕虫启用特洛伊木马功能。您可以在以下的特洛伊木马部分找到对特洛伊木马机制的分析。
seg000:000002C4
K.如果本地系统不是中文系统则蠕虫休眠1天,否则休眠2天。
seg000:000002DA
L.重新启动 Windows。
seg000:000002E1
复制 该功能负责扩散蠕虫。
seg000:000002EB
A.设置本地IP_STORAGE变量。该变量用于蠕虫复制功能同时保证不会重新感染本地系统。
seg000:000002EB
B.休眠64h毫秒。
seg000:000002F1
C.得到本地的系统时间。蠕虫会检查系统年份是否不到2002或者月份不到10。如果日期不在上述范围之内,蠕虫就重新启动本地系统。这样蠕虫的传播就基本上限制在了10月1日。
seg000:000002FD
D.设置SockAddr_in。引用GET_IP。
seg000:0000031A
E.设置socket:执行socket()函数,保存句柄,然后把它设置为非阻塞socket(这对connect()函数的调用速度来说非常重要)。
seg000:00000337
F.连接到与远程主机,如果连接成功就转到H。
seg000:00000357
以下就是蠕虫产生IP地址供其建立连接的过程:
GET_IP: ; CODE XREF: sub_1C4+168 p
call GET_OCTET ; load 4th octet (由于字节顺序的缘故这里执行一个反序操作) mov bh,al call GET_OCTET ; get 3rd octet mov bl,al shl ebx,10h ; shift bx to the top of ebx call GET_OCTET ; get 2nd octet mov bh,al call GET_OCTET ; 1st mov bl,al call GEN_OCTET ; get first octet and eax,7 ; and it by 7 call CHECK_ADDR_MASK ; ecx has eip
对每个八位组,程序在1和254之间产生一个伪随机字节,接下来就会得到一个范围在1和254 之间的随机八位组,其掩码是7,蠕虫用这个最后的字节产生第1个八位组。最重要的位是CHECK_ADDR_MASK。
详细数据记录如下: dd 0FFFFFFFFh ; 0 - 地址掩码 dd 0FFFFFF00h ; 1 dd 0FFFFFF00h ; 2 dd 0FFFFFF00h ; 3 dd 0FFFFFF00h ; 4 dd 0FFFF0000h ; 5 dd 0FFFF0000h ; 6 dd 0FFFF0000h ; 7
这个掩码用于本地系统的IP地址,并且匹配蠕虫所产生的IP地址。这样就产生了一个新的IP地址,其0、1或2字节数据原本是本地IP地址一部分。
例如,蠕虫会耗费1/8的时间来产生不在本地IP地址范围以内的随机IP地址。会用掉1/2的时间在本地IP地址的同一A类地址范围扩散,在其3/8的时间内,它将在本地IP地址的B类地址范围以内扩散。
我们还注意到,如果蠕虫产生的IP地址形如127.x.x.x、224.x.x.x或者和本地系统的IP地址一样,那么蠕虫将跳过这类IP地址并产生一个新的IP地址供其感染。
和以前出现的红色代码蠕虫相比,新型蠕虫产生IP地址的方式可以让它更快地发现更多的IIS Web服务器。这种新蠕虫还会在网络上产生大量的数据流量。
G.选择获得句柄,如果没有返回句柄就转到K。
seg000:000003B6
H.把socket设为阻塞。
seg000:000003C5
I.发送蠕虫的拷贝。
seg000:000003E4
J.执行recv函数。实际上并没有什么真正的用途。
seg000:000003FC
K.关闭socket循环到A。
特洛伊木马 在这部分蠕虫会把root.exe(root.exe就是cmd.exe)转储到msadc和脚本并在本地驱动器上创建一个特洛伊木马。
seg000:00000804
A.获得系统目录(比如c:\winnt\system32)
seg000:00000810
B.在系统目录之后附加cmd(c:\winnt\system32\cmd.exe)
seg000:00000828
C.设驱动器盘符为c:
seg000:0000082D
D.把cmd.exe拷贝到/scripts/root.exe(实际路径是:驱动器盘符:\inetpub\scripts\root.exe)
seg000:00000831
E.把cmd.exe拷贝到/msadc/root.exe(实际路径是:驱动器盘符:\progra~1\common~1\system\MSADC\root.exe)
seg000:00000863
F.对explorer.exe初始化
seg000:000008A2
G.创建Drive/explorer.exe(drive指的是c和d)
seg000:00000E83
H.蠕虫现在写explorer.exe。蠕虫体内的部分二进制代码将写到explorer.exe。蠕虫有这么一个特性:如果嵌入字节是0xFC,它就会被20h 0x00字节代替而不是由通常的字节替代。要了解这方面的更详细情况请参看Explorer.exe特洛伊部分。还有,NT的工作方式是:某一个用户登录到本地系统的时候就必须装载explorer.exe(桌面、任务条等等……),然而NT 首先会在主驱动器路径c:\下面寻找explorer.exe,这就意味着,当下一次用户登录的时候装载的实际上是被改写的explorer.exe……。
seg000:00000EC8
I.关闭explorer.exe。
seg000:00000ED5
J.把驱动器盘符改到D,然后蠕虫返回到D。之后回到感染过程的k步。
seg000:00000EDD
Explorer.exe特洛伊木马 explorer.exe木马过程概述:
1.获得本地系统目录。
2.在本地系统目录下执行explorer.exe。
3.蠕虫进入以下循环:
while(1) { set SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SFCDisable to 0FFFFFF9Dh, which basically disables system file protection. set SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\Scripts to ,,217 set SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\msadc to ,,217 Set SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\c to c:\,,217 Set SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\d to d:\,,217 sleep for 10 minutes }
以上的代码会创建一个虚拟web路径(/c和/d),路径把/c映射到c:\,/d映射到d:\。蠕虫的作者设计的这个功能等于在系统上开了一个后门,所以,即便您把root.exe(cmd.exe)从您的/scripts文件夹中删除了攻击者也使用/c和/d虚拟根目录威胁您的系统。其发起的攻击如下所示:
http://IpAddress/c/inetpub/scripts/root.exe?/c+dir (如果root.exe还在)
或者:
http://IpAddress/c/winnt/system32/cmd.exe?/c+dir ,这里dir可能是攻击者打算执行的任意命令。
只要这个特洛伊木马在运行,攻击者就能够远程访问您的服务器。
|