本文参考 https://github.com/edwardz246003/shadowsocks ,由于作者给出的代码过少,于是我将作者描述的攻击方式用代码写出来,更加通俗易懂。
浏览器使用 socks5 代理,通过 client 去访问 a.baidu.com 的 IP 地址,攻击者拿到加密的返回包,可以破解httpResponse内容(大部分内容)。
ssserver,
python3 myserver.py;启动
sslocal,
python3 myclient.py;
curl --socks5 127.0.0.1:1080 http://a.baidu.com,收到返回 "OK",保存为
ss_ip_direct.pcapng
127.0.0.1:1083
ss_ip_direct.pcapng中的返回包,篡改头部,将目标地址从 baidu的 IP 写为
127.0.0.1:1083篡改后发给 1081
127.0.0.1:1083(或者任意指定的 IP 和 port)
默认 ssserver 不会发数据给127.0.0.1:1083,需要临时将
_create_remote_socket下面这段检查 patch 掉!或者把目标改成一台公网 IP 和端口
# if self._forbidden_iplist: # if common.to_str(sa[0]) in self._forbidden_iplist: # raise Exception('IP %s is in forbidden list, reject' % # common.to_str(sa[0]))
为了方便读者复现,已经抓到一组包,只需要执行下方三句代码即可:
python3 myserver.py启动 ssserver
nc -lk 1083监听1083端口
python3 ip_direct_attack.py读取密文,篡改密文,发送给 ssserver
之后观察 1083,会出现下图的样子
浏览器使用 socks5 代理,通过 client 去访问 a.baidu.com 的 域名 地址,攻击者拿到加密的请求包,可以破解httpRequest内容(大部分内容)。
ssserver,
python3 myserver.py;启动
sslocal,
python3 myclient.py;
ss_domain.pcapng
127.0.0.1:1083,并且申请域名
a.baidu.abc,指向自己的服务器;(本文为了演示,在 localhost 里干了这件事)
ss_domain.pcapng中的请求包,篡改头部,将
a.baidu.com改为
a.baidu.abc,篡改后发给 1081
a.baidu.abc:1083(或者任意指定的域名和 port)
默认 ssserver 不会发数据给127.0.0.1:1083,需要临时将
_create_remote_socket下面这段检查 patch 掉!或者把目标改成一台公网 IP 和端口
为了方便读者复现,已经抓到一组包,只需要执行下方四句代码即可:
127.0.0.1 a.baidu.abc加入 hosts
python3 myserver.py启动 ssserver
nc -lk 1083监听1083端口
python3 domain_attack.py读取密文,篡改密文,发送给 ssserver
之后观察 1083,会出现下图的样子
对于 https 的请求,攻击者有能力知道域名,无法知道传输内容,原理和情景二相同,数据包如下图
https://leadroyal.cn/?p=1036