一次PostgreSQL被入侵记录
0x00 症状
昨天(6-17)我发现服务器上的PostgreSQL数据库连接性能急剧下降,很多服务都报数据库连接错误.
去查看容器的日志呢,我看到了一些诡异的东西


你说一个好端端的数据库怎么会跑这些命令呢?
此时我已经觉得有可能是被入侵了.
再查看容器内的进程,发现一些更加奇怪的东西

很有病毒那味了.
在主机上,使用 htop 能看到以下内容

啧啧啧,怕不是挖矿哦
此时总体 CPU 占用率达到了50%
本来我准备重建容器的,但是我发现删不掉. 原因是有一个隐藏文件不可以删除

好,那就来会一会这个隐藏文件.
0x01 分析
打开这个脚本文件发现,老Base64了

完整的

那还用说? 解码走起

很明显就是一段脚本
变量名像混淆了一样,不过不算复杂,替换几次就好了
下面是已经整理分析过的样子

那就一块一块分析把
首先是最开始的几个变量,这倒没啥好说的,字面意思
然后是 sockz() 函数

不得不说为了防止被防火墙发现这个做的是真的牛批.
使用 DoH 进行查询,保证 DNS 流量是加密的,这样子就不会被传统监测 53 端口UDP流量的方式所侦测了.
查询的域名是用来获取 Tor 代理的网站.
接下来是 fexe() 函数

这个我没看出他啥意思,感觉就是执行和删除文件(可能是执行一次病毒来防止被停止?)
往下是 u() 函数(已整理)

码掉的地址是下载可执行文件的 Tor 网址,不过我进去看的时候已经是 404 了.
我把里面晦涩难懂的变量都替换了,两个取变量的地方我也写了一个例子.
其中 Tor 代理就是之前 sockz() 函数所获取到的那个
传入的参数在文件最下面有
而且这个函数还很"贴心"的提供了在不传入参数的时候也能下载的办法.够狠的.
事后删掉可执行文件,还不留痕迹.
最后是最终执行部分

我是很不懂这个病毒干嘛要判断是否有桌面环境呢? 难道是只感染服务器不感染Linux工作站吗?
(那给服务器装个GNOME桌面不就偷笑了?)
这部分就是从一堆备选站点里挑选一个出来,传参给函数 u() 去下载真正的可执行文件.
0x02 事后
我用 lsattr 查询了这个隐藏文件的附加属性,发现被禁止移动或更改(i)
chattr -i 教他做人,然后删除容器并重建.
也许是服务器性能太强了吧,要不是一批应用程序出现崩溃我根本不会注意到数据库已经被人入侵拿来挖矿了.
因为数据库运行在 Docker 中,所以这次中毒并未影响主机.算是不幸中的大幸吧.
以前处理过主机中十字符病毒,那个病毒疯狂 DDoS 吃满上行带宽,连 SSH 都卡的不行.杀掉一个还会瞬间再生.