如何判斷 Linux 伺服器是否被入侵?

發表於2017-12-06

本指南中所謂的伺服器被入侵或者說被黑了的意思,是指未經授權的人或程式為了自己的目的登入到伺服器上去並使用其計算資源,通常會產生不好的影響。

免責宣告:若你的伺服器被類似 NSA 這樣的國家機關或者某個犯罪集團入侵,那麼你並不會注意到有任何問題,這些技術也無法發覺他們的存在。

然而,大多數被攻破的伺服器都是被類似自動攻擊程式這樣的程式或者類似“指令碼小子”這樣的廉價攻擊者,以及蠢蛋罪犯所入侵的。

這類攻擊者會在訪問伺服器的同時濫用伺服器資源,並且不怎麼會採取措施來隱藏他們正在做的事情。

被入侵伺服器的症狀

當伺服器被沒有經驗攻擊者或者自動攻擊程式入侵了的話,他們往往會消耗 100% 的資源。他們可能消耗 CPU 資源來進行數字貨幣的採礦或者傳送垃圾郵件,也可能消耗頻寬來發動 DoS 攻擊。

因此出現問題的第一個表現就是伺服器 “變慢了”。這可能表現在網站的頁面開啟的很慢,或者電子郵件要花很長時間才能傳送出去。

那麼你應該檢視那些東西呢?

檢查 1 – 當前都有誰在登入?

你首先要檢視當前都有誰登入在伺服器上。發現攻擊者登入到伺服器上進行操作並不複雜。

其對應的命令是 w。執行 w 會輸出如下結果:

第一個 IP 是英國 IP,而第二個 IP 是越南 IP。這個不是個好兆頭。

停下來做個深呼吸, 不要恐慌之下只是幹掉他們的 SSH 連線。除非你能夠防止他們再次進入伺服器,否則他們會很快進來並踢掉你,以防你再次回去。

請參閱本文最後的“被入侵之後怎麼辦”這一章節來看找到了被入侵的證據後應該怎麼辦。

whois 命令可以接一個 IP 地址然後告訴你該 IP 所註冊的組織的所有資訊,當然就包括所在國家的資訊。

檢查 2 – 誰曾經登入過?

Linux 伺服器會記錄下哪些使用者,從哪個 IP,在什麼時候登入的以及登入了多長時間這些資訊。使用 last 命令可以檢視這些資訊。

輸出類似這樣:

這裡可以看到英國 IP 和越南 IP 交替出現,而且最上面兩個 IP 現在還處於登入狀態。如果你看到任何未經授權的 IP,那麼請參閱最後章節。

登入後的歷史記錄會記錄到二進位制的 /var/log/wtmp 檔案中(LCTT 譯註:這裡作者應該寫錯了,根據實際情況修改),因此很容易被刪除。通常攻擊者會直接把這個檔案刪掉,以掩蓋他們的攻擊行為。 因此, 若你執行了 last 命令卻只看得見你的當前登入,那麼這就是個不妙的訊號。

如果沒有登入歷史的話,請一定小心,繼續留意入侵的其他線索。

檢查 3 – 回顧命令歷史

這個層次的攻擊者通常不會注意掩蓋命令的歷史記錄,因此執行 history 命令會顯示出他們曾經做過的所有事情。 一定留意有沒有用 wgetcurl 命令來下載類似垃圾郵件機器人或者挖礦程式之類的非常規軟體。

命令歷史儲存在 ~/.bash_history 檔案中,因此有些攻擊者會刪除該檔案以掩蓋他們的所作所為。跟登入歷史一樣,若你執行 history 命令卻沒有輸出任何東西那就表示歷史檔案被刪掉了。這也是個不妙的訊號,你需要很小心地檢查一下伺服器了。(LCTT 譯註,如果沒有命令歷史,也有可能是你的配置錯誤。)

檢查 4 – 哪些程式在消耗 CPU?

你常遇到的這類攻擊者通常不怎麼會去掩蓋他們做的事情。他們會執行一些特別消耗 CPU 的程式。這就很容易發現這些程式了。只需要執行 top 然後看最前的那幾個程式就行了。

