返回文章列表

OWASP ZAP 與 Gauntlt 安全掃描實踐

本文探討如何使用 OWASP ZAP 進行基線掃描,並將結果整合到 CI/CD 管道中,同時介紹了 Gauntlt 這個安全測試框架,以及如何使用 Gauntlt 構建 Docker 容器、執行 Nmap 和 sqlmap 等安全測試,並結合實際案例說明如何自訂攻擊規則,提升 Web 應用程式的安全性。

資安 Web 開發

OWASP ZAP 基線掃描能有效識別 Web 應用程式常見漏洞,透過 Docker 容器化執行更便於整合 CI/CD 流程。解析掃描結果中的 FAIL-NEW、WARN-NEW 等狀態碼,能快速掌握安全風險等級。除了使用預設規則,還能自訂規則檔案和正規表示式,排除特定 URL 或檔案型別,更精準地掃描目標主機。此外,多目標掃描指令碼與進度標記功能,有助於團隊協作和追蹤漏洞修復進度。除了 ZAP,Gauntlt 框架則提供了另一種安全測試途徑。透過整合 Nmap、sqlmap 等工具,Gauntlt 能執行更廣泛的安全檢測。其 Gherkin 語法易於理解和維護,方便團隊編寫自定義攻擊規則。利用 Docker 容器化 Gauntlt,更能確保測試環境的一致性,並簡化佈署流程。

使用 OWASP ZAP 進行基線掃描的全面

在現代 DevSecOps 實踐中,確保應用程式的安全性是至關重要的。OWASP ZAP(Zed Attack Proxy)是一個廣泛使用的開源工具,用於識別 Web 應用程式中的安全漏洞。本章節將探討如何使用 OWASP ZAP 進行基線掃描,並將結果整合到 CI/CD 管道中。

檢查檔案結構與隱藏字元

在開始掃描之前,瞭解目標檔案的結構至關重要。使用 cat -ET 命令可以檢查檔案中的隱藏字元,如行尾和製表符。

$ cat -ET custom-fail.conf

此命令的輸出將幫助您瞭解檔案的結構,並避免因隱藏字元導致的意外錯誤。

內容解密:

  • cat 命令用於顯示檔案內容。
  • -E 選項顯示行尾字元。
  • -T 選項將製表符顯示為 ^I

執行基線掃描

使用 OWASP ZAP 對目標主機進行掃描,可以透過 Docker 容器輕鬆實作。掃描完成後,您將獲得一個包含掃描結果的報告。

掃描結果的最後一行狀態顯示如下:

FAIL-NEW: 1 FAIL-INPROG: 0 WARN-NEW: 0 WARN-INPROG: 0 INFO: 0 IGNORE: 0 PASS: 51

此狀態表明掃描過程中發現了一個新的失敗專案。

內容解密:

  • FAIL-NEW 表示新發現的失敗專案數量。
  • PASS 表示透過的測試專案數量。

對 Nmap 主機進行掃描

Nmap 提供了一個測試掃描的主機 scanme.nmap.org。對此主機進行掃描,可以更好地瞭解 ZAP 的掃描結果。

掃描結果狀態如下:

FAIL-NEW: 0 FAIL-INPROG: 0 WARN-NEW: 7 WARN-INPROG: 0 INFO: 0 IGNORE: 0 PASS: 45

與前一次掃描相比,此次掃描發現了更多的警告專案。

內容解密:

  • WARN-NEW 表示新發現的警告專案數量。
  • 列出的警告專案包括跨域 JavaScript 原始檔包含、缺少 X-Frame-Options 頭等。

編輯規則檔案與正規表示式

您可以透過編輯規則檔案和使用正規表示式來定製掃描規則,忽略特定的 URL 或檔案型別。

範例如下:

# 忽略指定的非 TLS/SSL HTTP 內網 URL
10012 OUTOFSCOPE http://www.chrisbinnie.tld

# 忽略包含 '.php' 檔案的 URL
* OUTOFSCOPE .*\.php

內容解密:

  • OUTOFSCOPE 用於標記需要忽略的專案。
  • 正規表示式用於比對特定的 URL 或檔案型別。

多目標掃描與進度標記

ZAP 社群提供了指令碼以實作多目標掃描,並將結果推播到 Wiki。使用 mass-baseline.sh 指令碼,您可以輕鬆新增多個目標並執行掃描。

此外,您還可以為特定的問題新增 “in-progress” 標記,以便在 CI/CD 管道中跟蹤問題的狀態。

範例如下(JSON 格式):

{
  "site": "chrisbinnie.tld",
  "issues": [
    {
      "id": "10035",
      "name": "Strict-Transport-Security Header Not Set",
      "state": "inprogress",
      "link": "https://chrisbinnie.tld/bugtracker/issue=1010"
    }
  ]
}

