歡迎光臨
每天分享高質量文章

神不知鬼不曉,使用 Shell 腳本掩蓋 Linux 服務器上的操作痕跡

使用 Shell 腳本在 Linux 服務器上能夠控制、毀壞或者獲取任何東西,通過一些巧妙的攻擊方法黑客可能會獲取巨大的價值,但大多數攻擊也留下蹤跡。當然,這些蹤跡也可通過 Shell 腳本等方法來隱藏。

 


 

尋找攻擊證據就從攻擊者留下的這些痕跡開始,如檔案的修改日期。每一個 Linux 檔案系統中的每個檔案都儲存著修改日期。系統管理員發現檔案的最近修改時間,便提示他們系統受到攻擊,採取行動鎖定系統。然而幸運的是,修改時間不是絕對可靠的記錄,修改時間本身可以被欺騙或修改,通過編寫 Shell 腳本,攻擊者可將備份和恢復修改時間的過程自動化。

操作步驟

 

 第一步:查看和操作時間戳 

 

多數 Linux 系統中包含一些允許我們快速查看和修改時間戳的工具,其中最具影響的當數 “Touch”,它允許我們創建新檔案、更新檔案 / 檔案組最後一次被 “touched” 的時間。

 

touch file

 

若該檔案不存在, 運行上面的命令將創建一個名為 “file” 的新檔案;若它已經存在,該命令將會更新修改日期為當前系統時間。我們也可以使用一個通配符,如下麵的字串。

 

touch *

 

這個命令將更新它運行的檔案夾中的每個檔案的時間戳。在創建和修改檔案之後,有幾種方法可以查看它的詳細信息,第一個使用的為 “stat” 命令。

 

stat file

 

 

運行 stat 會傳回一些關於檔案的信息,包含訪問、修改或更新時間戳。針對一批檔案可使用 ls 引數查看各檔案的時間戳,使用 “ -l” 或者 “long”,該命令會列出檔案詳細信息,包含輸出時間戳。

 

lsl

 

 

現在就可以設置當前時間戳並查看已經設置的時間戳,也可使用 touch 來定義一個自定義時間戳,可使用 “d” 標誌,用 yyyy-mm-dd 格式定義日期,緊隨其後設置時間的小時、分鐘及秒,如下:

 

touch -d"2001-01-01 20:00:00" file

 

通過 ls 命令來確認修改信息:

 

ls -l file

 


 

這種方法適用於修改個別時間戳,對於隱藏服務器上的操作痕跡,這個方法不太奏效,可以使用 shell 腳本將該過程自動化。

 

 步驟二:組織 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,以幫助我們稍後清理這個輸入。

 

lsl

 

通常會出現下麵的顯示結果:

 

-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″ *   修改目錄下的所有檔案時間戳
lsa   確認修改的檔案
./timestamps.sh –r   恢復檔案原始時間戳

 

最後可以再次運行 “ls -a” 來查看檔案的時間戳是否和之前備份的時間戳一致,整個的腳本就執行完成了,如下圖所示:

 

 

總結

該腳本只是用來清除攻擊服務器之後遺留的一些痕跡。為了隱藏痕跡,黑客在針對服務器實施具體的攻擊時,必須仔細考慮使用的每一個方法,以及入侵服務器之後如何隱藏自己的痕跡。

 

通過上面的介紹我們瞭解到,時間戳也是 “會撒謊的”,因此系統管理員必須意識到他們的許多日誌和保護措施是可以被操縱的,雖然看起來好像沒有異常。

赞(0)

分享創造快樂