网络入侵检测与UDP包捕

获分析—缓冲区溢出攻击

                   

                           

 

 

 


摘要
自从计算机问世以来,安全问题就一直存在着,使用者也一直未给予足够的重视,结果大量连接到Internet上的计算机暴露在愈来愈频繁的攻击中。
随着信息技术日新月异的发展,人类正在进入以网络为主的信息时代,基于Internet开展的电子商务已逐渐成为人们进行商务活动的新模式。越来越多的人通过Internet进行商务活动,电子商务的发展前景十分诱人,但由于Internet的开放性决定网络系统的脆弱性,随之而来的是其安全问题变得越来越突出。

                            

 

 

 

 

 

  目录
  TCP/IP协议介绍
1.01   TCP/IP整体构架概述……………………………………………………2
1.02   TCP/TP中的协议…………………………………………………………3
1.03   IP地址的分配原理和路由选择…………………………………………8
1.04   TCO/IP的工作原理………………………………………………………10
  网络安全
2.01 网络安全概述……………………………………………………………13
2.02 网络安全的目标2.03 …………………………………………………………14
2.04 网络所面临的威胁………………………………………………………14
2.05 网络安全的解决方案……………………………………………………15
2.06 网络的攻击类型…………………………………………………………16
2.07 网络安全的防范建议……………………………………………………17
  入侵检测
3.01 什么是入侵检测及实现方法……………………………………………18
3.02 入侵检测的功能…………………………………………………………19
3.03 入侵行为的概念,3.04 分类和演化……………………………………………20
3.05 网络入侵的一般思路及方法…………………………………………………22
3.06 VC++实现一个简单的端口扫描器……………………………………………28
  网络监听与过滤技术
4.01 包捕获…………………………………………………………………………31
4.02 利用以太网络的广播特性进行监听…………………………………………31
4.03 包过滤与分解…………………………………………………………………32
4.04 过滤原理………………………………………………………………………32
4.05 包分解………………………………………………………………33
  网络编程基础
5.01 Client/Sever通讯流程………………………………………………………34
5.02 相关API介绍…………………………………………………………………37
  网络攻击—缓冲区溢出攻击
6.01 黑客攻击的手段………………………………………………………………48
6.02 缓冲区溢出的概念……………………………………………………………49

 

 

 

 

第 1 章 TCP/IP协议介绍
     TCP/IP(传输控制协议/ 网间协议)是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式以及传送方式。TCP/IP是个协议族,它包含了多种协议,本章将对其中的一些重要协议进行介绍。
1.01  TCP/IP整体构架概述
   TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:
应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
 
应用层   
传输层   
网际层   
网络接口层   
硬件层 
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。         


TCP/IP模型

1.02  TCP/IP中的协议
 这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。
1. IP
网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。
2. TCP
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。 面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

3.UDP
 UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。
UDP骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。
4.ICMP
internet控制消息协议ICMP是用于报告错误并代表IP对消息进行控制,ICMP与IP位于同一层于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。
   ICMP源抑制消息:当TCP/IP主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个ICMP源抑制消息。
   *ICMP数据包结构类型:
一个8位类型字段,表示ICMP数据包类型。
   代码:一个8位代码域,表示指定类型中的一个功能。如果一个类型中只有一种功能,代码域置为0。
  检验和:数据包中ICMP部分上的一个16位检验和。  指定类型的数据随每个ICMP类型变化的一个附加数据。
5.ARP
要在网络上通信,主机就必须知道对方主机的硬件地址(我们不是老遇到网卡的物理地址嘛)。地址解析就是将主机IP地址映射为硬件地址的过程。地址解析协议ARP用于获得在同一物理网络中的主机的硬件地址。
   *主机IP地址解析为硬件地址:
    (1)当一台主机要与别的主机通信时,初始化ARP请求。当该IP断定IP地址是本地时,源主机在ARP缓存中查找目标主机的硬件地址。
     (2)要是找不到映射的话,ARP建立一个请求,源主机IP地址和硬件地址会被包括在请求中,该请求通过广播,使所有本地主机均能接收并处理。  
     (3)本地网上的每个主机都收到广播并寻找相符的IP地址。
     (4)当目标主机断定请求中的IP地址与自己的相符时,直接发送一个ARP答复,将自己的硬件地址传给源主机。以源主机的IP地址和硬件地址更新它的ARP缓存。源主机收到回答后便建立起了通信。
      *解析远程IP地址
     不同网络中的主机互相通信,ARP广播的是源主机的缺省网关。目标IP地址是一个远程网络主机的话,ARP将广播一个路由器的地址。
     (1)通信请求初始化时,得知目标IP地址为远程地址。源主机在本地路由表中查找,若无,源主机认为是缺省网关的IP地址。在ARP缓存中查找符合该网关记录的IP地址(硬件地址)。
      (2)若没找到该网关的记录,ARP将广播请求网关地址而不是目标主机的地址。路由器用自己的硬件地址响应源主机的ARP请求。源主机则将数据包送到路由器以传送到目标主机的网络,最终达到目标主机。 (3)在路由器上,由IP决定目标IP地址是本地还是远程。如果是本地,路由器用ARP(缓存或广播)获得硬件地址。如果是远程,路由器在其路由表中查找该网关,然后运用ARP获得此网关的硬件地址。数据包被直接发送到下一个目标主机。
     (4)目标主机收到请求后,形成ICMP响应。因源主机在远程网上,将在本地路由表中查找源主机网的网关。找到网关后,ARP即获取它的硬件地址。
      (5)如果此网关的硬件地址不在ARP缓存中,通过ARP广播获得。一旦它获得硬件地址,ICMP响应就送到路由器上,然后传到源主机。
      *ARP缓存
      为减少广播量,ARP在缓存中保存地址映射以备用。ARP缓存保存有动态项和静态项。动态项是自动添加和删除的,静态项则保留在CACHE中直到计算机重新启动。
       ARP缓存总是为本地子网保留硬件广播地址(0xffffffffffffh)作为一个永久项。此项使主机能够接受ARP广播。当查看缓存时,该项不会显示。每条ARP缓存记录的生命周期为10分钟,2分钟内未用则删除。缓存容量满时,删除最老的记录。
<加入静态(永久)记录通过添加静态ARP项可减少ARP请求访问主机的次数。
    * ARP包的结构
     ARP结构的字段如下:
硬件类型         使用的硬件(网络访问层)类型。
协议类型        解析过程中的协议使用以太类型的值。
硬件地址长度        硬件地址的字节长度,对于以太网和令牌环来说,其长度为6字节。
协议地址长度       协议地址字节的长度,IP的长度是4字节。   
操作号         指定当前执行操作的字段。
发送者的硬件地址       发送者的硬件地址。  
发送者的协议地址     发送者的协议地址。
目的站硬件地址     目标者的硬件地址。  目的站协议地址   目标者的协议地址
6. TCP和UDP的端口结构
 TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。
两统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:
IP地址---发送包的IP地址
目的IP地址---接收包的IP地址。
源端口---源系统上的连接的端口。
目的端口---目的系统上的连接的端口。
端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯

1.03  IP地址的分配原理和路由的实现
1、IP地址 
  IP地址标识着网络中一个系统的位置。我们知道每个IP地址都是由两部分组成的:网络号和主机号。其中网络号标识一个物理的网络,同一个网络上所有主机需要同一个网络号,该号在互联网中是唯一的;而主机号确定网络中的一个工作端、服务器、路由器其它T CP/IP主机。对于同一个网络号来说,主机号是唯一的。每个TCP/IP主机由一个逻辑IP地址确定。 

网络号和主机号 
  IP地址有两种表示形式:二进制表示(1和0太多了就搞不清)和点分十进制表示。每个IP地址的长度为4字节,由四个8位域组成,我们通常称之为八位体。八位体由句点. 分开,表示为一个0-255之间的十进制数。一个IP地址的4个域分别标明了网络号和主机号。 

2、地址类型 
   为适应不同大小的网络,internet定义了3种IP地址类型。可以通过IP地址的前八位来确定地址的类型: 
类型 IP形式 网络号 主机号 
 A类 w.x.y.z w x.y.z 
 B类 w.x.y.z w.x y.z 
 C类 w.x.y.z w.x.y z 
我们来看一下这3类地址: 
  A类地址:可以拥有很大数量的主机,最高位为0,紧跟的7位表示网络号,余24位表示 主机号,总共允许有126个网络。 
  B类地址:被分配到中等规模和大规模的网络中,最高两位总被置于二进制的10,允许16384个网络。
  C类地址:被用于局域网。高三位被置为二进制的110,允许大约200万个网络。 
