摘 要:本文通过研究用来传递电子邮件的SMTP协议的会话过程和基本原理,引入Libnids网络开发包作为工具,捕获局域网的数据包并进行协议还原和协议分析,从而为邮件内容还原打下基础,以实现系统安全性的提升。
关键词:SMTP;电子邮件;内容解析
1引言
电子邮件虽然方便、快捷,但在安全性方面有一些固有的弱点,容易导致企业的商业机密泄漏,造成不必要的损失。为了提升系统安全性,亟需构建一个网络监控系统,监视从局域网传出的机密文件和资料。本文通过研究用来传递电子邮件的SMTP协议的会话过程和基本原理,引入Libnids网络开发包作为工具,捕获局域网的数据包并进行协议还原和协议分析,为邮件内容还原打下基础,从而减少网络安全事件的发生。
2系统基本原理概述
目前,运用比较广泛的电子邮件协议包括SMTP协议, POP3协议以及 IMAP4协议,这几类协议都包含在TCP/IP协议簇中,电子邮件在网络上传输前,必须被封装成帧的形式。数据包的封装过程中,被应用程序所接收的数据包包含两方面的内容,一是邮件本身,二是来自应用层以下的各个层次的数据包头信息。本文的实现原理是以Libnids和网络开发函数库来完成数据包的捕获。
3 SMTP数据包的分析与还原
3.1 SMTP数据包的捕获
(1)捕获数据包的流程
本文基于Libnids进行数据包的捕获,主要流程为:
①获取本地网络接口列表;
②打开网络接口,将其设置为混杂模式;
③调用函数nids init()进行Libnids的初始化;
④调用函数void nids_register tcp(void(*))注册回调函数;
⑤调用函数nids run()循环捕获数据包;
⑥判断是否是25号端口,如果是,则分析SMTP协议,实现邮件内容重现,否则丢弃数据包;
⑦释放缓冲区。
在应用程序中,主函数的实现形式为:
(2)获得网络接口列表
本系统调用WinPcap开发包里的接口函数实现对网卡的设置,因此先安装WinPcap。通过调用pcap_findalldevs()函数,搜寻终端中能用的所有网络接口。在屏幕上显示出获取的网卡列表,进而选择要使用的网卡。向nids_prm数据结构中的device指针变量传递所获取的网卡名称。
(3)网卡模式设置
在捕获到局域网内传送的所有数据包之后,才能实现邮件的重现,本文通过设置网卡的工作模式来实现这个功能。通过设置网卡为混杂模式来实现局域网内传送的所有数据包的捕获。下面阐述这种做法的原因。
捕获数据包时,网卡不同的工作模式实现不一样的的功能。在网卡的正常模式下,接收到一个数据帧,检查其目的地址。由于只对目标地址是“广播地址”的数据帧和与本地物理地址相同的数据帧做出响应,无法捕获目的地是其它主机的数据帧。因此必须把网卡设为“混杂模式”,在这种模式下,该网卡每接收到一个帧,都产生中断,将包含的数据传送给上层处理,因此能够捕获到流经网卡的数据。
(4)打开网络接口
在得到了网卡的列表后,打开所选择的网络接口就能够捕获数据包。通过pcap_open live()来实现打开网卡的功能是,此函数设置了网卡参数。其函数原型定义为:
Pcap_ t *pcap_ open_live(char *device,int snaplen,int promise,int to_ms,char *ebufJ
其中由promise表示打开模式,默认设置网卡为混杂模式。
(5)系统初始化
通过实现Libnids初始化,能够避免不少参数设置的工作。对函数nids_init()进行调用并初始化后,设置过滤规则为NULL,意即对所有的数据包进行捕获;将网卡模式设置为混杂模式。此外还包括一些文件的初始化设置等。如果函数调用失败就返回0,成功就返回1。
(6)捕获数据包
网络数据包捕获技术是网络安全系统实现其他功能的基础,其最重要的条件是接收网络上所有的数据包,保证局域网内每个数据包都流过本主机的网卡是捕包的首要条件。
通常,数据包的传输会依次经过网卡、驱动层、链路层、IP层与传输层、到达应用层。通过在链路层增加一个旁路处理,来实现包捕获机制,通过过滤、缓冲捕获的数据包,传递到应用程序。本系统循环捕获网络数据包的功能是通过调用Libnids的捕获函数void nids_run(void)来实现的。系统运行时,调用pcap_loop()实现数据包捕获,pcap_loop()函数能够循环捕获网络数据包,直到遇到退出条件或错误为止。
(7)过滤数据包
本文的设计是在操作系统内核层实现捕获数据包和过滤数据包的,使用过滤函数pcap_setfilter()和pcap_compile()来过滤数据包。
pcap_ compile()函数的功能是进行过滤规则编译。过滤规则是一个由标识和修饰词组成的字符串。由修饰符和标识组成的原语构成了具体的过滤规则。
修饰词分为三种类别:方向,类型和协议。方向修饰符能够指定数据的具体传输方向,类型修饰词能够表示标识的具体种类,协议修饰符表示数据包使用的协议类型。实现本系统时,按协议类型进行设置过滤规则。因此选择的设置方式为:dst port 25,指的是对目的端口是25的所有数据包进行捕获。
(8)释放缓冲区
捕获数据包完成之后,通过调用pcap_freealldevs(alldevs)函数,将存在于网络接口链表中的所有网络接口进行释放,从而清空其占用的内存资源。
3.2电子邮件的解析
(1)TCP数据流重组
应该注册一个回调函数来接收到一个TCP流中交换的数据。本文实现TCP流重组的函数原型如下:
nids_register_tcp(smtp_protocol_callback)
函数中,smtp_protocol_callback指的是回调函数。
(2)邮件解析的实现
应用程序接收的数据包在包含邮件本身内容的同时,还包括各个层次的数据包头信息。通过解封数据包,就能还原出邮件的数据。
邮件内容的重现则需要重组还原出来的SMTP数据。为保证了数据传输的可靠性和完整性,本文利用Libnids的TCP数据流重组功能来解决TCP数据流的乱序问题、重叠问题以及重传问题。借助TCP数据流重组功能能够显示基于TCP协议的任何应用层协议,对数据进行分析并实现TCP连接。结合SMTP的会话过程解析数据包,得到想要的信息。下面是电子邮件的解析过程:
①调用回调函数void_smtp_protocol_callback (struct tcp_stream *ns,void **param)
②获取客户端和服务器端的连接状态;
③获取SMTP客户端接收到的数据;
④获取SMTP服务器接收到的数据;
⑤分析SMTP协议,从获取的数据中解析邮件内容;
⑥SMTP客户端和SMTP发送端连接关闭。
4结束语
在本文所研究的电子邮件解析的基础上,可以进一步利用Base 64的解码功能将经过解析的邮件还原成具体的字符,以实现系统安全性的提升。本系统的开发可以保证网络中受到监听的电子邮件全部处于可控范围内,不会发生漏包的现象,增强了局域网的安全。
参考文献:
[1]牛晓蕾.基于TCP/IP协议的安全即时通信系统设计与实现[D]. 西安电子科技大学,西安:2007.
[2]Kenneth D. Reed著,孙坦等译.协议分析[M].北京:电子工业出版社, 2010.10.