Pages

Tuesday, 5 May 2020

利用本地机器上的Socks5 Server防止http劫持

防治运营商HTTP劫持的终极技术手段


近年来,运营商HTTP劫持非但没有收敛,反而变本加厉,玩出了新花样:比如通过HTTP劫持进行密码截获的活动;比如下载软件被替换的情况;比如劫持进行返利(当然返利不是返给你)的情况。

本文介绍一种技术手段用来防止HTTP劫持,在大多数情况下不但可以解决广告推送的问题,也能解决密码截获和下载软件被替换的情况。最终的效果是运营商停止了HTTP劫持,而非劫持后通过浏览器插件进行广告过滤。此种方法的好处是既不用安装浏览器插件进行广告过滤,也不用额外的服务器(HTTP代理或VPN之类的),并且能防止下载软件被替换和返利劫持,也能在一定程度上防范密码的泄漏。

要说明这种技术手段的工作原理,首先需要说明大多数情况下运营商HTTP劫持的原理:

在用户的浏览器连上被访问的网站服务器,发送了HTTP请求后,运营商的路由器会首先收到此次HTTP请求,之后运营商路由器的旁路设备标记此TCP连接为HTTP协议,之后可以抢在网站服务器返回数据之前发送HTTP协议的302代码进行下载软件的劫持,浏览器收到302代码后就会跳转到错误的软件下载地址下载软件了,随后网站服务器的真正数据到达后反而会被丢弃。或者,旁路设备在标记此TCP连接为HTTP协议后,直接返回修改后的HTML代码,导致浏览器中被插入了运营商的广告,随后网站服务器的真正数据到达后最终也是被丢弃。

从上述原理中看出,如果需要进行HTTP劫持,首先需要进行标记:如果是HTTP协议,那么进行劫持,否则不进行劫持。那么,是否有一种方法,既可以避免被旁路设备标记为HTTP协议,而目标网站收到的仍旧是原来的HTTP请求,并且不需要任何第三方服务器呢?答案是有的:

旁路设备中检测HTTP协议的模块通常比较简单,一般只会检测TCP连接建立后的第一个数据包,如果其是一个完整的HTTP协议才会被标记;如果并非是一个完整的HTTP协议,由于无法得到足够多的劫持信息,所以并不会被标记为HTTP协议(我们伟大的防火墙并非如此,会检查后续数据包,所以这种方法无效)。了解了这种情况后,防止劫持的方法就比较简单了:将HTTP请求分拆到多个数据包内,进而骗过运营商,防止了HTTP劫持。而目标网站的操作系统的TCP/IP协议栈比较完善,收到的仍旧是完整的HTTP请求,所以也不会影响网页浏览。

那么如何将浏览器发出的HTTP请求拆分到多个数据包中呢?我们可以在本地架设一个代理服务器,在代理服务器将浏览器的HTTP请求进行拆包,浏览器设置本地的代理服务器即可。我这里经过测试,默认设置的情况下对三大运营商(电信、联通、移动)的HTTP劫持现象都有很好的抑制作用。

这个软件是个开源软件,代码在: https://github.com/lehui99/ahjs5s 。如果发现有什么问题,欢迎在Github上提Issue。

from https://www.williamlong.info/archives/4181.html

--------------------------------

防劫持的Socks5服务器

利用将发出的HTTP请求拆分到多个数据包中的原理抑制HTTP劫持。
运营商有时会通过DNS劫持进行非法活动,可以在解决DNS劫持后使用ahjs5s,避免DNS和HTTP的双重劫持。
使用方法:
  1. 安装Python,2.7和3.4版本测试可用
  2. (可选步骤)编辑config.json,配置server_port,默认为1080,即socks5服务的端口
  3. 在命令行下执行python main.py config.json即可开启socks5服务,配合polipo可以转为http代理,之后设置浏览器代理即可
注意:
  1. 通常劫持发生在HTTP,HTTPS一般不会劫持,所以只需要设置HTTP代理即可,无需设置HTTPS代理
参数配置:
  1. server_port:socks5代理的端口,默认1080
  2. send_packet_size:拆分HTTP请求的单包大小,默认10(字节):比如HTTP请求为95字节,那么将分10个数据包发送(最后一个数据包为5字节)
