V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
wuchangming89
V2EX  ›  JavaScript

分享:基于 Node.js 的 HTTPS MITM(中间人)代理的原理和实现

  •  2
     
  •   wuchangming89 · 2017-01-29 20:23:56 +08:00 · 7001 次点击
    这是一个创建于 2887 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基于 Node.js 的 HTTPS MITM(中间人)代理的原理和实现

    分享自己写的一篇关于 HTTPS 的技术博客

    地址: https://github.com/wuchangming/https-mitm-proxy-handbook

    部署在公网的服务面临着越来越多的流量劫持、运营商劫持事件,为了能更好的保障信息的安全性和完整性, HTTPS 得到了越来越多的重视。基于此原因,本文章尝试从另一个视角,通过使用 Node.js 实现一个简单的 HTTPS 中间人代理的方式,阐述 HTTPS 是如何保证网络信息的安全,并且分析用户的何种行将会导致 HTTPS 的安全性失效。

    MITM (中间人)代理的技术手段对于软件开发者并不陌生,在实际开发和测试中经常会使用。调试接口、查看 HTTP 请求与响应时使用的 http 抓包调试工具如: Fiddler 、 Charles ,就是基于该原理实现的。

    本文会更侧重于代码的实现,每一步都提供详细的、可运行的 js 代码实现。

    17 条回复    2017-01-31 19:20:40 +08:00
    jsser
        1
    jsser  
       2017-01-29 20:31:09 +08:00
    谢谢分享!
    Sparetire
        2
    Sparetire  
       2017-01-29 22:26:58 +08:00 via Android
    很有帮助,非常感谢!
    wuchangming89
        3
    wuchangming89  
    OP
       2017-01-29 22:31:59 +08:00
    @Sparetire ,谢谢!
    EPr2hh6LADQWqRVH
        4
    EPr2hh6LADQWqRVH  
       2017-01-29 23:14:14 +08:00 via Android
    ????黑人问号
    wuchangming89
        5
    wuchangming89  
    OP
       2017-01-29 23:16:14 +08:00
    @avastms ,没太懂,什么意思?
    SoloCompany
        6
    SoloCompany  
       2017-01-30 01:06:52 +08:00
    一般而言的 MITM 不包括正向代理
    当然为了调试的目的也可以在正向代理上附加 MITM
    如果你想做 MITM 的普及,应当实现一个反向代理 + DNS 污染
    linbiaye
        7
    linbiaye  
       2017-01-30 06:49:25 +08:00
    如何取得“信任”

    回到最初的思路分析:建立一个可以同时与客户端和服务端进行通信的网络服务。

    现在需要解决的是如何得到客户端的信任,才能建立与客户端的通信。经过上面的分析,突破口就是 CA 证书。只要自定义的 CA 证书得到了客户端的信任,我就能用 CA 证书签发各种“伪造”的服务器证书。简单说就是让客户端系统安装上我们自定义的 CA 证书。

    这算不上 mitm 了,都能给客户端安装 ca 证书了,啥不能干。思路应该是中间设备劫持 dns 和第一次 http->https 的 302 跳转,让客户端和中间设备保持 http 通信,同时剥去来自服务器端的 hsts header 。对于客户端已经被告知 hsts 的站点无效。
    lslqtz
        8
    lslqtz  
       2017-01-30 07:13:13 +08:00 via iPhone
    @linbiaye 这就是 mitm ,只不过能取得客户端的信任。
    HTTP 的劫持也是中间人,只要你和服务器的通信被第三方修改过或嗅探过,就属于被中间人。
    des
        9
    des  
       2017-01-30 08:28:05 +08:00 via Android
    https 劫持的话,就算去掉了 hsts ,然后代理。我也能插随机 js 跳回去,再加上 cookie secure ,不太可能破解。
    wuchangming89
        10
    wuchangming89  
    OP
       2017-01-30 09:53:24 +08:00
    @linbiaye ,想说的就是装了 CA 证书什么都能干 :)。对于一般用户他不知道什么是 CA 证书,被诱导安装上自定义的 CA 是很容易的。

    另外,“ https 剥离”我觉得更应该叫 http mitm ,因为全程和 https 都没什么关系。

    wuchangming89
        11
    wuchangming89  
    OP
       2017-01-30 10:00:03 +08:00
    @SoloCompany ,一个完整的 hack 方案确实是要包括流量劫持,但这里想讲的只是 HTTPS 的证书链,所以就用最简单的正向代理的方式。
    wuchangming89
        12
    wuchangming89  
    OP
       2017-01-30 10:02:00 +08:00
    @des ,随机 js ?
    linbiaye
        13
    linbiaye  
       2017-01-30 11:33:19 +08:00
    @wuchangming89 垃圾 12306 还在用自签的,估计已经不少人被装了不明来路的 ca 证书。
    breeswish
        14
    breeswish  
       2017-01-30 17:48:05 +08:00
    @linbiaye 只信任那一张证书就可以了,不需要信任 12306 的 CA
    wuchangming89
        15
    wuchangming89  
    OP
       2017-01-30 20:15:23 +08:00 via iPhone
    @breeswish ,但一般用户其实不知道 CA 是什么,会留下安全隐患
    breeswish
        16
    breeswish  
       2017-01-31 14:48:15 +08:00
    @wuchangming89 一般用户连 https 都不知道 ┑( ̄Д  ̄)┍
    sola97
        17
    sola97  
       2017-01-31 19:20:40 +08:00
    非一般用户不就没辙了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3665 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:49 · PVG 08:49 · LAX 16:49 · JFK 19:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.