在資安事件調查中,經常需要搜尋特設定檔案或分析大量資料。訊息摘要是確認檔案完整性的有效工具,而awk、sed、tr 和 cut 等命令列工具則能協助我們有效率地處理和分析資料。這些工具的組合應用,能大幅提升資料處理效率,對於資安事件的快速分析至關重要。
檔案範例
This is hash file A
內容解密:
範例檔案 hashfilea.txt 的內容。
hashsearch.sh程式碼
#!/bin/bash -
HASH=$1
DIR=${2:-.}
function mkabspath () {
if [[ $1 == /* ]]
then
ABS=$1
else
ABS="$PWD/$1"
fi
}
find $DIR -type f |
while read fn
do
THISONE=$(sha1sum "$fn")
THISONE=${THISONE%% *}
if [[ $THISONE == $HASH ]]
then
mkabspath "$fn"
echo $ABS
fi
done
內容解密:
使用 SHA-1 雜湊值搜尋檔案的 shell 指令碼 hashsearch.sh。它接受雜湊值和目錄作為引數,並輸出匹配檔案的絕對路徑。
使用SCP上傳資料範例
scp some_system.tar.gz bob@10.0.0.45:/home/bob/some_system.tar.gz
內容解密:
使用 SCP 將檔案 some_system.tar.gz 上傳到遠端主機的範例。
Mike Jones
John Smith
Kathy Jones
Jane Kennedy
Tim Scott
內容解密:
awk 命令範例使用的輸入檔案 awkusers.txt 內容。
$ awk '$2 == "Jones" {print $0}' awkusers.txt
Mike Jones
Kathy Jones
內容解密:
使用 awk 篩選並輸出姓氏為 “Jones” 的使用者。
1,jdoe
2,puser
3,jsmith
內容解密:
join 命令範例使用的輸入檔案 usernames.txt 內容。
0745,file1.txt,1
0830,file4.txt,2
0830,file5.txt,3
內容解密:
join 命令範例使用的輸入檔案 accesstime.txt 內容。
$ join -1 3 -2 1 -t, accesstime.txt usernames.txt
1,0745,file1.txt,jdoe
2,0830,file4.txt,puser
3,0830,file5.txt,jsmith
內容解密:
使用 join 命令合併 accesstime.txt 和 usernames.txt 檔案,以使用者 ID 作為關聯欄位。
ip,OS
10.0.4.2,Windows 8
10.0.4.35,Ubuntu 16
10.0.4.107,macOS
10.0.4.145,macOS
內容解密:
sed 命令範例使用的輸入檔案 ips.txt 內容。
$ sed 's/10\.0\.4\.35/10.0.4.27/g' ips.txt
ip,OS
10.0.4.2,Windows 8
10.0.4.27,Ubuntu 16
10.0.4.107,macOS
10.0.4.145,macOS
內容解密:
使用 sed 命令將 IP 地址 “10.0.4.35” 替換為 “10.0.4.27”。
$ tail -n 1 somefile.txt
12/30/2017 192.168.10.185 login.html
內容解密:
使用 tail 命令輸出 somefile.txt 的最後一行。
drive:path\name
c:\Users\Default\file.txt
內容解密:
tr 命令範例使用的輸入檔案 infile.txt 內容。
tr '\\:' '/|' < infile.txt > outfile.txt
內容解密:
使用 tr 命令將反斜線和冒號分別轉換為正斜線和豎線。
drive|path/name
c|/Users/Default/file.txt
內容解密:
tr 命令轉換後的 outfile.txt 檔案內容。
"name","username","phone","password hash"
"John Smith","jsmith","555-555-1212",5f4dcc3b5aa765d61d8327deb882cf99
"Jane Smith","jnsmith","555-555-1234",e10adc3949ba59abbe56e057f20f883e
"Bill Jones","bjones","555-555-6789",d8578edf8458ce06fbc5bb76a58c5ca4
內容解密:
cut 和 awk 命令範例使用的輸入檔案 csvex.txt 內容。
cut -d',' -f1 csvex.txt
內容解密:
使用 cut 命令提取 csvex.txt 檔案的第一欄資料。
cut -d',' -f1 csvex.txt | tr -d '"'
內容解密:
使用 cut 提取第一欄後,再使用 tr 移除雙引號。
cut -d',' -f1 csvex.txt | tr -d '"' | tail -n +2
內容解密:
在移除雙引號後,使用 tail 移除標題列。
cut -d',' -f3 csvex.txt | cut -c2-13 | tail -n +2
內容解密:
使用 cut 提取第三欄(電話號碼),再使用 cut 的 -c 選項提取引號之間的字元,最後使用 tail 移除標題列。
awk -F "," '{print $4}' csvex.txt
內容解密:
使用 awk 提取 csvex.txt 檔案的第四欄資料(密碼雜湊)。
grep "$(awk -F "," '{print $4}' csvex.txt)" passwords.txt
內容解密:
使用 grep 命令在 passwords.txt 檔案中搜尋與 csvex.txt 中的密碼雜湊匹配的專案。
使用訊息摘要值進行搜尋
密碼雜湊函式是一種單向函式,能將任意長度的輸入訊息轉換為固定長度的訊息摘要。常見的雜湊演算法包括MD5、SHA-1和SHA-256。考慮範例5-5和5-6中的兩個檔案。
檔案範例
hashfilea.txt
This is hash file A
hashfileb.txt
This is hash file B
注意到這兩個檔案除了句子中的最後一個字母外,其他內容完全相同。你可以使用sha1sum命令來計算每個檔案的SHA-1訊息摘要:
$ sha1sum hashfilea.txt hashfileb.txt
6a07fe595f9b5b717ed7daf97b360ab231e7bbe8 *hashfilea.txt
2959e3362166c89b38d900661f5265226331782b *hashfileb.txt
儘管兩個檔案之間只有很小的差異,但它們生成的訊息摘要卻完全不同。如果檔案相同,訊息摘要也會相同。你可以利用雜湊的這個特性,在系統中搜尋特定的檔案(如果已知其摘要)。其優點是搜尋結果不會受到檔案名稱、位置或其他屬性的影響;缺點是檔案必須完全相同。如果檔案內容有任何變化,搜尋將會失敗。
hashsearch.sh指令碼
範例5-7中的hashsearch.sh指令碼,從使用者指定的位置開始遞迴搜尋系統。它對找到的每個檔案進行SHA-1雜湊運算,然後將計算出的摘要與使用者提供的摘要值進行比較。如果找到匹配,指令碼將輸出檔案路徑。
hashsearch.sh程式碼
#!/bin/bash -
# Cybersecurity Ops with bash
# hashsearch.sh
# 描述:
# 遞迴搜尋指定目錄,尋找與給定SHA-1雜湊值匹配的檔案
# 用法:
# hashsearch.sh <hash> <directory>
# hash - 要尋找的檔案的SHA-1雜湊值
# directory - 開始搜尋的最上層目錄
HASH=$1
DIR=${2:-.} # 預設為當前目錄
# 將路徑名稱轉換為絕對路徑
function mkabspath () {
if [[ $1 == /* ]]
then
ABS=$1
else
ABS="$PWD/$1"
fi
}
find $DIR -type f |
while read fn
do
THISONE=$(sha1sum "$fn")
THISONE=${THISONE%% *}
if [[ $THISONE == $HASH ]]
then
mkabspath "$fn"
echo $ABS
fi
done
程式碼解析:
- 遞迴搜尋與雜湊計算:使用
find命令遞迴搜尋指定目錄下的所有普通檔案(避免特殊檔案),並對每個檔案計算SHA-1雜湊值。 - 比對雜湊值:將計算出的雜湊值與使用者提供的雜湊值進行比較,若匹配則輸出該檔案的絕對路徑。
mkabspath函式:將相對路徑轉換為絕對路徑,以確保輸出的路徑完整可用。
資料傳輸
收集完所需資料後,下一步是將資料從原始系統傳輸到其他地方進行進一步分析。可以將資料複製到可移除裝置或上傳到集中式伺服器。如果選擇上傳,務必使用安全的方法,如安全複製(SCP)。
使用SCP上傳資料範例
scp some_system.tar.gz bob@10.0.0.45:/home/bob/some_system.tar.gz
重點提示
- 在指令碼中使用SCP或SSH時,避免直接在指令碼中包含密碼,建議使用SSH憑證。
- 可以在資料收集指令碼的末尾新增一行,使用SCP自動將資料上傳到指定的主機。
- 為檔案取唯一名稱,以避免覆寫現有檔案,並使後續分析更容易。
資料處理技術與工具應用
在前一章中,我們收集了大量的資料。這些資料可能以多種格式存在,包括自由格式的文字、逗號分隔值(CSV)和XML。本章將介紹如何解析和操作這些資料,以便提取關鍵元素進行分析。
常用命令工具介紹
本章將介紹awk、join、sed、tail和tr等命令工具,用於準備資料進行分析。
awk:文字處理語言
awk不僅是一個命令,還是一種專為文字處理設計的程式語言。整個書籍都致力於此主題。本章將簡要介紹其用法。
常用選項
-f:從指定的檔案讀取awk程式
命令範例
假設有一個名為awkusers.txt的檔案,內容如下:
Mike Jones
John Smith
Kathy Jones
Jane Kennedy
Tim Scott
可以使用awk列印出姓氏為Jones的使用者:
$ awk '$2 == "Jones" {print $0}' awkusers.txt
Mike Jones
Kathy Jones
awk會迭代輸入檔案的每一行,將每個單詞(預設以空白分隔)讀入欄位。欄位$0代表整行,$1代表第一個單詞,$2代表第二個單詞等。一個awk程式由模式和對應的程式碼組成,當模式匹配時執行相應的程式碼。
注意事項
如果省略明確的比較,而是寫成awk '/Jones/ {print $0}',則斜線內的字串是匹配輸入行中任意位置的正規表示式。該命令將列印出所有名字中包含Jones的行。
join:合併檔案
join命令用於合併兩個共用一個共同欄位的檔案。為了使join正常運作,輸入檔案必須排序。
常用選項
-j:使用指定的欄位編號進行合併。欄位從1開始。-t:指定用作欄位分隔符的字元。預設的欄位分隔符是空格。--header:將每個檔案的第一行用作標題。
命令範例
考慮以下兩個檔案:
usernames.txt
1,jdoe
2,puser
3,jsmith
accesstime.txt
0745,file1.txt,1
0830,file4.txt,2
0830,file5.txt,3
兩個檔案共用一個資料欄位,即使用者ID。可以使用join命令合併這兩個檔案:
$ join -1 3 -2 1 -t, accesstime.txt usernames.txt
1,0745,file1.txt,jdoe
2,0830,file4.txt,puser
3,0830,file5.txt,jsmith
sed:流編輯器
sed允許對資料流進行編輯,例如替換字元。
常用選項
-i:編輯指定的檔案並就地覆寫
命令範例
假設有一個名為ips.txt的檔案,內容如下:
ip,OS
10.0.4.2,Windows 8
10.0.4.35,Ubuntu 16
10.0.4.107,macOS
10.0.4.145,macOS
可以使用sed替換所有出現的10.0.4.35 IP地址為10.0.4.27:
$ sed 's/10\.0\.4\.35/10.0.4.27/g' ips.txt
ip,OS
10.0.4.2,Windows 8
10.0.4.27,Ubuntu 16
10.0.4.107,macOS
10.0.4.145,macOS
tail:輸出檔案尾部內容
tail命令用於輸出檔案的最後幾行。預設情況下,tail會輸出檔案的最後10行。
常用選項
-f:持續監控檔案並輸出新增的行-n:輸出指定數量的行
命令範例
輸出s contention.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.txt somefile.html`
$ tail -n 1 somefile.txt
12/30/2017 192.168.10.185 login.html
內容解密:
此命令使用-n 1選項指定輸出`s contention.txt somefile.html````
練習題與解答指引(Workshop)
練習題目指引與解題方向
本章節提供一系列與資料處理相關的練習題,旨在幫助讀者熟悉和掌握資料處理工具的使用方法,包括檔案搜尋、遠端命令執行、指令碼修改等。以下是指引與解題方向,供讀者參考。
第1題:搜尋檔案系統中名為dog.png的檔案
- 解題方向:使用適當的命令列工具搜尋整個檔案系統,找出名為dog.png的檔案。
- 提示:考慮使用如find等命令。
第2題:搜尋包含“confidential”文字的檔案
- 解題方向:使用適當的命令列工具在檔案系統中搜尋包含特定文字“confidential”的檔案。
- 提示:考慮使用如grep等命令,並結合find命令進行搜尋。
第3題:搜尋包含“secret”或“confidential”文字的檔案並複製到當前工作目錄
- 解題方向:結合搜尋和檔案操作命令,先找出包含特定文字的檔案,然後將這些檔案複製到當前工作目錄。
- 提示:使用grep和find命令進行搜尋,並使用cp命令進行檔案複製。
第4題:在遠端系統上執行ls -R /並將輸出寫入本地檔案filelist.txt
- 解題方向:使用遠端命令執行工具,透過SSH連線到遠端系統執行ls -R /命令,並將輸出重定向到本地的filelist.txt檔案中。
- 提示:考慮使用ssh命令,並利用重定向符號(>)將輸出寫入檔案。
第5題:修改getlocal.sh以自動上傳結果到指定伺服器使用SCP
- 解題方向:編輯getlocal.sh指令碼,在指令碼中新增SCP命令,將處理結果上傳到指定的伺服器。
- 提示:在指令碼中使用scp命令,注意需組態好SSH金鑰認證或提供密碼。
第6題:修改hashsearch.sh以新增選項(-l)離開搜尋在找到匹配後,並保持預設繼續搜尋其他匹配的功能
- 解題方向:修改hashsearch.sh指令碼,新增命令列選項處理邏輯,實作當使用-l選項時,找到第一個匹配後離開。
- 提示:使用getopts或類別似工具處理命令列選項,並在指令碼邏輯中實作相應功能。
第7題:簡化hashsearch.sh輸出的完整路徑名稱
- 解題方向:修改hashsearch.sh指令碼,對輸出的路徑進行處理,以簡化顯示。
- 提示:使用引數擴充套件(如${parameter##*/})或sed等工具簡化路徑。
第8題:在winlogs.sh中顯示進度,列印日誌檔名在前一個檔名之上,使用歸位符號(\r)
- 解題方向:修改winlogs.sh指令碼,在處理日誌檔案時,使用歸位符號(\r)實作進度顯示。
- 提示:在echo或printf陳述式中使用\r,並注意清除或覆寫前一次輸出的內容。
第9題:在winlogs.sh中顯示簡單進度條,使用加號(+)構建進度條,並根據日誌數量縮放寬度到60個字元
- 解題方向:修改winlogs.sh指令碼,首先統計日誌數量,然後根據處理進度顯示加號(+)組成的進度條。
- 提示:使用wevtutil el命令統計日誌數量,並在迴圈處理日誌時更新進度條顯示。
第10題:在winlogs.sh完成tar封裝後清理提取的日誌檔案(*.evtx)
- 解題方向:修改winlogs.sh指令碼,在完成tar封裝後,刪除已封裝的日誌檔案(*.evtx)。
- 提示:使用rm命令刪除檔案,可以結合find命令查詢特定的*.evtx檔案進行刪除。
最終檢查與驗證指引
完成上述練習後,請根據以下指引檢查和驗證您的解答:
- 徹底清除內部標記且零容忍任何殘留。
- 強制驗證結構完整性及邏輯性。
- 強制確認技術深度及台灣本土化語言風格。
- 強制驗證程式碼邏輯完整性及「#### 內容解密」逐項詳細作用與邏輯之解說。
- 強制確認內容完全原創且充分重構。
- 強制確認每段程式碼後都有「#### 內容解密」詳細每個段落作用與邏輯之解說。
命令列文書處理工具:tr 與 cut
在命令列環境中,處理文字檔案是一項基本且重要的技能。tr 和 cut 是兩個非常有用的命令,可以幫助我們對文字檔案進行各種操作。
使用 tr 命令進行字元轉換和刪除
tr 命令主要用於字元的轉換或對映,以及刪除不需要的字元。它只讀取標準輸入並寫入標準輸出,因此通常會與重定向符號一起使用,以指定輸入和輸出檔案。
常用選項
-d:刪除指定的字元-s:擠壓重複的字元,即將多個連續的相同字元替換為單個字元
命令範例
假設我們有一個檔案 infile.txt,內容如下:
drive:path\name
c:\Users\Default\file.txt
我們可以使用 tr 命令將所有的反斜線(\)轉換為正斜線(/),並將所有的冒號(:)轉換為豎線(|):
tr '\\:' '/|' < infile.txt > outfile.txt
轉換後,outfile.txt 的內容將變為:
drive|path/name
c|/Users/Default/file.txt
這裡需要注意的是,反斜線在 tr 命令中有特殊含義,因此需要使用兩個反斜線(\)來表示一個反斜線字元。
刪除 Windows 檔案中的回車符
Windows 系統的檔案通常在每行末尾包含回車符(CR)和換行符(LF),而 Linux 和 macOS 系統只使用換行符(LF)來結束一行。如果將 Windows 檔案傳輸到 Linux 系統,可以使用 tr 命令刪除多餘的回車符:
tr -d '\r' < fileWind.txt > fileFixed.txt
相反,如果要將 Linux 檔案的換行符轉換為 Windows 風格,可以使用 sed 命令:
sed -i 's/$/\r/' fileLinux.txt
-i 選項表示直接修改原檔案。
處理分隔符號檔案
許多檔案採用分隔符號(如逗號、空格或 Tab)來分隔欄位。CSV(逗號分隔值)檔案是一種常見的格式,其欄位通常由逗號分隔,並可能被雙引號包圍。
使用 cut 命令提取欄位
假設有一個 CSV 檔案 csvex.txt,內容如下:
"name","username","phone","password hash"
"John Smith","jsmith","555-555-1212",5f4dcc3b5aa765d61d8327deb882cf99
"Jane Smith","jnsmith","555-555-1234",e10adc3949ba59abbe56e057f20f883e
"Bill Jones","bjones","555-555-6789",d8578edf8458ce06fbc5bb76a58c5ca4
我們可以使用 cut 命令提取第一欄的資料:
cut -d',' -f1 csvex.txt
輸出結果如下:
"name"
"John Smith"
"Jane Smith"
"Bill Jones"
如果要移除雙引號,可以將輸出結果透過管道傳給 tr 命令:
cut -d',' -f1 csvex.txt | tr -d '"'
結果變為:
name
John Smith
Jane Smith
Bill Jones
進一步地,可以使用 tail 命令移除標題列:
cut -d',' -f1 csvex.txt | tr -d '"' | tail -n +2
輸出結果為:
John Smith
Jane Smith
Bill Jones
這裡,-n +2 選項告訴 tail 從第二行開始輸出。
按字元位置處理資料
如果檔案具有固定寬度的欄位,可以使用 cut 命令的 -c 選項按字元位置提取資料。例如,在 csvex.txt 中,電話號碼欄位具有固定的寬度。我們可以先使用 cut 提取第三欄(電話號碼),然後再使用 -c 選項提取引號之間的字元:
cut -d',' -f3 csvex.txt | cut -c2-13 | tail -n +2
輸出結果如下:
555-555-1212
555-555-1234
555-555-6789
這裡首先使用 cut 以分隔符號模式提取第三欄,然後使用 -c 選項提取引號之間的字元,最後使用 tail 移除標題列。
使用 awk 處理分隔資料
雖然 cut 可以用於提取整列資料,但在某些情況下,我們需要逐行處理檔案並提取欄位。這時,awk 命令可能是一個更好的選擇。
範例:檢查密碼雜湊
假設我們要檢查 csvex.txt 中的使用者密碼雜湊是否出現在 passwords.txt 字典檔案中。首先,使用 awk 提取 csvex.txt 中的密碼雜湊欄位:
awk -F "," '{print $4}' csvex.txt
輸出結果如下:
"password hash"
5f4dcc3b5aa765d61d8327deb882cf99
e10adc3949ba59abbe56e057f20f883e
d8578edf8458ce06fbc5bb76a58c5ca4
預設情況下,awk 使用空格作為欄位分隔符號,因此我們使用 -F 選項指定自定義的欄位分隔符號(逗號)。
接著,將 awk 的輸出結果透過 grep 命令在 passwords.txt 中搜尋匹配的密碼雜湊:
grep "$(awk -F "," '{print $4}' csvex.txt)" passwords.txt
輸出結果如下:
123456,e10adc3949ba59abbe56e057f20f883e
password,5f4dcc3b5aa765d61d8327deb882cf99
qwerty,d8578edf8458ce06fbc5bb76a58c5ca4
這樣,我們就找到了與 csvex.txt 中密碼雜湊相匹配的密碼。
內容解密:
- 命令列工具:本文介紹了幾個重要的命令列工具,包括
tr、cut和awk,這些工具在處理文字檔案時非常有用。 - 字元轉換和刪除:使用
tr命令可以進行字元轉換和刪除操作,例如將反斜線轉換為正斜線,或刪除 Windows 檔案中的回車符。 - 分隔符號檔案處理:對於 CSV 等分隔符號檔案,可以使用
cut和awk命令提取特定欄位或進行逐行處理。 - 按字元位置處理:對於固定寬度的欄位,可以使用
cut的-c選項按字元位置提取資料。 - 逐行處理:使用
awk可以逐行處理檔案並提取所需欄位,結合其他命令(如grep)可以實作更複雜的操作。