公众号旧文

从 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 真的是一个开放代理,就会被扫描器收录拿去卖钱了。