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,實作自動化的安全測試。
程式碼解密:
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` 指定了目錄掛載的對映關係。
執行 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` 表示嘗試列舉資料函式庫中的表。