監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢(xún)管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 簽約案例 | 購(gòu)買(mǎi)價(jià)格 | 在線(xiàn)試用 | 手機(jī)APP | 產(chǎn)品資料
X 關(guān)閉

UNIX系統(tǒng)下的應(yīng)急響應(yīng)工具介紹

申請(qǐng)免費(fèi)試用、咨詢(xún)電話(huà):400-8352-114

文章來(lái)源:泛普軟件

注:這是一篇基礎(chǔ)的應(yīng)急工具介紹文檔。適合經(jīng)驗(yàn)不多者。限于水平,不足之處請(qǐng)指出。

整個(gè)文章分三個(gè)系列介紹對(duì)于 OpenBSD, Linux, 或者Solaris系統(tǒng)的應(yīng)急響應(yīng)和取證過(guò)程中有用的工具。本部份聚焦在系統(tǒng)工具上,第二部份主要是介紹文件系統(tǒng)工具,最后部分則主要是網(wǎng)絡(luò)工具。本文用到的都是基于 OpenBSD 3.2, Debian GNU/Linux 3.0 (woody), RedHat 8.0 (psyche), and Solaris 9 (aka Solaris 2.9 or SunOS 5.9)的。

依賴(lài)于你所使用的操作系統(tǒng),本文討論的許多軟件可能不是默認(rèn)安裝的。這種情況下,請(qǐng)根據(jù)文章后面的參考部分獲得這些工具。


The Soapbox

那些可以用來(lái)處理入侵威脅的工具不在本系列討論內(nèi)容中,本文只覆蓋在入侵發(fā)生之后使用的工具。入侵通常是可以防止的。使用一些比如保證系統(tǒng)更新安裝最新補(bǔ)丁的技術(shù),按照最小化服務(wù)配置系統(tǒng),使用設(shè)計(jì)為安全的操作系統(tǒng),使用能夠加固系統(tǒng)的核心補(bǔ)丁等等,這些來(lái)防范入侵的技術(shù)可能讓你根本就從來(lái)不會(huì)使用在本系列文章中介紹到的這些工具。

讀者應(yīng)該命令,一旦攻擊者獲得了系統(tǒng)控制權(quán),這個(gè)系統(tǒng)就基本不應(yīng)該被信任。我們討論的工具多數(shù)都操作在用戶(hù)方式。一個(gè)欺騙的核心模塊可能不會(huì)讓你正常地檢查系統(tǒng),比如,這個(gè)系統(tǒng)已經(jīng)被入侵的情況下。這些欺騙的模塊會(huì)采用多種辦法來(lái)隱藏自己,比如根據(jù)系統(tǒng)設(shè)計(jì)來(lái)讓自己在系統(tǒng)運(yùn)行的時(shí)候不能輕易檢測(cè)到。這意味著,你不應(yīng)該相信你使用的那些工具的輸出結(jié)果。這意味著在響應(yīng)入侵事件中,應(yīng)該采取懷疑、研究和謹(jǐn)慎的方式。

你用于分析系統(tǒng)的工具應(yīng)該是你可以去信任,而且沒(méi)有被修改的。下面討論了一些技術(shù),比如將工具保存在離線(xiàn)的只讀介質(zhì)中,這樣,你就更可以信賴(lài),而不是那些在已經(jīng)被入侵的系統(tǒng)上的二進(jìn)制程序。

你已經(jīng)做了所有正確的事情,可以進(jìn)行下面的一些練習(xí),你的系統(tǒng)已經(jīng)被入侵了?,F(xiàn)在怎么辦呢?

Breaking Out the Toolbelt

現(xiàn)在首先應(yīng)該檢查那些我們后面需要用到的工具。這里不說(shuō)man(1)提供的信息,特別是因?yàn)槊顓?shù)因?yàn)橄到y(tǒng)不同而不同。檢查這樣的信息是留給讀者的一種練習(xí)。

vmstat - 這是可以快速察看內(nèi)存、CPU和磁盤(pán)子系統(tǒng)的命令。vmstat 通常執(zhí)行一個(gè)短時(shí)間,以便可以察看子系統(tǒng)利用的趨勢(shì)。vmstat 經(jīng)??梢栽谙到y(tǒng)性能有一些問(wèn)題的時(shí)候幫助我們知道哪些地方應(yīng)該去深究。

mpstat - 這個(gè)命令在Linux和Solaris上都有,可以用它察看處理器利用的統(tǒng)計(jì)。mpstat 提供一個(gè)選項(xiàng),允許在多處理器系統(tǒng)中察看指定CPU的統(tǒng)計(jì)。vmstat 沒(méi)有這個(gè)功能。

iostat - 顯示比vmstat更詳細(xì)的跟子系統(tǒng)相關(guān)的統(tǒng)計(jì)信息。

