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