3、地址分配指南 
在分配网络号和主机号时应遵守以下几条准则: 
 (1)网络号不能为127。大家知道该标识号被保留作回路及诊断功能,还记得平时ping 
127.0.0.1? 
 (2)不能将网络号和主机号的各位均置1。如果每一位都是1的话,该地址会被解释为网内 广播而不是一个主机号。(TCP/IP是一个可广播的协议嘛) 
 (3)相应于上面一条,各位均不能置0,否则该地址被解释为“就是本网络”。 
 (4)对于本网络来说,主机号应该是唯一。(否则会出现IP地址已分配或有冲突之类的错误) 
分配网络号 
  对于每个网络以及广域连接,必须有唯一的网络号,主机号用于区分同一物理网络中的不 同主机。如果网络由路由器连接,则每个广域连接都需要唯一的网络号。 
分配主机号 
 主机号用于区分同一网络中不同的主机,并且主机号应该是唯一的。所有的主机包括路由 
器间的接口,都应该有唯一的网络号。路由器的主机号,要配置成工作站的缺省网关地址。 
有效的主机号 
A类:w.0.0.1--w.255.255.254       B类:w.x.0.1--w.x.255.254     
C类:w.x.y.1--w.x.y.254 
4.路由实现
路由就是选择一条数据包传输路径的过程。当TCP/IP主机发送IP数据包时,便出现了路由,且当到达IP路由器还会再次出现。路由器是从一个物理网向另一个物理网发送数据包的装置,路由器通常被称为网关。对于发送的主机和路由器而言,必须决定向哪里转发数据包。在决定路由时,I?P层查询位于内存中的路由表。?
(1)当一个主机试图与另一个主机通信时,IP首先决定目的主机是一个本地网还是远程网。?
(2)如果目的主机是远程网,IP将查询路由表来为远程主机或远程网选择一个路由。?
(3)若未找到明确的路由,IP用缺省的网关地址将一个数据传送给另一个路由器。?
(4)在该路由器中,路由表再次为远程主机或网络查询路由,若还未找到路由,该数据包将?
发送到该路由器的缺省网关地址。?
  每发现一条路由,数据包被转送下一级路由器,称为一次“跳步”,并最终发送至目的主机。若未发现任何一个路由,源主机将收到一个出错信息。
1.04  TCP/IP的工作原理
TCP/IP的分层工作原理:

                                   相同的报文

                                    相同的分组
 
                                   相同的数据     

                                     相同的帧
     传输介质
TCP格式
TCP传输的单位是段,在建立连接,传送数据,确认消息和告之窗口大小时均要进行段的交换。段的格式如下图:段的格式也分成两部分,头和数据。上面格式中的名称已经足够说明了他们的作用了。具体的含义请参见有关资料。
建立一个TCP连接:TCP协议使用一个三次握手来建立一个TCP连接的。
握手过程的第一个段的代码位设置为SYN,序列号为x,表示开始一次握手。接收方收到这个段后,向发送者回发一个段。代码位设置为SYN和ACK,序列号设置为y,确认序列号设置为x+1。发送者在受到这个段后,知道就可以进行TCP数据发送了,于是,它又向接收者发送一个ACK段,表示,双方的连接已经建立在完成握手之后,就开始正式的数据传输了。上面握手段中的序列号都是随机产生的。
第 2 章 网络安全
在网络技术迅速发展和普及的同时,网络的安全性问题也日益突出。用户或局域网连接到Internet后,虽然方便了信息的共享,但是由于网络开放性的体系结构,用户或局域网自身的信息和数据,包括某些具有不同程度保密性要求的信息和数据,也全部暴露在外部网络用户面前。
      另外随着网络的开放性、共享性和互连程度的扩大,除了实现信息资源共享,方便了信息检索查询外,依托网络的各种新兴业务也迅速崛起,如电子商务,数字货币,互联网银行等,因而信息网络安全的重要性也日益明显。网络在为人们的生活和工作带来便利的同时,也使非法分子有机可乘,在Intenet上可以轻而易举地获得各种攻击工具,网络攻击时常发生,带来了巨大的经济损失。
      针对网络上存在的各种安全隐患,人们已经研制了许多安全防范措施,提出了许多解决信息网络安全问题的思想。已有的信息网络安全技术有:防火墙技术;信息加密技术;信息认证技术;利用操作系统、数据库、应用系统本身的安全机制,对用户权限进行控制等等。其中,防火墙技术是目前比较广泛使用的网络安全防护技术。随着攻击者知识的日趋成熟,攻击工具与手法的日趋复杂多样,单纯的防火墙策略已经无法满足对安全高度敏感的部门的需要
2.01  网络安全概述
     随着计算机的网络化和全球化,人们日常生活中的许多活动将逐步转移到网络上来。主要原因是由于网络交易的实时性、方便性、快捷性及低成本性。今天,几乎世界上每一个国家都高度依赖于通讯、能源、运输和公用事业网络,包括政府事务、国防、金融、工商业等社会生活的各个方面。地球上的每一个人均可方便地与另一端的用户通讯。企业用户可以通过网络进行信息发布、广告、营销、娱乐和客户支持等,同时可以直接与商业伙伴直接进行合同签订和商品交易,用户通过网络可以获得各种信息资源和服务,如购物、娱乐、求职、教育、医疗、投资等。
然而,信息领域的犯罪也随之而来, 窃取信息、篡改数据和非法攻击等对系统使用者及全社会造成的危害和损失也特别巨大,并且日益增加。据统计,全球约20秒种就有一次计算机入侵事件发生,Internet上的网络防火墙约1/4被突破,约70%以上的网络信息主管人员报告因机密信息泄露而受到了损失。61%在过去的十二个月中遭到内部攻击,58%在过去的十二个月中遭到外部攻击。

大多数信息犯罪采用先进的技术手段,多于 45% 的攻击和高级黑客技术有关,如窃听器(sniffer)(Scan),口令文件窃取、漏洞扫描探测、特洛伊木马程序(Trojan Horse)等 互联网上可以得到免费的黑客工具,黑客工具和技术手段迅速泛滥,难以通过传统方式约束。事件发生的频率快速增加。攻击方法和手段不断翻新。一个破解的系统漏洞会造成所有采用该系统的用户处于危险之中。网络安全是一个关系国家安全和主权、社会的稳定、民族文化的继承和发扬的重要问题,网络安全涉及计算机科学、网络技术、通信技术、密码技术、信息安全技术、应用数学、数论、信息论等多种学科。
网络安全从其本质上来讲就是网络上的信息安全,是指网络系统的硬件、软件及其系统中的数据受到保护,不受偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。从广义来说,凡是涉及到网络上信息的保密性、完整性、可用性、真实性和可控性的相关技术和理论都是网络安全所要研究的领域。网络安全涉及的内容既有技术方面的问题,也有管理方面的问题,两方面相互补充,缺一不可。技术方面主要侧重于防范外部非法用户的攻击,管理方面则侧重于内部人为因素的管理。如何更有效地保护重要的信息数据、提高计算机网络系统的安全性已经成为所有计算机网络应用必须考虑和必须解决的一个重要问题。
2.02  网络安全的目标
网络安全的目标应当满足:
身份真实性:能对通讯实体身份的真实性进行鉴别。
信息机密性:保证机密信息不会泄露给非授权的人或实体。
信息完整性:保证数据的一致性,能够防止数据被非授权用户或实体建立、修改和破坏。
服务可用性:保证合法用户对信息和资源的使用不会被不正当地拒绝。
不可否认性:建立有效的责任机制,防止实体否认其行为。
系统可控性:能够控制使用资源的人或实体的使用方式。
系统易用性:在满足安全要求的条件下,系统应当操作简单、维护方便。
可审查性:对出现的网络安全问题提供调查的依据和手段
网络安全的唯一真正目标是通过技术手段保证信息的安全。
2.03  网络所面临的安全威胁
    网络中的主机可能会受到非法入侵者的攻击,网络中的敏感数据有可能泄露和或被修改,从内部网向共网传送的信息可能被他人窃听或篡改等等,造成网络安全的威胁的原因可能是多方面的,有来自外部,也有可能来自企业网络内部。攻击者主要是利用了TCP/IP协议的安全漏洞和操作系统的安全漏洞。归纳起来,系统的安全威胁常表现为以下特征:

