如何使用 Shell 指令碼掩蓋 Linux 伺服器上的操作痕跡?
使用 Shell 指令碼在 Linux 伺服器上能夠控制、毀壞或者獲取任何東西,通過一些巧妙的攻擊方法黑客可能會獲取巨大的價值,但大多數攻擊也留下蹤跡。當然,這些蹤跡也可通過 Shell 指令碼等方法來隱藏。
尋找攻擊證據就從攻擊者留下的這些痕跡開始,如檔案的修改日期。每一個 Linux 檔案系統中的每個檔案都儲存著修改日期。系統管理員發現檔案的最近修改時間,便提示他們系統受到攻擊,採取行動鎖定系統。然而幸運的是,修改時間不是絕對可靠的記錄,修改時間本身可以被欺騙或修改,通過編寫 Shell 指令碼,攻擊者可將備份和恢復修改時間的過程自動化。
操作步驟
步驟一:檢視和操作時間戳
多數 Linux 系統中包含一些允許我們快速檢視和修改時間戳的工具,其中最具影響的當數 “Touch”,它允許我們建立新檔案、更新檔案 / 檔案組最後一次被 “touched” 的時間。
touch file
若該檔案不存在, 執行上面的命令將建立一個名為 “file” 的新檔案;若它已經存在,該命令將會更新修改日期為當前系統時間。我們也可以使用一個萬用字元,如下面的字串。
touch *
這個命令將更新它執行的資料夾中的每個檔案的時間戳。在建立和修改檔案之後,有幾種方法可以檢視它的詳細資訊,第一個使用的為 “stat” 命令。
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 指令碼將該過程自動化。
步驟二:組織 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
雲端計算免費課程火熱開講中,5天運維經典課程免費學,會雲端計算的運維人才到底需要掌握哪些技術,未來前景發展怎麼樣?跟隨行業大咖一起剖根究底,點選文末“閱讀原文”或長按下方二維碼即可報名免費課程!抓住免費學習的機會,逆襲2019~~
PS:記得查收小編送你的免費大禮包呦~
福利 | 一萬多套PPT模板等你免費來拿!無條件領取!
免費送 | 1000多套簡歷模板免費拿,附贈簡歷製作教程!
免費領 | 《Shell指令碼 100例》電子書免費拿,運維必備乾貨~
▼▼點選【閱讀原文】,5天運維免費課程,開講在即!
相關文章
- 如何使用Linux伺服器的巡檢使用者和基礎命令,捕捉使用者登入痕跡?Linux伺服器
- Linux Shell指令碼Linux指令碼
- Linux 使用 shell 指令碼處理字串Linux指令碼字串
- linux常用的shell指令碼Linux指令碼
- PJzhang:鳥哥的linux私房菜-shell指令碼-上Linux指令碼
- 設定Linux伺服器IP地址的shell指令碼Linux伺服器指令碼
- 如何檢視網站伺服器被攻擊的痕跡網站伺服器
- linux學習day3——shell指令碼上Linux指令碼
- linux shell指令碼中 =~ 的作用Linux指令碼
- 程式碼上線的shell指令碼指令碼
- shell指令碼字串和陣列的使用操作方法指令碼字串陣列
- 如何使用zx編寫shell指令碼指令碼
- 如何在Linux中使用Shell指令碼終止使用者會話?Linux指令碼會話
- 檢測不同伺服器上程式碼差別的shell的指令碼伺服器指令碼
- 網頁瀏覽痕跡在哪裡徹底刪除_win10如何清除瀏覽器上網痕跡網頁Win10瀏覽器
- Linux shell:執行shell指令碼的幾種方式Linux指令碼
- 如何加密shell指令碼加密指令碼
- 入侵痕跡清理
- Linux 【Shell指令碼經典案例】Linux指令碼
- Linux基礎五(shell指令碼)Linux指令碼
- 【Linux】【Shell】主控指令碼實現Linux指令碼
- 什麼是Shell指令碼?Shell指令碼在Linux運維工作中的地位!指令碼Linux運維
- 如何使用 Shell 指令碼來檢視多個伺服器的埠是否開啟?指令碼伺服器
- oracle-rac出問題需要重灌,自動清理安裝痕跡指令碼Oracle指令碼
- LINUX Shell指令碼程式設計例項詳解(一)上Linux指令碼程式設計
- 如何編寫高效的 Shell 指令碼指令碼
- 如何呼叫python中的shell指令碼?Python指令碼
- 使用shell指令碼在Linux中管理Java應用程式指令碼LinuxJava
- Linux命令和shell指令碼學習Linux指令碼
- Linux shell 指令碼基礎介紹Linux指令碼
- Linux Shell指令碼時間排程Linux指令碼
- Linux必須掌握的shell指令碼基礎Linux指令碼
- 用Shell指令碼來解決DOS安全Linux伺服器生產指令碼Linux伺服器
- Linux shell指令碼判斷伺服器網路是否可以上網Linux指令碼伺服器
- Shell指令碼介紹與使用指令碼
- 如何讓shell指令碼自殺指令碼
- shell指令碼linux命令連續執行指令碼Linux
- Linux學習之路(三)Shell指令碼初探Linux指令碼