Linux下XordDos木馬的清除

朋友的阿里雲服務器一早上報木馬入侵,找我處理,登錄阿里雲查看警告信息「惡意進程(雲查殺)-XorDDoS木馬」,mysql

本文也能夠做爲服務器處理木馬排查的步驟的參考文章linux

排查原則:

1.通常的木馬都有多個守護進程,不必定能夠短期停掉,或者處理好,要注意備份業務數據nginx

2.若是木馬運行影響到業務運行,首先要恢復業務的訪問,同時進行排查處理,可是並不建議web

3.若是沒有太大影響,能夠先停掉相關業務進程,防止查殺過程的操做對業務產生影響sql

生產環境注意根據實際狀況決策ubuntu

處理木馬病毒的順序:

1.關閉對外訪問
2.中止定時任務
3.關閉木馬的守護進程
4.禁止木馬程序運行
5.刪除開機自啓動的木馬程序
6.重啓服務器測試木馬是否清理完成vim

1.確認木馬類型,關閉對外訪問

從阿里雲平臺得知是DDOS的木馬,可能對服務器性能形成影響,對業務數據不必定有影響bash

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 用法

參考:

==== 完畢,呵呵呵呵  =====

相關文章
相關標籤/搜索