1.窃听:攻击者通过监视网络数据获得敏感信息。
2.重传:攻击者事先获得部分或全部信息,以后将此信息发送给接收者。
3.伪造:攻击者将伪造的信息发送给接收者。
4.篡改:攻击者对合法用户之间的通讯信息进行修改、删除、插入,再发送给接收者。
5.拒绝服务攻击:攻击者通过某种方法使系统响应减慢甚至瘫痪,阻止合法用户获得服务。6.行为否认:通讯实体否认已经发生的行为。
7.非授权访问:没有预先经过同意,就使用网络或计算机资源被看作非授权访问。它主要有8.以下几种形式:假冒、身份攻击、非法用户进入网络系统进行违法操作、合法用户以未授权方式进行操作等。
9.传播病毒:通过网络传播计算机病毒,其破坏性非常高,而且用户很难防范。如众所周知的CIH病毒,最近出现的“爱虫” 病毒都具有极大的破坏性。

信息受到侵犯的典型来源:(美国阿伯丁集团咨询报告)人为错误 ---- 35%
人为忽略 ---- 25%
不满意的雇员 ---- 15%
外部攻击 ---- 10%
火灾、水灾 ---- 10%
其他 ---- 5%
2.04  网络安全的解决方案
   一个完整的网络安全解决方案所考虑的问题应当是非常全面的。保证网络安全需要靠一些安全技术,但是最重要的是要有详细的安全策略和良好的内部管理。 在确立网络安全的目标和策略之后,还要确定实施网络安全所应付出的代价,然后选择确实可行的技术方案,方案实施完成之后最重要的是要加强管理,制定培训计划和网络安全管理措施。完整的安全解决方案应该覆盖网络的各个层次,并且与安全管理相结合。
1.物理层的安全防护:在物理层上主要通过制定物理层面的管理规范和措施来提供安全解决方案。
2.链路层安全保护:主要是链路加密设备对数据加密保护。它对所有用户数据一起加密,用户数据通过通信线路送到另一节点后解密。
3.网络层和安全防护:网络层的安全防护是面向IP包的。网络层主要采用防火墙作为安全防护手段,实现初级的安全防护。在网络层也可以根据一些安全协议实施加密保护。在网络层也可实施相应的入侵检测。
4.传输层的安全防护:传输层处于通信子网和资源子网之间,起着承上启下的作用。传输层也支持多种安全服务:1)对等实体认证服务;2)访问控制服务;3)数据保密服务;4)数据完整性服务;5)数据源点认证服务;
5.应用层的安全防护:应用层的安全防护:原则上讲所有安全服务均可在应用层提供。在应用层可以实施强大的基于用户的身份认证。在应用层也是实施数据加密,访问控制的理想位置。在应用层还可加强数据的备份和恢复措施。应用层可以是对资源的有效性进行控制,资源包括各种数据和服务。应用层的安全防护是面向用户和应用程序的,因此可以实施细粒度的安全控制。
6.要建立一个安全的内部网,一个完整的解决方案必须从多方面入手。
加强主机本身的安全,减少漏洞;
用系统漏洞检测软件定期对网络内部系统进行扫描分析,找出可能存在的安全隐患;
建立完善的访问控制措施,安装防火墙,加强授权管理和认证;
在线监控非法入侵和异常行为,实时报警和切断非法行为;
加强数据备份和恢复措施;
对敏感的设备和数据要建立隔离措施;
对在公共网络上传输的敏感数据要加密;
加强内部网的整体防病毒措施;
建立详细的安全审计日志等。
2.05  网络攻击的类型
对互联网络的攻击包括对静态数据的攻击和对动态数据的攻击。 对静态数据的攻击主要有:
口令猜测:通过穷举方式搜索口令空间,逐一测试,得到口令,进而非法入侵系统。
IP地址欺骗:攻击者伪装成源自一台内部主机的一个外部地点传送信息包,这些信       息包中包含有内部系统的源IP地址,冒名他人,窃取信息。
指定路由:发送方指定一信息包到达目的站点的路由,而这条路由是经过精心设计 的、绕过设有安全控制的路由。
根据对动态信息的攻击形式不同,可以将攻击分为主动攻击和被动攻击两种。

被动攻击主要是指攻击者监听网络上传递的信息流,从而获取信息的内容(interception),或仅仅希望得到信息流的长度、传输频率等数据,称为流量分析(traffic analysis)。被动攻击和窃听示意图如图1、图2所示:

除了被动攻击的方式外,攻击者还可以采用主动攻击的方式。主动攻击是指攻击者通过有选择的修改、删除、延迟、乱序、复制、插入数据流或数据流的一部分以达到其非法目的。主动攻击可以归纳为中断、篡改、伪造三种(见图3)。中断是指阻断由发送方到接收方的信息流,使接收方无法得到该信息,这是针对信息可用性的攻击(如图4)。篡改是指攻击者修改、破坏由发送方到接收方的信息流,使接收方得到错误的信息,从而破坏信息的完整性(如图5)。伪造是针对信息的真实性的攻击,攻击者或者是首先记录一段发送方与接收方之间的信息流,然后在适当时间向接收方或发送方重放(playback)这段信息,或者是完全伪造一段信息流,冒充接收方可信任的第三方,向接收方发送。(如图6)

 

 

 

 

2.06  网络安全的防范建议
   Internet是一个公共网络,网络中有很多不安全的因素。一般局域网和广域网应该有以下安全措施:
(1). 系统要尽量与公网隔离,要有相应的安全连接措施.
(2). 不同的工作范围的网络既要采用防火墙、安全路由器、保密网关等相互隔离,又要在政策循序时保证互通。
(3). 为了提供网络安全服务,各相应的环节应根据需要配置可单独评价的加密、数字签名、访问控制、数据完整性、业务流填充、路由控制、公证、鉴别审计等安全机制,并有相应的安全管理。
(4). 远程客户访问重要的应用服务要有鉴别服务器严格执行鉴别过程和访问控制。
(5). 网络和网络安全设备要经受住相应的安全测试。
(6). 在相应的网络层次和级别上设立密钥管理中心、访问控制中心、安全鉴别服务器、授权服务器等,负责访问控制以及密钥、证书等安全材料的产生、更换、配置和销毁等相应的安全管理活动。
(7). 信息传递系统要具有抗侦听、抗截获能力能对抗传输信息的纂改、删除、插入、重放、选取明文密码破译等主动攻击和被动攻击,保护信息的机密性,保证信息和系统的完整性。
(8). 涉及保密的信息在传输过程中,在保密装置以外不以明文形式出现。
第 3 章 入侵检测
自从计算机问世以来,安全问题就一直存在。特别是随着Internet的迅速扩张和电子商务的兴起,人们发现保护资源和数据的安全,让他免受来自恶意入侵者的威胁是件相当困难的事。对于企业网络来说,入侵的来源可能是企业内部心怀不满的员工、网络黑客,甚至是竞争对手。攻击者可以窃听网络上的信息,窃取用户的口令、数据库的信息;还可以篡改数据库内容,伪造用户身份,否认自己的签名。更有甚者,攻击者可以删除数据库的内容,摧毁网络节点,释放计算机病毒,直到整个企业网络陷入瘫痪。入侵检测技术是一种主动保护自己免受黑客攻击的一种网络安全技术。入侵检测技术帮助系统对付网络攻击,拓展了系统管理员的安全管理能力(包括安全审计、监视、进攻识别和响应),提高了信息安全基础结构的完整性。它从计算机网络系统中的若干关键点收集信息,并分析这些信息,看看网络中是否有违反安全策略的行为和遭到袭击的迹象。入侵检测被认为是防火墙之后的第二道安全闸门,它在不影响网络性能的情况下能对网络进行监测,从而提供对内部攻击、外部攻击和误操作的实时保护
3.01  什么是入侵检测及实现方法
     入侵检测是防火墙的合理补充,帮助系统对付网络攻击,扩展了系统管理员的安全管理能力(包括安全审计、监视、进攻识别和响应),提高了信息安全基础结构的完整性。它从计算机网络系统中的若干关键点收集信息,并分析这些信息,看看网络中是否有违反安全策略的行为和遭到袭击的迹象。入侵检测被认为是防火墙之后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测,从而提供对内部攻击、外部攻击和误操作的实时保护。这些都通过它执行以下任务来实现:
  · 监视、分析用户及系统活动;
  · 系统构造和弱点的审计;
   · 识别反映已知进攻的活动模式并向相关人士报警;
   · 异常行为模式的统计分析;
   · 评估重要系统和数据文件的完整性;
   · 操作系统的审计跟踪管理,并识别用户违反安全策略的行为
