首页 -> 安全研究

安全研究

紧急通告
绿盟科技紧急通告(Alert2003-01)

NSFOCUS安全小组(security@nsfocus.com)
http://www.nsfocus.com

新SQL蠕虫紧急公告!

发布日期:2003-01-25


受影响的软件及系统:
====================
Microsoft SQL Server 2000 SP2
Microsoft SQL Server 2000 SP1
Microsoft SQL Server 2000 Desktop Engine
Microsoft SQL Server 2000
    - Microsoft Windows NT 4.0 SP6a
    - Microsoft Windows NT 4.0 SP6
    - Microsoft Windows NT 4.0 SP5
    - Microsoft Windows NT 4.0
    - Microsoft Windows 2000 Server SP3
    - Microsoft Windows 2000 Server SP2
    - Microsoft Windows 2000 Server SP1
    - Microsoft Windows 2000

综述:
======
绿盟科技安全小组监测到一种针对Microsoft SQL Server 2000的蠕虫正在活跃,危害极大。

绿盟科技安全小组专门为此免费提供了检测Microsoft SQL Server漏洞的扫描工具。可以到如下地址下载:

http://www.nsfocus.net/tools/SQLWormScanner.exe

更新记录:

2003-01-26  13:50  更新了安全补丁信息和解决方案;增加了对该蠕虫代码的分析;增加了一个专门查找该漏洞的工具。

分析:
======
北京时间2003年01月25日14时许,绿盟科技安全小组监测到忽然发生了世界范围的大规模网络访问速度减慢甚至阻塞的情况,经过绿盟科技安全小组对捕获的数据样本分析和研究,已经明确,这是一种新出现的针对Microsoft SQL Server 2000的蠕虫。

