網路攻擊並非單一事件,而是一系列精心企劃的步驟。理解攻擊生命週期,有助於防禦者預測攻擊者的下一步行動。從偵察階段的資訊收集,到初始利用階段的漏洞利用,再到建立橋頭堡、許可權提升、內部偵察、橫向移動以及最終的維持存在和完成任務,每個階段都環環相扣。攻擊者利用各種技術和工具,例如 SQL 注入、緩衝區溢位、雜湊傳遞等,逐步滲透目標系統並擴大影響範圍。因此,防禦者必須瞭解這些攻擊技術,才能有效地防禦和應對。同時,資料收集和分析在資安防禦中扮演著至關重要的角色。透過收集系統日誌、命令歷史、暫存檔等資訊,並使用 cut、file、head 等命令列工具進行分析,可以有效地偵測惡意活動、進行數位鑑識調查,並驗證系統的合規性。此外,reg 和 wevtutil 等工具則專門用於 Windows 系統的登入檔和系統日誌管理。而 SSH 遠端執行命令和 winlogs.sh 指令碼則提供了更進階的資料收集和分析能力,有助於更全面地瞭解系統安全狀況。
攻擊生命週期:深入理解駭客的策略與行動
網路攻擊的發生並非隨機事件,而是遵循特定的策略和流程。由Mandiant提出的「攻擊生命週期」(Attack Life Cycle)模型,描述了進階攻擊者在進行網路攻擊時的典型步驟。這個模型已經過多年的演進,目前通常被描述為八個階段:
- 偵察(Reconnaissance)
- 初始利用(Initial Exploitation)
- 建立橋頭堡(Establish Foothold)
- 許可權提升(Escalate Privileges)
- 內部偵察(Internal Reconnaissance)
- 橫向移動(Lateral Movement)
- 維持存在(Maintain Presence)
- 完成任務(Complete Mission)
偵察:網路攻擊的第一步
在偵察階段,攻擊者試圖收集目標網路的位址空間、使用的技術、相關漏洞以及目標組織的使用者和層級結構等資訊。偵察活動分為兩類別:被動偵察和主動偵察。
- 被動偵察不向環境中注入任何資料,也不改變系統的狀態,因此通常不會被目標檢測到。例如,網路封包嗅探、網際網路搜尋和DNS查詢等。
- 主動偵察則會注入資料和/或改變系統狀態,因此有可能被目標檢測到。例如,埠掃描、漏洞掃描和網站爬蟲等。
內容解密:
此階段的目的是收集足夠的資訊以規劃後續的攻擊行動。被動偵察由於其隱蔽性,更受攻擊者青睞,但主動偵察能夠提供更具體的技術細節。
初始利用:取得初步存取許可權
初始利用階段開始於攻擊者利用系統中的漏洞來取得對系統的存取許可權。常見的技術包括緩衝區溢位攻擊、SQL注入、跨站指令碼攻擊(XSS)、暴力破解和網路釣魚攻擊等。
程式碼範例:SQL注入攻擊
SELECT * FROM users WHERE username = 'admin' AND password = ' OR '1'='1
內容解密:
這段SQL程式碼展示了一個簡單的SQL注入攻擊。透過在密碼欄位中輸入 ' OR '1'='1,攻擊者可以繞過身份驗證機制,因為該條件始終為真。這種攻擊方式強調了輸入驗證和引數化查詢的重要性。
建立橋頭堡:確保持久存取
一旦攻擊者獲得了初始存取許可權,他們需要確保能夠長期保持對系統的控制,而不必每次都重新利用漏洞。這包括建立新的系統使用者、啟用遠端存取功能(如SSH、Telnet或RDP)以及安裝惡意軟體(如遠端存取木馬)。
內容解密:
建立橋頭堡是攻擊者維持對系統控制的關鍵步驟。它使攻擊者能夠在不需要重新發起攻擊的情況下,隨時傳回系統。
許可權提升:取得更高許可權
攻擊者在初始存取時可能只獲得了有限的許可權。為了執行更多操作,他們需要將許可權提升至管理員或根使用者級別。這可以透過利用本地系統漏洞、竊取憑證或進行行程注入等技術來實作。
程式碼範例:Linux許可權提升
sudo -l
內容解密:
此命令用於列出當前使用者可以使用sudo執行的命令。透過分析這些資訊,攻擊者可以找到提升許可權的機會,例如,如果某個命令允許以root身份執行而無需密碼,則可被利用來提升許可權。
內部偵察:從內部探索網路
在獲得足夠的許可權後,攻擊者可以從新的有利位置對網路進行內部偵察。使用的技術與初始偵察階段相似,但現在能夠看到更多的主機和內部網路協定,如Active Directory相關協定。
內容解密:
內部偵察使攻擊者能夠更詳細地瞭解目標網路,從而最佳化後續的攻擊策略。
橫向移動:在網路中擴散
由於初始受損的主機可能不是攻擊者所需的目標,因此他們需要在網路中橫向移動,以存取其他主機。橫向移動的技術包括憑證竊取、雜湊傳遞和直接利用遠端主機的漏洞。
程式碼範例:Windows雜湊傳遞
sekurlsa::pth /user:Administrator /domain:example.local /ntlm:<NTLM Hash>
內容解密:
此命令使用Mimikatz工具進行雜湊傳遞攻擊。透過傳遞有效的NTLM雜湊,攻擊者可以在不需要明文密碼的情況下,以特定使用者身份進行身份驗證,從而存取其他主機。
維持存在:保持對網路的控制
為了避免被檢測,攻擊者通常不會維持與惡意植入物的直接連線,而是讓這些植入物定期回連到由攻擊者控制的命令與控制(C&C)伺服器,以接收指令或與攻擊者直接互動。
內容解密:
這種稱為「信標」(beaconing)的行為,是攻擊者維持對網路控制的重要手段。它允許攻擊者在不直接連線的情況下,對植入物發出指令。
防禦性資安作業:資料收集與分析
在資安防禦領域,資料是所有安全防禦措施的核心。無論是進行數位鑑識調查、驗證合規性還是偵測惡意活動,都需要大量且多樣化的資料。本章節將探討如何使用命令列工具來收集、處理和分析資料,以支援防禦性資安作業。
資料收集的重要性
資料提供了系統的當前狀態、歷史活動記錄,甚至可能預測未來的事件。在 Linux 和 Windows 系統中,常見的資料來源包括日誌檔、命令歷史、暫存檔、使用者資料和瀏覽器歷史等。
常見的資料來源
日誌檔:記錄系統活動和狀態的重要資訊,包括 Web 和 DNS 伺服器日誌、路由器、防火牆和入侵偵測系統日誌等。
- Linux:大多數日誌檔位於
/var/log目錄。 - Windows:系統日誌位於事件日誌中。
- Linux:大多數日誌檔位於
命令歷史:記錄最近執行的命令。
- Linux:命令歷史檔案的位置可以透過執行
echo $HISTFILE命令來查詢,通常位於使用者的家目錄下的.bash_history檔案。
- Linux:命令歷史檔案的位置可以透過執行
暫存檔:最近存取、儲存或處理的各種使用者和系統檔案。
- Windows:暫存檔通常位於
c:\windows\temp和%USERPROFILE%\AppData\Local\Temp。 - Linux:暫存檔通常位於
/tmp和/var/tmp,也可以透過echo $TMPDIR命令查詢。
- Windows:暫存檔通常位於
資料收集工具
本章節介紹了多個用於選擇和收集本地及遠端系統資料的命令列工具,包括 cut、file、head,以及適用於 Windows 系統的 reg 和 wevtutil。
cut 命令詳解
cut 命令用於從檔案中擷取特定的部分。它按行讀取輸入檔案,並根據指定的分隔符號解析每行。預設情況下,cut 使用跳格字元(tab)作為分隔符號。
常見選項
-c:指定要擷取的字元位置。-d:指定欄位分隔符號。預設為跳格字元。-f:指定要擷取的欄位。
使用範例
假設有一個名為 cutfile.txt 的檔案,內容如下:
12/05/2017 192.168.10.14 test.html
12/30/2017 192.168.10.185 login.html
要擷取 IP 位址(第二欄位),可以使用以下命令:
$ cut -d' ' -f2 cutfile.txt
192.168.10.14
192.168.10.185
這裡,-d' ' 指定了空格作為欄位分隔符號,而 -f2 表示傳回第二欄位,即 IP 位址。
重點注意事項
在使用 cut 命令時,需要注意分隔符號的設定。如果欄位之間有多個連續的分隔符號,cut 會將每個分隔符號視為一個欄位的分隔,即使它們是連續的。這可能會導致欄位編號與預期不符。在這種情況下,使用單一的跳格字元(tab)作為分隔符號會更為合適。
資料分析與防禦策略
透過收集和分析系統中的各種資料,可以有效地偵測惡意活動、進行數位鑑識調查以及驗證系統的合規性。利用命令列工具,可以高效地從本地和遠端系統中收集和處理資料,從而加強資安防禦措施。
#### 內容解密:
本章節主要介紹了在資安防禦中,如何使用命令列工具來收集和分析資料。首先,我們瞭解了不同型別資料的重要性及其在系統中的位置。接著,我們探討了 cut 命令的使用方法和注意事項。最後,我們強調了資料分析在資安防禦策略中的關鍵作用。
資訊收集與系統日誌分析
在進行系統防禦和故障排除時,收集和分析系統資訊是至關重要的步驟。本篇文章將介紹多種命令列工具和技巧,用於收集系統資訊、執行遠端命令以及分析系統日誌。
使用 file 命令識別檔案型別
file 命令用於識別檔案型別。在 Linux 系統中,大多數檔案不需要具有特定的副檔名來標識其型別。file 命令透過讀取和分析檔案的第一個資料區塊(即魔術數字)來確設定檔案型別。
常用選項
-f:從指設定檔案中讀取要分析的檔案清單。-k:不要在第一個匹配項停止;列出所有匹配的檔案型別。-z:檢視壓縮檔案內部。
命令範例
$ file unknownfile
unknownfile: Microsoft Word 2007+
使用 head 命令顯示檔案開頭內容
head 命令用於顯示檔案的前幾行或位元組。預設情況下,head 顯示前 10 行。
常用選項
-n:指定要輸出的行數。例如,-n 15或-15可顯示前 15 行。-c:指定要輸出的位元組數。
使用 reg 命令操作 Windows 登入檔
reg 命令用於操作 Windows 登入檔,可在 Windows XP 及更高版本中使用。
常用引數
add:新增登入檔專案。export:將指定的登入檔專案複製到檔案中。query:傳回指定路徑下的子機碼清單。
命令範例
$ reg query HKEY_LOCAL_MACHINE
HKEY_LOCAL_MACHINE\BCD00000000
HKEY_LOCAL_MACHINE\HARDWARE
HKEY_LOCAL_MACHINE\SAM
HKEY_LOCAL_MACHINE\SECURITY
HKEY_LOCAL_MACHINE\SOFTWARE
HKEY_LOCAL_MACHINE\SYSTEM
使用 wevtutil 命令管理 Windows 系統日誌
wevtutil 是一個命令列工具,用於檢視和管理 Windows 環境中的系統日誌。
常用引數
el:列舉可用的日誌。qe:查詢日誌事件。
常用選項
/c:指定要讀取的最大事件數。/f:將輸出格式化為文字或 XML。/rd:讀取方向;如果設為 true,則先讀取最新的日誌。
命令範例
wevtutil el
wevtutil qe System //c:1 //rd:true
使用 SSH 遠端執行命令
SSH 可用於安全地遠端執行命令。若要在遠端系統上執行命令,只需在命令前加上 ssh 和主機名。
命令範例
ssh myserver who
ssh username@myserver who
ssh myserver ps > /tmp/ps.out
ssh myserver ps \> /tmp/ps.out
ssh myserver bash < ./osdetect.sh
蒐集 Linux 日誌檔案
Linux 系統的日誌檔案通常儲存在 /var/log/ 目錄下。可以使用 tar 命令輕鬆地將日誌檔案收集到單一檔案中。
命令範例
tar -czf ${HOSTNAME}_logs.tar.gz /var/log/
重要 Linux 日誌檔案位置
| 日誌位置 | 描述 |
|---|---|
/var/log/apache2/ | Apache 網頁伺服器的存取和錯誤日誌 |
/var/log/auth.log | 使用者登入、特權存取和遠端身份驗證資訊 |
/var/log/kern.log | 核心日誌 |
/var/log/messages | 一般非關鍵系統資訊 |
/var/log/syslog | 一般系統日誌 |
要查詢特定系統的日誌檔案儲存位置,請參閱大多數 Linux 發行版上的 /etc/syslog.conf 或 /etc/rsyslog.conf。
蒐集Windows日誌檔
在Windows環境中,可以使用wevtutil來操作和蒐集日誌檔。幸運的是,這個命令可以從Git Bash中呼叫。winlogs.sh指令碼(範例如範例5-2所示)使用wevtutil el引數列出所有可用的日誌,並使用epl引數將每個日誌匯出到檔案中。
winlogs.sh指令碼解析
#!/bin/bash -
# Cybersecurity Ops with bash
# winlogs.sh
# 描述:
# 蒐集Windows日誌檔的副本
# 用法:
# winlogs.sh [-z]
# -z 將輸出封裝並壓縮
TGZ=0
if (( $# > 0 ))
then
if [[ ${1:0:2} == '-z' ]]
then
TGZ=1 # tgz 旗標,用於封裝/壓縮日誌檔
shift
fi
fi
SYSNAM=$(hostname)
LOGDIR=${1:-/tmp/${SYSNAM}_logs}
mkdir -p $LOGDIR
cd ${LOGDIR} || exit -2
wevtutil el | while read ALOG
do
ALOG="${ALOG%$'\r'}"
echo "${ALOG}:"
SAFNAM="${ALOG// /_}"
SAFNAM="${SAFNAM//\//-}"
wevtutil epl "$ALOG" "${SYSNAM}_${SAFNAM}.evtx"
done
if (( TGZ == 1 ))
then
tar -czvf ${SYSNAM}_logs.tgz *.evtx
fi
內容解密:
引數檢查與處理:首先檢查是否有引數傳入指令碼。如果有,且第一個引數是
-z,則設定TGZ旗標為1,並使用shift移除該引數。- 邏輯:根據引數決定是否要壓縮日誌檔。
- 技術考量:使用算術表示式
(( ))進行數值比較,避免與字串比較混淆。
設定日誌儲存目錄:根據使用者提供的引數或預設值建立日誌儲存目錄,並切換到該目錄。
- 邏輯:確保日誌檔有正確的儲存位置。
- 技術考量:使用
${parameter:-default_value}語法提供預設值。
蒐集日誌檔:使用
wevtutil el列出所有可用的日誌檔,並逐一匯出到指定的檔案中。- 邏輯:遍歷所有日誌檔並進行匯出。
- 技術考量:處理Windows系統中日誌檔名稱可能包含空格或斜線的問題,使用
${VAR//old/new}語法進行替換。
壓縮日誌檔(若需要):如果設定了
TGZ旗標,則使用tar命令將所有.evtx檔案封裝並壓縮。- 邏輯:根據使用者需求決定是否壓縮輸出。
- 技術考量:使用
-czvf選項進行壓縮並顯示過程中的檔案名稱。
技術深度解析
wevtutil命令的使用:該命令用於列出和匯出Windows日誌檔,是Windows系統管理中非常實用的工具。- 指令碼中的錯誤處理:例如,
cd ${LOGDIR} || exit -2確保在無法切換到指定目錄時指令碼會終止並傳回錯誤碼。 - 字串處理技術:使用
${ALOG%$'\r'}移除行尾的回車符,確保正確處理Windows風格的行尾符號。
流程圖示
此圖示描述了winlogs.sh指令碼的主要流程:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 攻擊生命週期與防禦性資安作業
package "軟體測試架構" {
package "測試層級" {
component [單元測試
Unit Test] as unit
component [整合測試
Integration Test] as integration
component [端對端測試
E2E Test] as e2e
}
package "測試類型" {
component [功能測試] as functional
component [效能測試] as performance
component [安全測試] as security
}
package "工具框架" {
component [pytest] as pytest
component [unittest] as unittest
component [Selenium] as selenium
component [JMeter] as jmeter
}
}
unit --> pytest : 撰寫測試
unit --> integration : 組合模組
integration --> e2e : 完整流程
functional --> selenium : UI 自動化
performance --> jmeter : 負載測試
note right of unit
測試金字塔基礎
快速回饋
高覆蓋率
end note
@enduml
此圖示清晰地展示了指令碼從引數檢查到最終處理日誌檔的整個流程。