3.02  入侵检测的功能
     ·监督并分析用户和系统的活动
   检查系统配置和漏洞
   检查关键系统和数据文件的完整性
   识别代表已知攻击的活动模式
   对反常行为模式的统计分析
   对操作系统的校验管理,判断是否有破坏安全的用户活动。
   入侵检测系统和漏洞评估工具的优点在于:
   提高了信息安全体系其它部分的完整性
   提高了系统的监察能力
   跟踪用户从进入到退出的所有活动或影响
   识别并报告数据文件的改动
   发现系统配置的错误,必要时予以更正
   识别特定类型的攻击,并向相应人员报警,以作出防御反应
   可使系统管理人员最新的版本升级添加到程序中
   允许非专家人员从事系统安全工作
   为信息安全策略的创建提供指导
   必须修正对入侵检测系统和漏洞评估工具不切实际的期望:这些产品并不是无所不能的,它们无法弥补力量薄弱的识别和确认机制
   在无人干预的情况下,无法执行对攻击的检查
   无法感知公司安全策略的内容
   不能弥补网络协议的漏洞
   不能弥补由于系统提供信息的质量或完整性的问题
   它们不能分析网络繁忙时所有事务
   它们不能总是对数据包级的攻击进行处理
   它们不能应付现代网络的硬件及特性
  
  入侵检测作为一种积极主动地安全防护技术,提供了对内部攻击、外部攻击和误操作的实时保护,在网络系统受到危害之前拦截和响应入侵。从网络安全立体纵深、多层次防御的角度出发,入侵检测理应受到人们的高度重视,这从国外入侵检测产品市场的蓬勃发展就可以看出。在国内,随着上网的关键部门、关键业务越来越多,迫切需要具有自主版权的入侵检测产品。但现状是入侵检测仅仅停留在研究和实验样品(缺乏升级和服务)阶段,或者是防火墙中集成较为初级的入侵检测模块。可见,入侵检测产品仍具有较大的发展空间,从技术途径来讲,我们认为,除了完善常规的、传统的技术(模式识别和完整性检测)外,应重点加强统计分析的相关技术研究。
3.03  入侵行为的概念,分类和演化
从最早期的计算机安全开始,人们就密切关注恶意使用者破坏保护机制的可能性。早期系统多为多用户批处理系统。这个时期,主要的威胁来自系统的合法使用者,他们企图得到未经授权的材料。到了20世纪70年代,分时系统和其他的多用户系统已成气候,Willis H Ware主持的计算机安全防御科学特别工作小组提供了一项报告,为处理多级数据的计算机系统的发展奠定了基础。但这篇报告并没有受到应有的重视,直到70年代中期,人们才开始进行构建多级安全体系的系统研究。
1980年4月,詹姆斯安德森(James P.Anderson)为美国空军做的题为《Computer SecurityThreatMonitoring and Surveillance》(计算机安全威胁监控与监视)的技术报告,第一次详细阐述了入侵检测的概念,并首先为入侵和入侵检测提出了一个统一的架构,这是该领域的开山之作。他在论文中给出了入侵和入侵检测技术方面的概念:
威胁(Threat) 可能存在有预谋的、未经认可的尝试:
①存取数据;
②操控数据;
③使系统不可靠或无法使用。
危险(Risk) 意外的和不可预知的数据暴露,或者,由于硬件故障、软件设计的不完整和不正确所造成的违反操作完整性的问题。
脆弱性(Vulnerability) 已知的或可疑的硬件或软件设计中的缺陷;使系统暴露的操作;意外暴露自己信息的操作。攻击(Attack) 实施威胁的明确的表达或行为。
 渗透/入侵(Penetration)一个成功的攻击;(未经认可的)获得对文件和程序的使用,或对计算机系统的控制。
 威胁概念中的③包括DOS(Denial Of Service)“拒绝服务攻击”。盗用计算资源也属于这个类别之内。
 一般来说,外部入侵者的首要工作是进入系统。所谓外部入侵者,也可能是合法用户,但违规使用了未经授权的资源。另一方面,除了拒绝服务攻击外,多数攻击都需要入侵者取得用户身份。Anderson更进一步把入侵情况按表1所示分类。

20世纪80年代中后期,网络计算已经相当普遍,渗透和入侵也更广泛。但许多厂商和系统管理员却疏忽了这个危险。一些厂商在售出的系统中预先定义管理账户(曾有厂商使用User name:system,Password:manager),而很多系统操作员却大意地忘记了改变这个缺省设置。
1988年11月2日,第一个大范围的Internet上的攻击和渗透事件发生了。肇事者是“莫理斯蠕虫”,他采用多种传输技术在系统间复制,利用的是发送邮件程序的漏洞,这个漏洞允许邮寄的指令能在异地系统上执行。除此之外,蠕虫也利用在finger守护进程溢出串变量来扩散。蠕虫代码中还包含了一个高效的口令破解程序,他尝试破解被他传染的系统上的使用者的密码。在“莫理斯蠕虫”之后,DARPA建立了“计算机紧急情况反应小组”,也就是现在SEI(软件工程学会)的CERT(ComputerEmergencyResponse Team)。
1996年,在线杂志Phrack发表了一篇缓冲溢出攻击的文章,随后这种攻击事件就多了起来。CERT的一项研究显示,从1997年开始,缓冲溢出攻击变成逐渐严重。近年来报告给CERT/CC的攻击事件中涉及缓冲溢出的百分比上升,这种漏洞攻击流行的原因包括:系统的脆弱性;管理者(administrator)或超级用户(super user)在目标系统中的特权,攻击行为一般都要利用这些特权;这些攻击的脚本或程序在Internet上的适用性很好,使用者只需很少的技巧。
和其他攻击方式一样,缓冲溢出已经越来越复杂和更具综合性。早期的攻击主要是通过目标程序读数据。后来发现,包含环境参数的变量也可能被当作攻击向量使用。最近,基于格式串(format strings)的缓冲溢出也开始使用。
1992年,第一次大范围的“root kits”开始出现。入侵者会像一个平常的使用者一样进入系统,接着靠猜测、社会工程学或其他方式得到一个使用者的口令,然后他们尝试利用系统的弱点成为root。一旦获得root权限,版本不同的系统公用程序,像是Su,Ftp和Ftpd就会被安装和远程执行,这使侵入者能方便地再次进入(后门技术),而且,入侵者会修改系统信息,清理入侵痕迹,让管理者和安全审计者难以察觉。
现在的攻击行为向着大规模、自动和协同方向发展。攻击已经变得越来越复杂、越来越自动化。图1中,实线代表攻击行为,虚线代表入侵者需要掌握的技术,他显示了从90年代起,攻击行为的发展和对入侵者技术要求降低的情况。CERT/CC曾预言:攻击行为的自动化可能在因特网上引发大规模的入侵活动,这在今天得到了验证。

3.04  网络入侵的一般思路及方法
第一步:进入系统
1. 扫描目标主机。
2. 检查开放的端口,获得服务软件及版本。
3. 检查服务软件是否存在漏洞,如果是,利用该漏洞远程进入系统;否则进入下一步。
4. 检查服务软件的附属程序(*1)是否存在漏洞,如果是,利用该漏洞远程进入系统;否则进入下一步。
5. 检查服务软件是否存在脆弱帐号或密码,如果是,利用该帐号或密码系统;否则进入下一步。
6. 利用服务软件是否可以获取有效帐号或密码,如果是,利用该帐号或密码进入系统;否则进入下一步。
7. 服务软件是否泄露系统敏感信息,如果是,检查能否利用;否则进入下一步。
8. 扫描相同子网主机,重复以上步骤,直到进入目标主机或放弃。
第二步:提升权限
1. 检查目标主机上的SUID和GUID程序是否存在漏洞,如果是,利用该漏洞提升权限,否则进入下一步。
2. 检查本地服务是否存在漏洞,如果是,利用该漏洞提升权限,否则进入下一步。
3. 检查本地服务是否存在脆弱帐号或密码,如果是,利用该帐号或密码提升权限;否则进入下一步。
4. 检查重要文件的权限是否设置错误,如果是,利用该漏洞提升权限,否则进入下一步。
5. 检查配置目录(*2)中是否存在敏感信息可以利用。
6. 检查用户目录中是否存在敏感信息可以利用。
7. 检查临时文件目录(*3)是否存在漏洞可以利用。
8. 检查其它目录(*4)是否存在可以利用的敏感信息。
9. 重复以上步骤,直到获得root权限或放弃。
第三步:放置后门
最好自己写后门程序,用别人的程序总是相对容易被发现。
第四步:清理日志
最好手工修改日志,不要全部删除,也不好使用别人写的工具。
附加说明:

