【流量劫持】沉默中的狂怒 —— Cookie 大喷发
精简版:http://www.cnblogs.com/index-html/p/mitm-cookie-crack.html
前言
上一篇文章 讲解了如何借助前端技术,打造一个比 SSLStrip 更高大上的工具。
今天我们再次使用这套战术,通过前后端的里应外合,实现一个杀手锏级的攻击方案 —— Cookie 数据大喷发。
传统嗅探
在过去,Cookie 的窃取大多通过嗅探流量来实现。
这种方法具有很强的隐蔽性,让人几乎难以察觉。然而,正因为如此,也面临一个巨大的缺陷:速度太过缓慢。
中间人只能嗅探到用户正在访问的页面,对于那些令人期待的网站,只能慢慢等了。在家庭、办公场所这些稳定的网络环境里,长久的等待或许还能得到想要的结果;但对于公共场所上网的用户,就没那么容易了。
在公共网络里,大家多少保持一些警惕,很少会去访问一些重要的网站。况且,临时的网络用户也不会停留太久。因此纯粹的流量嗅探,难以捕捉到更有意义的数据。
前端出击
既然用户不按我们的套路出牌,那么我们的前端战术就得派上用场了 —— 只要能控制页面,一切皆可由我们做主。哪怕用户就是不中圈套,我们的脚本也可以强制跳转过去,从而轻易拿下想要的 Cookie 数据。
不过强制跳转的方式也太过暴力了。尽管我们使用了劫持页面这种高调的方式,但之后的所作所为,仍需保持隐蔽。
也许你会说可以通过隐藏框架页来代替,就可大幅提升隐蔽性了。这个方式确实不错,离我们的目标又近了一步,但仍然不够完美。为什么非得用访问页面的方式来获取 Cookie,这代价不免也太大了。
事实上,Cookie 的发送和请求类型是没有任何关系的。无论是页面的访问、还是第三方资源的加载,只要目标 URL 匹配了 Cookie 数据库的路径,符合的记录最终都会被带上。或许你平时并没有注意到这一点,但我们可以马上来验证下。
我们先在页面里,发起一个第三方的资源请求:

抓到请求包,自然就获得了其中的 Cookie:

但这些数据究竟是不是完整的,能否直接利用?不多猜测,我们把它粘到其他浏览器里试试:

当我们再次刷新页面时,奇迹发生了:

通过 Cookie,我们成功还原了之前的登录状态。而这一切,仅仅从一个第三方的图片请求中获得!
所以,中间人可以使用非常轻量的方式,来获取某个站点下的 Cookie,并不需要用户主动访问该站点。
我们可以事先收集大量的网站地址,让前端间谍进行逐一侦探,从而能嗅探到相当一部分账号了:

方案优化
前后端结合战术,在此又一次得到了展现。但为了能将其发挥到淋漓尽致,我们还需进行充分优化。
路径标记
虽然我们可以通过加载第三方资源的方式,将目标站点的 Cookie 送到流量上。但中间人收到请求后又该如何处理?返回空白内容,还是代理正常页面?
如果真走一遍代理,那实在是太浪费了。既然我们已得到 Cookie,随便返回什么都可以;但若返回空内容,要是用户正好打开这个网站,那就白屏了。
为了不影响 Cookie 的发送,同时能让中间人明白这个请求是咱们自己人的,我们在请求的 URL 里加上一个特殊的标记。
当中间人发现请求带有这个暗号,自然就明白了 —— 记录下其中携带的情报,然后放心的返回空白就可以了。

因为 Cookie 的 Path 属性不包括 Query,所以加上这个记号,并不影响 Cookie 的携带。原来有哪些,现在仍一样。
此外,修改了路径还有另一个好处:即使侦探被缓存了的站点,也能产生请求流量。从而不错过任何一个目标!
DNS 加速
解决了代理问题,发送 Cookie 现在只需极小的流量。
这时的瓶颈,已不仅仅是 HTTP 流量了。因为我们事先准备了大量的网站,他们都有各自的域名,因此 DNS 查询也成为不可忽视的一部分。
为了缩短查询时间,我们可以将所有发往 UDP/53 的数据包,全转发到中间人的 DNS 服务下,并且都解析成自己的 IP。这样不仅加快域名查询的过程,而且还能给中间人节省不少带宽。
当然,如今的浏览器,对域名解析做了大量的优化。因此在前端上,速度提升或许并不明显。
但这种方式仍有极大的意义 —— 我们同时劫持了 DNS 和 HTTP,这意味着整套方案,可以不依赖互联网,进行离线攻击!这尤其适用于上网成本较高的户外环境里。
痕迹收集
当然,并不是所有账号都得通过 Cookie 成功还原的。稍微重视安全的网站,其登录会话都绑定了 IP 地址段。如果还原时的外网 IP,和用户之前使用的存在较大区别,这个 Cookie 很有可能就失效了。
但大多数时候,我们劫持的都是附近的用户,甚至是同一内网的,所以仍有不少能够还原的。
但随着安全等级的提高,一些网站不仅仅绑定 IP 地址,有的还关联了 User-Agent 等信息。在将来,甚至还会绑定用户更多的痕迹,例如屏幕分辨率、插件版本、绘图算法等等,更精确的识别用户。
为了能提高还原成功率,我们也尽可能多的收集用户信息。除了 User-Agent,我们还可以考虑通过前端代码,收集更详细的浏览器特征信息。在账号还原时,把这些信息都模拟到沙盒里,伪装到天衣无缝。
攻击演示
Demo: https://github.com/EtherDream/cookie_hijack_demo
当受害者进入我们的劫持环境里,打开任意页面,即可触发布置其中的 XSS 脚本。(当然,这里为了演示简单,把整个页面都替换了。实战中,可以参考前一篇的文章的注入方法)