內容解密:

  • JSON 檔案用於標記特定問題的狀態為 “inprogress”。
  • 每個問題都包含 ID、名稱、狀態和相關連結。

利用 Gauntlt 實作安全控制的編碼

在現代的 DevSecOps 環境中,將安全控制編碼為自定義規則集的能力,意味著 CI/CD 管道能夠產生可重複、預測性的結果,確保應用程式遵循一致的釋出路徑。正如我們在第 7 章「基礎掃描(或稱掃描您的應用程式)」中看到的 ZAP 一樣,以及在本章節的其他工具建議中,我們將看到有多個開源工具可用於提供傳回碼以透過或失敗構建。在本章中,我們將探討一個名為 Gauntlt 的成熟工具(gauntlt.org),它非常適合建立可擴充套件的規則集,以提高主機的安全性。

Gauntlt 簡介

Gauntlt 將自己描述為一個「強化框架,使安全測試可被開發人員、維運人員和安全團隊使用」。其檔案指出,它提供了與多個安全工具的掛鉤,使它們變得可存取。Gauntlt 使用的語言直觀易懂,即使對於經驗不足的使用者來說,也不構成障礙。無論是在管道內還是外,Gauntlt 都非常靈活,可以組態為測試多種不同的使用案例。

安全工具

首先,我們將瞭解 Gauntlt 可以為我們提供什麼,然後再安裝它並執行一些規則。

編碼安全

Gauntlt 使用的一個關鍵術語是其工具被描述為攻擊介面卡。其網站列出了以下攻擊工具的介面卡(以及其他稍後將探討的工具),可用於編寫規則集:

  • curl
  • nmap
  • sslyze (github.com/iSECPartners/sslyze)
  • sqlmap (sqlmap.org)
  • Garmr (github.com/mozilla/Garmr)

我們可以看到,脆弱的 nmap 是 Gauntlt 可以測試的歡迎工具,SSL 檢測工具 sslyze 和資料函式庫駭客工具 sqlmap 也是如此。此外,能夠使用複雜的 curl 命令對測試進行簡單請求是必不可少的。儘管有些人可能不會立即將 curl 視為攻擊工具,但它經常被攻擊者用於偵察,並與 wget 一起下載檔案。它在 Linux 發行版中也通常是預設提供的。

安裝 Gauntlt

網站描述了兩種開始使用 Gauntlt 的方法。最簡單的方法是使用 Ruby 套件管理器 gem。在 Debian 衍生版本上,如果系統上已經有 gem 命令,語法如下:

$ gem install gauntlt

如果系統上尚未安裝 gem,請嘗試以下命令安裝:

$ apt install gem

本章中,我們將使用容器化版本的 Gauntlt。選擇容器化路線,您將獲得一個可移植的、預先構建的軟體,不會用大量小檔案填滿本地機器,這些檔案在安裝後可能難以找到和刪除。

要開始使用容器化版本的 Gauntlt,我們將前往其 Docker 倉函式庫(github.com/gauntlt/gauntlt-docker)。構建容器將為您建立一個 Docker 映像,並建立一個名為 gauntlt-docker 的二進位制存根,該存根將在 Dockerfile 處理後寫入 bin/ 目錄。這允許兩種使用該軟體的方法。您可以使用命令進入正在執行的容器並以這種方式與工具互動,也可以直接使用二進位制檔案與容器互動。

克隆 Gauntlt Docker 倉函式庫

按照檔案指示,我們現在將克隆 Git 倉函式庫,使用以下命令,以便從頭開始構建映像:

$ git clone https://github.com/gauntlt/gauntlt-docker.git

雖然 Gauntlt 仍由其開發人員維護,但顯然維護頻率不高,需要對 Dockerfile 進行兩處更改才能正確構建容器映像。

Dockerfile 分析

Dockerfile(github.com/gauntlt/gauntlt-docker/blob/master/Dockerfile)內容冗長,如您所料,它參照了 Ruby 相關的函式庫和套件。您還可以看到 Nikto、Arachni、sqlmap、nmap、sslyze 和 dirb(dirb.sourceforge.net)被拉入容器映像中。如果您不熟悉 dirb,它是一款滲透測試工具,用於 Kali Linux,用於網頁應用程式測試。檔案中提到,容器映像經常用於 CI/CD 管道,這令人感到鼓舞。

自定義 Dockerfile 的必要性

為了使容器映像正確構建,需要對 Dockerfile 進行修改,這些修改反映了 Gauntlt 開發人員在維護專案時所做的調整。

#### 內容解密:

Gauntlt 提供了一種靈活且可擴充套件的方式來提高主機的安全性。透過使用其提供的攻擊介面卡,使用者可以編寫自定義規則集,以測試多種不同的安全場景。安裝 Gauntlt 可以透過 Ruby 套件管理器 gem 或容器化方式進行,後者提供了一個可移植且預先構建的環境。透過克隆 Gauntlt Docker 倉函式庫並根據需要修改 Dockerfile,使用者可以建立一個符合自己需求的容器映像。最終,Gauntlt 為 DevSecOps 環境中的安全測試提供了強大的支援。

使用 Gauntlt 進行安全性測試

Gauntlt 是一個用於安全測試的框架,允許使用者對自己的程式碼和系統進行嚴格的安全性檢查。在本章中,我們將探討如何使用 Gauntlt 構建一個 Docker 容器,並執行簡單的安全測試。

構建 Gauntlt 容器

首先,我們需要克隆 Gauntlt 的 GitHub 倉函式庫,並修改 Dockerfile 以適應我們的需求。這涉及到更改基礎層和更新某些套件的版本。

# 修改前的 Dockerfile
FROM ubuntu:16.04

# 修改後的 Dockerfile
FROM ubuntu:18.04

此外,我們還需要將 libcurl3 更新為 libcurl4

完成修改後,我們進入倉函式庫目錄並執行 make build 命令來構建容器。

$ cd gauntlt-docker
$ make build

驗證構建結果

構建過程完成後,我們可以透過執行以下命令來驗證二進位制檔案的版本:

$ bin/gauntlt-docker --version
1.0.13

如果遇到與 optimist 套件相關的錯誤,可以忽略它,只要二進位制檔案成功構建並傳回版本號即可。

安裝 Gauntlt

為了方便使用,我們可以將 Gauntlt 二進位制檔案安裝到系統路徑中:

$ make install-stub

安裝完成後,我們可以透過以下命令驗證 Gauntlt 是否可用:

$ gauntlt-docker --help

內容解密:

  • make install-stub 命令用於將 Gauntlt 二進位制檔案安裝到 /usr/local/bin 目錄下,使其在系統路徑中可用。
  • gauntlt-docker --help 命令用於顯示 Gauntlt 的幫助資訊,驗證其是否正確安裝。

簡單測試

Gauntlt 使用 Gherkin 語言(由 Cucumber 解釋)來定義測試規則。下面是一個簡單的 nmap 攻擊介面卡示例:

# nmap-simple.attack
Feature: simple nmap attack to check for open ports
Background:
  Given "nmap" is installed
  And the following profile:
    | name          | value          |
    | hostname      | chrisbinnie.tld |
    | tcp_ping_ports | 25,80,443      |

Scenario: Check standard web ports
  When I launch an "nmap" attack with:
    """
    nmap -F <hostname>
    """
  Then the output should match:
    """
    80/tcp\s+open
    443/tcp\s+open
    """
  Then the output should not match:
    """
    25\/tcp\s+open
    """

內容解密:

  • Feature 部分提供了對規則目地的簡要描述。
  • Background 部分定義了測試的背景條件,包括 nmap 的安裝和目標主機的設定。
  • Scenario 部分描述了測試場景,包括執行的命令和預期的輸出結果。
  • 使用 nmap 對指定主機進行快速掃描(-F 選項),檢查特定埠是否開放。

透過這些步驟,我們成功地使用 Gauntlt 對目標系統進行了簡單的安全性測試。Gauntlt 的靈活性和可擴充套件性使其成為 DevSecOps 工具箱中的一個有力工具。

利用 Gauntlt 進行安全檢測的進階應用

深入瞭解 Gauntlt 的運作機制

Gauntlt 是一款強大的安全測試工具,它透過整合多種安全掃描工具來簡化安全檢測的流程。在前面的章節中,我們已經瞭解瞭如何使用 Gauntlt 的基本功能。現在,讓我們更深入地探討 Gauntlt 的內部工作原理,以及如何利用它來進行更複雜的安全檢測。

Gauntlt 的核心元件

Gauntlt 的核心元件包括其引擎和各種攻擊介面卡(attack adapters)。這些介面卡允許 Gauntlt 與不同的安全掃描工具(如 Nmap、sqlmap 和 Arachni)進行整合,從而對目標系統進行多角度的安全檢測。

使用 Docker 容器化 Gauntlt

為了方便使用和佈署,Gauntlt 可以被封裝在 Docker 容器中。這種方式不僅簡化了安裝和組態過程,還確保了在不同環境中的一致性。

進入 Gauntlt 容器

透過以下命令,我們可以進入 Gauntlt 容器並進行互動式操作:

$ docker run --rm -it --entrypoint /bin/bash gauntlt

在容器內,我們可以檢視 Gauntlt 的安裝目錄和相關檔案:

root@d469b6590ba7:/opt# ls
arachni-1.5.1-0.5.12-linux-x86_64.tar.gz  dirb222  dirb222.tar.gz  nikto  sqlmap