sar,sa,lastcomm,last - 這些是檢查歷史數(shù)據(jù)和一些近來(lái)的系統(tǒng)事件。sar是一個(gè)Solaris和Linux的系統(tǒng)性能分析工具。這些可以用于檢查的性能數(shù)據(jù)類(lèi)似于vmstat, mpstat和 iostat的顯示。 sar的數(shù)據(jù)是一段時(shí)間保存的內(nèi)容,因此可以察看過(guò)去的信息。 lastcomm可以現(xiàn)在系統(tǒng)最近被執(zhí)行的命令。這些可以用在系統(tǒng)審計(jì)中。sa 可以在*BSD和Linux中找到,它給用戶(hù)在系統(tǒng)審計(jì)中更多的選項(xiàng)來(lái)收集信息。

ps - 立足于進(jìn)程狀態(tài),用于顯示系統(tǒng)執(zhí)行的進(jìn)程和他們的信息。

 top - 顯示的信息同ps接近,但是top可以了解到CPU消耗,可以根據(jù)用戶(hù)指定的時(shí)間來(lái)更新顯示。

lsof - 列舉打開(kāi)的文件,顯示系統(tǒng)當(dāng)前打開(kāi)的所有文件。Unix系統(tǒng)的所有東西幾乎都可以看作是文件,因此lsof也顯示了系統(tǒng)的狀態(tài)中有重要意義的內(nèi)容。

file - 判斷文件是什么,不同的文件格式可以16進(jìn)制的形式現(xiàn)實(shí)文件的內(nèi)容

readelf - 顯示二進(jìn)制文件的ELF(可執(zhí)行鏈接和格式)頭的細(xì)節(jié)。這些內(nèi)容可以判斷可執(zhí)行提供的函數(shù)。

od - 以用戶(hù)指定的格式輸出文件內(nèi)容。od對(duì)于在文件內(nèi)容中有一些解釋的情況下察看原始內(nèi)容是有幫助的。

ldd - 讀取ELF頭的內(nèi)容,并顯示可執(zhí)行文件依賴(lài)的對(duì)象庫(kù)。

string - 現(xiàn)實(shí)文件中的ASCII字符串。對(duì)于在二進(jìn)制文件中查找其中可讀的字符串是非常有用處的。

find - 用于在文件系統(tǒng)中查找指定的對(duì)象。

strace - 這個(gè)工具開(kāi)始或者附加到一個(gè)當(dāng)前運(yùn)行的進(jìn)程中,顯示這個(gè)進(jìn)程所作的所有系統(tǒng)調(diào)用。這可以用來(lái)判斷程序運(yùn)行的行為,并且來(lái)決定是否是合適的程序。strace 存在于Linux上。在 Solaris上是truss, *BSD提供的ktrace可以達(dá)到相似的功能。

sudo - 可以讓管理員給用戶(hù)以其他用戶(hù)的權(quán)限執(zhí)行命令的能力,而不用給該用戶(hù)密碼。

grep - 用于按照用戶(hù)指定的模式查詢(xún)。 grep用匹配規(guī)則。

less - 頁(yè)面調(diào)度程序,用來(lái)按頁(yè)顯示文本。

在參考部分中的"CD-ROM and Floppy distributions"[3]中,一些站點(diǎn)介紹了怎么編譯這些工具以便用于不同的操作系統(tǒng),并放置在CD-ROM?,F(xiàn)在,開(kāi)始檢查運(yùn)行的系統(tǒng)了。

運(yùn)氣就是在機(jī)會(huì)面前有所準(zhǔn)備

運(yùn)氣對(duì)于技術(shù)來(lái)說(shuō),并不是可求解的。攻擊者可以采用很多方法來(lái)危及OS的安全。威脅系統(tǒng)安全的漏洞可能是OS提供商,也可以是那些應(yīng)用軟件。當(dāng)漏洞還沒(méi)有大面積公布,或者還沒(méi)有讓它的相關(guān)提供商自己知道的時(shí)候,攻擊者已經(jīng)在IRC里面知道那種系統(tǒng)可以被入侵了。作為一個(gè)安全管理員,你必須在這場(chǎng)游戲中表現(xiàn)一直出色。但是,攻擊者則只需要一次就足夠。

然而,你需要做許多前期的準(zhǔn)備工作。你應(yīng)該有一個(gè)應(yīng)急響應(yīng)的策略。你必須有一張CD-ROM或者軟盤(pán)什么的,來(lái)存儲(chǔ)檢查系統(tǒng)中需要的工具,而不是使用被入侵的系統(tǒng)中的工具。如果正使用軟盤(pán),讓他們處于寫(xiě)保護(hù)模式,你可以在取證[5]中獲得非常優(yōu)秀的資源。

現(xiàn)在回到機(jī)器上。把事件響應(yīng)的日期和時(shí)間都紀(jì)錄在記錄本上。并且紀(jì)錄采取的每一步的所有細(xì)節(jié)和時(shí)間。裝載CD-ROM或者軟盤(pán),并且使用紀(jì)錄在這些介質(zhì)上的軟件,緊記按照易失性的順序[6]保存相關(guān)的信息到安全的地方。