這也能顯示出那些未登入進來的攻擊者。比如,可能有人在用未受保護的郵件指令碼來傳送垃圾郵件。

如果你最上面的程式對不瞭解,那麼你可以 Google 一下程式名稱,或者通過 losfstrace 來看看它做的事情是什麼。

使用這些工具,第一步從 top 中拷貝出程式的 PID,然後執行:

這會顯示出該程式呼叫的所有系統呼叫。它產生的內容會很多,但這些資訊能告訴你這個程式在做什麼。

這個程式會列出該程式開啟的檔案。通過檢視它訪問的檔案可以很好的理解它在做的事情。

檢查 5 – 檢查所有的系統程式

消耗 CPU 不嚴重的未授權程式可能不會在 top 中顯露出來,不過它依然可以通過 ps 列出來。命令 ps auxf 就能顯示足夠清晰的資訊了。

你需要檢查一下每個不認識的程式。經常執行 ps (這是個好習慣)能幫助你發現奇怪的程式。

檢查 6 – 檢查程式的網路使用情況

iftop 的功能類似 top,它會排列顯示收發網路資料的程式以及它們的源地址和目的地址。類似 DoS 攻擊或垃圾機器人這樣的程式很容易顯示在列表的最頂端。

檢查 7 – 哪些程式在監聽網路連線?

通常攻擊者會安裝一個後門程式專門監聽網路埠接受指令。該程式等待期間是不會消耗 CPU 和頻寬的,因此也就不容易通過 top 之類的命令發現。

lsofnetstat 命令都會列出所有的聯網程式。我通常會讓它們帶上下面這些引數:

你需要留意那些處於 LISTENESTABLISHED 狀態的程式,這些程式要麼正在等待連線(LISTEN),要麼已經連線(ESTABLISHED)。如果遇到不認識的程式,使用 stracelsof 來看看它們在做什麼東西。

被入侵之後該怎麼辦呢?

首先,不要緊張,尤其當攻擊者正處於登入狀態時更不能緊張。你需要在攻擊者警覺到你已經發現他之前奪回機器的控制權。如果他發現你已經發覺到他了,那麼他可能會鎖死你不讓你登陸伺服器,然後開始毀屍滅跡。

如果你技術不太好那麼就直接關機吧。你可以在伺服器上執行 shutdown -h now 或者 systemctl poweroff 這兩條命令之一。也可以登入主機提供商的控制皮膚中關閉伺服器。關機後,你就可以開始配置防火牆或者諮詢一下供應商的意見。

如果你對自己頗有自信,而你的主機提供商也有提供上游防火牆,那麼你只需要以此建立並啟用下面兩條規則就行了:

  1. 只允許從你的 IP 地址登入 SSH。
  2. 封禁除此之外的任何東西,不僅僅是 SSH,還包括任何埠上的任何協議。

這樣會立即關閉攻擊者的 SSH 會話,而只留下你可以訪問伺服器。

如果你無法訪問上游防火牆,那麼你就需要在伺服器本身建立並啟用這些防火牆策略,然後在防火牆規則起效後使用 kill 命令關閉攻擊者的 SSH 會話。(LCTT 譯註:本地防火牆規則 有可能不會阻止已經建立的 SSH 會話,所以保險起見,你需要手工殺死該會話。)

最後還有一種方法,如果支援的話,就是通過諸如序列控制檯之類的帶外連線登入伺服器,然後通過 systemctl stop network.service 停止網路功能。這會關閉所有伺服器上的網路連線,這樣你就可以慢慢的配置那些防火牆規則了。

重奪伺服器的控制權後,也不要以為就萬事大吉了。

不要試著修復這臺伺服器,然後接著用。你永遠不知道攻擊者做過什麼,因此你也永遠無法保證這臺伺服器還是安全的。

最好的方法就是拷貝出所有的資料,然後重灌系統。(LCTT 譯註:你的程式這時已經不可信了,但是資料一般來說沒問題。)

 

相關文章