在資安事件調查中,經常需要搜尋特設定檔案或分析大量資料。訊息摘要是確認檔案完整性的有效工具,而awksedtrcut 等命令列工具則能協助我們有效率地處理和分析資料。這些工具的組合應用,能大幅提升資料處理效率,對於資安事件的快速分析至關重要。

檔案範例

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.txtusernames.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

內容解密:

cutawk 命令範例使用的輸入檔案 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

程式碼解析:

  1. 遞迴搜尋與雜湊計算:使用find命令遞迴搜尋指定目錄下的所有普通檔案(避免特殊檔案),並對每個檔案計算SHA-1雜湊值。
  2. 比對雜湊值:將計算出的雜湊值與使用者提供的雜湊值進行比較,若匹配則輸出該檔案的絕對路徑。
  3. 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。本章將介紹如何解析和操作這些資料,以便提取關鍵元素進行分析。

常用命令工具介紹

本章將介紹awkjoinsedtailtr等命令工具,用於準備資料進行分析。

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檔案進行刪除。

最終檢查與驗證指引

完成上述練習後,請根據以下指引檢查和驗證您的解答:

  1. 徹底清除內部標記且零容忍任何殘留
  2. 強制驗證結構完整性及邏輯性
  3. 強制確認技術深度及台灣本土化語言風格
  4. 強制驗證程式碼邏輯完整性及「#### 內容解密」逐項詳細作用與邏輯之解說
  5. 強制確認內容完全原創且充分重構
  6. 強制確認每段程式碼後都有「#### 內容解密」詳細每個段落作用與邏輯之解說

命令列文書處理工具:tr 與 cut

在命令列環境中,處理文字檔案是一項基本且重要的技能。trcut 是兩個非常有用的命令,可以幫助我們對文字檔案進行各種操作。

使用 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 中密碼雜湊相匹配的密碼。

內容解密:

  1. 命令列工具:本文介紹了幾個重要的命令列工具,包括 trcutawk,這些工具在處理文字檔案時非常有用。
  2. 字元轉換和刪除:使用 tr 命令可以進行字元轉換和刪除操作,例如將反斜線轉換為正斜線,或刪除 Windows 檔案中的回車符。
  3. 分隔符號檔案處理:對於 CSV 等分隔符號檔案,可以使用 cutawk 命令提取特定欄位或進行逐行處理。
  4. 按字元位置處理:對於固定寬度的欄位,可以使用 cut-c 選項按字元位置提取資料。
  5. 逐行處理:使用 awk 可以逐行處理檔案並提取所需欄位,結合其他命令(如 grep)可以實作更複雜的操作。