UNIX應(yīng)急響應(yīng)攻略
應(yīng)急響應(yīng)有一半是非技術(shù)的內(nèi)容,制定一個合理的響應(yīng)策略是至關(guān)重要的!
記住:現(xiàn)在開始對受害系統(tǒng)的每一步操作都可能改變已存在的證據(jù)或是導(dǎo)致敏感信息的丟失!
{{初始響應(yīng)}}
目標(biāo):在進(jìn)行司法鑒定復(fù)制之前獲得系統(tǒng)中的易失數(shù)據(jù),初步確定突發(fā)事件概況。
==============
創(chuàng)建響應(yīng)工具包
==============
我們調(diào)查系統(tǒng),必須以高度可信賴的程序執(zhí)行命令,再加上備份與修復(fù),創(chuàng)建一個工具包是很有必要的。
即使在非Unix/Linux系統(tǒng)上,創(chuàng)建工具包也應(yīng)該作為響應(yīng)的第一步。
首先,我們需要在對應(yīng)體系結(jié)構(gòu)的系統(tǒng)上編譯響應(yīng)期間需要的工具,且編譯程序需要考慮系統(tǒng)兼容的問題。
通常我們需要如下的工具:
ls dd des file pkginfo
find icat lsof md5sum nc
netstat pcat perl ps strace
strings truss df vi
cat kstat ifconfig chkrootkit
more gzip last w rm
script bash modinfo lsmod
讀者可根據(jù)自己的需要自行添加,但是一個工具包通常只能用來完成對某一特定平臺的工作,
把對多個平臺編譯的工具放進(jìn)同一個工具包反而會顯得紊亂。
在Linux上創(chuàng)建響應(yīng)工具包時,可以用gcc的–static參數(shù)編譯源代碼,或者用ldd檢查動態(tài)連接庫,
在響應(yīng)工具包存儲介質(zhì)上建立庫文件目錄,并拷貝所有工具需要的動態(tài)連接庫的副本,最后設(shè)置環(huán)境變量。
這個過程有點類似于創(chuàng)建一個Linux的優(yōu)盤啟動盤。
============
獲取易失數(shù)據(jù)
============
易失的數(shù)據(jù)包括:當(dāng)前打開的套接字,進(jìn)程列表,RAM內(nèi)容,非鏈接文件的位置。
*unix特性: unix允許進(jìn)程正在執(zhí)行時將其刪除!
非鏈接文件是訪問該文件的進(jìn)程中止時被標(biāo)記為刪除的文件。當(dāng)系統(tǒng)關(guān)閉時(正常關(guān)機或突然斷電非正常關(guān)機),
標(biāo)記為刪除的文件都將消失。因此在找到被標(biāo)記為刪除的文件之前不能關(guān)機!
=================
執(zhí)行可信賴的shell
=================
使用我們自己準(zhǔn)備的響應(yīng)工具包,裝載該介質(zhì)的文件系統(tǒng),
mount –t auto /dev/sda1 /mnt/usb 或
mount –t iso9660 /dev/cdrom /mnt/cdrom
按下Ctrl+Alt+F1~F6,從控制臺以root身份登陸。
請一定要區(qū)分原環(huán)境變量中的命令和當(dāng)前響應(yīng)工具包的相同名字的命令集,防止?jié)撛诘亩M(jìn)制特洛伊木馬攻擊。
==================
查看登陸系統(tǒng)的用戶
==================
[root@ay4z3ro foo]# w
19:50:48 up 43 min, 2 users, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root :0 19:08 ?xdm? 11.10s 0.43s gnome-session
root pts/0 19:08 1.00s 0.21s 0.01s w
輸出標(biāo)題行顯示了當(dāng)前系統(tǒng)時間,該系統(tǒng)已運行的時間,當(dāng)前登陸用戶數(shù),最近1分鐘,5分鐘和15分鐘內(nèi)的平均系統(tǒng)負(fù)載。
USER字段顯示當(dāng)前登陸的用戶名。TTY字段顯示了會話的控制終端,tty表示從控制臺登陸,pts/typ則可以表示通過一個網(wǎng)絡(luò)連接,
因為X是個C/S模式的應(yīng)用程序,所以我在GNOME下開的shell窗口顯示為pts。如果不從本地登陸,輸出中還有FROM字段,
表示建立會話的源地址的域名或IP。LOGIN@顯示該連接的本地開始時間。IDLE字段顯示了自上一個進(jìn)程運行以來的時間長度。
JCPU顯示與tty或pts關(guān)聯(lián)的全部進(jìn)程所使用的時間。PCPU字段顯示了WHAT列中當(dāng)前進(jìn)程所使用的CPU時間。WHAT列顯示用戶當(dāng)前運行的進(jìn)程。
================
查看系統(tǒng)進(jìn)程列表
================
Solaris中使用ps –eaf,而在FreeBSD和Linux中則使用ps –aux.
[root@ay4z3ro foo]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.2 1356 496 ? S 19:07 0:04 init
root 2 0.0 0.0 0 0 ? SW 19:07 0:00 [keventd]
root 3 0.0 0.0 0 0 ? SWN 19:07 0:00 [ksoftirqd_CPU0]
root 4 0.0 0.0 0 0 ? SW 19:07 0:00 [kswapd]
root 5 0.0 0.0 0 0 ? SW 19:07 0:00 [bdflush]
root 6 0.0 0.0 0 0 ? SW 19:07 0:00 [kupdated]
root 7 0.0 0.0 0 0 ? SW< 19:07 0:00 [mdrecoveryd]
root 11 0.0 0.0 0 0 ? SW 19:07 0:00 [kjournald]
root 114 0.0 0.5 2108 1304 ? S 19:07 0:00 devfsd /dev
root 209 0.0 0.0 0 0 ? SW 19:07 0:00 [khubd]
root 338 0.0 0.0 0 0 ? SW 19:07 0:00 [kjournald]
rpc 620 0.0 0.2 1496 520 ? S 19:07 0:00 [portmap]
root 636 0.0 0.2 1452 624 ? S 19:07 0:00 syslogd -m 0
…………………(以下省略)
Ps命令輸出中的START字段顯示了程序開始運行的時間,對于查出攻擊時間很有幫助。有時僅通過時間就能識別可疑進(jìn)程。
Linux下還可以通過strings –f /proc/[0-9]*/cmdline來查看系統(tǒng)中運行進(jìn)程的完整命令行參數(shù),但是這個并不完全可信。
因為攻擊者甚至不需要插入內(nèi)核模塊,而只在應(yīng)用層的編碼中加入語句就能欺騙我們。
===============
檢測LKM Rootkit
===============
內(nèi)核模塊后門,還有什么比這個更臭屁的呢?Solaris,Linux和幾乎所有的Unix都支持LKM(Loadable Kernel Modules),
用普通的方法無法檢測其存在,這給應(yīng)急響應(yīng)帶來了極大的挑戰(zhàn)性。對于我們來說,解決的辦法是找到那些lkm rootkit,
并熟悉,解剖他們。有時lkm rootkit雖然被成功裝載,但在系統(tǒng)的某些細(xì)節(jié)上會出現(xiàn)“異常,甚至可能使系統(tǒng)在運行一段時間后徹底崩潰。
還有,lkm雖然活動在ring0核心態(tài),但是攻擊者往往會在系統(tǒng)的某處留下痕跡,比如攻擊者為了讓系統(tǒng)每次關(guān)閉或重啟后能自動裝入他安置的
內(nèi)核后門,可能會改寫/etc/modules.conf或/etc/rc.local.
kstat/ksec是檢測lkm非常方便的工具,前者用于Linux,后者用于*BSD.
[root@ay4z3ro kstat]# ./kstat
Usage: ./kstat [-i iff] [-P] [-p pid] [-M] [-m addr] [-s]
-i iff may be specifIEd as 'all' or as name (e.g. eth0)
displays info about the queried interface
-P displays all processes
-p pid is the process id of the queried task
-M displays the kernel's LKMs' linked list
-m addr is the hex address of the queried module
displays info about the module to be found at addr
-s displays info about the system calls' table
其中-s參數(shù)最有用,它顯示了系統(tǒng)調(diào)用入口的信息,能檢測市面上最流行的knark和adore這兩個內(nèi)核后門,
但理論上他并不能檢測出所有的lkm rootkit.
Kstat/ksec站點:http://www.s0ftpj.org
其實熟悉內(nèi)核攻擊的人都知道Kstat單純檢查sys_call_table[]的方式如今已經(jīng)
被攻擊的一方完全超越,e4gle很早也寫過這類文章。
有興趣可以看看2002焦點峰會jbtzhm的《內(nèi)核后門實現(xiàn)及其檢測》
現(xiàn)在Linuxforum安全版版主madsys在Phrack61上有篇文章:
Finding hidden kernel modules (the extrem way)--鏈接:
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=security&Number=434871&page=0&vIEw=collapsed&sb=5&o=all&fpart=
======================
檢測開放端口和關(guān)聯(lián)進(jìn)程
======================
[root@ay4z3ro foo]# netstat –anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 620/
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 908/X
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 880/sshd
udp 0 0 0.0.0.0:111 0.0.0.0:* 620/
Active Unix domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 2753 756/ /tmp/.font-unix/fs-1
……(以下省略)
在Solaris,HP-UX,AIX,FreeBSD,Linux上可以使用lsof工具列舉所有運行進(jìn)程及其所打開的文件描述符,其中包括常規(guī)文件,
庫文件,目錄,UNIX流,套接字等。如果只想顯示網(wǎng)絡(luò)套接字的進(jìn)程:
[root@ay4z3ro foo]# lsof –i
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
portmap 620 rpc 3u IPv4 2598 UDP *:sunrpc
portmap 620 rpc 4u IPv4 2609 TCP *:sunrpc (LISTEN)
sshd 880 root 3u IPv4 2885 TCP *:ssh (LISTEN)
X 908 root 1u IPv4 2945 TCP *:x11 (LISTEN)
其中特別需要注意的是奇怪的進(jìn)程和已打開的原始套接字。
================================
尋找系統(tǒng)中是否運行一個非法嗅探器
================================
為了達(dá)到這個目的,我們需要檢查網(wǎng)卡是否處于混雜(promiscuous)模式:
[root@ay4z3ro foo]# ifconfig –i eth0 | grep PROMISC
PROMISC標(biāo)志并不會在所有的*NIX上出現(xiàn),通過lsof+ps命令可以判斷系統(tǒng)是否正運行一個嗅探器。或者通過第三方的工具,比如AntiSniff。
=================
檢查/proc文件系統(tǒng)
=================
在/proc/$PID/目錄下對于調(diào)查比較有意義的是:exe鏈接,fd子目錄,cmdline文件。
[root@ay4z3ro 880]# ls -al
total 0
dr-xr-xr-x 3 root root 0 Sep 20 19:53 ./
dr-xr-xr-x 62 root root 0 Sep 20 15:07 ../
-r--r--r-- 1 root root 0 Sep 20 19:54 binfmt
-r--r--r-- 1 root root 0 Sep 20 19:54 cmdline
lrwxrwxrwx 1 root root 0 Sep 20 19:54 cwd -> //
-r-------- 1 root root 0 Sep 20 19:54 environ
lrwxrwxrwx 1 root root 0 Sep 20 19:54 exe -> /usr/sbin/sshd*
dr-x------ 2 root root 0 Sep 20 19:54 fd/
-r--r--r-- 1 root root 0 Sep 20 19:54 maps
-rw------- 1 root root 0 Sep 20 19:54 mem
-r--r--r-- 1 root root 0 Sep 20 19:54 mounts
lrwxrwxrwx 1 root root 0 Sep 20 19:54 root -> //
-r--r--r-- 1 root root 0 Sep 20 19:54 stat
-r--r--r-- 1 root root 0 Sep 20 19:54 statm
-r--r--r-- 1 root root 0 Sep 20 19:54 status
Exe鏈接允許我們恢復(fù)被刪除的文件,只要這些文件仍然運行。為獲得“已刪除可執(zhí)行文件的備份,只需要使用cp命令在該文件系統(tǒng)上
創(chuàng)建一個拷貝就行。通過檢查fd子目錄,可以識別該進(jìn)程打開的所有文件。如果對Unix環(huán)境下的編程有所了解的話,很容易就能發(fā)現(xiàn)
是在讀寫一個文件還是打開一個網(wǎng)絡(luò)連接。cmdline文件的內(nèi)容是該進(jìn)程的完整命令行。以下語句是攻擊者的欺騙手段,
strcpy(argv[0],any_string);
這樣該文件就顯示了一種假象,即使如此,我們?nèi)杂斜匾獧z查此文件。
==================================
獲取所有文件的創(chuàng)建,修改和訪問時間
==================================
ls –alRu > /mnt/usb/access
ls –alRc > /mnt/usb/modification
ls –alR > /mnt/usb/creation
============
獲取系統(tǒng)日志
============
大多數(shù)UNIX的日志在/var/log和/var/adm目錄下,各種UNIX派生系統(tǒng)日志的具體位置有所不同。
在此之前,有必要了解針對特定系統(tǒng)的日志存貯位置。
比較重要的二進(jìn)制日志文件:
utmp,用w工具訪問;
wtmp,用last工具訪問;
lastlog,用lastlog工具訪問;
進(jìn)程記賬日志,用astcomm工具訪問
常見的ASCII文本日志文件:
apache日志--/var/log/httpd/access_log;
ftp日志—xferlog;
命令歷史記錄文件;
/var/log/messages;
檢查/etc/syslog.conf以及其他守護(hù)進(jìn)程的配置文件以確定其余日志的位置。
================
獲取重要配置文件
================
檢查各配置文件查找后門位置,未授權(quán)的信任關(guān)系和未授權(quán)的用戶ID。
/etc/passwd,查找未授權(quán)的用戶帳號和權(quán)限。初級的入侵者會添加uid=0的用戶,
有人也會把系統(tǒng)中一個不起眼的原本沒有shell的普通賬戶改成可登陸獲得shell執(zhí)行命令,
然后他可以通過一個suid位的ksh或其他的安置在本地的后門馬上得到rootshell.
/etc/shadow,確保每個用戶都有密碼認(rèn)證;當(dāng)然攻擊者給自己的賬戶加一個md5 hash其實也是非常簡單的事。
/etc/groups,查找權(quán)限的升級和訪問范圍的擴(kuò)大。
/etc/hosts,列出本地DNS條目。
/etc/hosts.equiv,檢查信任關(guān)系。
~/.rhosts,檢查基于用戶的信任關(guān)系,++這種很濫的后門相信大家都知道。
/etc/hosts.allow && /etc/hosts.deny 檢查tcpwrapper的規(guī)則。
/etc/rc*,檢查啟動文件。
Crontab文件,列出計劃事件。
/etc/inetd.conf,列出端口所監(jiān)聽的服務(wù)。
===========
轉(zhuǎn)儲系統(tǒng)RAM
===========
主要是從系統(tǒng)轉(zhuǎn)移/proc/kmem或/proc/kcore文件,該文件以非連續(xù)方式包含系統(tǒng)RAM的內(nèi)容。
{{深入調(diào)查}}
============
檢查系統(tǒng)日志
============
Unix有很多日志,這些為應(yīng)急響應(yīng)提供重要的線索。日志文件大多位于公用目錄,通常是/var/log,或/usr/adm,/var/adm,
有些日志位于禁止訪問的/etc目錄。具體請參考當(dāng)前操作體系統(tǒng)文檔。
其中syslogd守護(hù)進(jìn)程提供非常強大的日志功能,比如裝載一個內(nèi)核模塊的登記,其配置文件為/etc/syslog.conf,
通常它提供的最有用的日志是:messages,secure,syslog.在syslog.conf中每一行含有三個字段:
facility字段表示產(chǎn)生該日志文件的子系統(tǒng);priority字段表明事件的嚴(yán)重級別;
action字段表明如何記錄日志,它提供了遠(yuǎn)程網(wǎng)絡(luò)記錄的能力。
TCP wrapper日志也利用syslog記錄,其中可能會有telnet,ssh,ftp等遠(yuǎn)程登錄的信息。這些日志中有很多有價值的條目:
嘗試登陸的時間日期,主機名稱,訪問的服務(wù)類型,以及源IP地址。
其他的網(wǎng)絡(luò)日志比如,web,ftp,sql通常自身都提供了較為詳細(xì)的信息。Apache默認(rèn)日志在/usr/local/apache/logs,
最有用的日志是access_log,還有ssl_request_log,ssl_engine_log也能提供有價值的信息。其中可能包含攻擊前的掃描記錄。
Su命令日志,記錄了每一次執(zhí)行su命令的動作:時間日期,成功與否,終端設(shè)備,用戶ID.有些Unix具有單獨的su日志,
有些則保存在syslog中。
登陸用戶日志:utmp或wtmp文件保存了有關(guān)當(dāng)前登陸到系統(tǒng)的用戶的信息。此文件根據(jù)各UNIX版本的不同,
名稱及存儲位置有所差異。保存的基本信息是用戶名,用于登陸的終端以及登陸的時間。文件以二進(jìn)制格式存儲。
查詢utmp,wtmp文件應(yīng)使用適當(dāng)?shù)目蛻舳耍鐆,who,finger,last.檢索成功,失敗與用戶名未知的登陸條目。
Cron日志記錄了定時作業(yè)的內(nèi)容,通常在/var/log/cron或默認(rèn)日志目錄中一個稱為cron的文件里。
進(jìn)程記賬,如果系統(tǒng)存在acct或pacct日志文件,則可使用lastcomm或acctcom命令查看。該日志為二進(jìn)制文件。
Shell歷史記錄:
[root@ay4z3ro foo]# less ~/.bash_history
如果.bash_history被鏈接到/dev/null文件,或者環(huán)境變量中的$HISTFILE,$HISTFILESIZE兩個變量值為0,那么肯定有人非法活動過了。
大多數(shù)入侵者都會修改或刪除日志,雖然理論上能夠做到除種植lkm rootkit之外幾乎不留任何痕跡,但在實際入侵中,
善后工作實際上是個不小的工程,不僅依賴入侵者對系統(tǒng)的熟知程度,而且當(dāng)處理過多繁瑣的內(nèi)容時,疏忽很容易出現(xiàn)。比如:剛得到
rootshell時unset HISTFILESIZE,退出時忘了復(fù)原,留下一條痕跡。諸如此類的例子還有很多,日志清除工具是死的,它只會清除預(yù)定義的
項目,雖然你也能修改源碼,但那樣還是不能隨機應(yīng)變。最保險的方法就是手工勞動,這樣就加大了入侵者的負(fù)擔(dān)。出于懶惰,
對系統(tǒng)掌握程度不夠或是各種各樣的原因往往還是會留下一些對我們有價值的東西。所以,檢查日志對應(yīng)急響應(yīng)來說非常重要。
==============
執(zhí)行關(guān)鍵字搜索
==============
無論是對何種操作系統(tǒng)進(jìn)行應(yīng)急響應(yīng),關(guān)鍵字搜索都是該過程的一部分。針對某個具體事件,可能會有一些ID,phrase與此事件密切相關(guān),
執(zhí)行關(guān)鍵字搜索可以找到更多的信息。關(guān)鍵字可以是很長的ASCII字符串,包括攻擊者后門密碼,用戶名,Mac地址或IP.
例:搜索整個文件系統(tǒng)中包含ay4z3ro字符串大小寫形式的所有文件:
[root@ay4z3ro foo]# grep –r –i ay4z3ro /
strings命令用于顯示文件中的可打印字符,例如:srings /bin/login用于顯示login后門中的密碼(未加密的明文,編碼或加密后的散列)。
Find命令用于尋找匹配常規(guī)表達(dá)式的任何文件名。例:
在整個文件系統(tǒng)中搜索名為…的文件或目錄:
[root@ay4z3ro foo]# find / -name “... –print
此外find命令可以匹配的特征還包括:修改訪問時間,文件所有者,文件內(nèi)的字符串,文件名的字符串等。
