淺析Linux系統入侵排查與應急響應技術
前言
當企業發生網絡安全事件時,急需第一時間進行處理,使企業的網絡信息系統在最短時間內恢復正常工作,同時還需進一步查找入侵來源,還原入侵事故過程,給出解決方案與防范措施,為企業挽回或減少經濟損失。
常見的網絡安全事件:
- Web入侵:掛馬、篡改、Webshell;
- 系統入侵:系統異常、RDP爆破、SSH爆破、主機漏洞;
- 病毒木馬:遠控、后門、勒索軟件;
- 信息泄漏:拖褲、數據庫登錄(弱口令);
- 網絡流量:頻繁發包、批量請求、DDOS攻擊;
一個常規的入侵事件后的系統排查思路:

相關步驟的核心如下:
- 文件分析
- a) 文件日期、新增文件、可疑/異常文件、最近使用文件、瀏覽器下載文件;
- b) Webshell 排查與分析;
- c) 核心應用關聯目錄文件分析;
- 進程分析
- a) 當前活動進程、遠程連接;
- b) 啟動進程、計劃任務;
- c) 進程工具分析:Windows 使用 Pchunter、 Linux 使用 Chkrootkit 或 Rkhunter;
- 系統分析
- a) 環境變量;
- b) 帳號信息;
- c) History;
- d) 系統配置文件;
- 日志分析
- (a) 操作系統日志:Windows事件查看器、Linux
/var/log/; - (b) 應用日志分析:Access.log、Error.log。
本文旨在針對常見的攻擊事件,結合工作中應急響應事件分析和解決的方法,總結了一些 Linux 服務器入侵排查的思路和方法。
系統分析
對于被入侵的服務器,可對當前主機存在的用戶信息、歷史命令執行記錄、端口占用、異常進程、可疑服務等情況進行排查,從而搜集掌握入侵信息。
用戶信息排查
先來看看相關命令:
cat /etc/shadow #查看密碼cat /etc/group #查看組信息history #查看root用戶執行的歷史命令last #查看最近登錄成功的用戶及信息lastlog #顯示主機所有用戶最近一次登錄信息id #當前用戶信息who #查看當前登錄系統的所有用戶w #顯示已經登陸系統的用戶列表,并顯示用戶正在執行的指令users #顯示當前登錄系統的所有用戶的用戶列表usermod -L user #禁用帳號,帳號無法登錄,/etc/shadow第二欄為!開頭userdel -r user #刪除user用戶,并且將/home目錄下的user目錄一并刪除#查看可以遠程登錄的用戶awk '/\$1|\$6/{print $1}' /etc/shadow #查看擁有sudo權限的用戶more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"#查看超級用戶(uid=0),有些黑客將普通用戶的uid改為0,則該普通用戶也擁有了超級權限 awk -F: '$3==0{print $1}' /etc/passwd
1、來看下與系統用戶賬戶相關的文件格式:
A、用戶信息文件:/etc/passwdroot:x:0:0:root:/root:/bin/bashaccount:password:UID:GID:GECOS:directory:shell格式:用戶名:密碼:用戶ID:組ID:用戶說明:家目錄:登陸之后shell注意:無密碼只允許本機登陸,遠程不允許登陸 B、系統影子文件:/etc/shadowroot:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::bin:*:18264:0:99999:7:::daemon:*:18264:0:99999:7:::adm:*:18264:0:99999:7:::格式:用戶名:加密后的密碼:密碼最后一次修改日期:兩次密碼的修改時間間隔:密碼有效期:密碼修改到期到的警告天數:密碼過期之后的寬限天數:賬號失效時間:保留注意:如果加密后的密碼這一欄的第一個字符為!或者*的話,說明這是一個不能登錄的賬戶
可執行 lastlog 命令可顯示主機所有用戶最近一次登錄信息,可以看到除了 root 之外其他賬戶均為登錄過(均為不可登錄的賬戶):

2、查看可以遠程登錄的用戶、擁有 sudo 權限的用戶:

