使用 Shell 腳本在 Linux 服務器上可以控制、毀壞或者獲取任何東西,經過一些巧妙的攻擊方法黑客可能會獲取巨大的價值,但大多數攻擊也留下蹤影。固然,這些蹤影也可經過 Shell 腳本等方法來隱藏。html
尋找攻擊證據就從攻擊者留下的這些痕跡開始,如文件的修改日期。每個 Linux 文件系統中的每一個文件都保存着修改日期。系統管理員發現文件的最近修改時間,便提示他們系統受到攻擊,採起行動鎖定系統。然而幸運的是,修改時間不是絕對可靠的記錄,修改時間自己能夠被欺騙或修改,經過編寫 Shell 腳本,攻擊者可將備份和恢復修改時間的過程自動化。shell
多數 Linux 系統中包含一些容許咱們快速查看和修改時間戳的工具,其中最具影響的當數 「Touch」,它容許咱們建立新文件、更新文件 / 文件組最後一次被 「touched」 的時間。數據庫
touch file
若該文件不存在, 運行上面的命令將建立一個名爲 「file」 的新文件;若它已經存在,該命令將會更新修改日期爲當前系統時間。咱們也可使用一個通配符,以下面的字符串。編程
touch *
這個命令將更新它運行的文件夾中的每一個文件的時間戳。在建立和修改文件以後,有幾種方法能夠查看它的詳細信息,第一個使用的爲 「stat」 命令。bash
stat file
運行 stat 會返回一些關於文件的信息,包含訪問、修改或更新時間戳。針對一批文件可以使用 ls 參數查看各文件的時間戳,使用 「 -l」 或者 「long」,該命令會列出文件詳細信息,包含輸出時間戳。服務器
ls –l
如今就能夠設置當前時間戳並查看已經設置的時間戳,也可以使用 touch 來定義一個自定義時間戳,可以使用 「d」 標誌,用 yyyy-mm-dd 格式定義日期,緊隨其後設置時間的小時、分鐘及秒,以下:編輯器
touch -d"2001-01-01 20:00:00" file
經過 ls 命令來確認修改信息:函數
ls -l file
這種方法適用於修改個別時間戳,對於隱藏服務器上的操做痕跡,這個方法不太奏效,可使用 shell 腳本將該過程自動化。工具
在開始編寫腳本以前須要考慮清楚須要執行哪些過程。爲了在服務器上隱藏痕跡,攻擊者須要將文件夾的原始時間戳寫入一個文件,同時可以在咱們進行任何修改設置以後還能回到原始文件。測試
這兩個不一樣的功能會根據用戶的輸入或者參數的不一樣而觸發,腳本會根據這些參數執行相應的功能,同時咱們須要有一種方法來處理錯誤。根據用戶的輸入將會進行三種可能的操做:
沒有參數——返回錯誤消息; 保存時間戳標記——將時間戳保存到文件中; 恢復時間戳標記——根據保存列表恢復文件的時間戳。
咱們可使用嵌套語句 if/or 語句來建立腳本,也能夠根據條件將每一個函數分配給本身的 「if」 語句,可選擇在文本編輯器或者 nano 中開始編寫腳本。
從命令行啓動 nano 並建立一個名爲 「timestamps.sh」 的腳本,命令以下:
nano timestamps.sh
而後進行下列命令:
#!/bin/bash if [$# -eq 0];then echo 「Use asave (-s) or restore (-r) parameter.」 exit 1 fi
在 nano 中按下 Ctrl + O 保存這個文件,經過 chmod 命令將它標記爲可運行的腳本。
chmod +x timestamps.sh
而後運行腳本,測試無參數時返回錯誤信息的功能。若是腳本返回咱們的 echo 語句,咱們就能夠繼續下一個條件了。
./timestamps.sh
定義 if 語句的條件,「-s」 表示執行保存功能:
if [$1 ="-s"] ; then fi
固然,須要檢查計劃保存的時間戳文件是否存在,若是存在,咱們能夠刪除它(名爲 timestamps 的文件),避免重複或錯誤的輸入,使用下面的命令:
rm -f timestamps;
而後使用 「ls」 命令列出全部文件和它的修改時間,可將其輸出到另外一個程序,如 sed,以幫助咱們稍後清理這個輸入。
ls –l
一般會出現下面的顯示結果:
-rw-r--r-- 1 user user 0 Jan 1 2017 file
爲了保存時間戳,咱們只須要年、月、日及文件名,下面命令能夠清除 「Jan」 以前的信息:
ls -l file | sed 's/^.*Jan/Jan/p'
這樣顯示的就是咱們程序須要的信息,只是須要修改月份格式爲數字格式:
ls -l file | sed 's/^.*Jan/01/p'
將全部月份都替換爲數字:
ls -l | sed -n 's/^.*Jan/01/p;s/^.*Feb/02/p;s/^.*Mar/03/p;s/^.*Apr/04/p;s/^.*May/05/p;s/^.*Jun/06/p;s/^.*Jul/07/p;s/^.*Aug/08/p;s/^.*Sep/09/p;s/^.*Oct/10/p;s/^.*Nov/11/p;s/^.*Dec/12/p;'
在一個文件夾中運行咱們會看到以下圖所示的結果:
而後將輸出結果經過 「>>」 發送到名爲 「timestamps」 的文件中:
do echo $x | ls -l | sed -n 's/^.*Jan/01/p;s/^.*Feb/02/p;s/^.*Mar/03/p;s/^.*Apr/04/p;s/^.*May/05/p;s/^.*Jun/06/p;s/^.*Jul/07/p;s/^.*Aug/08/p;s/^.*Sep/09/p;s/^.*Oct/10/p;s/^.*Nov/11/p;s/^.*Dec/12/p;' >> timestamps
至此,腳本的前兩個操做就完成了,顯示結果以下圖:
下面可用 「-s」 標示測試腳本,用 cat 檢查保存的信息:
./timestamps.sh –s cat timestamps
在保存好原始時間戳後,須要恢復時間戳讓別人覺察不到文件被修改過,可以使用下面命令:
if $1 = "-r" ; thenfi
而後使用下面命令,轉發文本文件的內容,並一行一行運行:
cat timestamps |while read linedodone
而後再分配一些變量讓文件數據的使用更簡單:
MONTH=$(echo $line | cut -f1 -d ); DAY=$(echo $line| cut -f2 -d ); FILENAME=$(echo $line | cut -f4 -d ); YEAR=$(echo $line | cut -f3 -d )
雖然這四個變量在保存的時間戳文件中是一致的,可是若是時間戳是在過去一年中發生的,它只會顯示時間而不是年份。若是須要肯定當前年份,咱們能夠分配爲寫腳本的年份,也能夠從系統中返回年份,使用 cal 命令能夠查看日曆。
而後檢索第一行,只讓顯示想要得年份信息:
CURRENTYEAR=$(cal | head -1 | cut -f6- -d | sed 's/ //g')
定義了全部變量以後可使用 「if else」 語句,根據格式化的日期更新文件的時間戳,使用 touch 語法:
touch -d "2001-01-01 20:00:00" file
因爲每一個時間都包含冒號,所以可以使用下面的 「ifelse」 語句完成操做,總體操做以下圖所示:
if [ $YEAR == *:* ]; then touch -d $CURRENTYEAR-$MONTH-$DAY $YEAR:00 $FILENAME; else touch -d ""$YEAR-$MONTH-$DAY"" $FILENAME; fi
使用的命令主要有如下幾個:
./timestamps.sh –s 保存文件時間戳 touch -d 「2050-10-12 10:00:00″ * 修改目錄下的全部文件時間戳 ls –a 確認修改的文件 ./timestamps.sh –r 恢復文件原始時間戳
最後能夠再次運行 「ls -a」 來查看文件的時間戳是否和以前備份的時間戳一致,整個的腳本就執行完成了,以下圖所示:
該腳本只是用來清除攻擊服務器以後遺留的一些痕跡。爲了隱藏痕跡,黑客在針對服務器實施具體的攻擊時,必須仔細考慮使用的每個方法,以及入侵服務器以後如何隱藏本身的痕跡。
經過上面的介紹咱們瞭解到,時間戳也是 「會撒謊的」,所以系統管理員必須意識到他們的許多日誌和保護措施是能夠被操縱的,雖然看起來好像沒有異常。
來自:FreeBuf.COM,做者:JingleCats
連接:www.freebuf.com/articles/system/155579.html
一、SQLServer、MySQL、Oracle三種數據庫的優缺點總結
二、完全理解 Linux 的各類終端類型及概念
三、Shell 腳本中 '$' 符號的多種用法
四、一文讀懂 Shell 中各類括號的做用
五、編寫可靠 Shell 腳本需注意的幾點建議呢?
六、Shell編程 | 腳本參數與交互及常見問題
七、如何理解 Linux shell中「2>&1」?
八、一文讀懂 HTTPD 服務的訪問控制
九、詳解 Linux 環境下部署 HTTPD 服務
十、今天,公衆號一週年!
歡迎關注公衆號:傑哥的IT之旅