其他配置说明待添加。
Windows版集成Python和Polipo,有简单的配置向导,如不会修改配置文件可以尝试使用。双击start_ahjs5s.bat后根据向导提示启动服务后自行打开浏览器。下载链接:
MD5: 8174dc699eb967dbce493044c25c9c51
SHA1: 3714fd80ad7584520e27b7c43863ef4a0b4a9d22
后续计划:
  • 建立独有协议的DNS服务器,解决HTTP劫持的同时解决DNS劫持(代码已在,需要找台服务器运行)
  • 由于只是拆包仍旧会有劫持遗漏的情况,检查服务器返回的HTTP Response头,如非正常(如不包含Server字段等)并且是GET请求,则重新发起HTTP请求,可开关此功能
  • 结合winpcap/libpcap,如返回的数据包中有非正常的数据包(比如TTL变化。虽然正常请求也有可能发生,但概率极小,并且重新请求这种情况就会消失)并且是GET请求,则重新发起HTTP请求,可开关此功能
  • Windows图形界面
  • 由于有部分网站的TCP/IP协议栈处理不了拆包的情况(导致此网站无法访问),考虑通过PAC进行分别处理(无法拆包时可以考虑检测HTTP Response或数据包大法)

-----------------------------------

A local java-based socks proxy server for FUCKing HTTP hijacking.

fhsp

A socks proxy server for FUCKing HTTP hijacking, inspired by lehui99/ahjs5s

---------------------------------------------------

一切从劫持开始说起

在家上网浏览网页,第一次打开浏览器,输入网址,回车,发现页面右下角会出现一个大概300x300(像素)左右大小的正方形小窗口。窗口内多半是一些此时此刻非常不愿意看到的内容,比如广告。咦,我访问的明明是某知名搜索引擎啊,按常理来说这个位置不应该出现这样一个和页面布局极其不搭的小窗口的,是不是我中毒了?
自己运营了一个博客,放到公网分享内容给大家,流量还不错,可是留言区老有用户说我乱打小广告。我不信,打开浏览器访问了下自己的博客,怎么搞的?我的主页面上下左右被嵌入各种无耻下流肮脏邪恶小广告,而且与我发布的内容极其不和谐,有些弹窗甚至挡住了重要的内容,可是我明明没有接入任何广告啊?
如果遇到如上两种情况,那么恭喜你,你被http劫持了!!!

在用户的客户端与其要访问的服务器经过网络协议协调后,二者之间建立了一条专用的数据通道,用户端程序在系统中开放指定网络端口用于接收数据报文,服务器端将全部数据按指定网络协议规则进行分解打包,形成连续数据报文。
用户端接收到全部报文后,按照协议标准来解包组合获得完整的网络数据。其中传输过程中的每一个数据包都有特定的标签,表示其来源、携带的数据属性以及要到何处,所有的数据包经过网络路径中ISP的路由器传输接力后,最终到达目的地,也就是客户端。
HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中,监视特定数据信息,提示当满足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序解释“错误”的数据,并以弹出新窗口的形式在使用者界面展示宣传性广告或者直接显示某网站的内容。

以上内容摘自百度百科:http劫持

如果你去搜索引擎查找问题和答案,通常会找到如下关键词:

  • 运营商劫持广告
  • 运营商http劫持
  • http劫持
  • 电信劫持广告
  • 电信劫持
  • 电信网页劫持
  • 电信http劫持
  • 内容劫持
  • ISP hijacking

有人说这是天朝特有的,那是因为你只活在天朝,难道国外就没有了吗?劫持技术是通用的。

看看如何防范

  • 对于开篇说的第一种场景,月光博客里提到了一篇从用户的角度的解决方案
  • 对于广大网站主(博主)来说,全站https化是一种防止http劫持的有效方法

这里我们不具体聊https的原理了,就说说如何用免费的Let’s Encrypt来具体实践如何将你的站点https化。

Let’s Encrypt

Let’s Encrypt是由EFF、Mozilla、Cisco、Akamai、IdenTrust与密西根大学研究人员共同创立的免费的凭证中心,目的在于推动全球所有的网站都使用HTTPS加密传输,并由非营利的网际网路安全研究组织Internet Security Research Group(ISRG)负责营运。 这个组织的主要原则是:

  • 免费:任何域名所有者都可以零费用申请到一个针对其域名的有效证书。
  • 自动:整个证书注册过程在服务器安装或配置过程中可以简单实现,而更新过程更是可以在后台自动执行。
  • 安全:Let’s Encrypt 将会提供业界最新的安全技术和最好的实践。
  • 透明:所有关于证书发放、撤销的记录都会向任何需要调查的人员开放。
  • 开放:自动化执行的发放和更新协议将会是开放标准,软件也尽可能使用开源软件。
  • 合作:与现有的互联网协议本身很相似,Let’s Encrypt 是一个对整个社区都有益的联合行动,不由任何一个组织控制。

No comments:

Post a Comment