《《信息对抗技术》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《信息对抗技术》PPT课件.ppt(68页珍藏版)》请在三一办公上搜索。
1、信息对抗技术,韩 宏,入侵检测,入侵检测系统定义,入侵检测系统是通过诸如,数据审计,网络报文分析等手段,检测各种入侵行为,保证网络安全。英文是intrusion detection system(IDS)。,IDS的存在理由,网络防护中仅使用防火墙、访问控制、加解密技术并不能彻底解决安全问题。因为首先入侵者可寻找防火墙和访问控制背后敞开的后门;其次防火墙完全不能阻止内部袭击;第三,由于性能限制,防火墙通常不能提供实时入侵检测能力,而访问控制对取得根权限的入侵者束手无策。另外,加解密认证技术不能完全杜绝IP欺骗、重放攻击(replay attack)等入侵。特别对于危害十分严重的缓冲区溢出(bu
2、ffer overflow)攻击,以上传统技术均无有效防护措施。,IDS的历史,在80年代就开展了早期基础理论研究工作。随着计算机系统软、硬件飞速发展,以及网络技术、分布式计算、系统工程、人工智能等计算机新兴技术与理论的不断完善,入侵检测理论也在发展变化中,至今仍未形成比较成熟的理论体系,IDS的分类,根据检测原理可分为异常入侵检测,误用入侵检测。根据数据来源和系统结构可分为基于主机的入侵检测和基于网络的入侵检测和分布式入侵检测。,误用入侵检测,或称为基于特征的入侵检测系统(Signature-based IDS)必须从一个或多个网络数据包或审计数据中提取出特定模式。如果这些模式与已知入侵模式
3、匹配,系统就能检测出攻击,因此它只能鉴别已知模式,不能检测新型攻击。同时,对特征错误理解将产生误报。获取特征有多种方法,包括手工提取特征和用传感器自动学习等。,Snort是误用入侵检测的代表,网站:该软件是开源软件。其基本原理是将网卡设定为混杂模式,然后监听网络上的报文,并将报文和用户自定义的规则进行比较,如果满足规则,则会根据用户要求将该次匹配命中的事件纪录到日志。,一个简单的规则如下:alert tcp any any-any 7026(msg:“glacier”).这条规则的意思是:凡是从任何机器的任何端口到任何机器的7026端口的tcp访问,就纪录下来,而纪录的名字为glacier.因
4、为后门冰河的缺省端口实7026所以满足该规则的就可能是冰河,纪录下来的日志具有如下格式:*1:0:0 glacier*Priority:0 02/14-09:32:25.367646 202.115.14.1 11123-202.115.14.147 7026TCP TTL:255 TOS:0 x0 ID:46482 IpLen:20 DgmLen:60,Snort的规则中还有一个重要的选项,就是content,它指出如果报文中包含指定的字符串就告警。alert tcp any any-any any(content:“hell”).比如上面的规则就表明,如果报文中包含hell字符串就告警。,
5、很明显,snort的准确率依赖规则的准确性,更为重要的是,其判断依据往往会造成虚假告警或遗漏。Snort也对其加以改进。比如,它增加了一中规则叫动态规则,就是,当一个规则满足后,检测另外一条规则。这里有一定专家系统的影子。,Snort在网络抓包方面,使用了一种libpcap库,这是unix上的一个抓包库,再linux和windows上都有相关的版本,windows上叫winpcap。可以在winpcap网站上下载到相关软件。,异常入侵检测,基于异常的入侵检测系统(Anomaly-based IDS),其思路如下:正常系统有一“正常基准”,如CPU利用率、磁盘活动、用户注册、文件活动等等。一旦偏
6、离这一“正常基准”,检测系统将触发。基于异常检测的主要优点是能识别新型攻击。但正常操作产生变化时会导致误报,而入侵行为表现为正常又将导致漏报,且系统很难确定攻击类型。,检测用户行为模式是一种异常入侵检测。H.S.Javitz and A.Valdes.The SRI IDES statistical anomaly detector.In Proceedings of the 1991 IEEE Symposium on Security and Privacy,pages 316C326,Oakland,California,May 20C22,1991.IEEE Computer Soci
7、ety Press.,基于系统调用序列的免疫系统,该系统认为,对任何系统而言,存在一个基因库,该库中的基因是如下定义的:即一组系统调用序列,比如长度为45个系统调用。例如:socketbindlistenaccept.就是一个基因。通过在正常无攻击环境下运行一个网络服务程序,可以得到其基因库。然后在检测时,比较这些库,如果基因出现偏差,就意味着异常或攻击发生。,参见相关文章Stephanie Forrest,Steven Hofmeyer,A sense of self for UNXI processes.In Proceedings of the 1996 IEEE Symposium o
8、n Security and Privacy.1996.Steven A.Hofmeyr,Stephanie Forrest,Intrusion Detection using Sequences of System Calls,Journal of Computer Security 1998.,按IDS结构分类,基于主机的入侵检测系统 基于主机的入侵检测系统历史最久,多用户计算机系统出现不久已有雏形。最早用于审计用户的活动,比如用户的登陆、命令操作、应用程序使用资源情况等方面。此类系统一般使用操作系统的审计日志作为输入,某些也会主动与主机系统交互获得其它信息。收集的信息集中在系统调用和应用
9、层审计上,试图从日志记录中判断出滥用和入侵事件的线索。典型的有NIDES和NetStat,基于网络的入侵检测系统 由于来自网络的攻击事件逐渐成为信息系统的最大威胁,因而基于网络的入侵检测系统具有重要价值。基于网络的入侵检测系统监听网络原始流量,通过线路监听手段对捕获的网络报文进行处理,从中获取有用的信息。基于网络的入侵检测系统通过流量分析提取特征模式,与已知攻击特征匹配或与正常网络行为原型比较识别出攻击事件,如Snort、Bro。与基于主机的入侵检测不同,基于网络的IDS更适用于检测系统应用层以下的底层攻击事件,混合分布式入侵检测系统 合分布式入侵检测系统能从不同的主机、网络组件、或通过网络监
10、听方式收集数据,系统可利用网络数据也可收集分析来自主机系统的高层事件发现可疑行为。,掌握libpcap,掌握libpcap可以为我们自主开发基于网络的入侵检测提供方便。,主要内容:一、Winpcap使用介绍 二、面象对象对Winpcap的封装。,一、Winpcap介绍,Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个free and open source的项目。Winp-cap工作于驱动(Driver)层,所以能以很高的效率进行网络操作。一、Winpcap提供了以下强大的功能:1捕获原始的数据包 见源码:CapturePacket 2设置filter,只捕获自
11、己感兴趣的数据包,3方便的把捕获的数据包输出到文件和从文件输入 见源码:DumpToFile4发送原始的数据包 见源码 SendPacket5统计网络流量 见源码:DisplayStatus,二、Winpcap的安装使用方法,1到http:/下载winpcap的安装包,程序员开发包。2执行安装包,运行winpcap 程序3解压开发包,在VC的option的include和lib中加 入winpcap的include和lib,4.在你的程序中加入#include,#include.然后在工程的setting中加入预定义宏:WPCAP,HAV E_REMOTE.导入wpcap.lib,wsock3
12、2.lib库5编写wpcap程序,三、Winpcap的一些基本的功能的实现,(一)捕获数据包 1、.枚举所有的可用的设备pcap_findalldevs_ex(可选)2.通过名字打开一个设备pcap_open()3、在这里可以打开一个文件,只是在打开这个文 件之前需要通过pcap_createsrcstr创建相应的name string 4、设置Filterpcap_compile,pcap_setfilter(可选)5、捕获数据,有几种捕获数据的方法(捕获数据的数据都是最原始的数 据包,即包含数据链路层的数据头)a 是以回调的方式 pcap_loop,pcap_dispatch().这两种方
13、法基本相同,底层收集数据包,当满足一定的条件(timeout 或者缓冲区满),就会调用回调函数,把收集到 的原始数据包s,交给用户。他们返回的数据缓冲区包含多个包 例子见:CapturePacketb.pcap_next_ex()的方式每当一个包到到达以后,pcap_next_ex就会返回,返回的数据缓冲区里只包含一个包。,(二)发送数据包,Winpcap中有发送单个包和发送多个包的方法。这里只说说发送单个包1 通过名字打开一个设备pcap_open2 自己构造一个原始数据包(这个数据包会不经过任何处理就发送出去,所以必须把包中的各个字段设置好。另外这个数据包是包含数据链路层报头的)3 使用p
14、cap_sendpacket()发送数据包见源码SendPacket工程,(三)统计网络流量,通过名字打开一个设备pcap_open通过 read_timeout来设置统计的时间间隔 设置filterpcap_compile,pcap_setfilter(可选)设置设备的为统计模式 pcap_setmode(MODE _STAT);4.开始统计,pcap_loop/pcap_dispatch()5在回调函数中的参数中就包含了统计信息,/下面是一个应用winpcap写的一个网络流量统计的例子,也可参见 源码DisplayStatus工程/nettraffic.cpp:Defines the en
15、try point for the console/application.#include stdafx.h#include#include#include#include,using namespace std;/-/-void dispatcher_handler(u_char*user_data,const struct pcap_pkthdr*pkthdr,const u_char*pktdata);/-int main(int argc,char*argv)int i;pcap_if_t*alldevs;,pcap_if_t*dev;char errorbufPCAP_ERRBUF
16、_SIZE;int choice;pcap_t*stathandle;WSADATA wsadata;struct timeval timestamp;if(WSAStartup(MAKEWORD(2,2),/enum all deviceif(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,for(i=0,dev=alldevs;dev!=NULL;dev=dev-next)coutnameendl;if(i=0)WSACleanup();cerrno device found!endl;return(-2);,/let user choicewhil
17、e(1)coutchoice;if(choice=1,/move to the choosen devicefor(i=0,dev=alldevs;inext);if(stathandle=pcap_open(dev-name,100,PCAP_OPENFLAG_PROMISCUOUS,500,NULL,errorbuf)=NULL)cerrname errorbufendl;,pcap_freealldevs(alldevs);WSACleanup();return(-3);coutname.endl;pcap_freealldevs(alldevs);,pcap_setmode(stath
18、andle,MODE_STAT);timestamp.tv_sec=0;timestamp.tv_usec=0;pcap_loop(stathandle,0,dispatcher_handler,(unsigned char*),/-void dispatcher_handler(u_char*user_data,const struct pcap_pkthdr*pkthdr,const u_char*pktdata)static struct timeval tstamp=*(struct timeval*)user_data);LARGE_INTEGER Bps,Pps;unsigned
19、long delay;char strtime32;delay=(pkthdr-ts.tv_sec-tstamp.tv_sec)*1000000 tstam p.tv_usec+pkthdr-ts.tv_usec;Pps.QuadPart=(*(LONGLONG*)(pktdata)*1000000)/delay;Bps.QuadPart=(*(LONGLONG*)(pktdata+8)*1000000)/delay;,struct tm*ltime=localtime(,二、面象对象对Winpcap的封装,1、封装的原因:Winpcap提供的是C函数,是面向过程的 对包进行协议解析。2、封装
20、的目标:使对Winpcap的操作类似于对文件的操作。register,open,close,3、封装的申明,class CCapture private:pcap_t*adhandle;char buff1536;CCapCallback*PCallbackObject;pcap_t*Open(int);int GetPackets(pcap_t*adhandle,char*pbuf,int len,int packetcount,int,class CCapCallbackprivate:public:CCapCallback();CCapCallback();virtual HandleP
21、acket(char*buff,int len);,/这个文件包括两个类的实现 CCapture CCapCallback/*说明:CCapCallback是一个纯虚类,不能直接使用,必须继/*承后才能使用,CCapCallback 作为类CCapture 的接口类,*/#include stdafx.h#include WCapDll.hpcap_t*adhandle;struct tm*ltime;char timestr16;struct pcap_pkthdr*header;const u_char*pkt_data;int res;export_packet recvpacket;i
22、nt decode_iph(pexport_packet packet);int decode_eth(char*buff,const unsigned char*packetbuf,int len);,/以下是CCapture 类的实现/CCapture:CCapture()CCapture:CCapture()int CCapture:CapRegister(CCapCallback*PCbObject)if(PCbObject)PCallbackObject=PCbObject;return 0;elsereturn-1;,int CCapture:CapOpen(int NIC)int
23、 result;int RealBytes;adhandle=Open(NIC);if(adhandle=NULL)return-1;while(1)result=GetPackets(adhandle,buff,1536,1,RealBytes);PCallbackObject-HandlePacket(buff,RealBytes);if(result!=1)break;return-1;,int CCapture:CapClose()int res=0;res=Close(adhandle);return res;,pcap_t*CCapture:Open(int nic)/static
24、 pcap_t*adhandle;pcap_if_t*alldevs;pcap_if_t*d;int i=0;int NicTotal=0;char errbufPCAP_ERRBUF_SIZE;/*Retrieve the device list from the local machine*/if(pcap_findalldevs(,/*Print the list*/for(d=alldevs;d!=NULL;d=d-next)NicTotal+;/check the paramer if(nicNicTotal-1)|(NicTotal=0)return NULL;for(d=alld
25、evs,i=0;inext,i+);,/*Open the device*/if(adhandle=pcap_open_live(d-name,/name of/the device8000,/portion of the packet to capture/65536 guarantees that the whole packet will be/captured on all the link layers1,/promiscuous mode1000,/read timeout errbuf/error buffer)=NULL)fprintf(stderr,nUnable to op
26、en the adapter.%s is not supported by WinPcapn,d-name);/*Free the device list*/pcap_freealldevs(alldevs);return NULL;,/*We dont need any more the device list.Free it*/pcap_freealldevs(alldevs);/MessageBox(NULL,this is a test,example,MB_OK);#ifdef DEBUG printf(%sn,open succeed);#endifreturn adhandle;
27、,int CCapture:GetPackets(pcap_t*adhandle,char*pbuf,int len,int packetcount,int while(res=pcap_next_ex(adhandle,&header,&pkt_data)=0),if(res=0)continue;/36 reference to the size of the ethernet_frameif(retainlen=(header-len+36)/resolve the packetdecode_eth(pbuf,pkt_data,header-len);/decide whether to
28、 receive the next packetpbuf+=(sizeof(export_packet)+header-len);count+;,RealLen+=header-len+36;retainlen-=(sizeof(export_packet)+header-len);if(retainlen=36)#ifdef DEBUGprintf(%sn,memory size less than 36 and exit);#endifreturn count;,if(retainlenlen+36)#ifdef DEBUGprintf(%sn,retainlen len+36 and e
29、xit);#endifreturn count;if(count=packetcount)#ifdef DEBUGprintf(%sn,the count required have enough);#endifreturn count;,else if(retainlenlen+36)/at first/the buff is not enough to load a packet#ifdef DEBUGprintf(%sn,retainlen less than(header-len+36)bytes and exit);#endifreturn count;if(res=-1)#ifde
30、f DEBUG printf(Error reading the packets:%sn,pcap_geterr(adhandle);#endif return-1;return count;,int decode_eth(char*buff,const unsigned char*packetbuf,int len)export_packet*temp;memcpy(buff+36),packetbuf,len);temp=(export_packet*)buff;temp-buffer=buff+36;temp-totallen=len+36;temp-pethheader=(ethern
31、et_frame*)(buff+36);ethernet_frame*tef=(ethernet_frame*)packetbuf;if(tef-h_type=0 x08&tef-l_type=0 x00),#ifdef DEBUGprintf(this is a IP packetn);#endiftemp-pipheader=(ip_header*)(temp-buffer+14);#ifdef DEBUGprintf(n%d.%d.%d.%d-%d.%d.%d.%dn,temp-pipheader-saddr.byte1,temp-pipheader-saddr.byte2,temp-p
32、ipheader-saddr.byte3,temp-pipheader-saddr.byte4,temp-pipheader-daddr.byte1,temp-pipheader-daddr.byte2,temp-pipheader-daddr.byte3,temp-pipheader-daddr.byte4);#endif,decode_iph(temp);if(tef-h_type=0 x08,if(tef-h_type=0 x80,int decode_iph(pexport_packet packet)pip_header tempip;tempip=packet-pipheader;
33、int ip_len=(tempip-ver_ihl,case IPPROTO_UDP:/udp protocalpacket-pudpheader=(udp_header*)(packet-pipheader+ip_len);/printf(udp Sport:%d t Dport%dn,packet-pudpheader-sport,packet-pudpheader-dport);#ifdef DEBUGprintf(%sn,udp packet);#endifbreak;case IPPROTO_ICMP:/icmp protocal packet-picmpheader=(icmp_
34、header*)(packet-pipheader+ip_len);#ifdef DEBUG printf(%sn,icmp packet);#endif break;,case IPPROTO_IGMP:/igmp protocal packet-pigmpheader=(igmp_header*)(packet-pipheader+ip_len);#ifdef DEBUG printf(%sn,igmp packet);#endif break;default:#ifdef DEBUG printf(%sn,do not resolve the ip packet);#endif;return 1;,nt CCapture:Close(pcap_t*handle)if(handle!=NULL)pcap_close(handle);return 0;,/以下是CCapCallback类的实现文件/CCapCallback:CCapCallback()CCapCallback:CCapCallback(),PortScanKicker 检测网络扫描。,