公众号旧文
从 TCP 连接开始:我发现了开放代理扫描器
我刚登录自己的一台服务器继续学习 Linux
使用下面的命令查看连接状态:
ss -ntp
(用来查看当前所有已建立的 TCP 网络连接,以及每个连接对应的进程)
发现了几条连接:
156.231.112.139:5001 <- 89.37.172.137
156.231.112.139:5001 <- 31.14.254.101
156.231.112.139:5001 <- 123.118.10.63
在端口 5001 上,有一个我写的流量统计页面。
通过 SSH 登录我的所有服务器,执行 vnStat,然后汇总成一个 Web 页面,方便查看整个集群每天的流量情况。
说白了,就是一个给我自己看的内部页面。
理论上除了我自己,不会有人关心这些数据。
那这几个陌生 IP 是谁?
一、先确认是谁在监听
查看监听端口:
ss -lntp
果然:
LISTEN 0 128 0.0.0.0:5001
users:(("python3",pid=1480531,fd=3))
继续追:
ps -fp 1480531
定位到:
/opt/traffic-web/api.py
再看代码:
app.run(host="0.0.0.0", port=5001)
5001 是公网开放的
二、验证一下
在我的 Windows 电脑上执行:
curl http://156.231.112.139:5001/api/traffic/all
直接返回完整 JSON。
说明任何人都能访问这个接口。
三、开始翻日志
我本来以为会看到:
GET /api/traffic/all
或者:
GET /
但日志里出现了一条:
CONNECT www.baidu.com:443 HTTP/1.1
来源:
123.118.10.63
看到这里的时候,我不理解为什么会出现百度。
因为我的服务只有:
/api/traffic/all
根本没有百度。
四、什么是 CONNECT?
查了一下才发现。
原来这是 HTTP Proxy 的标准动作。
如果浏览器配置了 HTTP 代理。
访问:
https://www.baidu.com
实际上会先向代理发送:
CONNECT www.baidu.com:443 HTTP/1.1
如果代理返回:
HTTP/1.1 200 Connection Established
后面就开始 TLS 握手。
五、也就是说……
有人在问我的 5001:
你好
你是不是一个 HTTP 代理?
而我的 Flask 根本不懂 CONNECT。
于是返回:
404
扫描失败。
六、我的条件反射
正常人可能看到这里就结束了。
但我突然想到:
既然 CONNECT 是代理扫描器特有的特征
那我为什么不拿 CONNECT 去反查历史日志?
于是:
grep 'CONNECT ' /var/log/syslog*
grep 'CONNECT ' /var/log/daemon.log*
挖出了更有意思的东西。
七、发现专业代理扫描器
日志里出现了一组记录:
CONNECT proxy2.proxiesfood.com:443 HTTP/1.1
来源:
204.76.203.212
204.76.203.213
204.76.203.221
而且:
22:22:39
22:22:40
22:22:40
几乎同时发起。
三天后又来了:
Jun 3
Jun 6
同样的域名,同样的 IP 段。
八、这不是普通扫描器
如果是普通扫描器。
通常会访问:
GET /
或者:
GET /.env
GET /phpmyadmin
但这几个 IP 什么都没干。
只是:
CONNECT proxy2.proxiesfood.com:443
然后离开。
九、它们在干什么?
显然它们属于某种开放代理扫描系统。
扫描过程是:
发现开放端口
↓
尝试 CONNECT
↓
如果返回 200
↓
通过代理访问自己的验证服务器
↓
记录为可用代理
而:
proxy2.proxiesfood.com
很像他们自己的验证节点。
如果我的 5001 真的是一个开放代理,就会被扫描器收录拿去卖钱了。