{{初始響應}}
目標:在進行司法鑒定復制之前獲得系統中的易失數據,初步確定突發事件概況。
==============
創建響應工具包
==============
我們調查系統,必須以高度可信賴的程序執行命令,再加上備份與修復,創建一個工具包是很有必要的。
即使在非UNIX/LINUX系統上,創建工具包也應該作為響應的第一步。
首先,我們需要在對應體系結構的系統上編譯響應期間需要的工具,且編譯程序需要考慮系統兼容的問題。
通常我們需要如下的工具:
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
讀者可根據自己的需要自行添加,但是一個工具包通常只能用來完成對某一特定平台的工作,把對多個平台編譯的工具放進同一個工具包反而會顯得紊亂。
在Linux上創建響應工具包時,可以用gcc的–static參數編譯源代碼,或者用ldd檢查動態連接庫,在響應工具包存儲介質上建立庫文件目錄,並拷貝所有工具需要的動態連接庫的副本,最後設置環境變量。
這個過程有點類似於創建一個Linux的優盤啟動盤。
============
獲取易失數據
============
易失的數據包括:當前打開的套接字,進程列表,RAM內容,非鏈接文件的位置。
*unix特性: unix允許進程正在執行時將其刪除! 非鏈接文件是訪問該文件的進程中止時被標記為刪除的文件。當系統關閉時(正常關機或突然斷電非正常關機),標記為刪除的文件都將消失。因此在找到被標記為刪除的文件之前不能關機!
=================
執行可信賴的shell
=================
使用我們自己准備的響應工具包,裝載該介質的文件系統,
mount –t auto /dev/sda1 /mnt/usb 或
mount –t iso9660 /dev/cdrom /mnt/cdrom
按下Ctrl+Alt+F1~F6,從控制台以root身份登陸。
請一定要區分原環境變量中的命令和當前響應工具包的相同名字的命令集,防止潛在的二進制特洛伊木馬攻擊。
==================
查看登陸系統的用戶
==================
[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
輸出標題行顯示了當前系統時間,該系統已運行的時間,當前登陸用戶數,最近1分鐘,5分鐘和15分鐘內的平均系統負載。
USER字段顯示當前登陸的用戶名。TTY字段顯示了會話的控制終端,tty表示從控制台登陸,pts/typ則可以表示通過一個網絡連接,因為X是個C/S模式的應用程序,所以我在GNOME下開的shell窗口顯示為pts。如果不從本地登陸,輸出中還有FROM字段, 表示建立會話的源地址的域名或IP。LOGIN@顯示該連接的本地開始時間。IDLE字段顯示了自上一個進程運行以來的時間長度。
JCPU顯示與tty或pts關聯的全部進程所使用的時間。PCPU字段顯示了WHAT列中當前進程所使用的CPU時間。WHAT列顯示用戶當前運行的進程。
================
查看系統進程列表
================
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字段顯示了程序開始運行的時間,對於查出攻擊時間很有幫助。有時僅通過時間就能識別可疑進程。
Linux下還可以通過strings –f /proc/[0-9]*/cmdline來查看系統中運行進程的完整命令行參數,但是這個並不完全可信。
因為攻擊者甚至不需要插入內核模塊,而只在應用層的編碼中加入語句就能欺騙我們。
===============
檢測LKM Rootkit
===============
內核模塊後門,還有什麼比這個更臭屁的呢?Solaris,Linux和幾乎所有的UNIX都支持LKM(Loadable Kernel Modules),用普通的方法無法檢測其存在,這給應急響應帶來了極大的挑戰性。對於我們來說,解決的辦法是找到那些lkm rootkit,並熟悉,解剖他們。有時lkm rootkit雖然被成功裝載,但在系統的某些細節上會出現“異常”,甚至可能使系統在運行一段時間後徹底崩潰。
還有,lkm雖然活動在ring0核心態,但是攻擊者往往會在系統的某處留下痕跡,比如攻擊者為了讓系統每次關閉或重啟後能自動裝入他安置的
內核後門,可能會改寫/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參數最有用,它顯示了系統調用入口的信息,能檢測市面上最流行的knark和adore這兩個內核後門,但理論上他並不能檢測出所有的lkm rootkit.
Kstat/ksec站點:http://www.s0ftpj.org其實熟悉內核攻擊的人都知道Kstat單純檢查sys_call_table[]的方式如今已經被攻擊的一方完全超越,e4gle很早也寫過這類文章。
有興趣可以看看2002焦點峰會jbtzhm的《內核後門實現及其檢測》現在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=
======================
檢測開放端口和關聯進程
======================
[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工具列舉所有運行進程及其所打開的文件描述符,其中包括常規文件,庫文件,目錄,UNIX流,套接字等。如果只想顯示網絡套接字的進程:
[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)
其中特別需要注意的是奇怪的進程和已打開的原始套接字。
================================
尋找系統中是否運行一個非法嗅探器
================================
為了達到這個目的,我們需要檢查網卡是否處於混雜(promiscuous)模式:
[root@ay4z3ro foo]# ifconfig –i eth0 | grep PROMISC
PROMISC標志並不會在所有的*NIX上出現,通過lsof+ps命令可以判斷系統是否正運行一個嗅探器。或者通過第三方的工具,比如AntiSniff。
=================
檢查/proc文件系統
=================
在/proc/$PID/目錄下對於調查比較有意義的是: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 ro