
前陣子處理一台 Ubuntu 14.04 的機器,常常連不上、CPU 突然飆高,進入系統後用 ps 檢查,發現有許多奇怪的 Process 在執行,一直以來我對於這種奇怪的 Process 都會特別注意。沒錯,是機器被駭了,幫人工作(挖礦),但只是挖礦倒是單純。讓我更擔心的反而是其他的機器是否也被入侵了。
但我並沒有急著把它清乾淨,而是先觀察這駭客的行為,清的同時也把現場留下來:/etc、排程、日誌、當下的行程表都備份一份,在跑的程式本體也從 /proc/PID/exe 撈回來,算好雜湊,帶離這台機器再看。
既然知道這台被駭,那機器上的工具是不能信了,用 dpkg -V 比對系統程式,/bin/ls 已經被換掉;/etc/ld.so.preload 掛著一個 rootkit,一般程式啟動都會先載入它。也就是說,在這台機器上打 ls、ps 看到的,是駭客想讓我看到的。後面的檢查,我改用靜態編譯的 busybox,在獨立的 mount namespace 裡把 ld.so.preload 遮掉再跑。
那它到底做了什麼:
- 對外連線:
netstat -tnp看到它連著礦池的 3333 埠;清到一半,它換了另一個礦池繼續連。 - 排程:每小時從外部網站下載一段腳本,直接交給 shell 執行。
- 自我修復:行程被殺,systemd 馬上把它拉回來;檔案被設成 immutable,刪不掉;crontab 清掉,沒多久又被裝回去;帳號刪掉,同一分鐘又被建回來。
用 last、lastb 讀登入紀錄:一個在 sudo 群組裡的帳號,在登入失敗紀錄裡被試了三千多次密碼,最後被猜中,同一次登入就拿到 root。之後它建了一個叫 systemd 的帳號,名字看起來像系統的一部分,並在 sudoers 最後一行給它免密碼的 root。從第一次登入到被發現,過了 52 天。
更麻煩的是,這台機器的 auth.log 裡找不到任何 sshd 的紀錄。暴力破解、登入成功,都沒有留在最該留的地方。

修掉了以下的程式:
ld.so.preload掛的 rootkit,和被換掉的/bin/ls- 開機自動執行的
/usr/sshd,和會把它拉回來的 systemd 服務 - 每小時從外部下載腳本的排程,和被入侵帳號的 crontab
- 冒名的
systemd帳號,和 sudoers 裡的免密碼 root
清完複查,這些都沒有再出現。即使如此,但還是擔心有漏網之魚,也擔心密碼、金鑰等外洩,最後還是決定重灌一勞永逸。
之後我把檢查的清單,寫成檢查程式:ld.so.preload、行程的執行檔位置、cron、systemd 單元、sudoers、帳號、被改過的系統檔、immutable 檔、核心模組、連往礦池的連線、陌生的監聽埠等。
至於其他機器,同一支程式我也拿去另一台正式主機跑了一遍,還好沒有發現後門的跡象。
後來也把這個檢查程式整合進 SvrGuard:從暫存目錄跑起來的程式、ld.so.preload、從暫存目錄啟動的 cron 與 systemd、sudoers 裡的免密碼 root、連往礦池的對外連線。
這個經驗讓我深深體會,應該要有一個持續幫我監控、主動防禦跟檢查及隨時通知系統發生甚麼問題的工具,預防勝於治療,這樣就不用隨時擔心甚麼時候被駭。
本系列文章:主機防禦系統-SvrGuard。想了解更多 SvrGuard,歡迎造訪 SvrGuard 官方網站,有問題或想法歡迎到 SvrGuard 討論區。