朋友的阿里雲服務器一早上報木馬入侵,找我處理,登陸阿里雲查看警告信息“惡意進程(雲查殺)-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 用法
參考:
==== 完畢,呵呵呵呵 =====