我们的日志,成功记录下各种账号的 Cookie:

于是,就在这一瞬间 —— 尽管没做任何事,但众多账号已被黑客所控制:

当然,这里只演示最基本的功能,将嗅探到的 Cookie 保存在文件里。至于如何还原,有无数种方式,这里就不再介绍了。
【流量劫持】沉默中的狂怒 —— Cookie 大喷发的更多相关文章
- HTTPS-能否避免流量劫持
流量劫持是什么? EtherDream在一篇科普文章<>中详细介绍了流量劫持途径和方式. 流量劫持是一种古老的攻击方式,比如早已见惯的广告弹窗等,很多人已经对此麻木,并认为流量劫持不会造成 ...
- 【流量劫持】躲避 HSTS 的 HTTPS 劫持
前言 HSTS 的出现,对 HTTPS 劫持带来莫大的挑战. 不过,HSTS 也不是万能的,它只能解决 SSLStrip 这类劫持方式.但仔细想想,SSLStrip 这种算劫持吗? 劫持 vs 钓鱼 ...
- 【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
前言 在之前介绍的流量劫持文章里,曾提到一种『HTTPS 向下降级』的方案 -- 将页面中的 HTTPS 超链接全都替换成 HTTP 版本,让用户始终以明文的形式进行通信. 看到这,也许大家都会想到一 ...
- WiFi流量劫持—— JS脚本缓存投毒
在上一篇<WiFi流量劫持—— 浏览任意页面即可中毒>构思了一个时光机原型,让我们的脚本通过HTTP缓存机制,在未来的某个时刻被执行,因此我们可以实现超大范围的入侵了. 基于此原理,我们用 ...
- 关于全站https必要性http流量劫持、dns劫持等相关技术
关于全站https必要性http流量劫持.dns劫持等相关技术 微信已经要求微信支付,申请退款功能必须12月7号之前必须使用https证书了(其他目前为建议使用https),IOS也是2017年1月1 ...
- Linux-某电商网站流量劫持案例分析与思考
[前言] 自腾讯与京东建立了战略合作关系之后,笔者网上购物就首选京东了.某天在家里访问京东首页的时候突然吃惊地发现浏览器突然跳到了第三方网站再回到京东,心里第一个反应就是中木马了. 竟然有这样的事,一 ...
- Web如何应对流量劫持?
虽然互联网经过多年的发展,可是网站使用的底层协议仍是 HTTP,HTTP 作为一种明文传播协议,所有的传输数据都是明文,我们都知道在通信中使用明文(不加密) 内容可能会被窃听,同时网站存在被劫持的风险 ...
- 通过BGP实现流量劫持
BGP BGP全称是Border Gateway Protocol,翻译成中文是边界网关协议,用于全球各个AS之间的路由.它的地位是毋庸置疑的,如果没有它就没有全球的因特网.因为全球各个AS都等价的维 ...
- Istio 流量劫持过程
开篇 Istio 流量劫持的文章其实目前可以在servicemesher社区找到一篇非常详细的文章,可查阅:Istio 中的 Sidecar 注入及透明流量劫持过程详解.特别是博主整理的那张" ...
随机推荐
- 前端css兼容性与易混淆的点
一.常用的骨灰级清除浮动 .clearfix:after { content: "."; display: block; height:; clear: both; visibil ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- ExtJS 4.2 业务开发(二)数据展示和查询
本篇开始模拟一个船舶管理系统,提供查询.添加.修改船舶的功能,这里介绍其中的数据展示和查询功能. 目录 1. 数据展示 2. 数据查询 3. 在线演示 1. 数据展示 在这里我们将模拟一个船舶管理系统 ...
- Kooboo CMS技术文档之二:Kooboo CMS的安装步骤
在IIS上安装Kooboo CMS Kooboo CMS安装之后 安装的常见问题 1. 在IIS上安装Kooboo CMS Kooboo CMS部署到正式环境相当简单,安装过程是一个普通MVC站点在I ...
- mysql进阶之存储过程
往往看别人的代码会有这样的感慨: 看不懂 理还乱 是离愁 别是一番滋味在心头 为什么要使用存储过程? 在mysql开发中使用存储过程的理由: 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定 ...
- iOS架构一个中型普通App的一些经验总结
这一版比较完善的的App终于提交审核了.有时间写写自己的一些经验的总结了.自己主导的从0到比较成型的app到目前来说也只有两个,但是其中的很多东西都是大同小异.基本上是想到了什么就写什么,感觉写的不到 ...
- CSS三个定位——常规、浮动、绝对定位
.dage { width: 868px; background: #5B8C75; border: 10px solid #A08C5A; margin-top: -125px; margin-le ...
- Android 死锁和重入锁
死锁的定义: 1.一般的死锁 一般的死锁是指多个线程的执行必须同时拥有多个资源,由于不同的线程需要的资源被不同的线程占用,最终导致僵持的状态,这就是一般死锁的定义. package com.cxt.t ...
- .JavaWeb文件上传和FileUpload组件使用
.JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...