1. 前言 昨天郵件收到如下圖所示: 啊,天啊,對於一個做前端開發的人來說,對服務器端的知識只略懂一二啊,黑客就知道欺負小白,入侵我的服務器。 一開始我是束手無策的,根本無從所知病毒在哪,黑客怎么入侵我的服務器。接下來,讓我們一步步來排查吧,先看看如何判斷 Linux 服務器是否被入侵? 2. 判斷Linux 服務器是否被入侵 所謂的服務器被入侵或者說被黑了的意思,是指未經授權的人或程序為了自己的目的登錄到服務器上去並使用其計算資源,通常會產生不好的影響。 免責聲明:若你的服務器被類似 NSA 這樣的國家機關或者某個犯罪集團入侵,那么你並不會注意到有任何問題,這些技術也無法發覺他們的存在。 然而,大多數被攻破的服務器都是被類似自動攻擊程序這樣的程序或者類似“腳本小子”這樣的廉價攻擊者,以及蠢蛋罪犯所入侵的。 這類攻擊者會在訪問服務器的同時濫用服務器資源,並且不怎么會采取措施來隱藏他們正在做的事情。 被入侵服務器的症狀 當服務器被沒有經驗攻擊者或者自動攻擊程序入侵了的話,他們往往會消耗 100% 的資源。他們可能消耗 CPU 資源來進行數字貨幣的采礦或者發送垃圾郵件,也可能消耗帶寬來發動 DoS 攻擊。 因此出現問題的第一個表現就是服務器 “變慢了”。這可能表現在網站的頁面打開的很慢,或者電子郵件要花很長時間才能發送出去。 那么你應該查看那些東西呢? 2.1 當前都有誰在登錄? 你首先要查看當前都有誰登錄在服務器上。發現攻擊者登錄到服務器上進行操作並不復雜。 其對應的命令是 w。運行 w 會輸出如下結果: 10:43:09 up 214 days, 1:20, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 183.15.179.82 09:49 0.00s 0.02s 0.00s w 查了一下ip地址,是自己登陸了,沒有其他人登陸,如果查到ip地址不是自己的ip地址就要注意了,這個不是個好兆頭。 停下來做個深呼吸, 不要恐慌之下只是干掉他們的 SSH 連接。除非你能夠防止他們再次進入服務器,否則他們會很快進來並踢掉你,以防你再次回去。 請參閱本文最后的“被入侵之后怎么辦”這一章節來看找到了被入侵的證據后應該怎么辦。 whois 命令可以接一個 IP 地址然后告訴你該 IP 所注冊的組織的所有信息,當然就包括所在國家的信息。 2.2 誰曾經登錄過? Linux 服務器會記錄下哪些用戶,從哪個 IP,在什么時候登錄的以及登錄了多長時間這些信息。使用 last 命令可以查看這些信息。 輸出類似這樣: root pts/1 78.31.109.1 Thu Nov 30 08:26 still logged in root pts/0 113.174.161.1 Thu Nov 30 08:26 still logged in root pts/1 78.31.109.1 Thu Nov 30 08:24 - 08:26 (00:01) root pts/0 113.174.161.1 Wed Nov 29 12:34 - 12:52 (00:18) root pts/0 14.176.196.1 Mon Nov 27 13:32 - 13:53 (00:21) 這里可以看到英國 IP 和越南 IP 交替出現,而且最上面兩個 IP 現在還處於登錄狀態。如果你看到任何未經授權的 IP,那么請參閱最后章節。 登錄后的歷史記錄會記錄到二進制的/var/log/wtmp文件中(LCTT 譯注:這里作者應該寫錯了,根據實際情況修改),因此很容易被刪除。通常攻擊者會直接把這個文件刪掉,以掩蓋他們的攻擊行為。 因此, 若你運行了last命令卻只看得見你的當前登錄,那么這就是個不妙的信號。 如果沒有登錄歷史的話,請一定小心,繼續留意入侵的其他線索。 2.3 回顧命令歷史 這個層次的攻擊者通常不會注意掩蓋命令的歷史記錄,因此運行 history命令會顯示出他們曾經做過的所有事情。 一定留意有沒有用 wget 或 curl命令來下載類似垃圾郵件機器人或者挖礦程序之類的非常規軟件。 命令歷史存儲在~/.bash_history文件中,因此有些攻擊者會刪除該文件以掩蓋他們的所作所為。跟登錄歷史一樣,若你運行history 命令卻沒有輸出任何東西那就表示歷史文件被刪掉了。這也是個不妙的信號,你需要很小心地檢查一下服務器了。(LCTT 譯注,如果沒有命令歷史,也有可能是你的配置錯誤。) 2.4 哪些進程在消耗 CPU? 你常遇到的這類攻擊者通常不怎么會去掩蓋他們做的事情。他們會運行一些特別消耗 CPU 的進程。這就很容易發現這些進程了。只需要運行 top然后看最前的那幾個進程就行了。 這也能顯示出那些未登錄進來的攻擊者。比如,可能有人在用未受保護的郵件腳本來發送垃圾郵件。 如果你最上面的進程對不了解,那么你可以 Google 一下進程名稱,或者通過 losf和 strace來看看它做的事情是什么。 使用這些工具,第一步從 top中拷貝出進程的 PID,然后運行: strace -p PID 這會顯示出該進程調用的所有系統調用。它產生的內容會很多,但這些信息能告訴你這個進程在做什么。 lsof -p PID 這個程序會列出該進程打開的文件。通過查看它訪問的文件可以很好的理解它在做的事情。 2.5 檢查所有的系統進程 消耗 CPU 不嚴重的未授權進程可能不會在top中顯露出來,不過它依然可以通過ps 列出來。命令ps auxf就能顯示足夠清晰的信息了。 你需要檢查一下每個不認識的進程。經常運行 ps(這是個好習慣)能幫助你發現奇怪的進程。 2.6 檢查進程的網絡使用情況 iftop 的功能類似 top,它會排列顯示收發網絡數據的進程以及它們的源地址和目的地址。類似 DoS 攻擊或垃圾機器人這樣的進程很容易顯示在列表的最頂端。 2.7 哪些進程在監聽網絡連接? 通常攻擊者會安裝一個后門程序專門監聽網絡端口接受指令。該進程等待期間是不會消耗 CPU 和帶寬的,因此也就不容易通過top之類的命令發現。 lsof和 netstat 命令都會列出所有的聯網進程。我通常會讓它們帶上下面這些參數: lsof -i netstat -plunt 你需要留意那些處於 LISTEN 和 ESTABLISHED 狀態的進程,這些進程要么正在等待連接(LISTEN),要么已經連接(ESTABLISHED)。如果遇到不認識的進程,使用 strace 和 lsof來看看它們在做什么東西。 3. 被入侵之后該怎么辦呢? 經過上面的步驟后,基本可以找到你的服務器是否被入侵了。如果入侵了,首先,不要緊張,尤其當攻擊者正處於登錄狀態時更不能緊張。你需要在攻擊者警覺到你已經發現他之前奪回機器的控制權。如果他發現你已經發覺到他了,那么他可能會鎖死你不讓你登陸服務器,然后開始毀屍滅跡。 如果你技術不太好那么就直接關機吧。你可以在服務器上運行 shutdown -h now 或者 systemctl poweroff 這兩條命令之一。也可以登錄主機提供商的控制面板中關閉服務器。關機后,你就可以開始配置防火牆或者咨詢一下供應商的意見。 如果你對自己頗有自信,而你的主機提供商也有提供上游防火牆,那么你只需要以此創建並啟用下面兩條規則就行了: 只允許從你的 IP 地址登錄 SSH。 封禁除此之外的任何東西,不僅僅是 SSH,還包括任何端口上的任何協議。 這樣會立即關閉攻擊者的 SSH 會話,而只留下你可以訪問服務器。 如果你無法訪問上游防火牆,那么你就需要在服務器本身創建並啟用這些防火牆策略,然后在防火牆規則起效后使用kill 命令關閉攻擊者的 SSH 會話。(LCTT 譯注:本地防火牆規則 有可能不會阻止已經建立的 SSH 會話,所以保險起見,你需要手工殺死該會話。) 最后還有一種方法,如果支持的話,就是通過諸如串行控制台之類的帶外連接登錄服務器,然后通過systemctl stop network.service停止網絡功能。這會關閉所有服務器上的網絡連接,這樣你就可以慢慢的配置那些防火牆規則了。 重奪服務器的控制權后,也不要以為就萬事大吉了。 不要試着修復這台服務器,然后接着用。你永遠不知道攻擊者做過什么,因此你也永遠無法保證這台服務器還是安全的。 最好的方法就是拷貝出所有的數據,然后重裝系統。(LCTT 譯注:你的程序這時已經不可信了,但是數據一般來說沒問題。) 4. 過程 經過上面步驟 2.1,2.2,2.3 我都沒發現我的服務器有什么異常或者被誰登陸過,但是在步驟2.4 的時候,發現了異常,有不認識的進程在消耗CPU,然后我用strace -p PID 發現這個進程在向外發大量的數據包,用步驟2.7中的lsof -i發現確實這個進程在監聽網絡連接,進程名 有pnscan,在我用kill -9 PID 后 ,運行ps aux | grep pnscan 發現該進程仍然存在,於是上網查了一下,發現這是JBoss漏洞中毒。 5. 查進程端口相互占用情況 Linux下查看進程占用端口: 查看程序對應進程號:ps –ef | grep 進程名 [root@iZ28ti4v56dZ ~]# ps -ef | grep nginx root 17453 1 0 Feb27 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 17455 17453 0 Feb27 ? 00:14:13 nginx: worker process root 32251 32073 0 17:45 pts/0 00:00:00 grep nginx REDHAT :查看進程號所占用的端口號:netstat –nltp|grep 進程號 ubuntu:查看進程占用端口號:netstat -anp|grep pid [root@iZ28ti4v56dZ ~]# netstat -anp | grep 17453 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 17453/nginx tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 17453/nginx unix 3 [ ] STREAM CONNECTED 11886123 17453/nginx unix 3 [ ] STREAM CONNECTED 11886122 17453/nginx [root@iZ28ti4v56dZ ~]# netstat -nltp | grep 17453 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 17453/nginx tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 17453/nginx Linux下查看端口號所使用的進程號: 使用lsof命令: lsof –i:端口號 [root@iZ28ti4v56dZ ~]# lsof -i:443 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 17453 root 7u IPv4 11886111 0t0 TCP *:https (LISTEN) nginx 17455 nginx 7u IPv4 11886111 0t0 TCP *:https (LISTEN) 6. Jboss漏洞導致linux服務器中毒解決辦法 6.1 中毒現象 網絡出現擁塞,訪問延遲增加。 系統定時任務表中出現異常的定時任務。 出現異常進程。 $JBOSS_HOME/bin或/root目錄下出現大量的異常文件。 6.2 現象分析 這是最近網上流行的一種蠕蟲病毒,它利用Jboss中間件程序的jxm-console與web-console默認帳戶漏洞進行攻擊,感染linux服務器,成為僵屍代理。 出現網絡擁塞的原因是該蠕蟲病毒利用名為pnscan工具不斷執行端口掃描。發出大量的請求包,占用網絡帶寬。 在系統定時任務表中可查看到名為如下的異常定時任務(有時候只有其中2個)。 crontab –l .sysync.pl與.sysdbs都是隱藏文件,可以通過ls –la列表查看到。 查看進程,可以檢查到以下異常進程 有些服務器上還可以看到一些javas的異常進程,請確認這些javas進程,是否應用程序調用的java。 在$JBOSS_HOME/bin或/root目錄下出現大量如下異常文件 其中kisses.tar.gz就是病毒源碼安裝包,安裝后生成以上文件。 6.3 解決方法 步一:查殺病毒 Killall -9 javas Killall -9 pns Killall -9 perl cd /root 或 cd $JBOSS_HOME/bin rm –rf bm rm –rf .pl rm –rf treat.sh rm –rf install-sh rm –rf version rm –rf kisses rm –rf pns rm –rf Makefile rm –rf ipsort rm –rf kisses rm –rf .sysdbs rm –rf .sysync.pl crontab –e 1 1 10 ~/.sysdbs 1 1 24 perl ~/.sysync.pl 1 1 24 perl ~/.sysync.pl 1 1 10 ~/.sysdbs 刪除掉這幾行 service crond stop 步二:Jboss安全加固,修改jmx-console與web-console的默認口令 JMX安全配置: 把GET和POST兩行注釋掉,同時security-constraint整個部分不要注釋掉。 把security-domain注釋去掉 修改admin密碼 WEB-CONSOLE安全加固 修改方法與JMX安全加固一樣。 步三:測試 完成Jboss的安全加固后做http訪問測試,看能否正常顯示驗證窗口,輸入設置的用戶名口令后能否正常訪問。 http://xxx.xxx.xxx.xxx/web-console http://xxx.xxx.xxx.xxx/jmx-conslole 6.4 針對Jboss漏洞攻擊的建議 對於病毒攻擊一般還是以預防為主,一旦發現服務器已經中毒解決起來相關棘手。為了更有效的預防此類病毒攻擊,提供以下建議: Jboss應用程序應運行在非root用戶下,防止病毒獲得超級用戶權限,修改root口令,控制服務器。 為Jboss控制台啟用驗證,修改默認口令,口令要具有一定的復雜度。如果不需要,甚至可以關閉管理端口和相關統計信息,刪除Jboss主目錄和文件。 將Jboss升級到最新版本,尤其是老板本的Jboss的本身漏洞較多,新版本的Jboss安全性較高。 WEB應用與接收器分離,如可以通過Apache與Jboss整合的方式實現,這樣做一方面更安全,另一方面更適合高並發流量的訪問。 7. 總結 從昨天排查殺毒到今天,已經沒再給我發警告郵件了,說明病毒已經清除掉了。從這件事件中,發現世間難免有一些壞人,去攻擊別人的服務器,專門攻擊像我這種對服務器知識只懂皮毛的人,也要感謝他們,讓我下決心去學好相關知識來抵擋他們的攻擊。
商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:ll
鏈接:https://www.geekjc.com/post/5b95fb14fa1f363b8f7393b6
來源:極客教程
