一般人們都認爲在衆多的OS中,UNIX是比較安全的。但我們需知道,沒有一種系統能夠保證是絕對安全的,任何系統都會有讓黑客們有機可乘的地方,UNIX也不例外。爲了保護網絡的安全,除了實施例行的安全措施外,也要時刻留意你的系統是不是真正安全,黑客是否已經光顧。以下介紹一些如何利用系統中的常用命令查看黑客足跡的方法。 1.用w指令查看系統信息
$w 9:01pm up 10:08, 1 user, load average: 0.08, 0.06, 0.05 User tty login@ idle JCPU PCPU what notes console 10:54am 9days 28:04 23:29 /usr/dt/bin/dtscreen -mode blank notes pts/2 10:54am 10:07 /sbin/sh notes pts/4 10:54am 10:06 /sbin/sh notes pts/5 10:56am 9:59 /sbin/sh
在w顯示信息的最開頭是發出w命令的時間、系統啓動後的時間、及註冊在系統的用戶數。最後的三個數表示平均負載,即使用系統資源的程度,使用w命令給系統增加了0.08負載。 其他兩個數字分別表示在最後5分鐘及十五分鐘內系統的平均負載量。 注意:當有人在猜password時,將會大大增加系統的平均負載。
2.進程記帳
Unix 系統可以通過設置選項來讓核心在每個進程結束時產生一個記錄。這些記錄所產生的報告被稱爲進程記帳。它包括進程使用資源的信息,以及所執行的命令名。如果運行的是調整用戶id程序,則還包括用戶名等。系統管理員可根據進程記帳的CPU時間讓用戶交納上機費,也可用進程記帳來觀察某一用戶執行了哪些命令。 進程記帳和審計是兩碼事,審計是監視對安全性敏感的事件。進程記帳並不記下所執行命令的參數,所以無法知道某一命令修改了哪個文件,甚至也不知道此命令的執行是否成功。但系統管理員仍然可以在進程記帳中找出某些線索。 基於System V的系統和基於BSD的系統在進程記帳方面所採納的方法不同,命令也不一樣。
2.1 System V記帳
在System V 中,進程記帳保存在/usr/adm/pactt文件中。root可運行/usr/lib/acct/startup 來啓動進程記帳。記帳信息的日常處理可用runacct命令來做,它會壓縮pacct文件。每月的處理由shell程序monacct來完成。這兩個程序都在/usr/lib/acct目錄下。 acctcom 命令可用來搜索pacct中的內容,併產生報告。例如:查找用戶"tommy"在10:00 至11:30這段時間內所執行的全部命令。見下表:
$acctcom -u tommy -s 10:00 -e 11:30 START BEF: Sat Oct 10 11:30:00 1998 END AFTER: Sat Oct 10 10:00:00 1998 COMMAND START END REAL CPU MEAN NAME USER TTYNAME TIME TIME (SECS) (SECS) SIZE(K) cat tommy pts/3 11:01:13 11:01:13 0.02 0.02 492.00 mail tommy pts/3 11:01:13 11:01:13 0.02 0.02 876.00 clear tommy pts/3 11:01:14 11:01:14 0.03 0.01 744.00 ls tommy pts/3 11:01:16 11:01:16 0.03 0.03 776.00 date tommy pts/3 11:01:23 11:01:23 0.01 0.01 664.00
acctcom命令用來告訴系統管理員某一用戶幹了些什麼,而不是正在幹什麼,而且它只列出了命令名,沒有參數。所以,從中發現一些線索,如可找出使用大量cpu時間的進程(典型的是猜口令進程)。
可用shell程序runacct來產生幾個報告。這些報告存放在/usr/adm/acct/sum目錄下, 其文件名格式爲rprtMMDD。報告的第一部分包含"變更"信息,如進程記帳啓動及關閉的時間(關閉記帳可能是由於某人想隱藏某些活動),以及系統時間的改變。第二部分是每個用戶註冊到系統的時間以及有關每個端口的報告,還包括了每個端口上"接通"和"斷開" 的次數。"接通"表示一次成功的註冊,"斷開"表示退出系統或註冊失敗。大量的"斷開"可能意味着有人在試驗"註冊名,口令"序列組試圖侵入系統中。 報告的最後一部分是有關用戶最後一次註冊的信息,這個最後註冊報告是隨着用戶的不斷註冊、退出而時刻更新的。報告中還包括用戶名及最後的註冊時間,越早退出系統的帳號排在越前。這個報告對於發現那些死帳號非常有用,管理員可能會在這裏發現一些奇怪的事情如有人註冊到系統管理的帳號中(如bin或sys)。
2.2 BSD系統的記帳
BSD系統的進程記帳用/usr/etc/accton程序啓動。默認的記帳文件爲/usr/adm/acct 只要啓動了進程記帳,該文件會增長得很快。BSD有兩條命令來處理記帳信息。第一條是/usr/etc/ac,處理在/usr/adm/wtmp文件中的註冊信息,第二條是 /usr/etc/sa,產生已用命令的小結報告,保存在/usr/adm/savacct文件中。 BSD系統中也有與acctcom類似的命令叫做lastcomm。lastcomm命令反向搜索/usr/adm/acct文件,產生出與acctcom命令相似的結果。 BSD記帳系統也和System V一樣,有類似的缺陷(從安全性角度講),即不保留命令的參數。 並且,BSD系統沒有最後註冊的報告。
現在針對前面的兩點防衛措施,從攻的角度來看:
1.對與第一點中用w、who、last、ps等命令,hacker完全可以用程序將自己的記錄隱藏 起來,使管理員用以上幾個命令都查看不到。當然此時hacker已經把root的權限得到手。 2.就算最笨的hacker,當他無法隱藏自己時,他也會把整個記錄文件刪除掉,免得管理員查到用什麼帳號從哪裏登錄進來,運行了些什麼指令。但顯而易見,雖然管理員此時 (沒安裝第三方的審記軟件時)不能知道誰人在哪裏發起攻擊,但也無疑地告訴管理員 "你的系統已經給攻破了"。
3.歷史文件:
ksh、csh、sh、bash、zsh都可保存歷史文件。其文件如下: sh: .sh_history (sh 也即Bourne shell) csh: .history ksh: .sh_history bash: .bash_history zsh: .history 在運行sh和ksh的用戶的相應.profile中,加入HISTORY=100,可指定.sh_history 文件保存該用戶最近運行的100條記錄。 對於csh,則在.cshrc文件中加入, set history=100,則可。 用戶可以運行history指令來查看歷史文件中的內容。對於Ksh、sh 也可運行 tail -f .sh_history 來查看,其順序是從最近的運行的指令開始。 而C shell 是在退出才能更新文件,所以不能用tail來觀察C shell執行了那些命令。 這些歷史文件比進程記帳更爲有用,因爲命令的參數也被保留下來,所以可通過執行命令的上下文聯繫察覺到用戶幹了些什麼。 BTW: .profile用於Bourne和Korn shell; .login和.cshrc用於C shell。
4.找出屬主爲root且帶s位的程序:
以root身份執行以下的指令, 找出此類文件,看看是否有可疑的程序存在。 #find / -perm -4000 -exec /bin/ls -lab {} ";" 當hacker進入系統後,大部份是利用buffer overflow取得root shell。 例如:solaris 中帶s位的fdformat,ufsdump,ping等,AIX中xlock;SGI中的xlock, digital中的dop等等,都給hacker找出了其漏洞。 當hacker利用這些big bugs取的root shell後,若其想以後還想入侵此係統的話, 當然是留下root shell的程序,此時hakcer也不關心原來的bugs是否給fix掉,他不再需要利用bug了,只須運行自己留下的root shell即給。以下給出得到root shell的簡單程序:
#cat getrootshell.c void main(void) { setuid(0,0); execl("/bin/sh", "sh",0); }
編譯後得到bin文件。
#cc -o getrootshell getrootshell.c #chmod 4777 getrootshell #chown root:other getrootshell #ls -al getrootshell -rwsrwxrwx 1 root other 5 Oct 12 06:14 getrootshell (注意全過程是在取的rootshell後,纔可這樣做)
這樣hacker就在該系統中留下了後門,下次入來後就不需利用還沒fix的 fdformat,xlock,dop等bug 的程序了,直接運行getrootshell程序,就可跳成root了,想幹啥就幹啥了。因此,管理員要查清此類型的文件。
現在從攻的角度來看上面兩點防衛措施:
1.對於history文件,當hacker進入系統後可以改變shell類型,來使保存他後來所有指令的history文件失效。因此,當hacker用crack到的帳號進入系統後,第一條所敲的指令是改變shell類型的指令. example in digital unix下:
c:/>telnet XXX.XXX.XXX.XXX Digital UNIX (center) (ttyp5)
login: tommy Password: Last login: Sun Oct 11 22:43:51 from HPVC.com
Digital UNIX V4.0A (Rev. 464); Sat Feb 7 19:54:12 GMT+0800 1998
The installation software has successfully installed your system.
There are logfiles that contain a record of your installation. These are:
/var/adm/smlogs/install.cdf - configuration description file /var/adm/smlogs/install.log - general log file /var/adm/smlogs/install.FS.log - file system creation logs /var/adm/smlogs/setld.log - log for the setld(8) utility /var/adm/smlogs/fverify.log - verification log file
center>chsh Old shell: /bin/sh New shell: ksh 其他系統不在此一一列舉。
2.對於類似getrootshell的bin文件,hacker也不會真的那麼愚蠢到起這個名字,且他們 會將此類型的程序藏在不易察覺的目錄下,如果不是老練的管理員是不會發現的。(注:一般來說,hacker不會把getrootshell文件刪除的,因爲他也不能肯定下次進入系統時那些bugs是否還可以利用,使其變root)
5.找出隱藏文件
上節提到當hacker在取得root權限後,在系統中留下些後門文件。最常用的方法就是放在/bin、/usr/bin、/usr/sbin等命令目錄下,但也有其他的方法隱藏起來。如: $pwd /export/home/tommy $ls -al total 48 drwxr-xr-x 11 tommy other 1024 Oct 13 11:20 . drwxr-xr-x 10 root other 512 Sep 18 11:11 .. drwxr-xr-x 2 tommy other 512 Oct 13 11:18 .. drwxr-xr-x 2 tommy other 512 Oct 13 11:18 ... -rw-r--r-- 1 tommy other 255 Oct 10 23:37 .profile -rw------- 1 tommy other 272 Oct 11 00:19 .sh_history -rw-r--r-- 1 tommy other 1429 Oct 8 17:35 33acounts drwx------ 6 tommy other 512 Sep 24 18:24 IBM -rwx------ 1 tommy other 455 Sep 24 16:08 catcher.c drwxr-xr-x 2 tommy other 512 Oct 13 11:17 crack drwxr-xr-x 2 tommy other 512 Oct 12 10:15 exploit drwxr-xr-x 2 tommy other 512 Oct 13 11:20 host drwx------ 2 tommy other 512 Sep 24 15:38 klaxon -rwx------ 1 tommy other 124 Sep 18 11:07 local.cshrc -rwx------ 1 tommy other 575 Sep 18 11:07 local.login -rwx------ 1 tommy other 560 Sep 18 11:07 local.profile -rwx------ 1 tommy other 4275 Sep 21 20:40 scanproxy.c drwx------ 2 tommy other 1024 Oct 7 14:22 sniff drwxr-xr-x 2 tommy other 512 Oct 12 09:55 source
相信大家也會留意到有個三個點"..."的目錄了,這是最簡單的建立隱藏目錄的方法,管理員只要留神一下就會找到它,並且可以直接 敲 cd ... 指令就可進入此目錄。
但是否也注意到有兩個 ".."的目錄, 一點"." 是代表當前目錄,二個點".."是代表父目錄,但爲什麼有兩個父目錄呢? 有問題!其實是hacker利用了特殊字符建立的目錄,只要用帶參數b的ls 指令就可看清楚了。 $ls -lab drwxr-xr-x 11 tommy other 1024 Oct 13 11:32 . drwxr-xr-x 10 root other 512 Sep 18 11:11 .. drwxr-xr-x 2 tommy other 512 Oct 13 11:18 ../007 drwxr-xr-x 2 tommy other 512 Oct 13 11:18 ... -rw-r--r-- 1 tommy other 255 Oct 10 23:37 .profile -rw------- 1 tommy other 272 Oct 11 00:19 .sh_history -rw-r--r-- 1 tommy other 1429 Oct 8 17:35 33acounts drwx------ 6 tommy other 512 Sep 24 18:24 IBM -rwx------ 1 tommy other 455 Sep 24 16:08 catcher.c -rw-r--r-- 1 tommy other 149788 Oct 13 11:32 core drwxr-xr-x 2 tommy other 512 Oct 13 11:17 crack drwxr-xr-x 2 tommy other 512 Oct 12 10:15 exploit drwxr-xr-x 2 tommy other 512 Oct 13 11:20 h/007ost drwx------ 2 tommy other 512 Sep 24 15:38 klaxon -rwx------ 1 tommy other 124 Sep 18 11:07 local.cshrc -rwx------ 1 tommy other 575 Sep 18 11:07 local.login -rwx------ 1 tommy other 560 Sep 18 11:07 local.profile -rwx------ 1 tommy other 4275 Sep 21 20:40 scanproxy.c drwx------ 2 tommy other 1024 Oct 7 14:22 sniff drwxr-xr-x 2 tommy other 512 Oct 12 09:55 source
原來兩點".."後還跟了個ascii字符,對應爲ctrl+g ,hacker是用了mkdir ..^G 的指令來建立的,同時我們也注意到有一個看似是叫做host目錄,其實也是用mkdir h^Gost指令來建立的隱藏目錄;
hacker也可利用以上的方法(還有空格鍵)組合出隱藏的目錄,對於這些情況,管理員應查清楚該目錄下的文件內容(有時未必是hacker所幹,只是用戶想隱藏自己的私人文件而已),再做行動。如發現其目錄下有攻擊性程序,可以用問號"?"代替"/007"等不可見字符,來刪除該目錄,如
$rm -r ..? (刪除掉 ../007 目錄) $rm -r h?ost (刪除掉 h/007ost目錄)
就可刪除 "..^G"等隱藏的目錄了。 對於帶有空格鍵的目錄或文件,刪除它時,用引號引起來防止shell把它濾掉.
$ls -al total 6 drwxr-xr-x 3 tommy other 512 Oct 13 13:13 . drwxr-xr-x 10 tommy other 1024 Oct 13 13:11 .. drwxr-xr-x 2 tommy other 512 Oct 13 13:11 h ost $rm -r h" "ost
6.關閉不必要的服務
79端口所運行的服務是fingerd,它是爲網絡用戶提供服務的。一個遠程用戶可通過finger 來知道某一主機中是否存在某一個用戶。此命令根據/etc/passwd文件中相應帳號的註釋字段 來產生一個報告。這些信息可能被hacker利用來猜口令。
本身開通fingerd服務沒錯,錯在用戶採用了非常脆弱的password,使得有經驗hacker不運行猜口令的程序也可猜中password,所以對於ISP來說沒必要開着79端口,應將其關閉。
#vi /etc/inetd.conf
在finger前加"#"號,將其註釋掉
#finger stream tcp nowait nobody /usr/sbin/in.fingerd in.fingerd
再找出inetd的進程號,kill掉此id,再重起inetd進程。
#ps -ef|grep inetd root 120 1 0 Oct 12 ? 0:00 /usr/sbin/inetd -s root 4806 4764 0 17:31:24 pts/5 0:00 grep inetd #kill -HUP 120
|