揭秘运营商黑产 流量劫持技术细节剖析
1. 概述
相信大家对流量劫持都很痛心,明明要下载游戏盒子,结果变为XX助手或者是葫芦娃,但是这种光明正大的流氓行为似乎是个烂摊子几乎没人管或者管不着,而且像蟑螂一样消灭不尽。
偶尔的劫持造成的伤害大家可能已经麻木,但这点伤害累积起来对受伤的正规公司而言可是会损失大量用户,遭受万点以上的冲击。如果各公司都去用那些手段来获取用户的话,会造成整个行业持续地畸形发展,就像如果所有老板都去炒房,还有谁去认真做实业呢?
知己知彼,我们要拒绝被劫持的话先要了解下一般有哪些手段,其实大概原理大家都有所了解,因为是明文传输,中间的小运营商可以在传输过程中插入小广告或者强制替换下载内容,要杜绝的话要上https加密,这些大理论大家都明白。
但如果要追问,要怎么插入小广告或者强制替换掉用户下载的文件呢?估计大部分IT人士就只能说“他们有专业的设备做劫持”这样含糊的专业术语来糊弄一下了。更装一点的可能会列一个这样的表格给你:
我们常见的劫持一般是通过DNS污染和旁路模式注入恶意的HTTP信息给用户。这次来个详细的技术教程,让普通用户也可以过过瘾,了解一下网络劫持相关的技术,包括多种方式的流量捕获和窃听劫持、弹广告等方面,体验下我们常说的中间人劫持,为以后的防范做准备-_-。
2. 捕获流量
中间人攻击要对用户进行网络劫持的话,首先需要有捕获对方流量的通道。捕获流量大概分为两类,一类是有交换机或者网关设备的权限,直接进行普通用户无法控制的劫持,另外一类是诱导使用VPN或者进行ARP攻击这种旁门左道的方式,有一定的失败机率。
2.1 旁路镜像
最有效的是在网络设备这里进行旁路镜像,比如交换机的端口镜像、添加分光器等。
其中端口镜像的方式是成本最低的,直接在交换机这里取一份完整的数据到我们的设备,而且完全不影响原来的正常网络拓扑,用户毫无感知。
如图所示,在核心交换机这里插根网线和一台Linux服务器连接起来,然后用monitor session命令配置端口镜像即可。
有理由相信运营商的劫持基本都是添加一个旁路设备来做的。
2.2 Linux网关和WIFI
有些小办公点还是用的Linux做网关来替代出口路由器,用IPTABLES来做NAT处理,这种情况也是最好做的,直接在在IPTABLES上面即可控制用户流量了。如果手上没有网关设备,可以自行搭建个WIFI热点也行。
2.3 透明网桥
如果没权限登录网络设备进行旁路劫持,可以考虑用网桥的方式来捕获流量。准备个双网卡的机器,安装好bridge-utils套件,用brctl命令进行网卡绑定:
brctl addbr bri0brctl addif bri0 eth0brctl addif bri0 eth1
两个网卡不配置IP,配置里面加上BRIDGE="bri0",绑定好之后,两个网卡一进一出,一个直通的透明网桥就做好了,接入到任何网络拓扑里面就可以实现对流量的捕获和IPTABLES控制了。
上面几种情况的捕获流量需要比较大的设备权限,比如运营商的人,或者自行偷偷搬个机器到机房做网桥。
普通用户需要尝试的话可以用虚拟机或者下面几个方式来实现。
2.4 VPN代理
Vpn和代理在国内比较流行,同时技术上也是最容易进行劫持的。
比如在Linux上系统搭建好vpn,然后用IPTABLES做nat转发,同时我们也可以在IPTABLES这里做些特殊处理,比如直接REDIRECT流量走向来控制,同理如果是用户用的翻墙代理的话也是可以直接用IPTABLES来处理,统一导入到下面说的MITMF环境即可。
2.5 ARP欺骗
在局域网时候如果主机没有安装一些安全软件绑定网关的mac地址时候,攻击者只需要运行一些特殊的软件即可进行arp欺骗。
Arp欺骗最好是在linux环境下做,因为可以当作一个网关,打开数据包的转发,在IPTABLES这里做一层nat即可让用户几乎无察觉到有攻击存在(有防ARP情况例外),比如用arpspoof命令进行arp欺骗:
arpspoof -i eth0 -t 192.168.2.111 192.168.2.1
这样对方192.168.2.111在寻找网关地址192.168.2.1的时候就会误以为攻击方是他要找的网关,然后流量就被我们捕获了。
这种攻击方式需要是局域网才可以完成,而且需要主机没有安装网络安全软件绑定网关arp才可以正常实现,还有一点就是用户有机率网络不稳定导致容易察觉到有攻击存在。
2.6 篡改DNS
如果路由器有漏洞或者弱密码,可以有机率篡改用户DNS,使域名流量经过解析之后直接转向我们自己的服务器来达到捕获用户流量的目的。
3. 流量处理(开始劫持)
捕获到流量之后,要做内容的窃听和劫持这里分为两个情况,一个是网关模式,另外一个是交换机旁路模式。
因为旁路方式的优点,我们生活中的劫持现象一般都是用旁路方式进行流量注入,我们不用专业设备来处理旁路流量,我们直接用python之类的软件实现。
下面来具体介绍怎么针对捕获的流量进行内容劫持。
3.1 网关模式
网关模式可以理解为数据包直接经过我们的设备,这个时候可以通过IPTABLES来控制用户的流量走向,直接转发到我们的恶意代理即可。
HTTP劫持
我们可以创建个代理,然后对其中的http协议的数据进行劫持修改,首先
需要手动把用户的80端口http流量导入到我们的程序里面:
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 10000
然后用mitmf创建代理,比如把”买服务器”改为”买IPHONE”,命令:
mitmf -i eth0 --replace --search-str “买服务器” --replace-str “买IPHONE”
注意如果是新版的mitmf,语法已经变了,需要配置/etc/mitmf/mitmf.conf里面的Replace段,比如:
新版的mitmf如果有Content-Type的报错,需要把/usr/share/mitmf/plugins里面对应的插件里面的
修改为
然后客户端浏览器那里就对上述的字符串改为我们的目的字符串了,效果如下:
或者可以让其加载beef平台的js文件,然后用beef来实时控制浏览器行为了。
bdfproxy木马
bdfproxy可以对经过他的流量进行自动识别,识别到是下载动作时候就结合msfconsole进行下载的文件自动分拆,然后加入木马进行封装再传给用户,让用户从正常的通道也下载到含有木马的软件或者压缩包。
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 10000
修改两处配置:
然后直接用bdfproxy启动即可。
注意,这里用户端下载的时候,获取到的http头部除了Content-Length会变为新的长度值之外,别的头部都不会变,比如我们的APK下载里面的md5值和etag值等,虽然头部校验是含有我们正确的头部,但是内容还是可能会变为别的。
案例如下图:
DNS劫持
DNS劫持在桥接方式下直接把53端口的流量重定向到我们的程序即可。
类似IPTABLES里面配置:
-A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
然后在上面启动dnschef欺骗程序,把指定的几个域名所有解析解析成192.0.2.1,其余的正常转发。
效果如图:
dnschef --nameservers=114.114.114.114 --fakeip=192.0.2.1 --fakedomains=*.taobao.org,*.taobao.com -i 0.0.0.0
用户端界面:
或者启动一个dnsmasq程序,把hosts指定好,同样是一个可以做DNS劫持的好用工具,而且这种直接针对53端口的及时换了DNS因为无法避免。
3.2 旁路模式
旁路模式在网络入侵检测或者是抓包窃听时候是最好用的,不影响原来的网络架构,旁路设备出问题也不会影响到原先的流量,因为配置了旁路之后,交换机只是把原先的流量复制一份到旁路设备,然后就不管了。
旁路设备可以自行对原有的返回流量进行注入,比如优先返回302到别的网站,或者返回RST中断正常连接。
旁路配置
旁路监听的话很简单,比如cisco网络设备做端口镜像:
Switch#conf t (进入全局配置模式)Switch(config)#monitor session 1 destination interface fastEthernet 0/24(指定连接抓包主机的端口)Switch(config)#monitor session 1 source interface f0/1 - 23 both(指定端口1-23,both是进出的包都抓)
这样可以在fa0/24端口上接收到别的端口的流量,然后在利用一些抓包工具比如wireshark来进行窃听。
Linux做网关时候直接在服务器上进行tcpdump抓包即可:
tcpdump –i any tcp port 80 –w 80.cap
如果是要对旁路抓到的数据包进行处理的话,比如进行劫持,原理也比较简单,可以做dns劫持或者http劫持,就是旁路设备抓到需要处理的对象之后,在正常数据包返回之前优先返回我们伪造的数据包给用户,而用户会丢弃之后正常返回的数据包,因为会话已经重复了。
在要进行劫持时候,需要在monitor session的目标接口的时候需要指定ingress vlan模式。
monitor session 1 source vlan 777monitor session 1 destination interface Gi1/3/23 ingress vlan 777monitor session 1 filter ip access-group 141
特别注意这个ingress参数,这个参数导致以前测试一直为成功,如果不加的话会导致旁路设备只可以接收数据而无法发送成功,也就无法对用户进行实际的内容影响了。
中断会话
中断会话这个功能效果就是类似于发送请求之后,我们可以在旁路把这个连接两端RST断开会话。
工具是tcpkill这个命令。
比如设置好旁路之后,在eth0上面有所有有关目标用户的流量经过,然后运行命令:
tcpkill -i eth0 host 115.236.76.23
然后就无法正常连接到目标机器了。
图例:
会显示已经向两端发送了RST请求重置连接了。
dns劫持
这个注入模式稍微高端点,比如在网桥上面也可以做,也可以在自己的dns服务器上实现。当然我们现在是在端口镜像的旁路时候:
比如网桥上面用dnsspoof来进行解析干扰解析:
dnsspoof -i eth0 -f hostfile
hostsfile里面的内容是类似hosts格式的解析,然后用户端进行解析的时候,这个程序会优先返回结果来干扰正常的解析返回,效果如下:
抓包可以看到这个伪造的结果比正常的dns返回先返回给了用户,这样就达到了欺骗效果:
可以看到8.8.8.8这条数据优先1.5毫秒返回给用户,然后用户就丢弃了后面的正常响应而使用经过我们篡改的dns结果。
http劫持
下面模拟下旁路劫持用户流量时候的302跳转和弹广告情况。
1. 302跳转
在旁路服务器上直接监听网卡然后注入HTTP数据,比如利用的是python的scapy模块,像github上的hijack.py脚本,简单修改下L2socket时候的filter匹配条件,格式和tcpdump医院,效果如下:
这个就是访问腾讯官网,然后被劫持到淘宝去了的效果。
抓包的结果也是这个302包就快那么点点优先返回给用户了:
2. 弹广告
原先网桥模式下面用mitmf插入js地址就可以实现右下角弹广告的效果。
现在旁路模式不行这样直接插入,需要对目标站点的某个JS文件进行篡改然后再返回才行。
但是一般的广告js比较长,不适合一次性以内容方式返回给用户,而是采用修改js的内容,然后用js再加载js的方式,而且是先加载个带版本号的正确js,然后再加入广告就是,参考内容如下:
也就是以前见到过玩家的js内容被修改了,然后加载了广告js的效果。
然后具体实现需要修改之前的hijack.py代码来做,比如先判断好我们需要劫持的js具体URL,然后给这个js返回我们的上面一段内容(jscode)即可。
劫持效果如下:
js的加载情况:
如果再加些逻辑处理,然后打包起来就可以是一个专业的劫持后台了。
4. 总结
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论