當前位置:工程項目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 南昌OA系統(tǒng) > 南昌OA信息化
UNIX系統(tǒng)下的應急響應工具介紹
注:這是一篇基礎的應急工具介紹文檔。適合經驗不多者。限于水平,不足之處請指出。
整個文章分三個系列介紹對于 OpenBSD, Linux, 或者Solaris系統(tǒng)的應急響應和取證過程中有用的工具。本部份聚焦在系統(tǒng)工具上,第二部份主要是介紹文件系統(tǒng)工具,最后部分則主要是網(wǎng)絡工具。本文用到的都是基于 OpenBSD 3.2, Debian GNU/Linux 3.0 (woody), RedHat 8.0 (psyche), and Solaris 9 (aka Solaris 2.9 or SunOS 5.9)的。
依賴于你所使用的操作系統(tǒng),本文討論的許多軟件可能不是默認安裝的。這種情況下,請根據(jù)文章后面的參考部分獲得這些工具。
The Soapbox
那些可以用來處理入侵威脅的工具不在本系列討論內容中,本文只覆蓋在入侵發(fā)生之后使用的工具。入侵通常是可以防止的。使用一些比如保證系統(tǒng)更新安裝最新補丁的技術,按照最小化服務配置系統(tǒng),使用設計為安全的操作系統(tǒng),使用能夠加固系統(tǒng)的核心補丁等等,這些來防范入侵的技術可能讓你根本就從來不會使用在本系列文章中介紹到的這些工具。
讀者應該命令,一旦攻擊者獲得了系統(tǒng)控制權,這個系統(tǒng)就基本不應該被信任。我們討論的工具多數(shù)都操作在用戶方式。一個欺騙的核心模塊可能不會讓你正常地檢查系統(tǒng),比如,這個系統(tǒng)已經被入侵的情況下。這些欺騙的模塊會采用多種辦法來隱藏自己,比如根據(jù)系統(tǒng)設計來讓自己在系統(tǒng)運行的時候不能輕易檢測到。這意味著,你不應該相信你使用的那些工具的輸出結果。這意味著在響應入侵事件中,應該采取懷疑、研究和謹慎的方式。
你用于分析系統(tǒng)的工具應該是你可以去信任,而且沒有被修改的。下面討論了一些技術,比如將工具保存在離線的只讀介質中,這樣,你就更可以信賴,而不是那些在已經被入侵的系統(tǒng)上的二進制程序。
你已經做了所有正確的事情,可以進行下面的一些練習,你的系統(tǒng)已經被入侵了?,F(xiàn)在怎么辦呢?
Breaking Out the Toolbelt
現(xiàn)在首先應該檢查那些我們后面需要用到的工具。這里不說man(1)提供的信息,特別是因為命令參數(shù)因為系統(tǒng)不同而不同。檢查這樣的信息是留給讀者的一種練習。
vmstat - 這是可以快速察看內存、CPU和磁盤子系統(tǒng)的命令。vmstat 通常執(zhí)行一個短時間,以便可以察看子系統(tǒng)利用的趨勢。vmstat 經??梢栽谙到y(tǒng)性能有一些問題的時候幫助我們知道哪些地方應該去深究。
mpstat - 這個命令在Linux和Solaris上都有,可以用它察看處理器利用的統(tǒng)計。mpstat 提供一個選項,允許在多處理器系統(tǒng)中察看指定CPU的統(tǒng)計。vmstat 沒有這個功能。
iostat - 顯示比vmstat更詳細的跟子系統(tǒng)相關的統(tǒng)計信息。
sar,sa,lastcomm,last - 這些是檢查歷史數(shù)據(jù)和一些近來的系統(tǒng)事件。sar是一個Solaris和Linux的系統(tǒng)性能分析工具。這些可以用于檢查的性能數(shù)據(jù)類似于vmstat, mpstat和 iostat的顯示。 sar的數(shù)據(jù)是一段時間保存的內容,因此可以察看過去的信息。 lastcomm可以現(xiàn)在系統(tǒng)最近被執(zhí)行的命令。這些可以用在系統(tǒng)審計中。sa 可以在*BSD和Linux中找到,它給用戶在系統(tǒng)審計中更多的選項來收集信息。
ps - 立足于進程狀態(tài),用于顯示系統(tǒng)執(zhí)行的進程和他們的信息。
top - 顯示的信息同ps接近,但是top可以了解到CPU消耗,可以根據(jù)用戶指定的時間來更新顯示。
lsof - 列舉打開的文件,顯示系統(tǒng)當前打開的所有文件。Unix系統(tǒng)的所有東西幾乎都可以看作是文件,因此lsof也顯示了系統(tǒng)的狀態(tài)中有重要意義的內容。
file - 判斷文件是什么,不同的文件格式可以16進制的形式現(xiàn)實文件的內容
readelf - 顯示二進制文件的ELF(可執(zhí)行鏈接和格式)頭的細節(jié)。這些內容可以判斷可執(zhí)行提供的函數(shù)。
od - 以用戶指定的格式輸出文件內容。od對于在文件內容中有一些解釋的情況下察看原始內容是有幫助的。
ldd - 讀取ELF頭的內容,并顯示可執(zhí)行文件依賴的對象庫。
string - 現(xiàn)實文件中的ASCII字符串。對于在二進制文件中查找其中可讀的字符串是非常有用處的。
find - 用于在文件系統(tǒng)中查找指定的對象。
strace - 這個工具開始或者附加到一個當前運行的進程中,顯示這個進程所作的所有系統(tǒng)調用。這可以用來判斷程序運行的行為,并且來決定是否是合適的程序。strace 存在于Linux上。在 Solaris上是truss, *BSD提供的ktrace可以達到相似的功能。
sudo - 可以讓管理員給用戶以其他用戶的權限執(zhí)行命令的能力,而不用給該用戶密碼。
grep - 用于按照用戶指定的模式查詢。 grep用匹配規(guī)則。
less - 頁面調度程序,用來按頁顯示文本。
在參考部分中的"CD-ROM and Floppy distributions"[3]中,一些站點介紹了怎么編譯這些工具以便用于不同的操作系統(tǒng),并放置在CD-ROM?,F(xiàn)在,開始檢查運行的系統(tǒng)了。
運氣就是在機會面前有所準備
運氣對于技術來說,并不是可求解的。攻擊者可以采用很多方法來危及OS的安全。威脅系統(tǒng)安全的漏洞可能是OS提供商,也可以是那些應用軟件。當漏洞還沒有大面積公布,或者還沒有讓它的相關提供商自己知道的時候,攻擊者已經在IRC里面知道那種系統(tǒng)可以被入侵了。作為一個安全管理員,你必須在這場游戲中表現(xiàn)一直出色。但是,攻擊者則只需要一次就足夠。
然而,你需要做許多前期的準備工作。你應該有一個應急響應的策略。你必須有一張CD-ROM或者軟盤什么的,來存儲檢查系統(tǒng)中需要的工具,而不是使用被入侵的系統(tǒng)中的工具。如果正使用軟盤,讓他們處于寫保護模式,你可以在取證[5]中獲得非常優(yōu)秀的資源。
現(xiàn)在回到機器上。把事件響應的日期和時間都紀錄在記錄本上。并且紀錄采取的每一步的所有細節(jié)和時間。裝載CD-ROM或者軟盤,并且使用紀錄在這些介質上的軟件,緊記按照易失性的順序[6]保存相關的信息到安全的地方。
按照易失性順序的重要原因是因為入侵事件發(fā)生后與之相關信息的數(shù)量和自量都將隨時間增加而迅速減少。那些經驗豐富的攻擊者制造的事件則可能讓曲線更陡,下降速度更快。
了解自己
可能在入侵事件之前,你已經在系統(tǒng)上花費了大量時間。你了解這些系統(tǒng)的里里外外,進行了相當多的文檔工作,并且做了備份。在系統(tǒng)上,開啟了進程審計(或者*BSD的系統(tǒng)審計),進行了系統(tǒng)實時數(shù)據(jù)(sadc[8])來保存系統(tǒng)的性能數(shù)據(jù)。管理日志的時候,可能沒有足夠的空間來頻繁存儲這些數(shù)據(jù),你可以發(fā)送syslog數(shù)據(jù)到安全的日志服務器上。
你接到webmaster的電話,他發(fā)現(xiàn)某個web服務器上CPU負載很高,而這個服務器每天的瀏覽量僅僅幾千而已。webmaster確信服務器存在有什么問題。
vmstat 和 mpstat (只在*BSD系統(tǒng)上) 表明CPU被用戶空間的一個或者多個進程消耗掉了,但是內存和I/O子系統(tǒng)還沒有大量使用。 iostat 也顯示出磁盤系統(tǒng)不正常。
$ vmstat 1 4
procs memoryswap io system cpu
r b w swpd free buff cache si sobibo incs us sy id
1 0 0376 7756 29772 570960 0 0 7 3 441 397 87 5 8
5 0 0376 6728 29772 570960 0 0 0 0 498 1249 100 0 0
6 0 0376 7240 29772 570960 0 0 0 0 652 1563 97 3 0
6 0 0376 7604 29772 570960 0 0 0 0 536 1323 97 3 0
$ mpstat 1 4
20:51:21 CPU %user %nice %system %idleintr/s
20:51:22 all 100.000.000.000.00479.00
20:51:23 all 100.000.000.000.00496.00
20:51:24 all 100.000.000.000.00499.00
20:51:25 all 97.000.003.000.00481.00
Average: all 98.000.601.400.00486.60
$ iostat -dk 1 4
Device:tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
dev3-00.00 0.00 0.01 73 1296
dev3-00.00 0.00 0.00 0 0
dev3-00.00 0.00 0.00 0 0
dev3-00.00 0.00 0.00 0 0
sar (*BSD的sa) 顯示CPU從早些晚上 03:17 就開始被使用。 lastcomm 顯示FTP客戶端在03:17以root運行了幾次, last 這個命令顯示最近的登錄,沒有顯示出這個時間段有 root 從什么地方登錄進來。另外,這個服務器又使用 sudo來管理root權限。這里有兩個系統(tǒng)管理員賬號可以用 root登錄,但是他們并沒有登錄過,特別是在 AM 3這個時間附近。根據(jù)這一點,你決定使用CD上準備好的二進制工具?,F(xiàn)在運行 top -d1,并且發(fā)現(xiàn)apache這個進程占用了100%的CPU。
現(xiàn)在用 grep 檢查apche的錯誤日志,這個GNU工具可以有更多有用的參數(shù),-A, -B和-C 可以讓你指定想從哪一個匹配的行的開始,之前或者周圍看。 grep可以通過-E 來使用擴展的模式匹配表達式??梢詸z查系統(tǒng)日志。但是并沒有在這些日志里面檢查到什么奇怪的地方。
現(xiàn)在繼續(xù)進行檢查。運行 ps -eflcyL (Solaris 9),ps -eflcym --headers (Deb3.0, RH8.0)或者 ps auwxhkwvl(OBSD 3.2)。找到進程 apache,而這一次發(fā)現(xiàn)有問題了。這里只有一個apache進程和多個httpd進程。httpd實際上是Apache服務器,因為httpd是在apachectl文件執(zhí)行的二進制,運行的apache是前派生的,因此,如果二進制文件被重命名為"apache",那么也應該有多個進程存在。這就是問題所在。
使用 lsof -p
現(xiàn)在來檢查這個所謂的apache程序。通過 file apache,表明這個文件是ELF可執(zhí)行的?,F(xiàn)在進行進一步的挖掘,執(zhí)行 readelf -a apache,確信這是一個ELF可執(zhí)行程序。 od -xc apache | less 現(xiàn)實ELF魔法數(shù)字(7f454c46),ldd顯示apache連接的共享對象庫比實際的httpd進程小一些,這里面一定有文章:
$ ldd ./apache
libc.so.6 => /lib/libc.so.6 (0x4001f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$ ldd /usr/sbin/httpd
libm.so.6 => /lib/libm.so.6 (0x7002c000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x700c4000)
libdb.so.2 => /lib/libdb.so.2 (0x70100000)
libdb2.so.2 => /lib/libdb2.so.2 (0x70120000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x70180000)
libdl.so.2 => /lib/libdl.so.2 (0x701b4000)
libc.so.6 => /lib/libc.so.6 (0x701c8000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x70000000)
執(zhí)行: strings | grep -i john,顯示如下:
$ strings apache | grep -i john
/usr/share/john/password.lst
/etc/john.ini
~/john.pot
/etc/john.ini
john
John the Ripper Version 1.6 Copyright (c) 1996-98 by Solar Designer
/etc/john.ini
/etc/john.ini
/etc/john.ini
用 strace -fp 'pgrep apache'(Deb3.0, RH8.0), truss -fp 'pgrep apache'(Sol9),或者 ktrace -dip
# strace -fp `pgrep apache`
--- SIGALRM (Alarm clock) ---
sigreturn() = ? (mask now [])
--- SIGALRM (Alarm clock) ---
sigreturn() = ? (mask now [])
--- SIGALRM (Alarm clock) ---
sigreturn() = ? (mask now [])
_llseek(4, 65536, [65536], SEEK_SET)= 0
read(4, "2YUz