该蠕虫本身非常小,仅仅是一段376个字节的数据。利用的安全漏洞是“Microsoft SQL Server 2000 Resolution服务远程栈缓冲区溢出漏洞”(http://www.nsfocus.net/index.php?act=sec_bug&do=view&bug_id=3148)。

蠕虫利用的端口是UDP/1434,该端口是SQL Server Resolution服务。Microsoft SQL Server 2000支持在单个物理主机上伺服多个SQL服务器的实例,每个实例操作需要通过单独的服务,不过多个实例不能全部使用标准SQL服务会话会话端口(TCP 1433),所以SQL Server Resolution服务操作监听在UDP 1434端口,提供一种使客户端查询适当的网络末端用于特殊的SQL服务实例的途径。

当SQL Server Resolution服务在UDP 1434端口接收到第一个字节设置为0x04的UDP包时,SQL监视线程会获取UDP包中的数据并使用此用户提供的信息来尝试打开注册表中的某一键值,如发送\x04\x41\x41\x41\x41类似的UDP包,SQL服务程序就会打开如下注册表键:
HKLM\Software\Microsoft\Microsoft SQL Server\AAAA\MSSQLServer\CurrentVersion
攻击者可以通过在这个UDP包后追加大量字符串数据,当尝试打开这个字符串相对应的键值时,会发生基于栈的缓冲区溢出,通过包含"jmp esp"或者"call esp"指令的地址覆盖栈中保存的返回地址,可导致以SQL Server进程的权限在系统中执行任意指令。

蠕虫溢出成功取得系统控制权后,就开始向随机IP地址发送自身,由于这是一个死循环的过程,发包密度仅和机器性能和网络带宽有关,所以发送的数据量非常大。在绿盟科技安全小组的测试中,和被感染机器在同一网段的每一台分析机每秒钟都收到了近千个数据包。

该蠕虫对被感染机器本身并没有进行任何恶意破坏行为,也没有向硬盘上写文件,仅仅存在与内存中。对于感染的系统,重新启动后就可以清除蠕虫,但是仍然会重复感染。由于发送数据包占用了大量系统资源和网络带宽,形成Udp Flood,感染了该蠕虫的网络性能会极度下降。一个百兆网络内只要有一两台机器感染该蠕虫就会导致整个网络访问阻塞。

蠕虫代码分析:

以下地址以以未打sql server service pack的为准。

溢出是用sprintf( )的格式串bug覆盖了ssnetlib.dll中如下函数的返回地址。将返回地址指向sqlsort.dll中文件偏移地址为0x2C9DC处的一条JMP ESP指令,实际上该处是sqlsort.dll的数据区,只不过数据FF E4正好也是JMP ESP这条指令的机器码。

第N个包的目的IP地址 = (107005的N次方) 乘以 (seed) + N 乘以 C,C = GetProcAddress这个函数的起始虚拟地址与一个常数FFD9613C异或的结果,所以C只取决于OS类型和Service pack号。在win2k sp3中,C = 8831FA24。


* Referenced by a CALL at Address:
|:42CFACC3  
|
:42CFB392 55                      push ebp
:42CFB393 8BEC                    mov ebp, esp
...........................................................................//此处省略
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:42CFB562(C)
|
:42CFB58E 8B8538DBFFFF            mov eax, dword ptr [ebp+FFFFDB38]
:42CFB594 50                      push eax

* Possible StringData Ref from Data Obj ->"SOFTWARE\Microsoft\Microsoft SQL "
                                        ->"Server\"
                                  |
:42CFB595 68000BD042              push 42D00B00

* Possible StringData Ref from Data Obj ->"%s%s\MSSQLServer\SuperSocketNetLib\"
                                  |
:42CFB59A 682C0BD042              push 42D00B2C
:42CFB59F 8D8DFCD6FFFF            lea ecx, dword ptr [ebp+FFFFD6FC]
:42CFB5A5 51                      push ecx

* Reference To: MSVCRT.sprintf, Ord:02B2h
                                  |
:42CFB5A6 FF1510E1CF42            Call dword ptr [42CFE110]
:42CFB5AC 83C410                  add esp, 00000010
:42CFB5AF 8B9538DBFFFF            mov edx, dword ptr [ebp+FFFFDB38]
:42CFB5B5 52                      push edx

* Possible StringData Ref from Data Obj ->"SOFTWARE\Microsoft\Microsoft SQL "
                                        ->"Server\"
                                  |
:42CFB5B6 68500BD042              push 42D00B50

* Possible StringData Ref from Data Obj ->"%s%s\MSSQLServer\CurrentVersion"
                                  |
:42CFB5BB 687C0BD042              push 42D00B7C
:42CFB5C0 8D857CFFFFFF            lea eax, dword ptr [ebp-84]          <--------利用这个局部缓冲区的溢出来覆盖返回地址
:42CFB5C6 50                      push eax

* Reference To: MSVCRT.sprintf, Ord:02B2h
                                  |
:42CFB5C7 FF1510E1CF42            Call dword ptr [42CFE110]
:42CFB5CD 83C410                  add esp, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:42CFB58C(U)
|
:42CFB5D0 8D8D00DBFFFF            lea ecx, dword ptr [ebp+FFFFDB00]
:42CFB5D6 51                      push ecx
:42CFB5D7 6819000200              push 00020019
:42CFB5DC 6A00                    push 00000000
:42CFB5DE 8D957CFFFFFF            lea edx, dword ptr [ebp+FFFFFF7C]
:42CFB5E4 52                      push edx
:42CFB5E5 6802000080              push 80000002

* Reference To: ADVAPI32.RegOpenKeyExA, Ord:0172h
                                  |
:42CFB5EA FF1518E0CF42            Call dword ptr [42CFE018]

解决方法:
==========
* 通用解决方案:

我们建议所有运行Microsoft SQL Server 2000和近期发现网络访问异常的用户按照以下解决方案操作:

1、在边界防火墙或者路由器上阻塞外部对内和内部对外的UDP/1434端口的访问

根据Cisco的安全公告,可以使用下列命令来完成对UDP/1434端口的阻塞的操作:

对交换机(以6500系列为例):

  配置:

  set security acl ip WORM deny udp any eq 1434 any
  set security acl ip WORM deny udp any any eq 1434
  set security acl ip WORM permit any
  commit security acl WORM
  set security acl map WORM <vlan>
  
  设置端口为vlan based:
  
  set port qos <mod/port> vlan-based
  
  验证:
  
  show security acl info all
  
  删除:
  
  clear security acl WORM
  commit security acl WORM

对路由器:

  access-list 115 deny udp any any eq 1434
  access-list 115 permit ip any any
  
  int <interface>
  ip access-group 115 in
  ip access-group 115 out


2、找到被感染的主机

在边界路由器(或者防火墙)上进行检查,也可启动网络监视程序(譬如Sniffer Pro)进行检查,找到网络中往目的端口为UDP/1434发送大量数据的主机,这些主机极为可能感染了该蠕虫。

如果不能确定,则认为所有运行Microsoft SQL Server 2000 而没有安装补丁程序的机器都是被感染的机器。
可以使用端口扫描程序(譬如Nmap)对UDP/1434端口进行扫描来找到运行Microsoft SQL Server 2000的主机,但是由于UDP端口扫描并不准确,可以扫描TCP/1433端口找到运行SQL Server的主机。但需要注意的是,只有SQL Server 2000才会受到此蠕虫的感染。

绿盟科技专门设计的用于查找存在该漏洞主机的工具:
http://www.nsfocus.net/tools/SQLWormScanner.exe

3、拔掉被感染主机的网线。

4、重新启动所有被感染机器,以清除内存中的蠕虫。关闭SQL Server服务以防止再次被蠕虫感染。

5、插上被感染机器的网线

6、为被感染机器安装最新的Microsoft SQL Server 2000 Service Pack:

建议安装Microsoft SQL Server 2000  SP3(http://www.microsoft.com/sql/downloads/2000/sp3.asp)。

或者至少应该下载针对该漏洞的热修复补丁:

http://www.microsoft.com/Downloads/Release.asp?ReleaseID=40602
安装此补丁必须先安装Microsoft SQL Server 2000  SP2(http://www.microsoft.com/sql/downloads/2000/sp2.asp

注意:如果由于某种原因无法从网络下载补丁进行安装,因此可以在其他未被感染的主机上下载补丁,刻录在光盘或者保存在其他移动介质上,然后再到被感染的主机上进行安装。

* 如果由于某种原因不能及时安装补丁,可暂时使用系统上的TCP-IP筛选来阻塞对本机UDP/1434端口的访问,但我们并不推荐这样做。注意!使用TCP-IP筛选阻塞UDP可能导致某些网络应用异常。

TCP-IP筛选操作步骤:

打开“控制面板”-->“网络和拨号连接”,找到需要设置TCP-IP筛选的网卡,单击右键,选“属性”,拖动滚动条,找到“Internet 协议(TCP/IP)”,在上面双击鼠标,在新出现的窗口中点击“高级”,在“选项”页中找到“TCP/IP筛选”,打开之后点选“启用 TCP/IP筛选”并找到UDP这一栏,选择“只允许”,然后就可以添加需要使用的UDP端口,凡是不在这个端口范围内的UDP数据都会被阻塞,如果不添加则阻塞所有UDP端口。

* 某些内部大量感染该蠕虫的网络在路由器或者边界防火墙上设置阻塞UDP/1434端口的规则后会导致网络设备CPU资源占用剧增的现象,在这种情况下,可先拔掉被感染机器的网线,再设定网络设备的过滤规则,待内部所有系统都重新启动并安装补丁之后再插上网线。

注:上述步骤仅供参考。

绿盟科技产品的冰之眼IDS(http://www.nsfocus.com/homepage/products/nids.htm)早在该漏洞发布时(2002年7月)就已经可以检测此种攻击,现在又紧急添加了专门针对该蠕虫的升级包;RSAS(http://www.nsfocus.com/homepage/products/rsas.htm)也早就可以检测到网络内受该漏洞影响的主机;对于大量的UDP数据流导致的拒绝服务,黑洞(http://www.nsfocus.com/homepage/products/collapsar.htm)是目前最佳解决方案之一。

附加信息:
==========
Microsoft SQL Server 2000 Resolution服务远程栈缓冲区溢出漏洞

发布日期:2002-07-25
更新日期:2002-07-30

受影响系统:
Microsoft SQL Server 2000 SP2
Microsoft SQL Server 2000 SP1
Microsoft SQL Server 2000 Desktop Engine
Microsoft SQL Server 2000
    - Microsoft Windows NT 4.0 SP6a
    - Microsoft Windows NT 4.0 SP6
    - Microsoft Windows NT 4.0 SP5
    - Microsoft Windows NT 4.0
    - Microsoft Windows 2000 Server SP2
    - Microsoft Windows 2000 Server SP1
    - Microsoft Windows 2000
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 5311
CVE(CAN) ID: CAN-2002-0649

Microsoft SQL Server 2000是一款由Microsoft公司开发的商业性质大型数据库系统。

Microsoft SQL Server 2000的Resolution服务对用户提交的UDP包缺少正确的处理,远程攻击者可以利用这个漏洞进行基于栈的缓冲区溢出攻击。

Microsoft SQL Server 2000支持在单个物理主机上伺服多个SQL服务器的实例,每个实例操作需要通过单独的服务,不过多个实例不能全部使用标准SQL服务会话会话端口(TCP 1433),所以SQL Server Resolution服务操作监听在UDP 1434端口,提供一种使客户端查询适当的网络末端用于特殊的SQL服务实例的途径。

当SQL Server Resolution服务在UDP 1434端口接收到第一个字节设置为0x04的UDP包时,SQL监视线程会获取UDP包中的数据并使用此用户提供的信息来尝试打开注册表中的某一键值,如发送\x04\x41\x41\x41\x41类似的UDP包,SQL服务程序就会打开如下注册表键:

HKLM\Software\Microsoft\Microsoft SQL Server\AAAA\MSSQLServer\CurrentVersion

攻击者可以通过在这个UDP包后追加大量字符串数据,当尝试打开这个字符串相对应的键值时,会发生基于栈的缓冲区溢出,通过包含"jmp esp"或者"call esp"指令的地址覆盖栈中保存的返回地址,可导致以SQL Server进程的权限在系统中执行任意指令。

<*来源:NGSSoftware Insight Security Research

  链接:http://archives.neohapsis.com/archives/bugtraq/2002-07/0291.html
        http://www.microsoft.com/technet/security/bulletin/MS02-039.asp
        http://www.ngssoftware.com/advisories/mssql-udp.txt
*>

建议:
--------------------------------------------------------------------------------
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* 在边界防火墙、网关设备或者SQL Server主机上限制对UDP/1434端口的访问。由于UDP报文的源地址很容易伪造,所以不能简单地限制只允许可信IP访问。

厂商补丁:

Microsoft
---------
Microsoft已经为此发布了一个安全公告(MS02-039)以及相应补丁:
MS02-039:Buffer Overruns in SQL Server 2000 Resolution Service Could Enable Code Execution (Q323875)
链接:http://www.microsoft.com/technet/security/bulletin/MS02-039.asp

补丁下载:

    * Microsoft SQL Server 2000:
       http://www.microsoft.com/Downloads/Release.asp?ReleaseID=40602



参考:
=======

http://www.nsfocus.net/index.php?act=sec_bug&do=view&bug_id=3148
http://www.microsoft.com/technet/security/bulletin/MS02-039.asp
http://archives.neohapsis.com/archives/bugtraq/2002-07/0291.html
http://www.microsoft.com/technet/security/bulletin/MS02-039.asp
http://www.ngssoftware.com/advisories/mssql-udp.txt

声 明
==========

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

关于绿盟科技
============

绿盟科技(NSFOCUS Co., Ltd.)是中国网络安全领域的领导企业,致力于网络和系统安全问题的研究、高端网络安全产品的研发、销售与网络安全服务,在入侵检测/保护、远程评估、 DDoS攻击防护等方面提供具有国际竞争能力的先进产品,是国内最具安全服务经验的专业公司。有关绿盟科技的详情请参见: http://www.nsfocus.com

© 2024 绿盟科技