■ 河南 劉建臣
編者按:單位的一臺Linux服務器上運行了Web服務,最近訪問起來比較緩慢,在經過一系列排查之后發現是遭到了黑客攻擊所致,本文就將該過程進行詳細分析。
單位的一臺Linux服務器上運行了Web服務,最近訪問起來比較緩慢,該機采用的是Apache+TomCat的平臺,后臺是Oracle數據庫。
執行“top”命令查看其整體狀態,發現CPU的占用率很高,在返回信息中的“Load average”欄中顯示在1分鐘/5分鐘/15分鐘間隔的負載也很高,該機安裝了32GB的內存,在“Mem”欄中顯示內存的占用率居高不下。該機處于超負荷運行狀態,這明顯和平時狀態不符。
對進程列表進行分析,可以發現名為“systemd”的進程比較可疑,對應的“%CPU”中的數值很高,“%MEM”列的數值很小,說明CPU占用率很高,但內存使用率卻很小。
在老版系統中,“init”進程是系統啟動的首個進程(即根進程),在新版本的系統(例如“CentOS7”等),該進程被“systemd”進程取代了。執行“more /etc/issue”命令查看系統版本信息,發現采用的是CentOS6.X版本,這就存在明顯的問題,因為上述進程列表“init”和“systemd”進程是同時存在的。
對 于“init” 進 程 來說,PID為1,關聯的用戶為“root”,這是沒有問題的。但是“systemd”進程的PID是一個雜亂的數字,而且啟動的用戶是一個名為“oracle”的普通用戶,但是普通用戶是沒有權限啟動系統級別的進程的。執行“ps -ef”命令,顯示系統級別的進程信息,在其中細致查找,發現名為“oracle”的用戶在不同的時間點運行了兩個名為“proc”的進程,與其對應的PID和上述進程列表中的進程ID是完全相同的。根據以上分析,上述“systemd”明顯是利用Shell啟動的,是來歷不明的虛假進程。
對“oracle”用戶啟動的進程進行全面分析,發現其啟動了名為“lan0 /oracle/prt”的程序,在正常情況下,在Oracle目錄中是不存在這一程序的。執行“lsof -p 23108”命令查看指定進程加載的信息,其中的“23168”為“systemd”進程關聯的ID。在列表中顯示名為“oracle”的用戶在啟動該進程時,先查看了根目錄,之后其調用了“/usr/bin/crontab”程序,而且其開啟了名為“localhost.localdomain:51609” 的 監聽端口,通過調用“/bin/uname”命令來查看主機的IP,還執行了“delete”命令刪除了一些文件,并且建立了一個長久的網絡連接,在本機和“x.x.x.193”的遠程主機之間建立TCP連接。
可以看出,“systemd”進程在啟動時,會利用預設的計劃任務啟動特定程序,之后開啟非法連接,很顯然這是一個惡意程序。進入“/var/spool/cron”目錄,執行“ls”命令,顯示“oracle”和“root”用戶都創建了計劃任務。執行“more oracle”命令,顯示“oracle”用戶創建了“* * * * * /home/oracle/.cp/Update >/dev/null 2>&1”和“* * * * */home/oracle/prt >/dev/null 2>&1 &”兩個計劃任務,說明這些非法任務在持續不斷的執行。執行“lsof-i :51609”命令,查看上述可疑端口的信息,發現與其相關的是“ptr”和“systemd”進程,其中的“ptr”進程對應的PID為3029。
執 行“ps -ef |grep 3029”命令,發現與其對應的是“/oracle/ptr”程序,這說明該程序啟動了TCP 51609端口和外界建立非法連接。既然“systemd”進程極為可疑,那么執行“find/* -name systemd”命令,來查找與其相關的文件。但是沒有找到相關的文件,說明黑客很可能先創建了該文件并啟動,然后將其刪除,沒有留下明顯的痕跡,造成非常真實的運行效果,讓管理員誤以為這是一個系統進程。黑客通過“/home/oracle/ptr”進程開啟非法端口,提供給“systemd”進程使用。
進入“/home/oracle”目錄,自行“ls -al”命令,發現了“ptr”“ddeut”“wxvatt0”等可疑執行文件和一些目錄。進入其中的“cppcb”的目錄,發現很多雜亂的 文 件。 執 行“more passwordfile”命 令 查 看名為“passwordfile”的文件,發現這其實是一個字典文件,明顯是用來測試賬戶密碼的。執行“more scan.log”命令,查看其中的某個日志文件,發現包含了大量IP,明顯是用來掃描的,即使用上述字典來掃描這些IP,進而獲取登錄權限的。
當非法程序運行后,往往會在臨時文件目錄下留下一些痕跡,因為這些目錄擁有可讀可寫可執行的權限,進入“/tmp”和“/var/tmp”等目錄下,執行“ls -al”命令,顯示所有的文件,從中可以發現一些可疑文件。根據以上分析,不難發現該Linux主機之所以出現很高的CPU占用率,就是因為其被惡意程序非法控制所致。因為該機的“Oracle”賬戶采用了簡單密碼,被惡意程序破解后,就以該賬戶身份登錄進來,之后上傳了掃描文件,利用該機來對其他的主機進行掃描攻擊。如果其破解了其他主機的密碼。就采取同樣的手法對其進行登錄,來攻擊更多的主機。
知道了問題所在,處理起來就容易多了,只需停止惡意進程,刪除相關文件,清理非法計劃任務,就可以將該機恢復到正常狀態。
進入“/home/oracle”目錄,執 行“rm -rf cppcb*”命令,徹底刪除非法目錄。依次執行“rm -rf xxx”命令,將所有的惡意文件徹底刪除,其中的“xxx”代表具體的文件名。執行“su - oracle”命令,切換到“Oracle”用戶環境,執行“crontab -e”命令,刪除非法的計劃任務項目。進入“/tmp”目錄,將可執行“ls-al”命令,顯示隱藏的信息,利用上述命令,將這些可疑的隱藏文件刪除。
執 行“kill -9 23108”等命令,將上述“systemd”進程關閉。執行“top”命令,可以看到CPU的占用率降低了很多,系統負載明顯降低。但是執行“lsof -i :51609”命令,發現上述可疑端口依然處于開啟狀態。因其對應的 PID為 3029,執行“kill-9 3029”命令,將對應的進程關閉。
為了防止該機再次被黑客利用,可以執行“passwd oracle”命令,更改“Oracle”賬戶密碼。因為黑客是通過TCP 22端口以“Oracle”用戶身份登錄的,所以需要使用Linux內置的防火墻進行攔截。執行“iptables A INPUT -p tcp--dport 80 -j ACCEPT”、“iptables -A INPUT-s x.x.x.x/32 -p tcp--dport 22 -j ACCEPT”、“iptables A INPUT -i lo-j ACCEPT”、“iptables A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT”命令,只開放本機的TCP 80端口,只針對本機開放TCP 22端口。
執行:iptables A INPUT-p tcp -m tcp -tcp-flags FIN, SYN,RST,ACK,URG NONE-j DROP
iptables A INPUT -p tcp -m tcp -tcp-flags FIN, SYN FYN,SYN -j DROP
iptables A INPUT -p tcp -m tcp -tcp-flags SYN,RST SYN,RST -j DROP
iptables A INPUT -p tcp -m tcp --tcp-flags FIN, RST FIN,RST -j DROP
iptables A INPUT -p tcp -m tcp -tcp-flags FIN, ACK FIN -j DROP
iptables A INPUT -p tcp -m tcp -tcp-flags PSH, ACK PSH -j DROP
iptables A INPUT -p tcp -m tcp -tcp-flags ACK, URG URG -j DROP
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPY
iptables -P FORWARD DROP等命令,攔截所有可疑的TCP數據包。這樣,即使黑客知道了本機密碼,也無法連接本機。