3、查看用戶執行的歷史命令信息:
Linux 系統可以通過 .bash_history 查看帳號執行過的系統命令:
1、查看 root 用戶的歷史命令:histroy2、打開 /home 各帳號目錄下的.bash_history,執行命令:cat .bash_history >> history.txt,可查看普通帳號的歷史命令3、為歷史的命令增加登錄的IP地址、執行命令時間等信息:(1)保存1萬條命令sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile(2)在 /etc/profile 的文件尾部添加如下行數配置信息:######jiagu history xianshi#########USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`if [ "$USER_IP" = "" ]thenUSER_IP=`hostname`fiexport HISTTIMEFORMAT="%F %T $USER_IP `whoami` "shopt -s histappendexport PROMPT_COMMAND="history -a"######### jiagu history xianshi ##########(3)source /etc/profile讓配置生效生成效果: 1 2021-07-16 06:19:24 222.129.38.129 root whoami 2 2021-07-16 06:19:36 222.129.38.129 root history 3 2021-07-16 06:20:56 222.129.38.129 root cat /root/.bash_history
4、歷史操作命令的清除:history -c注意此命令并不會清除保存在文件中的記錄,因此需要手動刪除.bash_profile文件中的記錄。
相關命令執行效果如下:


進程端口排查
同樣先來看看相關命令:
netstat -antlp #檢查端口連接情況netstat -antlp | grep 18176 #查看端口連接情況,過濾含有字符“18176”的行top #動態查看進程ls -l /proc/18176/exe #查看PID為18176的進程的可執行程序lsof -p 18176 #查看PID為18176的進程打開的文件lsof -c sshd #查看進程sshd打開的文件lsof -i:33946 #查看33946端口對應的一些進程fuser -n tcp 33946 #查看33946端口對應的進程PIDpstree #查看進程樹ps aux #靜態查看進程ps aux | grep ssh #查看與ssh相關的進程ps aux --sort -pcpu #靜態查看進程,根據cpu使用情況排行,從高到低ps aux --sort -pmem #靜態查看進程,根據內存使用情況排行,從高到低ps -p PID -o lstart #查看進程的啟動時間點kill -9 pid #強制殺死進程
1、使用netstat -antlp命令檢查異常端口:

2、使用ps aux --sort -pcpu命令查看系統進程(根據 CPU 使用情況排行,從高到低,如果 CPU 占用率超過 70% 且名字可疑,大概率是中了挖礦病毒了):

【木馬排查實例】
1、檢查端口連接情況,查看到名為 kali-6666.elf 的異常連接,疑似外連木馬:

2、使用 ps 命令,匹配進程,得到相應 pid 號:

3、查看 pid 所對應的進程文件路徑:

4、應急處置:針對以上案例,進一步可使用kill -9 6071強制殺死進程,并 rm -f kali-6666.elf 將木馬文件刪除,同時應該溯源分析木馬文件是如何被傳到服務器的。
系統服務排查
1、檢查是否存在可疑服務,執行命令service --status-all,枚舉主機所有服務,查看是否有惡意服務:

另外chkconfig -list 命令也可列出所有的服務:
2、當發現入侵殺掉了惡意進程后,過一段時間如果惡意進程又會重新啟動,則說明該進程有守護進程,此時應檢查是否存在可疑定時任務,可使用cat /etc/anacrontab查看 anacron 異步定時任務,同時使用crontab -l 枚舉定時任務:
3、檢查服務器開機啟動項:

核查部分啟動項如下:

例子:當我們需要開機啟動自己的腳本時,只需要將可執行腳本丟在/etc/init.d目錄下,然后在/etc/rc.d/rc*.d中建立軟鏈接即可:
root@localhost ~]# ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh
此處的 sshd 是具體服務的腳本文件,S100ssh 是其軟連接,S 開頭代表加載時自啟動;如果是 K 開頭的腳本文件,代表運行級別加載時需要關閉的。
4、RPM 軟件包檢查(RPM 包是預先在 Linux 機器上編譯好并打包好的軟件安裝包),Linux 系統完整性可以通過 rpm 自帶的 -Va 來校驗檢查所有的 rpm 軟件包,查看哪些命令是否被替換了:

如果一切均校驗正常將不會產生任何輸出,如果有不一致的地方,就會顯示出來,輸出格式是8位長字符串,每個字符都用以表示文件與 RPM 數據庫中一種屬性的比較結果 ,如果是. (點) 則表示測試通過。
驗證內容中的8個信息的具體內容如下: S 文件大小是否改變 M 文件的類型或文件的權限(rwx)是否被改變 5 文件MD5校驗是否改變(可以看成文件內容是否改變) D 設備中,從代碼是否改變 L 文件路徑是否改變 U 文件的屬主(所有者)是否改變 G 文件的屬組是否改變 T 文件的修改時間是否改變
日志分析
Linux 系統日志檢查:
- 日志默認存放位置:/var/log/;
- 必看日志:secure、history;
- 查看日志配置情況:more /etc/rsyslog.conf;
核心日志文件及其作用如下:
/var/log/cron 記錄了系統定時任務相關的日志/var/log/cups 記錄打印信息的日志/var/log/dmesg 記錄了系統在開機時內核自檢的信息,也可以使用dmesg命令直接查看內核自檢信息/var/log/mailog 記錄郵件信息/var/log/message 記錄系統重要信息的日志。這個日志文件中會記錄Linux系統的絕大多數重要信息,如果系統出現問題時,首先要檢查的就應該是這個日志文件/var/log/btmp 記錄錯誤登錄日志,這個文件是二進制文件,不能直接vi查看,而要使用lastb命令查看/var/log/lastlog 記錄系統中所有用戶最后一次登錄時間的日志,這個文件是二進制文件,不能直接vi,而要使用lastlog命令查看/var/log/wtmp 永久記錄所有用戶的登錄、注銷信息,同時記錄系統的啟動、重啟、關機事件。同樣這個文件也是一個二進制文件,不能直接vi,而需要使用last命令來查看/var/log/utmp 記錄當前已經登錄的用戶信息,這個文件會隨著用戶的登錄和注銷不斷變化,只記錄當前登錄用戶的信息。同樣這個文件不能直接vi,而要使用w,who,users等命令來查詢/var/log/secure 記錄驗證和授權方面的信息,只要涉及賬號和密碼的程序都會記錄,比如SSH登錄,su切換用戶,sudo授權,甚至添加用戶和修改用戶密碼都會記錄在這個日志文件中
SSH暴力破解
Linux 記錄了 SSH 日志信息的文件:

這兩個文件關于 SSH 的內容基本?致,記錄了驗證和授權方面的信息,只要涉及賬號和密碼的程序都會記錄下來。下面以 Centos 系統的/var/log/secure日志文件為例進行日志分析演示。
1、先來查看下該日志文件的后 15 行:

2、定位有多少 IP 在爆破主機的 root 帳號:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
執行結果如下圖所示:

3、查看成功登錄過主機的 IP 有哪些:
grep "Accepted" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
執行結果如下圖所示:

4、查看登錄成功的日期、用戶名、IP:
grep "Accepted" /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
執行結果如下圖所示:

5、匯總下與 SSH 登錄日志分析相關的命令:
cat /var/log/secure* | grep Accepted #查看登錄成功的記錄cat /var/log/secure* | grep Failed #查看登錄失敗的記錄grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}' #查看登錄成功的日期、用戶名及ipgrep "Failed password for root" /var/log/secure | awk '{print $11}' #查看有哪些ip在爆破主機的root賬號grep "Failed password" /var/log/secure | awk {'print $9'} | sort | uniq -c | sort -nr #查看爆破用戶名字典
Web應用日志
一般如果網絡邊界做好控制,通常對外開放的僅是Web服務,那么需要先找到Webshell,可以通過如下途徑:
1、Webshell搜索
檢查最近創建的 php、jsp 文件和上傳目錄,例如要查找 24 小時內被修改的 jsp 文件:
find ./ -mtime 0 -name "*.jsp"
相關的依據時間檢索文件的命令還有:
# -atime 文件的訪問時間# -mtime 文件內容修改時間# -ctime 文件狀態修改時間(文件權限,所有者/組,文件大小等,當然文件內容發生改變,ctime也會隨著改變)# 要注意:系統進程/腳本訪問文件,atime/mtime/ctime也會跟著修改,不一定是人為的修改才會被記錄 # 查找最近一天以內修改的文件:find / -mtime -1 -ls | more # 查找50天前修改的文件:find ./ -mtime +50 -ls
2、工具掃描特征
通常入侵行為會伴隨著踩點和掃描行為,那么可以查一下具有掃描行為的日志。
例如使用AWVS掃描:grep 'acunetix' /var/log/httpd/access_log 例如使用sqlmap,但是沒有使用–random-agent,UA中帶有sqlmapgrep 'sqlmap' /var/log/httpd/access_log
Linux 系統中,Apache 的訪問日志默認位置為 /var/log/httpd/access.log。
應急工具
以上是純手工命令排查服務器入侵痕跡,下面介紹幾款 Liunx 系統應急響應的工具,用于提高應急排查的效率。
GScan
GScan 是一款開源的 Linux 應急響應工具,Github項目地址。本程序旨在為安全應急響應人員對Linux主機排查時提供便利,實現主機側 Checklist 的自動全面化檢測,根據檢測結果自動數據聚合,進行黑客攻擊路徑溯源,此程序的特點:
- 程序檢測的邏輯和方法,均是由一線安全應急人員根據多年實戰經驗總結出來的;
- 程序包括10W+的惡意特征信息,用于惡意文件的比對和查殺;
- 結果自動化分析,進行黑客攻擊溯源。
自動化程序的 CheckList 項如下:
1、主機信息獲取2、系統初始化alias檢查3、文件類安全掃描 3.1、系統重要文件完整行掃描 3.2、系統可執行文件安全掃描 3.3、臨時目錄文件安全掃描 3.4、用戶目錄文件掃描 3.5、可疑隱藏文件掃描4、各用戶歷史操作類 4.1、境外ip操作類 4.2、反彈shell類5、進程類安全檢測 5.1、CUP和內存使用異常進程排查 5.2、隱藏進程安全掃描 5.3、反彈shell類進程掃描 5.4、惡意進程信息安全掃描 5.5、進程對應可執行文件安全掃描6、網絡類安全檢測 6.1、境外IP鏈接掃描 6.3、惡意特征鏈接掃描 6.4、網卡混雜模式檢測7、后門類檢測 7.1、LD_PRELOAD后門檢測 7.2、LD_AOUT_PRELOAD后門檢測 7.3、LD_ELF_PRELOAD后門檢測 7.4、LD_LIBRARY_PATH后門檢測 7.5、ld.so.preload后門檢測 7.6、PROMPT_COMMAND后門檢測 7.7、Cron后門檢測 7.8、Alias后門 7.9、SSH 后門檢測 7.10、SSH wrapper 后門檢測 7.11、inetd.conf 后門檢測 7.12、xinetd.conf 后門檢測 7.13、setUID 后門檢測 7.14、8種系統啟動項后門檢測8、賬戶類安全排查 8.1、root權限賬戶檢測 8.2、空口令賬戶檢測 8.3、sudoers文件用戶權限檢測 8.4、查看各賬戶下登錄公鑰 8.5、賬戶密碼文件權限檢測9、日志類安全分析 9.1、secure登陸日志 9.2、wtmp登陸日志 9.3、utmp登陸日志 9.4、lastlog登陸日志10、安全配置類分析 10.1、DNS配置檢測 10.2、Iptables防火墻配置檢測 10.3、hosts配置檢測11、Rootkit分析 11.1、檢查已知rootkit文件類特征 11.2、檢查已知rootkit LKM類特征 11.3、檢查已知惡意軟件類特征檢測12.WebShell類文件掃描 12.1、WebShell類文件掃描
項目的具體介紹在 Github 寫得很仔細,此處不再繼續展開:

1、直接在 Kali 虛擬機下載并解壓縮,運行程序:

2、我在桌面先用 MSF 生成并存放了一個 Liunx Backdoor 文件 Tr0e.elf ,然后執行python GScan.py --pro開始掃描,查看結果與處理方案:

