Webmaster网络安全讲座:7.攻击与渗透
www.hackbase.com 2004-9-29 黑客基地
Webmaster网络安全讲座:第七讲 攻击与渗透
作者:(webmaster网络技术学院)
一旦黑客定位了你的网络,他通常会选定一个目标进行渗透。通常这个目标会是安全漏洞最多或是他拥有最多攻击工具的主机。非法入侵系统的方法有很多,你应当对这些方法引起注意。
常见攻击类型和特征
攻击特征是攻击的特定指纹。入侵监测系统和网络扫描器就是根据这些特征来识别和防范攻击的。下面简要回顾一些特定地攻击渗透网络和主机的方法。
常见的攻击方法
你也许知道许多常见的攻击方法,下面列出了一些:
· 字典攻击:黑客利用一些自动执行的程序猜测用户命和密码,审计这类攻击通常需要做全面的日志记录和入侵监测系统(IDS)。
· Man-in-the-middle攻击:黑客从合法的传输过程中嗅探到密码和信息。防范这类攻击的有效方法是应用强壮的加密。
· 劫持攻击:在双方进行会话时被第三方(黑客)入侵,黑客黑掉其中一方,并冒充他继续与另一方进行会话。虽然不是个完全的解决方案,但强的验证方法将有助于防范这种攻击。
· 病毒攻击:病毒是能够自我复制和传播的小程序,消耗系统资源。在审计过程中,你应当安装最新的反病毒程序,并对用户进行防病毒教育。
· 非法服务:非法服务是任何未经同意便运行在你的操作系统上的进程或服务。你会在接下来的课程中学到这种攻击。
· 拒绝服务攻击:利用各种程序(包括病毒和包发生器)使系统崩溃或消耗带宽。
容易遭受攻击的目标
最常遭受攻击的目标包括路由器、数据库、Web和FTP服务器,和与协议相关的服务,如DNS、WINS和SMB。本课将讨论这些通常遭受攻击的目标。
路由器
连接公网的路由器由于被暴露在外,通常成为被攻击的对象。许多路由器为便于管理使用SNMP协议,尤其是SNMPv1,成为潜在的问题。许多网络管理员未关闭或加密Telnet会话,若明文传输的口令被截取,黑客就可以重新配置路由器,这种配置包括关闭接口,重新配置路由跳计数等等。物理安全同样值得考虑。必须保证路由器不能被外人物理接触到进行终端会话。
过滤Telnet
为了避免未授权的路由器访问,你应利用防火墙过滤掉路由器外网的telnet端口和SNMP[161,162]端口
技术提示:许多网络管理员习惯于在配置完路由器后将Telnet服务禁止掉,因为路由器并不需要过多的维护工作。如果需要额外的配置,你可以建立物理连接。
路由器和消耗带宽攻击
最近对Yahoo、e-Bay等电子商务网站的攻击表明迅速重新配置路由器的重要性。这些攻击是由下列分布式拒绝服务攻击工具发起的:
· Tribal Flood Network(TFN)
· Tribal Flood Network(TFN2k)
· Stacheldraht(TFN的一个变种)
· Trinoo(这类攻击工具中最早为人所知的)
因为许多公司都由ISP提供服务,所以他们并不能直接访问路由器。在你对系统进行审计时,要确保网络对这类消耗带宽式攻击的反映速度。你将在后面的课程中学习如何利用路由器防范拒绝服务攻击。
数据库
黑客最想得到的是公司或部门的数据库。现在公司普遍将重要数据存储在关系型或面向对象的数据库中,这些信息包括:
· 雇员数据,如个人信息和薪金情况。
· 市场和销售情况。
· 重要的研发信息。
· 货运情况。
黑客可以识别并攻击数据库。每种数据库都有它的特征。如SQL Server使用1433/1434端口,你应该确保防火墙能够对该种数据库进行保护。你会发现,很少有站点应用这种保护,尤其在网络内部。
服务器安全
WEB和FTP这两种服务器通常置于DMZ,无法得到防火墙的完全保护,所以也特别容易遭到攻击。Web和FTP服务通常存在的问题包括:
· 用户通过公网发送未加密的信息;
· 操作系统和服务存在众所周知的漏洞导致拒绝服务攻击或破坏系统;
· 旧有操作系统中以root权限初始运行的服务,一旦被黑客破坏,入侵者便可以在产生的命令解释器中运行任意的代码。
Web页面涂改
近来,未经授权对Web服务器进行攻击并涂改缺省主页的攻击活动越来越多。许多企业、政府和公司都遭受过类似的攻击。有时这种攻击是出于政治目的。大多数情况下Web页面的涂改意味着存在这入侵的漏洞。这些攻击通常包括Man-in-the-middle攻击(使用包嗅探器)和利用缓冲区溢出。有时,还包括劫持攻击和拒绝服务攻击。
邮件服务
广泛使用的SMTP、POP3和IMAP一般用明文方式进行通信。这种服务可以通过加密进行验证但是在实际应用中通信的效率不高。又由于大多数人对多种服务使用相同的密码,攻击者可以利用嗅探器得到用户名和密码,再利用它攻击其它的资源,例如Windows NT服务器。这种攻击不仅仅是针对NT系统。许多不同的服务共享用户名和密码。你已经知道一个薄弱环节可以破坏整个的网络。FTP和SMTP服务通常成为这些薄弱的环节。
与邮件服务相关的问题包括:
· 利用字典和暴力攻击POP3的login shell;
· 在一些版本中sendmail存在缓冲区溢出和其它漏洞;
· 利用E-mail的转发功能转发大量的垃圾信件
名称服务
攻击者通常把攻击焦点集中在DNS服务上。由于DNS使用UDP,而UDP连接又经常被各种防火墙规则所过滤,所以许多系统管理员发现将DNS服务器至于防火墙之后很困难。因此,DNS服务器经常暴露在外,使它成为攻击的目标。DNS攻击包括:
· 未授权的区域传输;
· DNS 毒药,这种攻击是指黑客在主DNS服务器向辅DNS服务器进行区域传输时插入错误的DNS信息,一旦成功,攻击者便可以使辅DNS服务器提供错误的名称到IP地址的解析信息;
· 拒绝服务攻击;
其它的一些名称服务也会成为攻击的目标,如下所示:
· WINS,“Coke”通过拒绝服务攻击来攻击没有打补丁的NT系统。
· SMB服务(包括Windows的SMB和UNIX的Samba)这些服务易遭受Man-in-the-middle攻击,被捕获的数据包会被类似L0phtCrack这样的程序破解。
· NFS和NIS服务。这些服务通常会遭受Man-in-the-middle方式的攻击。
在审计各种各样的服务时,请考虑升级提供这些服务的进程。
审计系统BUG
作为安全管理者和审计人员,你需要对由操作系统产生的漏洞和可以利用的软件做到心中有数。早先版本的Microsoft IIS允许用户在地址栏中运行命令,这造成了IIS主要的安全问题。其实,最好的修补安全漏洞的方法是升级相关的软件。为了做到这些,你必须广泛地阅读和与其他从事安全工作的人进行交流,这样,你才能跟上最新的发展。这些工作会帮助你了解更多的操作系统上的特定问题。
虽然大多数的厂商都为其产品的问题发布了修补方法,但你必须充分理解补上了哪些漏洞。如果操作系统或程序很复杂,这些修补可能在补上旧问题的同时又开启了新的漏洞。因此,你需要在实施升级前进行测试。这些测试工作包括在隔离的网段中验证它是否符合你的需求。当然也需要参照值得信赖的网络刊物和专家的观点。
审计Trap Door和Root Kit
Root kit是用木马替代合法程序。Trap Door是系统上的bug,当执行合法程序时却产生了非预期的结果。如老版本的UNIX sendmail,在执行debug命令时允许用户以root权限执行脚本代码,一个收到严格权限控制的用户可以很轻易的添加用户账户。
虽然root kit通常出现在UNIX系统中,但攻击者也可以通过看起来合法的程序在Windows NT中置入后门。象NetBus,BackOrifice和Masters of Paradise等后门程序可以使攻击者渗透并控制系统。木马可以由这些程序产生。如果攻击者够狡猾,他可以使这些木马程序避开一些病毒检测程序,当然用最新升级的病毒检测程序还是可以发现它们的踪迹。在对系统进行审计时,你可以通过校验分析和扫描开放端口的方式来检测是否存在root kit等问题。
审计和后门程序
通常,在服务器上运行的操作系统和程序都存在代码上的漏洞。例如,最近的商业Web浏览器就发现了许多安全问题。攻击者通常知道这些漏洞并加以利用。就象你已经知道的RedButton,它利用了Windows NT的漏洞使攻击者可以得知缺省的管理员账号,即使账号的名称已经更改。后门(back door)也指在操作系统或程序中未记录的入口。程序设计人员为了便于快速进行产品支持有意在系统或程序中留下入口。不同于bug,这种后门是由设计者有意留下的。例如,像Quake和Doom这样的程序含有后门入口允许未授权的用户进入游戏安装的系统。虽然看来任何系统管理员都不会允许类似的程序安装在网络服务器上,但这种情况还是时有发生。
从后门程序的危害性,我们可以得出结论,在没有首先阅读资料和向值得信赖的同事咨询之前不要相信任何新的服务或程序。在你进行审计时,请花费一些时间仔细记录任何你不了解它的由来和历史的程序。
审计拒绝服务攻击
Windows NT 易遭受拒绝服务攻击,主要是由于这种操作系统比较流行并且没有受到严格的检验。针对NT服务的攻击如此频繁的原因可以归结为:发展势头迅猛但存在许多漏洞。在审计Windows NT网络时,一定要花时间来验证系统能否经受这种攻击的考验。打补丁是一种解决方法。当然,如果能将服务器置于防火墙的保护之下或应用入侵监测系统的话就更好了。通常很容易入侵UNIX操作系统,主要因为它被设计来供那些技术精湛而且心理健康的人使用。在审计UNIX系统时,要注意Finger服务,它特别容易造成缓冲区溢出。
缓冲区溢出
缓冲区溢出是指在程序重写内存块时出现的问题。所有程序都需要内存空间和缓冲区来运行。如果有正确的权限,操作系统可以为程序分配空间。C和C++等编程语言容易造成缓冲区溢出,主要因为它们不先检查是否有存在的内存块就直接调用系统内存。一个低质量的程序会不经检查就重写被其它程序占用的内存,而造成程序或整个系统死掉,而留下的shell有较高的权限,易被黑客利用运行任意代码。
据统计,缓冲区溢出是当前最紧迫的安全问题。要获得关于缓冲区溢出的更多信息,请访问Http://www-4.ibm.com/software/developer/library/overflows/index.heml
Telnet的拒绝服务攻击
Windows中的Telnet一直以来都是网络管理员们最喜爱的网络实用工具之一,但是一个新的漏洞表明,在Windows2000中Telnet在守护其进程时,在已经被初始化的会话还未被复位的情况下很容易受到一种普通的拒绝服务攻击。Telnet连接后,在初始化的对话还未被复位的情况下,在一定的时间间隔之后,此时如果连接用户还没有提供登录的用户名及密码,Telnet的对话将会超时。直到用户输入一个字符之后连接才会被复位。如果恶意用户连接到Windows2000的Telnet守护进程中,并且对该连接不进行复位的话,他就可以有效地拒绝其他的任何用户连接该Telnet服务器,主要是因为此时Telnet的客户连接数的最大值是1。在此期间任何其他试图连接该Telnet服务器的用户都将会收到如下错误信息:
Microsoft Windows Workstation allows only 1 Telnet Client LicenseServer has closed connection
察看“列出当前用户”选项时并不会显示超时的会话,因为该会话还没有成功地通过认证。
Windows NT的TCP port 3389存在漏洞
Windows NT Server 4.0 终端服务器版本所作的 DoS 攻击。这个安全性弱点让远端使用者可以迅速的耗尽 Windows NT Terminal Server 上所有可用的内存,造成主机上所有登陆者断线,并且无法再度登入。
说明:
1. Windows NT Server 4.0 终端服务器版本在 TCP port 3389 监听终端连接 (terminal connection),一旦某个 TCP 连接连上这个端口, 终端服务器会开始分配系统资源,以处理新的客户端连接,并作连接的认证工作。
2. 此处的漏洞在于:在认证工作完成前,系统需要拨出相当多的资源去处理新的连 接,而系统并未针对分配出去的资源作节制。因此远端的攻击者可以利用建立大 量 TCP 连接到 port 3389 的方法,造成系统存储体配置达到饱和。
3. 此时服务器上所有使用者连接都会处于超时状态,而无法继续连接到服务器上,远端攻击者仍能利用一个仅耗用低频宽的程式,做出持续性的攻击,让此 服务器处於最多记忆体被耗用的状态,来避免新的连接继续产生。
4. 在国外的测试报告中指出,长期持续不断针对此项弱点的攻击,甚至可以导致服务器持续性当机,除非重新开机,服务器将无法再允许新连接的完成。
解决方案:
1. 以下是修正程序的网址:
ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/NT40tse/hotfixes postSP4/Flood-fix/
[注意]:因为行数限制,上面网址请合并为一行。
2. 更详细资料请参考 Microsoft 网站的网址:
http://www.microsoft.com/security/bulletins/ms99-028.asp.
防范拒绝服务攻击
你可以通过以下方法来减小拒绝服务攻击的危害:
· 加强操作系统的补丁等级。
· 如果有雇员建立特定的程序,请特别留意代码的产生过程。
· 只使用稳定版本的服务和程序。
审计非法服务,特洛伊木马和蠕虫
非法服务开启一个秘密的端口,提供未经许可的服务,常见的非法服务包括:
· NetBus
· BackOrifice 和 BackOrifice 2000
· Girlfriend
· 冰河2.X
· 秘密的建立共享的程序
许多程序将不同的非法服务联合起来。例如,BackOrifice2000允许你将HTTP服务配置在任意端口。你可以通过扫描开放端口来审计这类服务,确保你了解为什么这些端口是开放的。如果你不知道这些端口的用途,用包嗅探器和其它程序来了解它的用途。
技术提示:不要混淆非法服务和木马。木马程序通常包含非法服务,而且,木马程序还可以包含击键记录程序,蠕虫或病毒。
特洛伊木马
特洛伊木马是在执行看似正常的程序时还同时运行了未被察觉的有破坏性的程序。木马通常能够将重要的信息传送给攻击者。攻击者可以把任意数量的程序植入木马。例如,他们在一个合法的程序中安放root kit或控制程序。还有一些通常的策略是使用程序来捕获密码和口令的hash值。类似的程序可以通过E-mail把信息发送到任何地方。
审计木马
扫描开放端口是审计木马攻击的途径之一。如果你无法说明一个开放端口用途,你也许就检测到一个问题。所以,尽量在你的系统上只安装有限的软件包,同时跟踪这些程序和服务的漏洞。许多TCP/IP程序动态地使用端口,因此,你不应将所有未知的端口都视为安全漏洞。在建立好网络基线后,你便可以确定哪些端口可能存在问题了。
蠕虫
Melissa病毒向我们展示了TCP/IP网络是如何容易遭受蠕虫攻击的。在你审计系统时,通常需要配置防火墙来排除特殊的活动。防火墙规则的设置超出了本术的范围。但是,作为审计人员,你应当对建议在防火墙上过滤那些从不信任的网络来的数据包和端口有所准备。
蠕虫靠特定的软件传播。例如,在2000年三月发现的Win32/Melting.worm蠕虫只能攻击运行Microsoft Outlook程序的Windows操作系统。这种蠕虫可以自行传播,瘫痪任何种类的Windows系统而且使它持续地运行不稳定。
结合所有攻击定制审计策略
攻击者有两个共同的特点。首先,他们将好几种不同的方法和策略集中到一次攻击中。其次,他们在一次攻击中利用好几种系统。综合应用攻击策略可以增强攻击的成功率。同时利用好几种系统使他们更不容易被捕获。
例如,在实施IP欺骗时,攻击者通常会先实施拒绝服务攻击以确保被攻击主机不会建立任何连接。大多数使用Man-in-the-middle的攻击者会先捕获SMB的密码,再使用L0phtCrack这样的程序进行暴力破解攻击。
渗透策略
你已经了解到那些网络设备和服务是通常遭受攻击的目标和黑客活动的攻击特征。现在,请参考下列的一些场景。它们将有助于你在审计过程中关注那些设备和服务。请记住,将这些攻击策略结合起来的攻击是最容易成功的。
物理接触
如果攻击者能够物理接触操作系统,他们便可以通过安装和执行程序来使验证机制无效。例如,攻击者可以重启系统,利用其它启动盘控制系统。由于一种文件系统可以被另一种所破坏,所以你可以使用启动盘获得有价值的信息,例如有管理权限的账号。
物理攻击的简单例子包括通过重新启动系统来破坏Windows95或98的屏幕锁定功能。更简单的物理攻击是该系统根本就没有进行屏幕锁定。
操作系统策略
近来,美国白宫的Web站点(http://www.whitehouse.gov)被一个缺乏经验的攻击者黑掉。攻击者侦查出该Web服务器(www1.whitehouse.gov)运行的操作系统是Solaris 7。虽然Solaris 7被成为艺术级的操作系统,但管理员并没有改变系统的缺省设置。虽然该站点的管理员设置了tripwire,但攻击者还是使用phf/ufsrestore命令访问了Web服务器。
较弱的密码策略
上面白宫网站被黑的例子可能是由于该系统管理员使用FTP来升级服务器。虽然使用FTP来更新网站并没有错,但大多数FTP会话使用明文传输密码。很明显,该系统管理员并没有意识到这种安全隐患。又由于大多数系统管理员在不同的服务上使用相同的密码,这使攻击者能够获得系统的访问权。更基本的,你可以保证/etc/passwd文件的安全。
NetBIOS Authentication Tool(NAT)
当攻击者以WindowsNT为目标时,他们通常会使用NetBIOS Authentication Tool(NAT)来测试弱的口令。这个程序可以实施字典攻击。当然它也有命令行界面,这种界面的攻击痕迹很小。而且命令行界面的程序也很好安装和使用。在使用NAT时,你必须指定三个文本文件和IP地址的范围。当然,你也可以指定一个地址。NAT使用两个文本文件来实施攻击而第三个来存储攻击结果。第一个文本文件包含一个用户列表,第二个文件中是你输入的猜测密码。
当使用命令行版本时,语法格式为:
nat –u username.txt –p passwordlist.txt –o outputfile.txt
即使服务器设置了密码的过期策略和锁定,攻击者还是可以利用NAT反复尝试登录来骚扰管理员。通过简单地锁定所有已知的账号,攻击者会极大地影响服务器的访问,这也是一些系统管理员不强行锁定账号的原因。
较弱的系统策略
到此为止,你已经学习了一些外部攻击。然而,对于管理员来说最紧迫的是大多数公司都存在不好的安全策略。如果安全策略很弱或干脆没有安全策略,通常会导致弱的密码和系统策略。通常,公司并不采取简单的预防措施,比如需要非空的或有最小长度要求的密码。忽略这些限制会给攻击者留下很大的活动空间。
审计文件系统漏洞
不论你的操作系统采取何种文件系统(FAT,NTFS或NFS),每种系统都有它的缺陷。例如,缺省情况下NTFS在文件夹和共享创建之初everyone组可完全控制。由于它是操作系统的组成部分(Windows NT),因此也成为许多攻击的目标。NFS文件系统可以共享被远程系统挂接,因此这也是攻击者入侵系统的途径之一。
IP欺骗和劫持:实例
IP欺骗是使验证无效的攻击手段之一,也是如何组合攻击策略攻击网络的典型实例。IP欺骗利用了Internet开放式的网络设计和传统的建立在UNIX操作系统之间信任关系。主要的问题是使用TCP/IP协议的主机假设所有从合法IP地址发来的数据包都是有效的。攻击者可以利用这一缺陷,通过程序来发送虚假的IP包,从而建立TCP连接,攻击者可以使一个系统看起来象另一个系统。
许多UNIX操作系统通过rhosts和rlogin在非信任的网络上(如Internet)建立信任的连接。这种传统的技术是流行的管理工具并减轻了管理负担。通常,这种系统由于把UNIX的验证机制和IP地址使用相结合从而提供了适当的安全。然而,这种验证机制是如此的独立于IP地址不会被伪造的假设,以至于很容易被击破。
Non-blind spoofing 和Blind spoofing
Non-blind spoofing是指攻击者在同一物理网段上操纵连接。Blind spoofing是指攻击者在不同的物理网段操纵连接。后者在实施上更困难,但也时常发生。
进行IP欺骗的攻击者需要一些程序,包括:
· 一个包嗅探器
· 一个能够同时终止TCP连接、产生另一个TCP连接、进行IP 伪装的程序
IP欺骗涉及了三台主机。像先前分析的那样,使用验证的服务器必须信任和它建立连接的主机。如果缺乏天生的安全特性,欺骗是非常容易的。
思考下列的场景,有三台主机分别是A,B和C。A使用TCP SYN连接与合法用户B初始一个连接。但是B并没有真正参与到这次连接中,因为C已经对B实施了拒绝服务攻击。所以,虽然A认为是在与B对话,但实际上是与C对话。IP欺骗实际上组合了几种攻击手法包括对系统实施了拒绝服务攻击,还包括利用验证技术。
作为审计人员,你不应该说服管理员终止这种信任关系,相反,你应当建议使用防火墙规则来检测有问题的包。
TCP/IP序列号生成方法
TCP的Initial Sequence Number(ISN)的预测
(图1)
正常的TCP连接基于一个三次握手(3-way handshake),一个客户端(Client)向服务器(Server)发送一个初始化序列号ISNc, 随后,服务器相应这个客户端ACK(ISNc),并且发送自己的初始化序列号ISNs,接着,客户端响应这个ISNs(如下图),三次握手完成。
C ---〉S: (ISNc)
S ---〉C: ACK(ISNc)+ ISNs
C ---〉S: ACK(ISNs)
C ---〉S: data
and / or
S ---〉C: data
下面,我以Windows2000 Advanced Server为例,来说一下两台主机是如何进行三次握手。
(图2)
(图3)
我们可以看到:
1) Smartboy首先发送一个seq:32468329的包给服务器202.116.128.6。
2) 然后, 202.116.128.6响应主机Smartboy, 它送给Smartboy自己的
seq:3333416325 而且响应Smartboy的ack:3240689240。
3) Smartboy再响应服务器202.116.128.6, seq:3240689240, ack:3333416326。
三次握手完毕,两台几建立起连接。
可以看出,在三次握手协议中,Clinet一定要监听服务器发送过来的ISNs, TCP使用的sequence number是一个32位的计数器,从0-4294967295。TCP为每一个连接选择一个初始序号ISN,为了防止因为延迟、重传等扰乱三次握手,ISN不能随便选取,不同系统有不同算法。理解TCP如何分配ISN以及ISN随时间变化的规律,对于成功地进行IP欺骗攻击很重要。
在Unix系统里,基于远程过程调用RPC的命令,比如rlogin、rcp、rsh等等,根据/etc/hosts.equiv以及$HOME/.rhosts文件进行安全校验,其实质是仅仅根据源IP地址进行用户身份确认,以便允许或拒绝用户RPC。这就给与了那些攻击者进行IP地址欺骗的机会。
让我们看X是如何冒充T来欺骗S,从而建立一个非法连接 :
X---->S: SYN(ISNx ) , SRC = T
S---->T: SYN(ISNs ) , ACK(ISNT) (*)
X---->S: ACK(ISNs+1 ) , SRC = T (**)
X---->S: ACK(ISNs +1) , SRC = T, 攻击命令(可能是一些特权命令)
但是,T必须要在第(**)中给出ISNs, 问题是ISNs在第(*)步中发给了T(X当然很难截取到),幸运的是,TCP协议有一个约定: ISN变量每秒增加250,000次,这个增加值在许多版本比较旧的操作系统中都是一个常量,在FreeBSD4.3中是125000次每秒,这就给X一个可乘之机。
看一下X是如何猜出ISNs :
a、首先, X发送一个SYN包来获取服务器现在的ISNs
X ---〉S: (ISNx)
S ---〉X: ACK(ISNx)+ ISNs# (1)
b、紧接着,X冒充T向服务器发送SYN包
X ---〉S: SYN(ISNx ) , SRC = T (2)
c、于是,服务器发出一个响应包给T(这个包X是收不到的)
S ---〉T: SYN(ISNs$) , ACK(ISNT ) (3)
d、X计算ISNs$:
ISNs$ = ISNs# + RTT×Increment of ISN (4)
其中,RTT(Round Trip Time),是一个包往返X和S所用的时间,可以通过Ping 来得到。
(图4)
上图显示了round trip times (RTT) 大概是0。
Increment of ISN是协议栈的初始序列号每秒钟增加的值,以Unix为例,当没有外部连接发生时,服务器的ISN每秒增加128,000,有连接的时候,服务器的ISN每秒增加64,000。
e、于是,
X ---> S : ACK(ISNs$) (冒充可信主机成功了)
X ---> S : 恶意的命令或窃取机密消息的命令
在评价以下的解决方案时有几点要注意:
1.该解决方案是否很好地满足TCP的稳定性和可操作性的要求?
2.该解决方案是否容易实现?
3.该解决方案对性能的影响如何?
4.该解决方案是否经得起时间的考验?
以下的几种方案各有各的优点和缺点,它们都是基于增强ISN生成器的目标提出的。
配置和使用密码安全协议
TCP的初始序列号并没有提供防范连接攻击的相应措施。TCP的头部缺少加密选项用于强加密认证,于是,一种叫做IPSec的密码安全协议的技术提出了。IPSec提供了一种加密技术(End to end cryptographic),使系统能验证一个包是否属于一个特定的流。这种加密技术是在网络层实现的。其它的在传输层实现的解决方案(如SSL/TLS和SSH1/SSH2), 只能防止一个无关的包插入一个会话中,但对连接重置(拒绝服务)却无能为力,原因是因为连接处理是发生在更低的层。IPSec能够同时应付着两种攻击(包攻击和连接攻击)。它直接集成在网络层的安全模型里面。
上面的解决方案并不需要对TCP协议做任何得修改,RFC2385(“基于TCP MD5签名选项的BGP会话保护)和其他的技术提供了增加TCP头部的密码保护,但是,却带来了收到拒绝服务攻击和互操作性和性能方面的潜在威胁。使用加密安全协议有几个优于其它方案的地方。TCP头部加密防止了Hijacking和包扰乱等攻击行为,而TCP层仍然能够提供返回一个简单增加ISN的机制,使方案提供了最大程度的可靠性。但实现IPSec非常复杂,而且它需要客户机支持,考虑到可用性,许多系统都选择使用RFC 1948。
使用RFC1948
在RFC1948中,Bellovin提出了通过使用4-tuples的HASH单向加密函数,能够使远程攻击者无从下手(但不能阻止同一网段的攻击者通过监听网络上的数据来判断ISN)。
Newsham 在他的论文 [ref_newsham]中提到:
RFC 1948 [ref1]提出了一种不容易攻击(通过猜测)的TCP ISN的生成方法。此方法通过连接标识符来区分序列号空间。每一个连接标识符由本地地址,本地端口,远程地址,远程端口来组成,并由一个函数计算标识符分的序列号地址空间偏移值(唯一)。此函数不能被攻击者获得,否则,攻击者可以通过计算获得ISN。于是,ISN就在这个偏移值上增加。ISN的值以这种方式产生能够抵受上面提到的对ISN的猜测攻击。
一旦全局ISN空间由上述方法来生成,所有的对TCP ISN的远程攻击都变得不合实际。但是,需要指出的,即使我们依照RFC 1948来实现ISN的生成器,攻击者仍然可以通过特定的条件来获得ISN(这一点在后面叙述).
另外,用加密的强哈希算法(MD5)来实现ISN的生成器会导致TCP的建立时间延长。所以,有些生成器(如Linux kernel )选择用减少了轮数的MD4函数来提供足够好的安全性同时又把性能下降变得最低。削弱哈希函数的一个地方是每几分钟就需要对生成器做一次re-key 的处理,经过了一次re-key的处理后,安全性提高了,但是,RFC793提到的可靠性却变成另一个问题。
我们已经知道,严格符合RFC1948的ISN生成方法有一个潜在的危机:
一个攻击者如果以前合法拥有过一个IP地址,他通过对ISN进行大量的采样,可以估计到随后的ISN的变化规律。在以后,尽管这个IP地址已经不属于此攻击者,但他仍然可以通过猜测ISN来进行IP欺骗。
以下,我们可以看到RFC 1948的弱点:
ISN = M + F(sip, sport, dip, dport, )
其中
ISN 32位的初始序列号
M 单调增加的计数器
F 单向散列哈希函数 (例如 MD4 or MD5)
sip 源IP地址
sport 源端口
dip 目的IP地址
dport 目的端口
哈希函数可选部分,使远程攻击者更难猜到ISN.
ISN自身的值是按照一个常数值稳定增加的,所以F()需要保持相对的稳定性。而根据Bellovin 所提出的,是一个系统特定的值(例如机器的启动时间,密码,初始随机数等),这些值并不 会经常变。
但是,如果Hash函数在实现上存在漏洞(我们无法保证一个绝对安全的Hash函数,况且,它的实现又与操作系统密切相关),攻击者就可以通过大量的采样,来分析,其中,源IP地址,源端口,目的IP地址,目的端口都是不变的,这减少了攻击者分析的难度。
Linux TCP的ISN生成器避免了这一点。它每5分钟计算一次值,把泄漏的风险降到了最低。
有一个办法可以做的更好:
取M = M + R(t)
ISN = M + F(sip, sport, dip, dport, )
其中
R(t) 是一个关于时间的随机函数
很有必要这样做,因为它使攻击者猜测ISN的难度更大了(弱点在理论上还是存在的)。
其它一些方法
构造TCP ISN生成器的一些更直接的方法是:简单地选取一些随机数作为ISN。这就是给定一个32位的空间,指定 ISN = R(t)。(假设R()是完全的非伪随机数生成函数)
固然,对于完全随机的ISN值,攻击者猜测到的可能性是1/232是,随之带来的一个问题是ISN空间里面的值的互相重复。这违反了许多RFC(RFC 793, RFC 1185, RFC 1323, RFC1948等)的假设----ISN单调增加。这将对TCP协议的稳定性和可靠性带来不可预计的问题。
其它一些由Niels Provos(来自OpenBSD 组织)结合完全随机方法和RFC 1948解决方案:
ISN = ((PRNG(t)) << 16) + R(t) 32位
其中
PRNG(t) :一组随机指定的连续的16位数字 0x00000000 -- 0xffff0000
R(t) :16位随机数生成器(它的高位msb设成0)0x00000000 -- 0x0000ffff
上面的公式被用于设计OpenBsd的ISN生成器,相关的源代码可以从下面的网址获得
http://www.openbsd.org/cgi-bin/cvsweb/src/sys/netinet/tcp_subr.c
Provos的实现方法有效地生成了一组在给定时间内的不会重复的ISN的值,每两个ISN值都至少相差32K,这不但避免了随机方法造成的ISN的值的冲突,而且避免了因为哈希函数计算带来的性能上的下降,但是,它太依赖于系统时钟,一旦系统时钟状态给攻击者知道了,就存在着系统的全局ISN状态泄密的危机。
TCP ISN生成器的构造方法的安全性评估
ISN与PRNGs(伪随机数生成器)
我们很难用一台计算机去生成一些不可预测的数字,因为,计算机被设计成一种以重复和准确的方式去执行一套指令的机器。所以,每个固定的算法都可以在其他机器上生成同样的结果。如果能够推断远程主机的内部状态,攻击者就可以预测它的输出;即使不知道远程主机的PNRG函数,但因为算法最终会使ISN回绕,按一定的规律重复生成以前的ISN,所以,攻击者仍然可以推断ISN。幸运的是,目前条件下,ISN的重复可以延长到几个月甚至几年。但是,仍然有部分PRNG生成器在产生500个元素后就开始回绕。解决伪随机数的方法是引入外部随机源,击键延时,I/O中断,或者其它对攻击者来说不可预知的参数。把这种方法和一个合理的HASH函数结合起来,就可以产生出32位的不可预知的TCP ISN的值,同时又隐蔽了主机的PNRG的内部状态。不幸的是,很少的TCP ISN产生器是按这种思路去设计的,但即使是这样设计的产生器,也会有很多的实现上的漏洞使这个产生器产生的ISN具有可猜测性。
RFC1948的建议提供了一种比较完善的方法,但是,对攻击者来说,ISN仍然存在着可分析性和猜测性。其中,PRNG的实现是个很关键的地方。
Spoofing 集合
需要知道一点是,如果我们有足够的能力能够同时可以发出232个包,每个包由不同的ISN值,那么,猜中ISN的可能性是100%。但是,无论从带宽或计算机的速度来说都是不实际的。但是,我们仍然可以发大量的包去增加命中的几率,我们把这个发出的攻击包的集合称为Spoofing集合。通常,从计算机速度和网络数据上传速率两方面来考虑,含5000个包的Spoofing的集合对众多的网络用户是没有问题的,5000-60000个包的Spoofing集合对宽带网的用户也是不成问题的,大于60000个包的Spoofing集合则超出一般攻击者的能力。网络的速度和计算机性能的不断增加会提高那种使用穷尽攻击方法猜测ISN的成功率。从攻击者的立场,当然希望能够通过定制一个尽可能小的Spoofing集合,而命中的几率又尽可能高。我们假定我们攻击前先收集50000个包作为ISN值的采样,然后,我们把这些ISN用作对将来的ISN的值猜测的依据。
一种称为“delay coordinates”的分析方法
在动态系统和非线性系统中,经常使用一种叫做“delay coordinates”的分析法,这种方法使我们可以通过对以前的数据的采样分析来推想以后的数据。
我们试图以建立一个三维空间(x,y,z)来观察ISN值(seq[t])的变化,其中t取0,1,2, ……
(图6)
方程组(E1)
现在,对采样了的50000个ISN序列seq[t] 按照上面的三个方程式来构建空间模型A。这样,就可以通过A的图像特征来分析这个PNRG生成的ISN值的规律。A呈现的空间模型的3D特性越强,它的可分析性就越好。
接着,我们根据这个模型,去分析下一个ISN值seq[t],为此,我们用一个集合K(5000个)去猜测seq[t]。
如果我们知道seq[t-1],要求seq[t],那么,可以通过在这个三维空间中找出一个有良好特性的节点P(x,y,z),将P.x+seq[t-1],我们就可以得到seq[t]。现在,我们将注意力放到怎样在这个三维空间中选择一些点来构成Spoofing集合,也就是怎样通过seq[t-1],seq[t-2],sea[t-3]来推知seq[t]。
由于seq[t-1],seq[t-2],seq[t-3]都可以很容易地在远程主机上探测到,于是,P.y和P.z可以通过以下的公式求出
(图7)
而对于P.x=seq[t]-seq[t-1], 由于seq[t-1]已知,所以,我们可以把它当作是空间的一条直线。如果,在对以前的ISN的采样,通过上面提到的构成的空间模型A呈现某种很强的特征,我们就可以大胆地假设,seq[t]在直线与A的交点上,或者在交点的附近。这样,seq[t]就这样确定了,于是,seq[t+1],seq[t+2]……,我们都可以推断出来。
(图8)
于是,我们大致将构造Spoofing集合分成3个步骤:
先选取L与A交点之间的所有点。如果,L与A没有交点,我们则选取离L最近的A的部分点。
假设现在 seq[t-1]=25
seq[t-2]=50
seq[t-3]=88
于是,我们可以计算出
y = seq[t-1] - seq[t-2]=25
z = seq[t-2] - seq[t-3]=33
而我们在集合A中找不到满足y=25,z=33这个点,但是,我们找到y=24,z=34和y=27,z=35这两个点,所以,我们要把它们加入Spoofing集合。
我们按照上面的方法,把在A附近(半径<=R1的空间范围内)点集M找出来,然后,我们根据这些点的相应的x值去推导相应的seq[t](按照一定的算法,后面会提到),于是,我们就得到很多的seq[t]。
根据点集M(j),我们在一定的变化浮动范围U里(-R2<=U<=+R2)处理其x值,得出以下的集合K:
M(j).x+1 M(j).x-1 M(j).x+2 M(j).x-2 M(j).x+3 M(j).x-3 …… M(j).x+R2 M(j)-R2
接着我们确定R1和R2的值
R1值的选取的原则:使M不为空集,一般为1-500个。
R2值的选取的原则:使K的个数为5000。
对TCP ISN的PRNG分析的总体流程:
(图9)
相关系数的意义:
R1 radius: 影响搜索速度。
R2 radius: 影响猜测ISN的成功率, R2越大,成功率越高,但代价越大。
Average error: 反映了在3.3.2中找出的点集的平均距离。一个过分大的平均距离是不需要的。可以通过是否有足够的正确的猜测值来计算Average error。
delay coordinates分析法的意义
站在攻击者的立场,他是千方百计地想缩小搜索空间,他希望先搜索一些最可能的值,然后再去搜索其它可能性没那么大的值。通过delay coordinates,他可以看去观察ISN数列的特征,如果,按照上面的方法构造的空间模型A呈现很明显的空间轮廓,如一个正方体,一个圆柱体,或者一个很小的区域,那么ISN很可能就是这个空间模型A中的一点,搜索空间就会可以从一个巨大的三维空间缩小到一个模型A。看一下一个设计得很好的PRNG(输出为32位):...2179423068, 2635919226, 2992875947, 3492493181, 2448506773, 2252539982, 2067122333, 1029730040, 335648555, 427819739...
(图10)
RFC 1948要求我们用31位的输出,但是,32位的搜索空间比31位的要大一倍,所以,在后面的PRNG的设计中,我采用了32位的输出。
下面,我们来看一下各种典型的空间模型以及对它们的评价。
(图11)
从空间特性可以看出,某些区域的值互相重叠,某些地方的空间形状很明显,呈针状型,这种PRNG设计得不好,重叠特性很强,攻击者可以从左图分析推断可能性比较大的重叠区域去搜索,这样可以大大减少搜索的难度。
(图12)
这种PRNG参杂了一些可以预测的随机种子,导致空间模型呈现很明显的片状。攻击者可以根据前面的一些ISN来推测后面的ISN。
(图13)
这种PRNG产生的随机数序列之间的差值非常小,但是,它的分布特性非常好。所以,虽然,它并没有扩展到整个空间,但是,它比上面几种模型要好的多。攻击者攻击的成功率要少得多。
(图14)
这个PRNG是以计算机时钟为随机源的。它的ISN值都分布在三个很明显的面上。三个面都在模型的中间有一个汇聚点。这样的PRNG设计的非常差,所以,我们在设计PRNG的时候,不能只是以时钟作为随机源。
各种操作系统的TCP ISN生成器的安全性比较
Windows 95 和Windwos 98 SE
(图15)
Windows 95 的序列号产生算法非常的弱,但很难明白为什么Windows 98的算法更弱。我们看到R1为0,也就是说,A的空间特性太明显,以致M集只需要一个点就可以算出seq[t]。我们看到,Windows 98的R2小于Windows 95的R2,换言之,Windows 98的seq[t]的搜索代价更少。
Windows NT4 SP3,Windows SP6a和Windows 2000
(图16)
Windows NT4 SP3在ISN的PNRG算法也是非常弱的,成功率接近100%。Windows 2000和Windows NT4 SP6a的TCP 序列号有着相同的可猜测性。危险程度属于中到高的范围。虽然,我们在图上看不到很明显的3D结构化特征,但是,12%和15%对攻击者来说,已经是一个很满意的结果。
FreeBSD 4.2,OpenBSD 2.8和OpenBSD-current
(图17)
OpenBSD-current的PRNG 输出为31-bit,也就是说,△seq[t]的值域范围可以是231 –1,意味着,y,z值域也很大,这对使我们很难确定M集,经过我们的处理后,可以看到一个云状物(见上图),它的R1半径很大,而且分布均匀,不呈现任何的空间结构化特性,很难对它进行分析。
Linux 2.2
(图18)
Linux 2.2的TCP/IP序列号的可分析性也是很少,比起OpenBSD-current,它的PRNG的输出宽度只有24bit,但是,对抵御攻击已经足够了。Linux是按照RFC 1948规范的。它的HASH函数从实现来说,应该是没有什么的漏洞,而且,它应该是引入了外部随机源。
Solaris
Solaris的内核参数tcp_strong_iss有三个值,当tcp_strong_iss=0时,猜中序列号的成功率是100%;当tcp_strong_iss=1时,Solaris 7和Solaris 8一样,都能产生一些特性相对较好的序列号。
(图19)
tcp_strong_iss=2时,依据Sun Microsystem的说法,系统的产生的ISN值非常可靠,不可预测。通过观察采样值的低位值的变化,可以相信它的PRNG的设计采用了RFC 1948规范,正如Solaris的白皮书所提到的。
(图20)
但是,我们观察到,Solaris7(tcp_strong_iss=2)虽然使用了RFC 1948,但是,仍然相当的弱,究其原因,是因为Solaris没有使用外部随机源,而且也没有在一段时间之后重算。由一些Solaris系统动态分配IP地址的主机群要特别小心,因为Solaris在启动之后,一直都不会变(这一点与Linux不同),于是,攻击者在合法拥有某个IP地址的时候,他可以在TCP会话期间对序列号进行大量的采样,然后,当这个IP地址又动态地分配给其他人的时候,他就可以进行攻击(在Clinet-Server结构的网络系统中要尤为注意,因为,许多应用都是分配固定的端口进行通讯)。
获得信息
一旦攻击者获得root的权限,他将立即扫描服务器的存储信息。例如,在人力资源数据库中的文件,支付账目数据库和属于上层管理的终端用户系统。在进行这一阶段的控制活动时,攻击者在脑海中已经有明确的目标。这一阶段的信息获取比侦查阶段的更具有针对性,该信息只会导致重要的文件和信息的泄漏。这将允许攻击者控制系统。
攻击者获得信息的一种方法是操纵远程用户的Web浏览器。大多数的公司并没有考虑到从HTTP流量带来的威胁,然而,Web浏览器会带来很严重的安全问题。这种问题包括Cross-frame browsing bug和Windows spoofing以及Unicode等。浏览器容易发生缓冲区溢出的问题,允许攻击者对运行浏览器的主机实施拒绝服务攻击。一旦攻击者能够在局部使系统崩溃,他们便可以运行脚本程序来渗透和控制系统。
Cross-frame browsing bug允许怀有恶意的Web站点的制作者创建可以从用户计算机上获得信息的Web页面。这种情况出现在4.x和5.x版本的Netscape和Microsoft浏览器上,这种基于浏览器的问题只会发生在攻击者已经知道文件和目录的存储位置时。这种限制看起来不严重,但实际上并非如此。其实,任何攻击者都清楚地知道缺省情况下UNIX操作系统的重要文件存放在(\etc)目录下,Windows NT的文件在(\winnt)目录下,IIS在(\inetpub\wwwroot)目录下等等。
大多数的攻击者都知道操作系统存放文件的缺省位置。如果部门的管理者使用Windows98操作系统和Microsoft Word, Excel或Access,他很可能使用\deskto\My Documents目录。攻击者同样知道\windows\start\menu\programs\startup目录的重要性。攻击者可能不知道谁在使用操作系统或文件和目录的布局情况。通过猜测电子表格,数据库和字处理程序缺省存储文件的情况,攻击者可以轻易地获得信息。
虽然攻击者无法通过浏览器控制系统,但这是建立控制的第一步。利用Cross-frame browsing bug获得的信息要比从网络侦查和渗透阶段获得的信息更详细。通过阅读文件的内容,攻击者会从服务器上获得足够的信息,要想阻止这种攻击手段,系统管理员必须从根本上重新配置服务器。
审计UNIX文件系统
Root kit充斥在互联网上,很难察觉并清除它们。从本质上来说,root kit是一种木马。大多数的root kit用各种各样的侦查和记录密码的程序替代了合法的ls,su和ps程序。审计这类程序的最好方法是检查象ls, su和ps等命令在执行时是否正常。大多数替代root kit的程序运行异常,或者有不同的的文件大小。在审计UNIX系统时,要特别注意这些奇怪的现象。下表1列出了常见的UNIX文件的存放位置。
文件名
存放位置
/
根目录
/sbin
管理命令
/bin
用户命令;通常符号连接至/usr/bin
/usr
大部分操作系统
/usr/bin
大部分系统命令
/usr/local
本地安装的软件包
/usr/include
包含文件(用于软件开发)
/usr/src
源代码
/usr/local/src
本地安装的软件包的源代码
/usr/sbin
管理命令的另一个存放位置
/var
数据(日志文件,假脱机文件)
/vr/log
日志文件
/export
被共享的文件系统
/home
用户主目录
/opt
可选的软件
/tmp
临时文件
/proc
虚拟的文件系统,用来访问内核变量
审计Windows NT
下列出了在Windows NT中通常文件的存放位置
文件名
位置
\winnt
系统文件目录;包含regedit.exe和注册表日志
\winnt\system32
包含许多子目录,包括config(存放security.log,event.log和application.log文件)
\winnt\profiles
存放与所有用户相关的信息,包括管理配置文件
\winnt\system32\config
包含SAM和SAM.LOG文件,NT注册表还包含密码值
\inetpub
缺省情况下,包含IIS4.0的文件,包括\ftproot,\wwwroot
\program files
服务器上运行的大多数程序的安装目录
L0phtCrack工具
L0phtCrack被认为是对系统攻击和防御的有效工具。它对于进行目录攻击和暴力攻击十分有效。它对于破解没有使用像!@#¥%^&*()等特殊字符的密码非常迅速。L0phtCrack可以从http://www.l0pht.com上获得。
L0pht使用文字列表对密码进行字典攻击,如果字典攻击失败,它会继续使用暴力攻击。这种组合可以快速获得密码。L0pht可以在各种各样的情况下工作。你可以指定IP地址来攻击Windows NT系统。然而,这种方式需要首先登录到目标机器。L0pht还可以对SAM数据库文件进行攻击。管理员从\winnt\repair目录拷贝出SAM账号数据库。第三中方式是配置运行L0pht的计算机嗅探到密码。L0pht可以监听网络上传输的包含密码的会话包,然后对其进行字典攻击。这种方式使用L0pht需要在类似Windows NT这样的操作系统之上,并且你还需要物理地处于传输密码的两个操作系统之间。
John the Ripper和Crack是在基于UNIX的操作系统上常见的暴力破解密码的程序。这两个工具被用来设计从UNIX上获取密码。所有版本的UNIX操作系统都将用户账号数据库存放在/etc/passwd或/etc/shadow文件中。这些文件在所有UNIX系统中存放在相同的位置。为了使UNIX正常运行,每个用户都必须有读取该文件的权限。
John the Ripper和Crack是最常见的从shadow和passwd文件中获得密码的程序。这些工具将所有的密码组合与passwd或shadow文件中加密的结果进行比较。一旦发现有吻合的结果就说明找到了密码。
在你审计UNIX操作系统时,请注意类似的问题。虽然许多扫描程序,如NetRecon和ISS Internet Scanner可以模仿这种工具类型,许多安全专家还是使用像L0pht和John the Ripper来实施审计工作。
信息重定向
一旦攻击者控制了系统,他便可以进行程序和端口转向。端口转向成功后,他们可以操控连接并获得有价值的信息。例如,有些攻击者会禁止像FTP的服务,然后把FTP的端口指向另一台计算机。那台计算机会收到所有原来那台主机的连接和文件。
相似的攻击目标还包括重定向SMTP端口,它也允许攻击者获得重要的信息。例如,攻击者可以获得所有使用SMTP来传送E-mail账号的电子商务服务器的信息。即使这些传输被加密,攻击者还是可以获得这些传输的信息并用字典攻击这些信息。
通常,攻击者渗透你的操作系统的目的是通过它来渗透到网络上其它的操作系统。例如,NASA服务器是攻击者通常的攻击目标,不仅因为他们想要获取该服务器上的信息,更主要的是许多组织都和该服务器有信任的连接关系,比如Department of Defense。
因此,许多情况下,攻击者希望攻击其它的系统。为了防止类似的情况发生,美国政府要求那些直接连到政府部门的公司必须按照Rainbow Series的标准来实施管理。从1970年开始,该系列标准帮助系统确定谁可以安全的连接。这个系列中最长被使用的是Department of Defense Trusted Computer System Evaluation Criteria,该文件被成为Orange Book。例如,C2标准是由Orange Book衍生出来并被用来实施可以信任的安全等级。这个等级是C2管理服务(C2Config.exe)在Microsoft NT的服务补丁基础上提供的。
控制方法
新的控制方法层出不穷,原因有以下几个。首先是因为系统的升级不可避免的会开启新的安全漏洞,二是少数黑客极有天赋,他们不断开发出新的工具。大多数的UNIX操作系统都有C语言的编译器,攻击者可以建立和修改程序。这一部分讨论一些允许你控制系统的代表性程序。
系统缺省设置
缺省设置是指计算机软硬件“Out-of-the-box”的配置,便于厂商技术支持,也可能是因为缺乏时间或忽略了配置。攻击者利用这些缺省设置来完全控制系统。虽然改变系统的缺省设置非常容易,但许多管理员却忽视了这种改变。其实,改变缺省设置可以极大地增强操作系统的安全性。
合法及非法的服务,守护进程和可装载的模块
Windows NT运行服务,UNIX运行守护进程,Novell操作系统运行可装载的模块。这些守护进程可以被用来破坏操作系统的安全架构。例如,Windows NT的定时服务以完全控制的权限来执行。如果用户开启了定时服务,他就有可能运行其它的服务,(例如,域用户管理器),从而使用户更容易控制系统。