*1 例如WWW服务的附属程序就包括CGI程序等
*2 这里指存在配置文件的目录,如/etc等
*3 如/tmp等,这里的漏洞主要指条件竞争
*4 如WWW目录,数据文件目录等
/*****************************************************************************/
好了,大家都知道了入侵者入侵一般步骤及思路 那么我们开始做入侵检测了。
第一步、我们都知道一个入侵者想要入侵一台服务器首先要扫描这台服务器,搜集服务器的信息,以便进一步入侵该系统。系统信息被搜集的越多,此系统就越容易被入侵者入侵。 所以我们做入侵检测时,也有必要用扫描器扫描一下系统,搜集一下系统的一些信息,来看看有没有特别流行的漏洞(呵呵这个年头都时兴流行哦:)
第二步、扫描完服务器以后,查看扫描的信息---->分析扫描信息。如果有重大漏洞---->修补(亡羊补牢,时未晚),如果没有转下一步。
第三步、没有漏洞,使用杀毒工具扫描系统文件,看看有没有留下什么后门程序,如:nc.exe、srv.exe......如果没有转下一步。
第四步、入侵者一般入侵一台机器后留下后门,充分利用这台机器来做一些他想做的事情,如:利用肉鸡扫描内网,进一步扩大战果,利用肉鸡作跳板入侵别的网段的机器,嫁祸于这台机器的管理员,跑流影破邮箱......
如何检测这台机器有没有装一些入侵者的工具或后门呢?
查看端口(偏好命令行程序,舒服)
1、fport.exe--->查看那些端口都是那些程序在使用。有没有非法的程序,和端口 winshell.exe 8110 晕倒~后门 net use 谁在用这个连接我?
2、netstat -an ---->查看那些端口与外部的ip相连。 23 x.x.x.x 没有开23端口,怎么自己打开了??黑客!?
3、letmain.exe //ip -admin -d 列出本机的administrators组的用户名查看是否有异常。 怎么多了一个hacker用户??<==>net user id
4、pslist.exe---->列出进程<==>任务管理器
5、pskill.exe---->杀掉某个进程,有时候在任务管理器中无法中止程序那就用这个工具来停止进程吧。
6、login.exe ---->列出当前都有那些用户登录在你的机器上,不要你在检测的同时,入侵者就在破坏:(
7、查看日志文件--->庞大的日志文件--->需要借助第三方软件来分析日志 记录了入侵者扫描的信息和合法用户的正确请求
Find “scirpts/..” C:/WINNT/system32/LogFiles/W3SVC1/ex010705.log --解码漏洞??谁在扫描我?
8、查看 Web 目录下文件改动与否 留没有留 asp php 后门......查看存放日志文件的目录
DOS dir /a
GUI 查看显示所有文件和文件夹
技巧:查看文件的修改日期,我两个月没有更新站点了(好懒:),怎么 Web 目录下有最近修改文件的日期??奇怪吧?:)
#######################################
C:/WINNT/system32/LogFiles/W3SVC1>dir
dir
驱动器 C 中的卷是 system Server
卷的序列号是 F4EE-CE39
C:/WINNT/system32/LogFiles/W3SVC1 的目录
2001-07-05 02:43 1,339 ex010704.log
2001-07-05 23:54 52,208 ex010705.log
2001-07-07 22:59 0 ex010707.log
2001-07-08 22:45 0 ex010708.log
2001-07-10 08:00 587 ex010709.log
恩?奇怪?怎么没有 2001-07-06 那天的日志文件??可疑......2001-07-07、2001-07-08 两天的日志文件大小为零,我得网站访问量怎么两天都是空??没有那么惨吧:(好奇怪?!
#######################################
D:/win 2000>dir
dir
驱动器 D 中的卷是 新加卷
卷的序列号是 28F8-B814
D:/win 2000 的目录
2001-06-03 17:43

.
2001-06-03 17:43 ..
2001-06-03 17:43 CLIENTS
2001-06-03 17:43 BOOTDISK
2001-06-03 17:43 I386
2001-06-03 17:46 PRINTERS
2001-06-03 17:46 SETUPTXT
2001-06-03 17:46 SUPPORT
2001-06-03 17:46 VALUEADD
2000-01-10 20:00 45 AUTORUN.INF
2000-01-10 20:00 304,624 BOOTFONT.BIN
2000-01-10 20:00 5 CDROM_IS.5
2000-01-10 20:00 5 CDROM_NT.5
2000-01-10 20:00 12,354 READ1ST.TXT
2000-01-10 20:00 465,408 README.DOC
2000-01-10 20:00 267,536 SETUP.EXE
2001-06-04 17:37 SP1
2001-06-27 16:03 sp2
2001-07-06 00:05 system --->从来没有修改或安装什么文件程序啊 什么时候多了system目录?这个是我安装 win 2000 的安装文件。 日期怎么不对 2001-07-06,日志文件也没有 2001-07-06 的这一天的记录,可疑.......
7 个文件 1,049,977 字节
12 个目录 10,933,551,104 可用字节
#######################################
总的来说入侵检测包括:
一、基于80端口入侵的检测 CGI IIS 程序漏洞......
二、基于安全日志的检测 工作量庞大
三、文件访问日志与关键文件保护
四、进程监控 后门什么的
五、注册表校验 木马
六、端口监控 21 23 3389 ...
七、用户 我觉得这个很重要,因为入侵者进入系统以后,为了方便以后的“工作”通常会加一个用户或者激活guest帐号提升为管理员的
/************** 借助第三方软件协助分析 IDS Firewall .....***********************/
对 unix & linux 入侵检测说几句
有必要先用扫描器扫描一下系统,搜集一下资料 CGI RPC TELNETD FTP ......本地远程溢出漏洞......
1、检查 suid sgid 程序
find / -user root -perm -4000 -print --常用
find / -group kmem -perm -2000 -print

2、查看系统的二进制文件是否被更改
如:ls su telnet netstat ifconfig find du df sync login......
建议做入侵检测时候,从一个干净的系统 copy 过来这些文件 来做检测
使用 MD5 Tripwire 校验工具检测
3、检查 /etc/passwd 文件
有没有新增的用户、没有口令的帐号、uid等于0的帐号......
4、检查有没有网络监听程序在运行
netstat -an
5、检查系统非正常的隐藏文件
".." ".. " "..^G"
find / -name ".. " -print -xdev
find / -name ".*" -print -xdev | cat -v
6、在系统正常运作的情况下,系统管理员要经常使用下列命令(必要的话,系统管理员可以改变 path,或者修改二进制文件名称,放到一个只有自己知道的目录下)在保证二进制文件没有被篡改的情况下用绝对路径
/bin/who
/bin/w
/bin/last
/bin/lastcomm
/bin/netstat
/bin/snmpnetstat
.
.
.
shell 的历史文件 如:.history 、.rchist、.bash_history......
7、日志

8、........

因为 unix&vlinux系列源代码是开放的,所以如果入侵者装上了内核后门 #!@$%!#@%$#@^$Content$amp;
强烈建议备份您机器上重要文件,重装系统,打好补丁,迎接入侵者^_^
/******************借助第三方软件协助分析 IDS Firewall .....***********************/
入侵检测介绍就到这里,在实际运用中,系统管理员对基础知识掌握的情况直接关系到他的安全敏感度,只有身经百战而又知识丰富、仔细小心的系统管理员才能从一点点的蛛丝马迹中发现入侵者的影子,未雨绸缪,扼杀入侵的行动。
3.05  VC++实现一个简单的端口扫描器
1.扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器可以不留痕迹地发现远程服务器的各种TCP端口的分配及提供的服务和它们所使用的软件版本!这些信息可以间接地了解远程主机所存在的安全问题。
扫描器的工作原理是:通过连接远程TCP/IP不同端口,并记录目标给予的应答。通过这种方法,可以搜集到很多有关主机的各种信息(是否能够匿名登录;是否有可写的FTP目录;是否能用TELNET;HTTPD是用ROOT还是nobady在运行……)。
扫描器的一个主要功能就是发现一个主机或网络并检查有什么服务正运行在这台主机上,更进一步还能测试这些服务,发现系统漏洞。要实现这些功能,只需要采用罪简单的TCP connect()扫描。操作系统提供的connect()系统调用,用来与每一个目标计算机端口进行连接。如果端口处于侦听状态,那么connect()就能够成功;否则这个端口不能使用,即没有提供服务。
这个技术的最大有点是:无需任何权限。系统中的任何用户都有权利使用这个调用。另一个好处是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那将会花费相当长的时间。我们可以同时打开多个socket,从而加速扫描。使用非阻塞I/O允许设置一个较低的时间用尽周期,同时观察多个socket

2.程序实现步骤
① 用AppWizard建立一个基于对话框的应用程序,注意,程序需要选择支持WinSocket。为对话框添加资源,得到如下图一个界面。上面为一个IP地址,下面为一个编辑框,添加按钮“扫描”,它的ID为ID_SCAN

                    自制扫描器界面图
② 添加控制变量,如下表:

③ 添加函数TestConnection
函数主要通过建立一个SOCKET,然后通过CONNECT方法测试端口是否打开。主要代码如下:
bool CPortScanDlg ::TestConnection (CString IP , UNIT nPort)
{
CSocket* pSocket;
pSocket = new CSocket;
ASSERT ( pSocket );
If ( !pSocket -> Create ( ) )
{
delete pSocket;
pSocket = Null;
return FALSE;
}
while ( ! pSocket ->Connect ( IP , nPort ) )
{
delete pSocket ;
pSocket = NULL ;
return FALSE ;
}
pSocket -> close ( );
delete pSocket ;
return TRUE ;
}
④ 为ID_SCAN 添加函数。
简单接受数据,并调用TestConnection ( ip , port ) 函数就可以了。
至此,端口扫描程序就完成了,它实现了很简单的检测端口的功能。
第 4 章 网络监听听与过滤技术
本章中监听特指”sniffing”(通常直译为嗅探或窥探),即利用计算机网络借口截获目的地为其他计算机的数据抱文。
监听几乎和Internet有一样久的历史,它原本是提供给管理员的一类管理工具,使用这类工具可以监视网络状态、数据流动情况以及网络上传输的信息并利用这些信息来排除网络故障。事实上,这类工具往往也被称为网络分析仪。
不幸的是监听工具能有效地截获网上的数据,它也成了黑客使用的最多的方法。黑客们运行监听程序以暗中监视他人的网络状况、窃取明文传输的密码和各种数据。
一个简单的监听程序的结构大体上来说,可以将监听长呢工序分为两个组成部分:
内核空间部分:负责从网络汇总捕获以及过滤数据包。
拥护空间部分:负责处理用户界面、格式化、协议分析,此外如果核心层没有进行过滤话,还必须负责过滤部分工作。
4.1   包捕获
网络底层信息监听(即包捕获)可以通过两种方法实现,一种是利用以太网络的广播特性实现,另一种是通过实质路由器的监听端口实现,两种方式分别适用于不同的工作情况,下面进行详细论述。
4.11  利用以太网络的广播特性进行监听
以太网数据传输通过广播实现,通常在同一个共享局域网的所有网络接口都有访问在物理媒体上传输的所有数据的能力,但是在系统正常工作时,应用程序只能收到以本机为目标主机的数据包,其他数据包过滤后将被丢弃不作处理。该过滤机制可以作用在链路曾、网络层和传输层这几个层次。
链路层主要指网卡驱动程序判断所收到包的目标以太地址,在系统正常工作时,一个合法的网络接口应该只响应这样的两种数据侦:
侦的目标区域具有和本地网络接口相匹配的硬件地址。
侦的目标区域具有”广播地址”。
在接收到上面两种情况的数据包时,网络接口通过CPU产生硬件中断,操作系统进行中断处理后将侦中所包含的数据传送给网络层进一步处理,而其他情况下数据侦将被丢弃不作处理。
网络层判断目标IP地址是否为本所绑定的IP地址,如果不是本所绑定IP地址,将丢弃这些IP数据报;如果符合本机IP地址则叫给传输层处理。
传输层中的TCP或者UDP判断目标端口是否在本机已经打开,如果没有打开,则抛弃这些包;否则将向应用层提交其内容。
要监听到流经网卡的不属于自己主机的数据,必须绕过系统正常工作的处理机制,直接访问网络底层。首先将网卡工作模式置于混杂(promiscuous)模式。当网络接口处于这种”混杂”方式时,该网络接口具备”广播地址”,它对所有接受到的侦都产生硬件中断以提醒操作系统处理流经该物理媒体上的每一个报文(绝大多数的网络接口具备置成promisuous方式的能力)。操作系统直接访问数据链路层,截获相关数据,由应用程序而非上层如IP层、TCP层协议对数据过滤处理,这样就可以监听流经网卡的所有数据。
可见,监听程序工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过响应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。值得注意的是监听程序是极其安静的,它是一种消极的安全攻击。必须注意的是这种监听方法对所有共享式广播网络都同样适用,如令牌网。
目前,UNIX系统中有3种常见的数据链路层访问设备,可以用来捕获和过滤链路层上的数据包,它们分别是:BSD系统中采用的BSD分组过滤器,SVR4中的数据链路层接口和Linux系统的SOCKET_PACKET接口。
在Windows中访问数据链路层信息的机制与在UNIX中截然不同;WIN32平台不提供直接的网络低层访问接口,必须通过虚拟设备驱动程序实现网络监听的功能,VxD驱动程序提供外部程序和网卡NIC之间的接口。
因此,为了保证监听系统能够适应多种不同的操作系统平台,必须使其中的”网络分组捕捉器”能够适用于UNIX及Windows NT中的多种不同的数据链路层接口,并为建立在其上的系统中其他部分提供同意的应用接口,即在该层必须屏蔽掉不同系统中不同数据链路设备的差异。
4.2   包过滤与分解
4.2.1  过滤原理
网络信息监控将获取所有的网络信息,但在实际应用中,其中存在用户不关心的数据,或者称之为垃圾数据,垃圾数据比重极大,严重影响了系统工作效率。事实上,网络监听模块过滤功能的效率是该网络监听的关键,因为对于网络上的每一数据包都会使用该模块处理,判断是否符合过滤条件。低效率的过滤程序会导致数据包丢失、来不及分析处理等。用户可以按特定的子网主机以及特定的协议端口如HTTP、FTP、E-mail等进行过滤,只将用户关心的敏感数据向上层提交,从而提高系统工作效率。信息的简单过滤有如下几种。
站过滤:根据MAC地址,筛选出某一个工作站或者服务器的数据。
协议过滤:根据传输层和网络曾中的特性过滤,如选择TCP而非UDP数据或选择某一特定IP层协议数据。
服务过滤:根据端口筛选特定类型服务。
通用过滤:根据数据包中某一偏移处的16进制值选择特定数据包。
同时根据过滤的时间,可以分为两种过滤方式。
捕获前过滤:当不想缓冲区因无用的数据而溢出时这一方法很有用。
捕获后过滤:在已经捕获了有问题的数据后还需进一步分析所有数据时。
4.2.2  包分解
另一个使进入缓冲区中的包数量更多的方法是使用包分解技术,游戏网络分析仪中将之直接描述为”只捕捉一个包的头n个字节”。采用这种方式的原因包的最关键部分-----协议头都在包的首部;通常建议捕捉包都部的至少128个字节的数据以白正能完全捕捉到协议头。监听程序仍然记住包的起始大小,但只需128个字节加上管理存储每个报德开销。如果需要查看更多信息,例如要查看包含在IP或IPX选路信息包中的路由信息时,那么不许加大分解长度甚至采集整个包。
监听程序中往往在过滤基础上同时进行包分解
第 5 章 网络编程基础
 网络编程是一个很广泛的概念。一般指利用操作系统底层的函数调用进行Internet连接的编程工作。各种操作系统的编程方法都不同,但大致思路是一致的。这以Linux系统为例介绍网络编程的方法。另一方面,随着Internet的发展,各种高层应用也不可避免地要设计网络功能,用各种高层开发工具开发Internet应用是相对简单的,但其安全性问题却往往不能引起普通程序员的重视。
网络程序通常是由客户端和服务器两个部分组成的:先启动服务器程序,等待客户端的程序运行并建立连接。具体形式一般是服务端的程序在一个端口上监听,直到有一个客户端的程序发来了请求。
一些常用的网络命令有助于编程时调试。比如,可用命令netstat显示网络的连接、路由表和接口统计等网络的信息。Netstat有许多选项,常用-an显示详细的网络状态。再如:可用telnet来调试服务端的程序。若服务器程序程序在监听8888端口,则可用telnet localhost 8888来看服务端的状况。下面介绍下TCO/IP框架设计基础。
5.1   Client/Sever通讯流程
        “服务器”其实是一个进程,它需要等待任意数量的客户机连接,以便为它们的请求提供服务。服务器必须在一个已知的名字监听连接,在TCP/IP中这个名字就是本地接口的IP地址,加上一个端口编号。每种协议都有一套不同的定址方案,所以有一种不同的命名方法。在Winsock中,第一步是将指定协议的套接字绑定到它已知的名字上。这个过程是通过API调用bind来完成的。下一步是将套接字置为监听模式,这是用API函数listen来完成的。服务器设置为监听模式后,若一个客户机试图建立连接,服务器不许通过accept或WSAAccept调用来接受连接。谅解建立后,服务器与客户机交换数据(面向连接的套接字使用send和recv,无连接的套接字使用recvfrom和sendto)。若是面向连接情况,最后必须调用closesocket关闭连接,释放资源。下图面向连接套接字和无连接套接字应用程序的时序图。
   Server

 

 

                                                            Client
                                     

 


Blocking

 

 


processing

 

 

                           Reply

 

             面向连接socket应用程序时序图

 

Server/Client

                                                    Server/Client

 

                             Sockaddr_in()


sock                          sockaddr_in()     
                                       

   Blocking


   Processing

 

 

 

 

                      无连接socket应用程序时序图

5.2   相关API介绍
bind
一旦为某种特定协议创建了套接字,就必须将套接字绑定到一个已知地址。Bind函数可将指定的套接字同一个已知地址绑定到一起。该函数声明如下:
int bind(
SOCKET s,
Sonst struct sockaddr FAR*name,
Int namelen
);
其中s标识未捆绑套接口的描述字。Name为赋予套接口的地址。Sockaddr结构定义如下:
struct sockaddr{
   u_short    sa_family;
   char       sa_data[14];
};
name参数的作用很简单,就是一个普通的缓冲区针对具体使用的协议,必须把该参数实际的填充一个地址缓冲区(通常是sockaddr_in结构),并在调用bind时将其显示转换为一个struct sockaddr。第三个参数代表要传递的、由协议决定的地址的长度。
一旦出错,bind就会返回SOCKET_ERROR。对bind来说,最常见的错误是WSAADDRINUSE和WSAEFAULT。如果使用的是TCP/IP,那么前者表示另一个IP已经和本地IP接口和端口号绑定在一起了,或者那个IP接口和端口号处于TIME_WAIT状态。后者通常发生在对一个已经绑定的套接字调用bind时。
listen
listen调用指示一个套接字等候进入连接,它仅适用于支持连接的套接口,如SOCK_STREAM类型的。套接口s处于一种”变动”模式,申请进入的连接请求被确认,并排队等待被接受。这个函数特别适用于同时有多个连接请求的服务器;listen函数定义如下:
int listen(
SOCKET s,
Int backlog
);
其中第一个参数指定套接字。Backlog参数则指定了正在等待连接的最大队列长度。如果当一个连接请求到来时,队列已满,那么客户将收到一个WSAECONNREFUSED错误。注意,一旦服务器接收了一个连接,这个连接请求就会从队列中删去,以便别人可继续发出请求。Backlog参数其实本身就存在着限制,这个限制是由基层的协议提供者决定的。如果出现非法值,那么会用与之最接近的一个合法值来取代。除此以外,对于如何知道实际的backlog值,其实并不存在一种标准手段。与listen对应的错误是非常只管的。到目前为止,最常见的错误是WSAEINVAL。该错误通常意味着,你忘记在listen之前调用bind。
accept
accept调用在一个指定套接口接受连接,它也仅适用于支持连接的套接口,其定义如下:
SOCKET accept(
SOCKET s,
Struct sockaddr FAR*addr,
Int FAR*addrlen
);
本函数从s的等待连接队列中抽取第一个连接,穿件一个与s 同类的新的套接口并返回句柄。如果队列中无等待连接,且套接口为非阻塞方式,则accept()阻塞调用进程直至新的连接出现。如果套借口为非阻塞方式切队列中等待连接,则accept()返回错误代码。正常情况下,accept会返回一个新的套接字描述符,它对于已经接受的那个客户机连接。对于该客户 机后续的所有操作,都应使用这个新套接字。至于那个监听套接字,它仍然用于接受其他客户机连接,而且仍处于监听模式。
其中参数s是一个限定套接字,它处于监听模式。Addr参数为返回参,其中填写的是为通讯层所知的连接实体地址。Addr参数的实际格式由通讯时产生的地址族确定。Addrlen参数也是返回参数,在调用结束时它包含了指向实际返回的地址的长度(用字节数表示)的指针。该函数与SOCK_STREAM类型的面向连接的套接口一起使用。如果addr与addrlen中有一个为零NULL,将不返回所接受的套接口远程地址的任何信息。
Winsock 2引入了一个名为WSAAcept的函数。它根据条件函数的返回值,选择性地接受一个连接。这个新函数的定义如下:
SOCKET WSAAccept(
SOCKET s,
Struct sockaddr FAR*addr,
LPINT addrlen,
LPCONDITIONPROC lpfnCondtion,
DWORD dwCallbackData
);
其中,头三个参数与accept是相同的。LpfnCondition参数是指向回调条件函数的指针,那个函数是根据客户穷求来调用的,该函数决定是否接受客户 的连接请求。
connect
connect函数也仅仅用于支持连接的套接口,其定义如下:
int connect(
SOCKET s,
Const struct sockaddr FAR*name,
Int namelen
);
         其中s是即将在其上面建立连接的那个有效TCP套接字;name是针对TCP的套接字地址结构(SOCKET_IN);namelen则是名字参数的长度。Winsock 2引入了新版本的WSAConnect,其定义如下:
         int WSAConnect(
SOCKET s,
Const struct sockaddr FAR*name,
Int namelen
        LPWSABUF lpCallerData,
        LPWSABUF lpCalleeData,
        LPQOS lpSQOS,
        LPQOS lpGQOS
);
前3个参数和connect API函数的参数完全一样的,后4个参数定义如下:
lpCallerData:指向用户数据的指针,该数据在建立连接时将传送到远端。
lpCalleeData:指向用户数据的指针,该数据在建立连接时将从远端传送回本。
lpSQOS:指向为套接字s指定的FLOWSPEC结构的指针,每个方向一个;用于指定套接字s需要的服务质量。
lpGQOS:指向套接字组流描述的指针,用于指定套接字组所需要的服务质量。通常将其置空。
如果无错误发生,WSAConnect()返回0。否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取响应的错误代码。如果客户机想连接的计算机没有监听指定端口这一进程,connect调用就回失败,并发生错误WSAECONNREFUSED。另一个错误可能是WSAETIMEDOUT,这种情况一般发生在试图连接的计算机不能使用时
数据传输API
收发数据是网络编程的主要目的,要在已建立连接的套接字上收发数据,可使用两组API函数recv/recbfrom和send/sendto。第一组用于接受数据,第二组用于发送数据。其中recv/send用于面向连接套接字,send/sendto用于无连接套接字。
在介绍上述两组API时,首先必须注意的是所有关系到收发数据的缓冲都属于简单的char类型。也就是说,这些函数没有”Unicode”版本。另外,所有收发函数返回的错误代码都是SOCKET_ERROR。一旦返回错误,系统就会调用WSAFenLastError获得详细的错误信息。最常见的错误是WSAECONNABORTED和WSAECONNRESET。两者均涉及到即将关闭连接这一问题—要么通过超时,要么通过通信方关闭连接。另一个常见错误是WSAEWOULDBLOCK,一般出现在套接字处于非暂停模式或异步状态时。这个错误折腰意味着指定函数暂不能完成。
recv
对在已连接套接字上接受接入数据来说,recv函数是最基本的方式。它的定义如下:
int recv(
SOCKET s,
Char FAR*buf,
Int len,
Int flags
);
第一个参数s ,是准备接受数据的那个套接字。第二个参数buf,是即将收到数据的字符缓冲,而len则是准备接收字节数或buf缓冲的长度。最后,flags参数可以是下面的值:0、MSG_PEEK或MSG_OOB。0表示无特殊行为;MSG_PEEK会使有用的数据复制到所提供的接收端缓冲内,但是没有从系统缓冲中将它删除;MSG_OOB处理带外数据。此外可对这些标志中的每一个进行按位和运算。Recv函数返回实际接收到的字符数。
WSARecv函数在recv的基础上增加了一些新特性。比如说重叠I/O和部分数据报通知。WSARecv的定义如下:
Int WSARecv(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPSWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWsAOVERLAPPEd_COMPLEtion_ROUTINE lpComletionRoutine
);
其中第一个参数s与recv函数中s含义相同,其余个参数意义如下:
lpBuffers:指向WSABUF结构数组指针。每一个WSABUF结构包含一个缓冲区的指针和缓冲区的长度。
dwBufferCount:lpBuffers数组中WSABUF结构的数目。
lpNumberOfBytesRecvd:如果接收操作立即结束,则为指向本调用所接收的字节数的指针。
lpOverlapped:指向WSAOVERLAPPED结构的指针。
lpCompletionRoutine:指向接收操作结束后调用的例程的指针。
l recvfrom
          在无连接socker中与recv函数响应的是recvfrom,起定义如下:
          int recvfrom(
SOCKET s,
Char FAR*buf,
Int len,
Int flags,
Struct sockaddr FAR*from,
Int FAR*fromlen
);
recvfrom的前面4个参数和recv是一样的,其中包括标志MSG_OOB和MSG_PEEK。其后两个参数是返回参数,在调用结束后,被填入发送数据的那个工作站的地址和数据长度。Recvfrom也有winsock 2扩展版本WSARecvFrom,定义如下:
int WSARecvFrom(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
Struct sockaddr FAR*lpFrom,
LPINT lpFromlen,
LPWsAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpComletionRoutine
);
其中第一个参数s与recv函数中s 含义相同,其余参数意义如下:
lpBuffers:指向WSABUF结构数组的指针。每个WSAVUF结构包含缓冲区的指针和缓冲区的大小。
dwBufferCount: lpBuffers数组中WSABUF结构的数目。
lpNumberOfBytesRecvd:如果接收操作立即完成,则为指向所接收数据字节数的指针。
lpFlags:一个指向标志位的指针。
lpFrom:(可选)指针,指向重叠操作完成后存放资源的缓冲区。
lpFromlen:指向form缓冲区大小的指针,仅当指定了lpFrom才需要。
lpOverlapped:指向WSAOVERLAPPED结构的指针。
lpComletionRoutine:一个指向接收操作完成后调用的完成例程的指针。
l send
          要在建立连接的套接字上发送数据,第一个可用的API函数是send,其定义如下:
          int send(
SOCKET s,
Const char FAR*buf,
Int len,
Int flags
);
SOCKET函数是已建立连接的套接字,将在这个套接字上发送数据。第二个参数buf则是字符缓冲区,去内包含即将发送的数据。第三个参数len,指定即将发送的缓冲区内的字符数。最后flags可为0、MSG_DONTROUTE或MSG_OOB或对那些标志进行按位”或运算”的结果。
对返回值而言send返回发送的字节数;若发生错误,就返回SOCKET_ERROR。常见的错误是WSAECONNABORTED。这一错误一般发生在虚拟回路由于超时或协议有错而中断时。发生这种情况时应该关闭这个套接字,因为它不能再用了。远程主机上的应用通过执行强行关闭或意外中断操作重新设置虚拟虚路时,或远程主机重新启动时,发生的则是WSAECONNRESET错误。最后一个常见错误是WSAETIMEOUT,它发生在连接由于网络故障或远程连接系统异常死机而引起的连接中断时。
Send函数的Winsock 2版本是WSASend,起定义如下:
Int WSASend(
SOCKET s,
LPWSABUF lpBuffers,
DWORd dwBufferCount,
LPDWOrd lpNumberOfBytesSent,
Dword dwFlags,
LPWSAOVERLAPPed lpOverlapped,
LPWsAoverLAPPED_COMLETION_ROUTINE lpCompletionRoutime
);
除发送与接受意义外,WSASend个参数含义与WSARecv相应参数含义相似。
sendto
在无连接socket中与send函数相应的是sendto,其定义如下:
          int sendto(
SOCKET s,
Const char FAR*buf,
Int len,
Int flags,
Const struct sockaddr FAR*to,
Int tolen
);
其中前四个参数含义与send函数相同,后两个参数分别为指向目的套接口的地址结构指针和所指地址结构的长度。
Sendto函数的Winsock 2版本是WSASendto,其定义如下:
Int WSASendTo(
LPWSABUF lpBUffers,
DWORd dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
Const struct sockaddr FAR*lpTo,
Int iToLen,
LPWSAOVWELAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
除lpto和iToLen参数外,其他个蚕山眼意义与WSASend哈哈书类似
第 6 章 网络攻击—缓冲区溢出攻击
6.01  黑客攻击的手段
起初设计互联网的主要目的,是想用它来连接军方,大学和研究所的计算机,实现计算机资源的共享.因为用户都是军方的研究员和大学的科学家,所以,可以认为这些用户基本上都是可信任的,并没有设计太多的保密措施。限制用户的方法主要是通过输入用户名和密码,在登陆是验证。这些用户名和密码本身在传输过程中也没有加密,也就是说是按照明文传输的。现在互联网被民间的公司用来进行日常的经营活动,普通的老百姓也可以用它进行日常的信息交流。而在社会上,有行行色色的人,有写人可能会对互联网进行恶意的破坏,利用互联网非法获取信息或者破坏互联网上的信息。这时候原来的互联网就显的非常脆弱了,从各个层的协议到端口,漏洞非常多,当然黑客的攻击手段也很多。
  根据攻击的性质,严重程度,攻击目标,可以进行不同的分类。按照攻击性质,通常可以分成保守型(Passive Attack)攻击和进攻型(Aggressive Aattack)攻击。
                         黑客攻击手段及结果
 
 完  整  性 保  密  性 真  实  性 拒 绝 服 务   
威胁 篡改用户数据
特洛伊木马
修改内存
修改传输过程中的数据 网络窃听
盗窃服务器信息
盗窃网络配置信息
盗窃客户和服务器交流的信息 冒充合法用户
伪造数据 杀死用户进程
用假请求轰炸系统
把硬盘或内存占满
用Dns攻击孤立系统   
结果 丢失信息
系统破坏
容易受到其他攻击 丢失信息
暴露隐私 错误的用户
接受假消息 破坏
烦恼
用户无法完成工作   
措施 加密验证 加密 加密技术 很难防止 
1.端口扫描2.网络监听3.破译密码4.IP欺骗5.缓冲区溢出6.拒绝服务7.电子邮件攻击。等等是几种黑客常用的攻击手段,而缓冲区溢出是当前各个操作系统和各种应用软件广泛存在的漏洞,如果你去访问计算机紧急行动小组的网站http://www.cert.com并查出最近的安全漏洞公告,你会发现,从操作系统,守护程序到数据库系统,都存在缓冲区溢出漏洞。所以,目前大多数的攻击是针对缓冲区溢出的攻击。
6.02  缓冲区溢出的概念
  缓冲区溢出主要是由于程序设计错误引起的。下面我们先看一段C语言程序:
  Void function(char *str)
{  Char buffer[4];
   Strcpy(buffer,str);
}
   int main()
{  char large_string[256];
Int  i
for(i=0;i++;i<255)
     large_string[i]=’A’ ;
function(large_string);
}
这个程序是经典的缓冲区溢出程序。程序非常简单,Function函数需要传入一个字符串,这个字符串最长不能超过16个字符,但是在min中,给了一个很长的字符串,超出了buffer可以接受的范围,缓冲区溢出了。如果只是缓冲区溢出了不会出现安全威胁。问题是黑客会利用这个溢出,把他们要执行的代码放到返回的地方,使程序溢出后返回时,开始执行他的代码,获取root权限,从而控制整个计算机。所以,所谓的缓冲区溢出攻击,指的是利用可能溢出的程序,往它的缓冲区写入超长的内容,从而破坏程序堆栈,使程序转向执行一段特殊指令,从而达到攻击目的的攻击技术。
附录—参考文献
监听与隐藏—谭思亮,人民邮电出版社,2002.8
网络编程技巧与实例—贾斌等,人民邮电出版社,2001.11
黑客终结-网络安全解决方案—姚顾波等,电子工业出版社,2003.1
网络安全技术与应用大典—高勇强等,人民邮电出版社,2003.1
黑客攻防编程解析—潘志翔等,机械工业出版社,2003.6

你可能感兴趣的:(网络,socket,路由器,internet,tcp,服务器)