zoukankan      html  css  js  c++  java
  • Linux下XordDos木马的清除

    朋友的阿里云服务器一早上报木马入侵,找我处理,登陆阿里云查看警告信息“恶意进程(云查杀)-XorDDoS木马”,

    本文也可以作为服务器处理木马排查的步骤的参考文章

    排查原则:

    1.一般的木马都有多个守护进程,不一定可以短时间停掉,或者处理好,要注意备份业务数据

    2.如果木马运行影响到业务运行,首先要恢复业务的访问,同时进行排查处理,但是并不建议

    3.如果没有太大影响,可以先停掉相关业务进程,防止查杀过程的操作对业务产生影响

    生产环境注意根据实际情况决策

    处理木马病毒的顺序:

    1.关闭对外访问
    2.停止定时任务
    3.关闭木马的守护进程
    4.禁止木马程序运行
    5.删除开机自启动的木马程序
    6.重启服务器测试木马是否清理完成

    1.确认木马类型,关闭对外访问

    从阿里云平台得知是DDOS的木马,可能对服务器性能造成影响,对业务数据不一定有影响

    1.1.检查服务器对外的访问,获取相关IP地址

    先登录到服务器上查看进程:

    [root@web ~]# netstat -anptl
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
    tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      1480/mysqld         
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1553/nginx          
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1296/sshd           
    tcp        0    112 1.1.1.1:22                  2.2.2.2:50103               ESTABLISHED 1509/sshd           
    tcp        0      0 1.1.1.1:43436               104.166.89.67:8080          ESTABLISHED 4939/bash                   # 异常IP
    tcp        0      0 1.1.1.1:37026               106.11.68.13:80             ESTABLISHED 1219/AliYunDun      

    可以看到有一个对外访问的IP:104.166.89.67,明显这个是有问题的,记录下来

    我这里业务的访问量不大,暂时停掉服务,排除干扰

    [root@web ~]# service mysqld stop
    Shutting down MySQL..                                      [  OK  ]
    [root@web ~]# service nginx stop
    Stopping nginx:                                            [  OK  ]

    结束掉相关进程,再次查看

    [root@web ~]# !net
    netstat -anptl
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      16286/sshd          
    tcp        0    112 1.1.1.1:22                  2.2.2.2:50103               ESTABLISHED 1509/sshd           
    tcp        0      1 1.1.1.1:51374               91.195.240.82:8080          SYN_SENT    14221/sh            
    tcp        0      0 1.1.1.1:37026               106.11.68.13:80             ESTABLISHED 1219/AliYunDun      

    这次更换的IP是91.195.240.82,记录下来

    多次杀掉相关异常进程,确认对外连接的只有这两个IP,顺便查询下归属地

    104.166.89.67    美国
    91.195.240.82    德国

    1.2.利用防火墙禁用本机对外的IP访问

    为了防止对外访问造成数据问题,首先要禁用这些IP的出入站访问

    iptables -I INPUT -s 104.166.89.67/24 -j DROP
    iptables -I OUTPUT -s 104.166.89.67/24 -j DROP
    iptables -I INPUT -s 91.195.240.82/24 -j DROP
    iptables -I OUTPUT -s 91.195.240.82/24 -j DROP

    查看并保存下防火墙规则

    chkconfig iptables on
    service iptables save
    cat /etc/sysconfig/iptables
    service iptables start
    iptables -nL

    以下是保存生效的防火墙规则

    [root@web ~]# cat /etc/sysconfig/iptables
    # Generated by iptables-save v1.4.7 on Wed Jul  4 11:39:56 2018
    *nat
    :PREROUTING ACCEPT [123:7004]
    :POSTROUTING ACCEPT [1962:123695]
    :OUTPUT ACCEPT [1962:123695]
    COMMIT
    # Completed on Wed Jul  4 11:39:56 2018
    # Generated by iptables-save v1.4.7 on Wed Jul  4 11:39:56 2018
    *filter
    :INPUT ACCEPT [172093:225615531]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [21578:18815078]
    -A INPUT -s 91.195.240.0/24 -j DROP 
    -A INPUT -s 104.166.89.0/24 -j DROP 
    -A OUTPUT -s 91.195.240.0/24 -j DROP 
    -A OUTPUT -s 104.166.89.0/24 -j DROP 
    COMMIT
    # Completed on Wed Jul  4 11:39:56 2018
    [root@web ~]# iptables -nL               
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       all  --  91.195.240.0/24      0.0.0.0/0           
    DROP       all  --  104.166.89.0/24      0.0.0.0/0           
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       all  --  91.195.240.0/24      0.0.0.0/0           
    DROP       all  --  104.166.89.0/24      0.0.0.0/0    

    1.3.防火墙处理完,再查看进程访问状态

    [root@web ~]# !net
    netstat -anptl
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      16286/sshd          
    tcp        0    112 1.1.1.1:22                  2.2.2.2:50103               ESTABLISHED 1509/sshd           
    tcp        0      1 1.1.1.1:51374               91.195.240.82:8080          SYN_SENT    14221/sh            
    tcp        0      0 1.1.1.1:37026               106.11.68.13:80             ESTABLISHED 1219/AliYunDun      

    可以看到该IP已经无法对外建立连接,多次kill掉,虽然会重建,但无法对外进行访问,不过进程名会变化

    用 iptables 封禁向外请求的 ip 后,该清理木马了

    2.停止定时任务

    对于所有的木马或病毒,必定会创建定时任务,以便定时重建进程,或者在被杀掉后重建

    2.1.检查系统级别的定时任务配置

    vim /etc/crontab 
    ------------------------------
    */3 * * * * root /etc/cron.hourly/gcc.sh
    ------------------------------

    发现被增加了一项异常的定时任务,先注释掉,过几分钟又会重新创建,先不操作

    2.2.检查用户级别的定时任务配置文件

    ll /var/spool/cron/

    该目录用于保存以用户名作为文件的定时任务,没有文件表示没有用户级别的定时任务

    2.3.查看木马创建的定时任务的内容

    vim /etc/cron.hourly/gcc.sh
    ------------------------------
    [root@web tools]# vim /etc/cron.hourly/gcc.sh
    #!/bin/sh
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin
    for i in `cat /proc/net/dev|grep :|awk -F: {'print $1'}`; do ifconfig $i up& done
    cp /lib/libudev.so /lib/libudev.so.6
    /lib/libudev.so.6
    ------------------------------

    由脚本内容可以推断,以下文件是木马文件

    /lib/libudev.so
    /lib/libudev.so.6

    2.4.处理相关木马文件

    尝试失败的处理方法:
    手动清理木马文件,清除定时任务配置,不久就会重新产生

    可以成功的处理方法:

    对于木马文件,删除会重建,可以修改权限,使之无法运行,但不要删掉

    chmod 600 /lib/libudev.so
    chmod 600 /lib/libudev.so.6

    对于定时任务,删除或者注释都会被删掉重写,可以设置权限,使crontab文件无法写入

    chattr +i /etc/crontab

    处理完以上的文件,定时任务就无法运行了,接下来需要处理木马的相关进程 

    3.查杀木马

    方法:查看进程,确认木马进程名,找到对应的程序文件

    3.1.检查确认系统命令工具是否被替换

    下载并安装 rkhunter,扫描 Rootkit 替换的系统程序

    wget https://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz
    tar xzvf rkhunter*
    cd rkhunter*
    ./installer.sh --layout /usr --install
    rkhunter --update
    rkhunter -C

    我这边没有命令被替换,如果有,需要重装被修改的命令工具

    看网络上有其他人的以下命令被替换了

    ps, lsof, ss, netstat
    ps 属于 procps 
    ss 属于 iproute 
    netstat 属于 net-tools
    yum -y reinstall procps lsof iproute net-tools

    3.2.查找木马进程文件的方法

    1)查看系统进程找到木马进程名

    pstree    # 查看进程树
    ps -aux    # 查看进程
    top

    使用top命令查看的结果,以CPU倒序的方式查看,可以看到占用 CPU 最多的进程,类似这样的 “jlavwskubs” (是十位随机名称进程),

    用kill -9杀死进程后,会出现类似的十位随机名称进程,可以看出有多个守护进程,显然没用

    使用pstree也可以看到类似的十位随机名称的进程,还有子进程数量

    2)通过木马进程的PID找到木马文件的位置

    原理:Linux在启动一个进程时,系统会在 /proc下创建一个以 PID 命名的文件夹,在该文件夹下会保存该进程的信息,其中包括一个名为exe的文件指向该进程对应程序文件的绝对路径

    所以:使用以下命令查看木马进程运行目录

    ll /proc/[木马PID]

    exe文件指向的文件即为木马进程文件

    3)使用lsof命令查找木马文件的位置

    原理:用 lsof 可以查看某个路径下的运行中的进程列表

    lsof /usr/bin/*

    实例如下:

    lsof /usr/local/nginx/sbin/*
    [root@web virus]# lsof /usr/local/nginx/sbin/*
    COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
    nginx   1481 root txt    REG  252,1  5389099 1977535 /usr/local/nginx/sbin/nginx
    nginx   1484 root txt    REG  252,1  5389099 1977535 /usr/local/nginx/sbin/nginx

    4)用 pidof 命令可以查看某个路径下运行进程的 pid

    pidof /usr/bin/*

    实例如下:

    pidof /usr/local/nginx/sbin/*
    [root@web virus]# pidof /usr/local/nginx/sbin/*
    1484 1481

    发现木马进程的运行目录,可以通过管道符 | 和 xargs 将 pid传参给kill命令进行结束:

    pidof /usr/bin/* | xargs kill -9

    5)使用which查找木马进程文件的所在位置

    which [木马进程名]

    3.3.尝试解析木马进程文件内容

    1)确定木马文件所在位置,备份下该木马文件

    mkdir -p /tmp/virus
    cp /usr/bin/jlavwskubs /tmp/virus/usr-bin-jlavwskubs

    2)直接打开该文件会显示乱码,可以通过 strings 命令把二进制的木马文件转化成可识别的字符

    cd /tmp/virus
    strings usr-bin-jlavwskubs  >usr-bin-jlavwskubs.txt

    3)查找转化后的文件内容可以看到:

    sed -i '//etc/cron.hourly/gcc.sh/d' /etc/crontab && echo '*/3 * * * * root /etc/cron.hourly/gcc.sh' >> /etc/crontab

    这一行是修改定时任务的命令,也就是前面注释掉定时任务又会重新生成的原因,不管有没有,强制重建

    #!/bin/sh
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin
    for i in `cat /proc/net/dev|grep :|awk -F: {'print $1'}`; do ifconfig $i up& done
    cp /lib/libudev.so /lib/libudev.so.6
    /lib/libudev.so.6

    这个是上面定时任务执行的gcc.sh脚本的内容,

    3.4.木马程序文件的处理:

    删除会重建,可以照上面的修改权限,使之无法运行,不要删掉

    chmod 600 /usr/bin/jlavwskubs

    至此,上面定时任务涉及到的就都找出来,并停止运行了,木马相关程序也形成了个闭环,但是此时放松还为时尚早

    作为一个合格的木马,必定会设置开机启动项,这样不管你怎样清理掉我运行中的木马,一旦重启系统,木马就又回来了,所以

    4.删除开机自启动的木马程序

    4.1.检查最基本的开机启动项配置文件

    cat /etc/rc.local

    4.2.检查chkconfig方法配置的自启动的服务

    1)可以找到上面的jlavwskubs程序

    chkconfig --list|grep on
    -----------------------------------------
    [root@web ~]# chkconfig --list|grep on                  
    jlavwskubs           0:off   1:on    2:on    3:on    4:on    5:on    6:off
    -----------------------------------------

    2)查看该文件内容

    cat /etc/init.d/jlavwskubs
    -----------------------------------------
    #!/bin/sh
    # chkconfig: 12345 90 90
    # description: jlavwskubs
    ### BEGIN INIT INFO
    # Provides:        jlavwskubs
    # Required-Start:    
    # Required-Stop:    
    # Default-Start:    1 2 3 4 5
    # Default-Stop:        
    # Short-Description:    jlavwskubs
    ### END INIT INFO
    case $1 in
    start)
        /usr/bin/jlavwskubs
        ;;
    stop)
        ;;
    *)
        /usr/bin/jlavwskubs
        ;;
    esac
    -----------------------------------------

    可以看出,无论怎样操作这个程序,都是启动它,并且在12345模式下都会开机自启动
    3)接下来找这个启动的源文件,找十位随机名称的进程文件

    ls /etc/rc*/init.d
    ls /etc/rc*/

    ls /etc/rc*/
    -----------------------------------------
    [root@web ~]# ls /etc/rc*/
    /etc/rc0.d/:
    K01agentwatch   K25sshd          K50cloud-init-local    K75blk-availability  K87restorecond  K89rdisc       K90gfkexlpwho  K90luobdoxchv  K90xfeualnqzg  K95rdma
    K05atd          K30postfix       K50cloud-init-upgrade  K75netfs             K88auditd       K90apjpqfyeom  K90hnipcstryl  K90network     K90xfvzcygkae  K99lvm2-monitor
    K05jexec        K36mysqld        K60crond               K75ntpdate           K88iscsi        K90cpaanfozrw  K90imipfrazsb  K90otgsovjinw  K90yidoxmlkvd  K99sysstat
    K10saslauthd    K50cloud-config  K61nfs-rdma            K75udev-post         K88rsyslog      K90dgznpnhhcv  K90jlavwskubs  K90qfkxlouaux  K90yxexqdafhi  S00killall
    K15nginx        K50cloud-final   K74nscd                K85mdmonitor         K89iscsid       K90egymjlsoun  K90jvykhthbys  K90rrywkqorsv  K92ip6tables   S01halt
    K25aliyun-util  K50cloud-init    K74ntpd                K87multipathd        K89netconsole   K90ftyncxdpbf  K90ljtyhksudi  K90wpryovwobc  K92iptables
    
    /etc/rc1.d/:
    K01agentwatch  K25aliyun-util  K50cloud-config      K50cloud-init-upgrade  K74ntpd       K87multipathd   K88rsyslog     K90network     K95rdma              S26udev-post
    K05atd         K25sshd         K50cloud-final       K60crond               K75netfs      K87restorecond  K89iscsid      K90yidoxmlkvd  S01sysstat           S95jexec
    K10saslauthd   K30postfix      K50cloud-init        K61nfs-rdma            K75ntpdate    K88auditd       K89netconsole  K92ip6tables   S02lvm2-monitor      S99single
    K15nginx       K36mysqld       K50cloud-init-local  K74nscd                K85mdmonitor  K88iscsi        K89rdisc       K92iptables    S25blk-availability
    
    /etc/rc2.d/:
    K05atd        K75netfs        K89iscsid      K92ip6tables     S10network           S26udev-post           S53cloud-config  S64mysqld      S99local
    K10saslauthd  K75ntpdate      K89netconsole  K95rdma          S11auditd            S50aegis               S54cloud-final   S85nginx
    K30postfix    K87multipathd   K89rdisc       S01sysstat       S12rsyslog           S50cloud-init-upgrade  S55aliyun-util   S90crond
    K61nfs-rdma   K87restorecond  K90jlavwskubs  S02lvm2-monitor  S15mdmonitor         S51cloud-init-local    S55sshd          S95jexec
    K74nscd       K88iscsi        K90yidoxmlkvd  S08iptables      S25blk-availability  S52cloud-init          S58ntpd          S98agentwatch
    
    /etc/rc3.d/:
    K10saslauthd  K75ntpdate      K89rdisc       K95rdma          S08iptables  S13iscsi             S26udev-post    S58ntpd    S95atd
    K30postfix    K87multipathd   K90jlavwskubs  S01sysstat       S10network   S15mdmonitor         S50aegis        S64mysqld  S95jexec
    K61nfs-rdma   K87restorecond  K90yidoxmlkvd  S02lvm2-monitor  S11auditd    S25blk-availability  S55aliyun-util  S85nginx   S98agentwatch
    K74nscd       K89netconsole   K92ip6tables   S07iscsid        S12rsyslog   S25netfs             S55sshd         S90crond   S99local
    
    /etc/rc4.d/:
    K10saslauthd  K87multipathd   K90yidoxmlkvd    S07iscsid    S13iscsi             S50aegis               S54cloud-final  S85nginx       S99local
    K30postfix    K87restorecond  K92ip6tables     S08iptables  S15mdmonitor         S50cloud-init-upgrade  S55aliyun-util  S90crond
    K61nfs-rdma   K89netconsole   K95rdma          S10network   S25blk-availability  S51cloud-init-local    S55sshd         S95atd
    K74nscd       K89rdisc        S01sysstat       S11auditd    S25netfs             S52cloud-init          S58ntpd         S95jexec
    K75ntpdate    K90jlavwskubs   S02lvm2-monitor  S12rsyslog   S26udev-post         S53cloud-config        S64mysqld       S98agentwatch
    
    /etc/rc5.d/:
    K10saslauthd  K87multipathd   K90yidoxmlkvd    S07iscsid    S13iscsi             S50aegis               S54cloud-final  S85nginx       S99local
    K30postfix    K87restorecond  K92ip6tables     S08iptables  S15mdmonitor         S50cloud-init-upgrade  S55aliyun-util  S90crond
    K61nfs-rdma   K89netconsole   K95rdma          S10network   S25blk-availability  S51cloud-init-local    S55sshd         S95atd
    K74nscd       K89rdisc        S01sysstat       S11auditd    S25netfs             S52cloud-init          S58ntpd         S95jexec
    K75ntpdate    K90jlavwskubs   S02lvm2-monitor  S12rsyslog   S26udev-post         S53cloud-config        S64mysqld       S98agentwatch
    
    /etc/rc6.d/:
    K01agentwatch   K25sshd          K50cloud-init-local    K75blk-availability  K87restorecond  K89rdisc       K90gfkexlpwho  K90luobdoxchv  K90xfeualnqzg  K95rdma
    K05atd          K30postfix       K50cloud-init-upgrade  K75netfs             K88auditd       K90apjpqfyeom  K90hnipcstryl  K90network     K90xfvzcygkae  K99lvm2-monitor
    K05jexec        K36mysqld        K60crond               K75ntpdate           K88iscsi        K90cpaanfozrw  K90imipfrazsb  K90otgsovjinw  K90yidoxmlkvd  K99sysstat
    K10saslauthd    K50cloud-config  K61nfs-rdma            K75udev-post         K88rsyslog      K90dgznpnhhcv  K90jlavwskubs  K90qfkxlouaux  K90yxexqdafhi  S00killall
    K15nginx        K50cloud-final   K74nscd                K85mdmonitor         K89iscsid       K90egymjlsoun  K90jvykhthbys  K90rrywkqorsv  K92ip6tables   S01reboot
    K25aliyun-util  K50cloud-init    K74ntpd                K87multipathd        K89netconsole   K90ftyncxdpbf  K90ljtyhksudi  K90wpryovwobc  K92iptables
    
    /etc/rc.d/:
    init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit

    可以看到很多红色显示的,以K90和S90开头的脚本文件(方框标注),这些就是chkconfig设置的开机启动项,需要依次删掉

    注意在0,1,6三种启动级别下有K90network(圆框标注)的正常启动文件,这个是开机时网络的启动脚本,需要特别处理

    4.3.删除木马的开机自启动文件

    rm -f /etc/rc*.d/K90*
    ls /etc/rc*/ 

    使用以下命令可以恢复被删除的K90network文件

    chkconfig network on 

    查看修复后的自启动配置目录

    ls /etc/rc*/    

    多么清爽的界面,哈哈

    4.4.接下来删除掉之前禁用关停的木马程序文件和定时任务内容即可

    rm -f /etc/init.d/yidoxmlkvd
    rm -f /usr/bin/yidoxmlkvd 
    rm -f /lib/libudev.so
    rm -f /etc/cron.hourly/gcc.sh vim
    /etc/crontab

    到此木马程序就清理完毕了

    5.重启系统查看是否有其他的隐藏木马

    reboot

    重启后查看进程,没有木马相关程序即表明木马清理完成

    6.拓展知识:杀毒工具

    # 安装clamav杀毒软件,更新病毒库

    yum -y install clamav
    freshclam

    # 全盘扫描,只显示被感染的文件,并在发现时发出警告音。

    clamscan -r --bell -i /

    # 也可以进入后台扫描,并将报告输出到 /tmp/virus/scan.log

    clamscan -r --bell -i / > /tmp/virus/scan.log &

    # 更多 ClamAV 用法

    参考:

    ==== 完毕,呵呵呵呵  =====

    
    
  • 相关阅读:
    10.汇编语言--伪指令(offset、prt、lengthof)
    9.汇编语言--算数运算,标记寄存器
    8.汇编语言--数据传输指令mov等
    7.汇编语言--定义数据类型、数组
    6.汇编语言--汇编基本元素、寄存器、内存初步调试
    5.汇编语言--输入输出
    4.汇编语言--更为简便的使用win32-api
    3.汇编语言--x86处理器架构
    微信小程序获取input输入框里面的value值
    学习微信小程序遇到的坑 ---跳转
  • 原文地址:https://www.cnblogs.com/tssc/p/9265528.html
Copyright © 2011-2022 走看看