在监视网关和客户端主机之间的数据报时,如果发现了客户端发送的DNS查询数据报(目的端口为53),那么我们可以提前将自己构造的DNS响应数据报发送到客户端。注意,我们必须提取有客户端发送来的DNS查询数据报的ID信息,因为客户端是通过它来进行匹配认证的,这就是一个我们可以利用的DNS漏洞。这样客户端会先收到我们发送的DNS响应数据报并访问我们自定义的网站,虽然客户端也会收到DNS服务器的响应报文,不过已经来不及了。
工具、环境
windows系统、visualstudio集成开发环境、wpdpack4.1
核心代码
1.DNS相关
//将网卡设置为混杂模式
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));
//初始化一个PACKET结构,发送DNS响应数据报
PacketInitPacket(lppackets,sendbuf,sizeof(ETHDR)+sizeof(IPHDR)+sizeof(UDPHDR)+sizeof(DNS)+ulen+4+sizeof(RESPONSE));
2.ARP欺骗相关
//初始化ARP响应数据报
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
//发送ARP欺骗的响应数据报
PacketSendPacket(lpadapter,lppackets,TRUE);
//获取网络适配器的属性
GetAdaptersInfo(padapterinfo,&adapterinfosize);
//发送ARP请求数据报,请求网络主机的MAC地址
SendARP(destip,0,pulmac,&ullen);
3.一些核心的数据结构
主要包括DNS请求、响应、ARP报文、网络适配器信息结构,具体可查看相关材料,这里不列出。