文章作者:fleshwound(
fleshwound@126.com)
信息来源:邪恶八进制信息安全团队(
www.eviloctal.com)
本文首发安全焦点xfocus论坛 后由作者友情提交至邪恶八进制信息安全团队论坛
0引言:
网络监听与过滤技术是网络入侵的核心技术,也是网络安全协议技术的一个基础技术。监听技术最初是为了提供给系统管理员用的,主要是对网络的状态和信息流动和信息内容等进行监视,相应的工具被称为网络分析仪。但是,技术是把双刃剑,网络监听和过滤也成了黑客使用最多的技术,主要用于监视他人的网络状态、攻击网络协议、窃取敏感信息等。另外,网络监听也有好的重要应用,在PPDR模型中,最基本的要求就是能够实现网络监听与过滤,所有的部分(安全策略、防护、检测、响应)都建立在此上。
1最简单的监听程序包括:
内核部分:负责从网络中捕获和过滤数据。(Libcap/winpcap就是干这个的!)
用户分析部分:负责界面、数据转化与处理、格式化、协议分析,如果在内核没有过滤的话,在这里还要对数据进行过滤。一个简单的模型如图1所示:
2 如何进行包捕获
常用的方法有两种:
(1) 通过设置硬路由器的监听端口;(涉及硬件,不具体谈!)
(2) 利用以太网络的广播特性,这种方式必须将网卡设置为混杂(promiscuous)模式.监听程序工作在网络环境的底三层,可以拦截所有经过该机器的网络上传送的数据,然后将这些数据做相应处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。操作系统所提供的分组捕获机制主要有以下三种:(1)数据链路提供者接口DLPI(Data Link Provider Interface);(2)Linux的SOCK_PACKET类型套接口;(3)伯克利数据包过滤器BPF(Berkeley Packet Filter).不同的系统可以使用不同的捕获和过滤链路层的数据包,例如UNIX系统采用BPF(BSD分组过滤器,设置感觉象汇编语言),LINUX系统使用SOCKET_PACKET接口,WINDOWS使用VXD。但是Libcap(winpcap是其windows版本)可以提供与平台无关的接口,而且操作简单,它是基于改进的BPF(Berkeley Packet Filter),该软件来自与Berkeley Lawrence National Laboratory研究院。
3 如何进行包过滤与分解
捕获数据包后要进行的工作是对其进行包过滤与分解,用通俗的语言表达就是在海量的数据里面找我们感兴趣的内容。关于此部分的研究很多,仁者见人,智者见智。不好的的过滤程序会导致数据包丢失、来不及分析,严重的影响系统的工作效率。一些基础的过滤规则如下:
(1) 站过滤:专门筛选出来自一台主机或者服务器的数据;
(2) 协议过滤:根据不同的协议来筛选数据,例如:选择TCP数据而非UDP数据;
(3) 服务过滤:根据端口号来选择特定数据包;
(4) 通用过滤:通过数据包中某一特定位置(偏移处)的16进度(或2进制)选择数据包;
大部分情况下,我们的过滤规则是上面基本规则的组合。有时,如果不想自己的缓冲区被一些莫名其妙的无效数据溢出,我们必须在捕获前进行粗过滤,然后在捕获后再进行一次过滤,,然后再进行分析。
过滤完成后,为了使得我们的缓冲区能处理的包更多,我们必须进行包分解(Slice),因为数据包最关键的部分在数据包的头部。即使要分析整个包,包分解的过程还是要的,不过我们得记住包的原始长度。关于包的过滤和分解,完全可以做出非常有深度的博士论文出来,如果大家对BPF原理和BPF虚拟机包的过滤和分解的原理感兴趣,可参考《TCP/IP协议详解卷2:实现》。
4 数据采集与数据分析
该部分主要根据你自己到底想干什么。
5 Libpcap/Winpcap的一些问题
winpcap是Libpcap 的windows版本,linux用户请使用Libpcap,Windows用户请使用winpcap(UNIX我也没用过,不知道用什么!),在windows底下会去,在linux底下应该也会用。关于具体如何使用请参考XFOCUS的《循序渐进学习使用wincap》系列文章,另外还有一些其它的代码。这里我们主要讲的是其它的问题。
使用winpcap包是件非常愉快的事情(我常用来分析密码协议,要实现协议攻击必须使用它!),原因有以下2点:
(1) Libpcap源代码逻辑结构非常清晰,让我们来看看他们是怎么组织的:
<1>. 初始化:打开设备、读取设备,设置过滤器部分。这部分主要的函数如下:pcap_read(),pcap_open_live(),pcap_setfilter().在源代码中是以pcap-*.c方式出现。
<2>.过滤规则表达式的处理:编译、优化、调试(该部分过滤机制采用的是伪主机技术),如果各位能够有幸熟悉BPF程序的编码规则,甚至可以修改其中代码。这部分代码在:
gencode.c,grammar.c,scanner.c,optimize.c,这一部分代码的工作方式是通过将我们输入的过滤规则表达式编译成BPF代码,然后存在一个名为bpf_program的结构中,最后,利用pcap_setfilter来加载.
<3>.本机网络设置部分:这部分是通过获取socket的状态,来检测TCP/IP层网络设置。主要函数有:pcap_lookupdev()、pcap_lookupnet()等,这部分代码在inet.c中。
<4>.其他部分:在pcap.c中定义了读数据的对外统一接口pcap_next()获取下一个数据包,获取当前错误信息的pcap_geterr()等函数.另外,Libcap还支持脱机方式监听,在savefile.c中,有两个函数:pcap_open_offline()和pcap_offline_read().
(2) 基于libcap库的基本使用流程比较规范,一般为:
pcap_lookupdev 获取设备->pcap_lookupnet获取网络地址和子网掩码->
pcap_open_live:打开设备->pcap_complile编译过滤规则->pcap_setfilter设置过滤规则->pcap_loop循环捕获数据包,在其中调用相应处理函数->pcap_close关闭设备句柄.