識別出了部分風險,但是沒有桌面的 Backdoor……

3、其中檢測出來的 setuid 風險指的是:

病毒查殺
1、Rootkit 查殺
Rootkit 是一種系統內核級病毒木馬,其進入內核模塊后能獲取到操作系統高級權限,從而使用各種底層技術隱藏和保護自身,繞開安全軟件的檢測和查殺。
Linux 系統可以使用 chkrootkit 工具(網址:http://www.chkrootkit.org)進行 Rootkit 查殺,其使用方法:
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gztar zxvf chkrootkit.tar.gzcd chkrootkit-0.52make sense#編譯完成沒有報錯的話執行檢查./chkrootkit
在 Kali Liunx 虛擬機進行工具測試:

執行./chkrootkit命令,掃描后的結果:

2、病毒查殺
ClamAV 的官方下載地址為:http://www.clamav.net/download.html,安裝使用如下:
1、安裝zlib:wget http://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz tar -zxvf zlib-1.2.7.tar.gzcd zlib-1.2.7#安裝一下gcc編譯環境: yum install gccCFLAGS="-O3 -fPIC" ./configure --prefix= /usr/local/zlib/make && make install 2、添加用戶組clamav和組成員clamav:groupadd clamavuseradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav 3、安裝Clamavtar –zxvf clamav-0.97.6.tar.gzcd clamav-0.97.6./configure --prefix=/opt/clamav --disable-clamav -with-zlib=/usr/local/zlibmakemake install 4、配置Clamavmkdir /opt/clamav/logsmkdir /opt/clamav/updatatouch /opt/clamav/logs/freshclam.logtouch /opt/clamav/logs/clamd.logcd /opt/clamav/logschown clamav:clamav clamd.logchown clamav:clamav freshclam.log 5、ClamAV 使用: /opt/clamav/bin/freshclam 升級病毒庫./clamscan –h 查看相應的幫助信息./clamscan -r /home 掃描所有用戶的主目錄就使用./clamscan -r --bell -i /bin 掃描bin目錄并且顯示有問題的文件的掃描結果
3、Webshell 查殺
Linux 系統:
- 河馬 Webshell 查殺:http://www.shellpub.com;
- 深信服 Webshell 網站后門檢測工具:http://edr.sangfor.com.cn/backdoor_detection.html。
(1)首先在 Kali Linux 虛擬機上的 Apache 網站目錄下存放了冰蝎 Webshell 文件:

(2)官網下載 Linux 版本的河馬工具并解壓縮,運行程序./hm scan /var/www/html開始掃描,成功檢測到 Webshell 文件:

總結
一個企業的信息安全建設,最基本的無非是要做好三件事:
- 第一件是事前的安全基線,從源頭盡可能保證新上線的系統的安全性;
- 第二件是建立事中的監控能力,各種多維度的入侵檢測,做到有針對性、及時的救火;
- 第三件是做好事后的應急響應能力,讓應急的時間成本更短,溯源和根因分析的能力更強。
可見在企業信息安全建設中,應急響應是很關鍵的一個環節。
服務器被入侵原因通常有幾個:系統漏洞、中間件漏洞(程序漏洞)、代碼漏洞、安全設置不正確、網絡層面 沒有限制等。
- 如果是系統漏洞和中間件漏洞,需要使用沒有發現漏洞的系統和中間件進行升級;
- 如果是程序/代碼漏洞,需要修改程序代碼進行修改,或者部署waf防火墻;
- 如果是安全設置不正確,需要進一步檢查安全配置。;
- 如果是網絡層面沒有限制,需要在防火墻和 IPS 上進行檢查。
業界有個應急響應參考模型,叫做 PDCERF 方法,它把應急響應體系分為六個階段來處理。這六個階段分別是 準備(Perparation) 、檢測(Detection) 、遏制(Containment) 、根除(Eradication)、 恢復(Recovery) 、跟蹤(Follow-up)。方法論的東西,看看就好,其實我們做的也基本都是根據這幾個步驟來的。應急響應講求的是快、準、穩。在最短的時間內定位安全問題,排查安全問題,保障業務系統的穩定性和安全性。