自訂攻擊規則檔案

我們可以將自訂的攻擊規則檔案寫入本地機器的特定目錄(例如 /root/attacks),然後透過掛載卷(volume)將該目錄對映到容器內,使 Gauntlt 能夠讀取並執行這些自訂的攻擊規則。

$ docker run --rm -it -v /root/attacks:/root/attacks --entrypoint gauntlt gauntlt /root/attacks/nmap-simple.attack

瞭解 Gauntlt 的執行步驟

透過使用 --allsteps 引數,我們可以檢視 Gauntlt 執行的所有步驟,包括檔案處理和輸出解析等。

$ docker run --rm -it -v /root/attacks:/root/attacks --entrypoint gauntlt gauntlt --allsteps

分析 Gauntlt 的輸出

從輸出的結果中,我們可以看到 Gauntlt 使用 Aruba 這個處理器來處理攻擊步驟。熟悉正規表示式(regular expressions)的讀者可以理解這些輸出的語法含義。

示例攻擊檔案與自訂攻擊

Gauntlt 提供了多個示例攻擊檔案,這些檔案展示瞭如何使用不同的攻擊介面卡來進行安全檢測。例如,使用 sqlmap 來檢測 SQL 資料函式庫的安全漏洞。

sqlmap 示例

在 Listing 8.5 中,我們看到了一個使用 Gauntlt 和 sqlmap 對 MySQL 資料函式庫進行安全檢測的示例。這個示例展示瞭如何定義一個測試場景(scenario),並使用 sqlmap 來識別 SQL 注入漏洞。

@slow
Feature: Run sqlmap with Gauntlt
Scenario: Highlight SQLi vulnerabilities
Given "sqlmap" is installed
And the following profile:
| name | value |
| target_url | http://chrisbinnie.tld/splash-page?number_id=1 |
When I launch a "sqlmap" attack with:
"""
python <sqlmap> -u <target> --dbms mysql --batch -v 0 --tables
"""
Then the output should contain:
"""
sqlmap identified the following injection points
"""
And the output should contain:
"""
[5 tables]
+————————+
| mysql_secure |
| database_users |
| mysql_test |
| customers |
| accounting |
+————————+
"""
重點回顧
  • Gauntlt 的核心元件和運作機制
  • 使用 Docker 容器化 Gauntlt 的優勢和方法
  • 自訂攻擊規則檔案和執行步驟分析
  • sqlmap 示例和 SQL 注入漏洞檢測

未來方向

  • 探索更多 Gauntlt 的攻擊介面卡和擴充套件功能
  • 結合更多安全掃描工具,提升安全檢測的全面性
  • 在持續整合/持續佈署(CI/CD)流程中整合 Gauntlt,實作自動化的安全測試。

程式碼解密:

  1. Docker 容器操作

$ docker run –rm -it –entrypoint /bin/bash gauntlt


    *   這行命令用於啟動一個 Gauntlt 的 Docker 容器,並進入互動式 Bash 終端。
    *   `--rm` 表示容器離開後自動刪除。
    *   `-it` 表示以互動式終端的方式執行容器。
    *   `--entrypoint /bin/bash` 指定容器啟動時執行的命令為 `/bin/bash`,取代預設的入口點。
2. **掛載本地目錄到容器**

    ```bash
$ docker run --rm -it -v /root/attacks:/root/attacks --entrypoint gauntlt gauntlt /root/attacks/nmap-simple.attack
*   這行命令將本地的 `/root/attacks` 目錄掛載到容器的 `/root/attacks` 目錄,從而使容器能夠存取本地的攻擊規則檔案。
*   `-v /root/attacks:/root/attacks` 指定了目錄掛載的對映關係。
  1. 執行 Gauntlt 並顯示所有步驟

$ docker run –rm -it -v /root/attacks:/root/attacks –entrypoint gauntlt gauntlt –allsteps


    *   這行命令用於執行 Gauntlt 並顯示所有的執行步驟,有助於理解 Gauntlt 的內部工作原理。
    *   `--allsteps` 引數指示 Gauntlt 輸出所有的執行步驟。
4. **sqlmap 攻擊範例**

    ```gherkin
When I launch a "sqlmap" attack with:
"""
python <sqlmap> -u <target> --dbms mysql --batch -v 0 --tables
"""
*   這段 Gherkin 語法定義了一個使用 sqlmap 發起攻擊的步驟。
*   `<sqlmap>` 和 `<target>` 是變數,分別代表 sqlmap 工具的路徑和目標 URL。
*   `--dbms mysql` 指定了資料函式倉管理系統的型別為 MySQL。
*   `--batch` 表示以批次模式執行,避免互動式提示。
*   `-v 0` 設定了詳細程度為 0,減少輸出資訊。
*   `--tables` 表示嘗試列舉資料函式庫中的表。