本文介紹如何在 Ubuntu Linux 中使用 Docker 快速搭建 Kali Linux 與各種 CVE 漏洞靶機的環境,透過 PentestCode 進行滲透測試演練。

建立 Docker 網路環境

我們希望將 Kali Linux 攻擊機與各種 CVE 漏洞的靶機都放在相同的 Docker 網路環境內,所以先在 Docker 內建立一個 pentest01 網路環境:

# 建立 Docker 網路環境
docker network create pentest01

確認新的 pentest01 網路環境有成功被建立:

# 檢查 Docker 網路環境
docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
c05c983cd706   bridge      bridge    local
f41726edfac5   host        host      local
38a1ba1521c1   none        null      local
14f3e931d7e9   pentest01   bridge    local

Vulhub 靶機

Vulhub 上面有各種類型漏洞的靶機,先將整個專案下載下來:

# 下載 Vulhub 專案原始碼
git clone --depth 1 https://github.com/vulhub/vulhub.git

建立一台 CVE-2021-42013 靶機,先進入 CVE-2021-42013 對應的靶機目錄,將預設的 docker-compose.yml 備份起來:

# 進入 CVE-2021-42013 靶機目錄
cd vulhub/httpd/CVE-2021-42013

# 備份原始 Docker Compose 設定檔
cp docker-compose.yml docker-compose.yml.default

修改 docker-compose.yml 的內容,設定容器名稱,並且加入預先建立好的 pentest01 靶機網路:

services:
  web01:
    # 設定容器名稱,不要暴露 CVE 編號
    container_name: web01
    build: .
    # 設定靶機網路
    networks:
      - pentest01

# 使用 PentAGI 建立好的靶機網路
networks:
  pentest01:
    name: pentest01
    external: true

修改好之後,用 Docker Compose 啟動靶機:

# 啟動靶機,背景執行
docker compose up --detach

由於 Vulhub 的靶機預設會用漏洞的 CVE 編號作為容器名稱,這會讓 AI 直接識別出該漏洞,為了讓測試更符合真實情況,建議把容器名稱改為比較普通的名字。

再建立另外一台 CVE-2021-3129 靶機,做法都類似,只不過要注意容器名稱要用不一樣的:

# 進入 CVE-2021-3129 靶機目錄
cd vulhub/laravel/CVE-2021-3129

# 備份原始 Docker Compose 設定檔
cp docker-compose.yml docker-compose.yml.default

修改 docker-compose.yml 的內容:

services:
  web02:
    image: vulhub/laravel:8.4.2
    # 設定容器名稱,不要暴露 CVE 編號
    container_name: web02
    # 設定靶機網路
    networks:
      - pentest01

# 使用 PentAGI 建立好的靶機網路
networks:
  pentest01:
    name: pentest01
    external: true

啟動靶機,讓它背景執行:

# 啟動靶機,背景執行
docker compose up --detach --build

Docker 執行 Kali Linux 攻擊機

為了讓 PentestCode 可以有最大的權限與空間,也避免污染自己的主機環境,我們用 Docker 建立一台 Kali Linux 攻擊機,讓 PentestCode 的所有執行動作都關在這台 Docker 容器內。

# 執行 Kali Linux 容器
docker run --hostname kali --name kalilinux --network pentest01 -t -d kalilinux/kali-rolling:latest

建立一台 Kali Linux 的 Docker 容器,並放在背景執行之後,我們可以用以下指令進入這台 Docker 容器,進行各種操作。

# 進入 Kali Linux 容器環境
docker exec -it kalilinux bash

第一次進入 Kali Linux 的 Docker 容器時,先把套件的鏡像站改為離自己比較近的站點,再安裝 Kali Linux 的基本套件:

# 使用交大資工的套件鏡像站(Kali Linux 容器內)
cd /etc/apt/sources.list.d
sed -i 's!http\.kali\.org!kali.cs.nycu.edu.tw!' kali.sources

# 更新並安裝基本套件(Kali Linux 容器內)
apt update && apt -y install kali-linux-headless

接著安裝一些自己需要的工具:

# 安裝基本工具(Kali Linux 容器內)
apt install -y iputils-ping

# 安裝 uv(Kali Linux 容器內)
curl -LsSf https://astral.sh/uv/install.sh | sh

檢查一下攻擊機與靶機的網路是否正常:

# 確認靶機網路連線(Kali Linux 容器內)
ping web01

若可以成功連線至靶機,這樣就完成基本的攻擊機與靶機環境設置了。

安裝 PentestCode

參考 PentestCode 的 GitHub 說明 安裝 PentestCode:

# 安裝 PentestCode(Kali Linux 容器內)
curl -fsSL https://raw.githubusercontent.com/s0ld13rr/pentestcode/main/install.sh | bash

安裝好之後,將 ~/.local/bin 加入 PATH,並建立 PentestCode 的設定檔目錄:

# 將 ~/.local/bin 加入 PATH(Kali Linux 容器內)
echo 'export PATH="/root/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

# 建立 PentestCode 目錄(Kali Linux 容器內)
mkdir ~/.pentestcode

PentestCode 要搭配 LLM 模型來使用,建議可以使用 Ollama 或 vLLM 來運行 LLM 模型。

若搭配 Ollama 則參考 Ollama 官方文件,建立 ~/.pentestcode/pentestcode.jsonc 設定檔,範例如下:

{
  "$schema": "https://opencode.ai/config.json",
  "permission": "allow",
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama",
      "options": {
        "baseURL": "http://172.17.0.1:11434/v1"
      },
      "models": {
        "qwen3.8": {
          "name": "qwen3.8"
        }
      }
    }
  }
}

若使用 vLLM,設定也是類似,以下是一個範例:

{
  "$schema": "https://opencode.ai/config.json",
  "permission": "allow",
  "provider": {
    "vllm": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "vLLM",
      "options": {
        "baseURL": "http://172.17.0.1:8000/v1"
      },
      "models": {
        "Qwen/Qwen3.8-27B": {
          "name": "Qwen/Qwen3.8-27B"
        }
      }
    }
  }
}

設定好 LLM 模型之後,執行 PentestCode:

# 執行 PentestCode(Kali Linux 容器內)
pentestcode

進入 PentestCode 環境之後,操作方式跟 OpenCode 非常類似,先用 /connect 指令將模型設定為自己的 LLM 模型,接著就可以對 web01web02 兩台靶機進行滲透測試了,可以嘗試以下提示詞:

對 web01 與 web02 進行滲透測試,掃描所有開啟的服務,比對 CVE 漏洞,嘗試 RCE,提供 PoC 驗證指令稿。不要碰觸其他主機。使用繁體中文。

輸入提示詞之後 PentestCode 就會自動進行滲透測試了。

PentestCode 滲透測試工具

PentestCode 滲透測試工具