随着计算机网络技术的高速发展,网络正日益成为政治、经济、文化、生活中不可缺少的一部分.在它给人们的生活、学习、工作带来前所未有的方便和机遇的同时,由于网络自身固有的不安全性,网络安全问题也越来越引起人们的关注.所谓网络监听,即将网络上传输的数据捕获并进行分析的行为.网络监听在协助网络管理员监测网络传输数据,排除网络故障等方面具有十分重要的作用.然而,网络监听也给网络的安全带来了极大的隐患,许多的网络入侵往往都伴随着以太网内网络监听行为,从而造成口令失窃,敏感数据被截获等连锁性安全代写论文
2 网络监听的原理运行网络监听程序的主机要实现网络监听必须满足两个条件:其一,是该主机的网卡必须工作在混杂模式下;其二,是传输的数据包能够到达该主机.根据连接的网络设备不同,以太网分为共享式以太网和交换式以太网.
2.1 共享式以太网在共享式以太网中,由于是基于广播的方式来发送数据的,所以数包会被发送到连在一起的所有的主机(图1所示).因此,只要运行了网络监听程序的主机的网卡处在混杂模式下就可以实施网络监听了.所以,在共享式以太网中实施网络监听还是很容易的.2.2 交换式以太网在交换式以太网中使用交换机,交换机工作在数据链路层,工作时维护着一张mac地址与交换机端口的映射表.当有数据报发送到交换机上时,交换机会将数据报的目的mac地址与自己维护的表内的端口对照,然后将数据报发送到相应端口上.所以,即使监听主机的网卡设置成混杂模式,也不能接收到传给其他主机的数据帧.因此,在交换式网络中实施网络监听的关键,就是要使发送给其他主机的数据帧能够到达运行了网络监听程序的主机.在交换式以太网中最常见的方式是利用arp欺骗的中间人攻击的方式实施网络监听.2.2.1 arp欺骗原理 局域网内部的主机根据mac地址进行通讯.arp(地址解析)协议是将32位ip到以太网的48位物理地址(mac地址),以便将报文封装成帧发送.如果源主机的arp表没有目的ip和目的mac的映射,则通过广播的方式发送arp请求.只有具有此目的ip的主机才会对这个广arp请求作出反应,向源主机发送一个包含其mac地址的arp应答报文.arp协议是一个无状态的协议.一旦收到arp应答就会对其高速缓存中存放的ip地址到物理地址映射记录进行更新,而不会关心之前是否发出过arp请求.arp欺骗的核心就是向目标主机发送一个含伪造的ip-mac映射信息的arp应答报文.当目的主机收到此应答报文后就会更新其arp高速缓存,从而使目标主机将报文发送给错误的对象.2.2.2 利用中间人攻击进行监听的原理 利用arp欺骗进行监听其实就是要实现中间人攻击,它是利用arp欺骗进行攻击的主要方式之一.其原理是使进行监听的主机插入到被监听主机与其它网络主机之间,使进行监听的主机成为被监听主机与其它网络主机通信的中继.在这种情况下,其他网络主机发往被监听主机的信息和被监听主机发往其他网络主机的信息都必须经过进行网络监听的主机.这样,进行网络监听的主机就很容易对被监听主机进行网络监听了.如图2所示,c为进行网络监听的主机,a为被监听主机,b为网络中的任一其他(1) c向a发送arp应答报文,a修改arp高速缓冲,使b的ip地址与c的mac地址相对应,即形成ip 192.168.0.2~mac 03:03:03:03的映射;2)同理,c向b发送arp应答报文,使a的ip地址与c的mac地址相对应,即ip 192.168.0.1~mac 03:03:03:03;(3)这时,如果a向b发送信息,根据a高速缓冲中的ip-mac映射,信息实际上是被发送到了c,再由c转发到b;同理,从b发送到a的信息也将会被c转发一次.此时,a与b之间的通信已经被c完全监控.如果运行了网络监听程序的主机c的网卡又工作在混杂模式下,那么,主机c就满足了前面所提到的实现网络监听的两个条件,可以对a与b间的通信进行监听了.
3 利用arp欺骗的网络监听实现的程序设计
3.1 程序总体设计程序的总体设计思想就是:首先要实现中间人攻击,使实施监听主机成为被监听主机之间的中继,然后分析接收到的数据包,根据自行约定的标志确定监听的开始,再根据用户的需要对监听到的数据包作出相应的操作.因此,该程序需要实现的主要功能有两个:(1)根据中间人攻击原理实现arp欺骗;(2)处理接收到的数据包,根据用户的输入,完成相应的功能.分别建立函数arpcheatapplication和使用带参数的main函数作为主函数.主函数的功能主要是初始化网卡以及一些全局变量,并使用函数createthread来建立新线程,实现对arpcheatapplication等子函数的调用,完成相应的功能.main的算法如下:int main(int argc, char **argv) //带参数的main函数{
声明部分,定义变量;
if (argc! =3) return 0; //参数输入错误,返回0
//取得参数
serversideip<--inet_addr(argv[1]); //第二个命令行参数代表server端的ip
clientsideip<--inet_addr(argv[2]); //第三个命令行参数代表client端的ip
使用initadapter函数初始化网卡;
使用自定义函数getmacaddr函数取得server端和client端的mac地址;
//使用createthread函数生成实现arp欺骗的新线程
i=1;
createthread(null, 0, arpcheatapplication, &i, 0, 0); //实现对server端的arp欺骗
i=2;
createthread(null, 0, arpcheatapplication, &i, 0, 0); //实现对client端的arp欺骗
//使用createthread函数生成处理接收到的数据包的新线程
createthread(0, 0, analysepacketsapplication, null, 0, 0);
//使用createthread函数生成处理用户输入的新线程
createthread(0, 0, customerapplication, null, 0, 0);
.......//其他所需的操作
使用packetfreepacket和packetcloseadapter函数释放资源;
return 0;
}
上面算法中使用到的getmacaddr函数是一个自定义的用来根据目标ip获得相应mac地址的函
,其代码如下:
bool getmacaddr(dword destip, char *pmac)
{
dword dwret;
ulong ullen = 6, pulmac[2];
dwret = sendarp(destip, 0, pulmac, &ullen); //调用sdk函数来获取目标ip的mac地址
if(dwret == no_error) //判断是否找到了目标ip相应的mac
{
memcpy(pmac, pulmac, 6);
return true;
}
else return false; //如果没有找到目标ip相应的mac,则返回false
}
.2 主要函数分析
3.2.1 dword winapi arpcheatapplicatio (lpvoid lptype) 此函数的功能是实施arp欺骗.由前
面对图2中间人攻击的分析可知,函数arpcheatapplication要实现的功能有两个(如图2,假定a为
serverside,b为clientside):①c告诉serverside,clientside的mac是ownmac;②c告诉clientside,
serverside的mac是ownmac.函数arpcheatapplication的流程图如图3所示.
716四川大学学报(自然科学版) 第42卷
图3 arpcheatapplication流程图
fig.3 arpcheatapplication flow chart
3.2.2 dword winapi analysepacketsapplication(lpvoid lp) 此函数的功能是处理收到的数据包,
通过筛选只分析不属于自己的tcp包,然后根据用户的输入,完成各种功能.其流程如图4所示.
图4 analysepacketsapplication流程图
fig.4 analysepacketsapplication flow chart
对图4有:
(1)对接收到的数据包需要进行以下筛选,其中continue代表跳出当前的数据包筛选,重新读入新数
据包进行筛选.
//不处理监听主机本身发送和转发的数据包
if(memcmp(tcppacket->ehhdr.sourcemac, ownmac, 6) == 0) continue;
//不处理目的ip为监听主机本身的数据包
for(i=0; i<totalip; i++) //totalip为监听主机所拥有的所有ip数目
if(tcppacket->iphdr.destip == ownip[i]) break; //判断目的ip是否为监听主机的某一ip
717第4期 向昕等:基于arp欺骗的网络监听原理及实现
if(i ! = totalip) continue;
//检查是否ip包,以太网首部中ip包的类型代码为十六进制的0800
if(tcppacket->ehhdr.ethernettype ! = htons(0x0800)) continue;
//检查是否tcp包
if(tcppacket->iphdr.proto ! = ipproto_tcp) continue;
(2)设置开始劫持的标志有多种选择,在这里假设捕获到一个从clientside -> serverside的纯ack
后才开始劫持,即检查tcp首部中的6个标志位是否为010000,函数isackpacket就是用来判断一个
据包是不是只有ack标志的,代码如下:
bool isackpacket(unsigned char flag) //flag代表tcp首部的标志位
{
int i, j=1;
for(i=0 ; i<4; i++)
{
if(flag & j) return false; //判断标志位低4位是否为1,有为1的,则返回false
j <<= 1;
}
if(! (flag & 0x10)) return false; //判断ack位是否为0,为0则返回false
if(flag & 0x20) return false; //判断最高位标志位的最高位是否为1,为1则返回false
return true; //
}
4 结束语
事物都有两面性,网络监听也是这样.我们在利用网络监听来分析网络性能、排除网络故障的同时,也要防范攻击者利用网络监听窃取明文传输的密码和各种机密数据.
参考文献:
[1] stevens w r.tcp/ip详解(卷1:协议)[m].北京:机械工业出版社,2003.
2] 谭浩强.c程序设计[m].北京:清华大学出版社,1999.
3] 萧秋水,文娟等.windows网络编程之vc篇[m].北京:清华大学出版社,2003.