按照易失性順序的重要原因是因?yàn)槿肭质录l(fā)生后與之相關(guān)信息的數(shù)量和自量都將隨時(shí)間增加而迅速減少。那些經(jīng)驗(yàn)豐富的攻擊者制造的事件則可能讓曲線(xiàn)更陡,下降速度更快。


了解自己

可能在入侵事件之前,你已經(jīng)在系統(tǒng)上花費(fèi)了大量時(shí)間。你了解這些系統(tǒng)的里里外外,進(jìn)行了相當(dāng)多的文檔工作,并且做了備份。在系統(tǒng)上,開(kāi)啟了進(jìn)程審計(jì)(或者*BSD的系統(tǒng)審計(jì)),進(jìn)行了系統(tǒng)實(shí)時(shí)數(shù)據(jù)(sadc[8])來(lái)保存系統(tǒng)的性能數(shù)據(jù)。管理日志的時(shí)候,可能沒(méi)有足夠的空間來(lái)頻繁存儲(chǔ)這些數(shù)據(jù),你可以發(fā)送syslog數(shù)據(jù)到安全的日志服務(wù)器上。

你接到webmaster的電話(huà),他發(fā)現(xiàn)某個(gè)web服務(wù)器上CPU負(fù)載很高,而這個(gè)服務(wù)器每天的瀏覽量?jī)H僅幾千而已。webmaster確信服務(wù)器存在有什么問(wèn)題。

vmstat 和 mpstat (只在*BSD系統(tǒng)上) 表明CPU被用戶(hù)空間的一個(gè)或者多個(gè)進(jìn)程消耗掉了,但是內(nèi)存和I/O子系統(tǒng)還沒(méi)有大量使用。 iostat 也顯示出磁盤(pán)系統(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 就開(kāi)始被使用。 lastcomm 顯示FTP客戶(hù)端在03:17以root運(yùn)行了幾次, last 這個(gè)命令顯示最近的登錄,沒(méi)有顯示出這個(gè)時(shí)間段有 root 從什么地方登錄進(jìn)來(lái)。另外,這個(gè)服務(wù)器又使用 sudo來(lái)管理root權(quán)限。這里有兩個(gè)系統(tǒng)管理員賬號(hào)可以用 root登錄,但是他們并沒(méi)有登錄過(guò),特別是在 AM 3這個(gè)時(shí)間附近。根據(jù)這一點(diǎn),你決定使用CD上準(zhǔn)備好的二進(jìn)制工具?,F(xiàn)在運(yùn)行 top -d1,并且發(fā)現(xiàn)apache這個(gè)進(jìn)程占用了100%的CPU。

現(xiàn)在用 grep 檢查apche的錯(cuò)誤日志,這個(gè)GNU工具可以有更多有用的參數(shù),-A, -B和-C 可以讓你指定想從哪一個(gè)匹配的行的開(kāi)始,之前或者周?chē)础?grep可以通過(guò)-E 來(lái)使用擴(kuò)展的模式匹配表達(dá)式。可以檢查系統(tǒng)日志。但是并沒(méi)有在這些日志里面檢查到什么奇怪的地方。

現(xiàn)在繼續(xù)進(jìn)行檢查。運(yùn)行 ps -eflcyL (Solaris 9),ps -eflcym --headers (Deb3.0, RH8.0)或者 ps auwxhkwvl(OBSD 3.2)。找到進(jìn)程 apache,而這一次發(fā)現(xiàn)有問(wèn)題了。這里只有一個(gè)apache進(jìn)程和多個(gè)httpd進(jìn)程。httpd實(shí)際上是Apache服務(wù)器,因?yàn)閔ttpd是在apachectl文件執(zhí)行的二進(jìn)制,運(yùn)行的apache是前派生的,因此,如果二進(jìn)制文件被重命名為"apache",那么也應(yīng)該有多個(gè)進(jìn)程存在。這就是問(wèn)題所在。

使用 lsof -p [9] ,發(fā)現(xiàn)這個(gè)apache進(jìn)程打開(kāi)了一個(gè)叫 john.pot 的文件。立刻通過(guò)google,查詢(xún)這是一個(gè)叫"John the Ripper"的密碼破解工具,正是這個(gè)東西讓CPU滿(mǎn)負(fù)荷了。

現(xiàn)在來(lái)檢查這個(gè)所謂的apache程序。通過(guò) file apache,表明這個(gè)文件是ELF可執(zhí)行的。現(xiàn)在進(jìn)行進(jìn)一步的挖掘,執(zhí)行 readelf -a apache,確信這是一個(gè)ELF可執(zhí)行程序。 od -xc apache | less 現(xiàn)實(shí)ELF魔法數(shù)字(7f454c46),ldd顯示apache連接的共享對(duì)象庫(kù)比實(shí)際的httpd進(jìn)程小一些,這里面一定有文章:

$ 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 (OBSD 3.2),來(lái)察看apache進(jìn)程到底在做什么。


# 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