作者:jweny
項目地址:https://github.com/jweny/pocassist

pocassist 是一個 Go (Golang) 編寫的全新的開源漏洞測試框架,實現對poc的在線編輯、管理、測試。

如果你不想擼代碼,又想實現poc的邏輯,又想在線對靶機快速測試,那就使用pocassist吧。

0x01 特性

規則體系

  • pocassist借鑒了xray優秀的規則體系。通過基于CEL表達式定義poc規則。

  • 完全兼容xray現有規則。

  • 不僅僅是xray。pocassist除了支持定義目錄級漏洞poc,還支持服務器級漏洞、參數級漏洞、url級漏洞以及對頁面內容檢測,如果以上還不滿足你的需求,還支持加載自定義腳本。

性能

高并發:支持批量運行poc,通過使用 ants實例化協程池,復用 goroutine ,節省資源,提升性能。

資源

小內存占用:使用內存復用機制。每個poc / 請求 / 響應 均使用sync.Pool 來緩存對象,減輕GC消耗。

易用

pocassist 為單二進制文件,無依賴,也無需安裝,下載后直接使用。

0x02 Demo

poc管理

poc

poc在線編輯

poc在線運行

漏洞管理

每個poc可以關聯配套的漏洞描述。

0x03 快速開始

下載

直接下載相應系統構建的二進制文件即可,下載時選擇最新的版本。

下載地址:https://github.com/jweny/pocassist/releases/

運行

pocassist分為兩種模式:

  • web:提供web頁面進行在線poc編輯和測試
  • cli:提供批量掃描功能

image-20210523182641503

如使用默認配置,可直接運行二進制文件。這里以pocassist_darwin_amd64為例:

./pocassist_darwin_amd64 -h

全局參數

pocassist 的全局參數是啟動的基礎參數,webserver 和 cli 都將繼承全局參數。

image-20210521114002361

-h, --help            顯示此幫助消息并退出
-b, --database              選擇后端的數據庫類型,目前支持sqlite和mysql,默認sqlite
-d, --debug           是否啟用debug模式,debug模式將輸出程序運行過程中的更多細節,默認false
-v, --version         顯示版本并退出

web端

pocassist的server模塊是整個項目的核心,通過web實現在線poc編輯。

image-20210523183024140

-h, --help            顯示此幫助消息并退出
-p, --port                      server的啟動端口,默認1231

運行web端,默認1231端口。:

./pocassist_darwin_amd64 server

自定義端口,如8888:

./pocassist_darwin_amd64 server -p 8888

默認賬號密碼:admin/admin2

cli

pocassist的cli模塊主要是實現批量掃描功能:提供批量加載目標、批量加載poc進行檢測。

/pocassist_darwin_amd64 cli -h

image-20210521120042659

-h, --help            顯示此幫助消息并退出
# 加載目標
-u, --url                           單個url (e.g. -u https://github.com)
-f, --urlFile               選擇一個目標列表文件,每個url必須用行來區分 (e.g. -f "/home/user/list.txt")
-r, --urlRaw                    從一個請求報文文件中加載單個測試目標
# 加載poc
-l, --loadPoc               poc插件加載模式
-o, --condition             poc插件加載條件

注意:

poc插件有以下四種加載模式(loadPoc的值):

  • single:加載單個插件
  • multi:加載多個插件,多個插件用逗號隔開
  • all:加載所有插件
  • affects:加載某一類插件。

condition是與loadPoc配套使用的,關系如下:

  • 加載模式為single時:condition為poc_id,如 poc-db-001

  • 加載模式為multi時:condition為多個poc_id,用逗號隔開。如 poc-db-001,poc-db-002

  • 加載模式為all時:無需指定condition`。

  • 加載模式為affects時:condition為數據庫中plugins表的affects字段的值,也就是前端的規則類型。如只加載目錄級漏洞的poc可指定為"directory"。目前有以下值:

directory / text / url / server / script / appendparam / replaceparam

0x04 個性化配置

下載的release中,會包含一個config.yaml文件。該文件中的配置項將直接運行pocassist在運行時的狀態。

注意:

  • 在修改某項配置時,請務必理解該項的含義后再修改,否則可能會導致非預期的情況發生。

  • 當前pocassist正在快速迭代,不保證配置文件向后兼容。請保證使用相同版本release中pocassist二進制和配置文件。

server運行配置

pocassist的webserver使用gin開發。在配置文件中可以使用以下配置修改gin的啟動模式:

serverConfig:
    # 配置jwt秘鑰
  jwt_secret: "pocassist"
  # gin的運行模式 "release" 或者 "debug"
  run_mode: "release"                               
  # 運行日志的文件名,日志將保存在二進制所在目錄
  log_name : "debug.log"                            

HTTP配置

對于 web 掃描來說,http 協議的交互是整個過程檢測過程的核心。

因此這里的配置將影響到pocassist在poc運行時進行 http 發包時的行為。

httpConfig:
  # 掃描時使用的代理:格式為 IP:PORT,example: 如 burpsuite,可填寫 127.0.0.1:8080
  proxy: ""
  # 讀取 http 響應超時時間,不建議設置太小,否則可能影響到盲注的判斷
  http_timeout: 10
  # 建立 tcp 連接的超時時間
  dail_timeout: 5
  # udp 超時時間
  udp_timeout: 5
  # 每秒最大請求數
  max_qps: 100
  # 單個請求最大允許的跳轉次數
  max_redirect: 5
  headers:
    # 默認 UA
    user_agent: "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0"

注意:

  • 使用代理:配置該項后漏洞掃描發送請求時將使用代理發送。目前pocassist僅支持http代理,因此配置代理時僅提供IP:PORT即可。
  • 每秒最大請求數:默認100,這里限制發包速度。通常是為了防止被ban才會將該值調的小一些。

數據庫配置

pocassist支持sqlite和mysql兩種數據庫類型。

dbConfig:
  # sqlite配置:sqlite數據庫文件的路徑
  sqlite : "pocassist.db"
  # mysql配置
  mysql:
    host: "127.0.0.1"
    password: ""
    port: "3306"
    user: "root"
    database: "pocassist"
    # 數據庫連接超時時間
    timeout: "3s"

并發配置

pocassist 基于 Go 編寫。通過使用 ants實例化協程池,復用 goroutine ,節省資源,提升性能。所以,這里的并發也基本指代的是同時在進行漏洞掃描的 Goroutine 的數量。

通俗來講就是同時運行的插件數量。假設一個請求在整個掃描流程中需要被 100 個插件掃描且每個插件的執行時間為1秒鐘, 倘若我們設置了并發為 50,那么只需要 2s 就能執行完所有的插件;如果設置并發為 20,那么就需要 5s 才能執行完所有插件。

pluginsConfig:
  # 并發量:同時運行的插件數量
  parallel: 8

反連平臺

反連平臺常用于解決沒有回顯的漏洞探測的情況,最常見的應該屬于 ssrf 和 存儲型xss。

目前pocassist支持的反連平臺為ceye.io,配置ceye的api_keydomain即可。

# 反連平臺配置: 目前使用 ceye.io
reverse:
  api_key: ""
  domain: ""

0x05 poc編輯手冊

image-20210521170258960

poc編輯主要分為兩大塊:

規則內容

熟悉xray規則的師傅,看到“規則內容” 這部分就很熟悉了。pocassist借鑒了xray優秀的規則體系,將xray規則中的所有的變量、方法全部實現注入到cel環境中,也就是說pocassist完全兼容xray所有規則。

因此該模塊的編寫可以參考xray規則的編輯手冊

注意:

  • 無論是哪種規則類型請求路徑 path 字段均必須以/開頭。
  • 如果定義了多個請求頭 headers,填寫完之后必須先點擊一下保存請求頭按鈕,否則不會保存請求頭。

規則類型

pocassist poc 運行時發起的請求由 原始請求 + 規則內容 共同決定。

這部分最關鍵的就是規則類型。規則類型的不同,檢測過程中的最終請求uri 和 參數是完全不同的。

pocassist定義了以下幾種類型。

1. directory

目錄型掃描。檢測目標為目錄,請求頭使用規則定義。

poc運行時發起的請求路徑為原始請求路徑 + "/" + 規則中定義的path。請求頭使用規則定義。

例如:

輸入目標為 https://jweny.top/aaa/bbb/ ,規則中定義的path為 /user/zs.php?do=save,poc運行時的請求路徑為https://jweny.top/aaa/bbb/user/zs.php?do=save

2. text

頁面內容檢測。檢測目標為原始請求的響應,因此直接使用原始請求請求頭。

poc運行時發起的請求直接為原始請求。

也就是說該類型的poc只需要定義cel表達式。(其他字段即使填寫也會被忽略)

3.url

url級漏洞檢測。檢測路徑為原始請求的uri,除了路徑外,均使用規則定義。

poc運行時發起的請求路徑為原始請求的路徑,請求頭、請求方法、post body等均使用規則定義。

4. server

server級漏洞檢測。檢測路徑為原始請求的server:port+規則中定義的path,其他均使用規則定義。

poc運行時發起的請求路徑為server:port+規則path,請求頭、請求方法、post body等均使用規則定義。

例如:

輸入目標為 https://jweny.top/aaa/bbb.cc.php ,規則中定義的path為 /user/zs.php?do=save,poc運行時的請求路徑為https://jweny.top/user/zs.php?do=save

5. script

腳本檢測。腳本檢測目前只支持開發者模式,也就是說直接使用release二進制是無法加載到引擎中的。(該缺陷正在緊急修復)。

腳本檢測的poc只需要在前端配置漏洞編號、規則類型、是否啟用、漏洞描述、規則內容中的名稱即可,沒有配置的話,腳本不會加載到引擎中。

image-20210521182719146

前端配置完基礎信息,可以在scripts目錄下編寫go腳本。源碼中已提供兩個demo,一個是檢測memcached未授權,一個是檢測tomcat弱口令。

func MemcachedUnauthority(args *ScriptScanArgs) (*util.ScanResult, error) {
    addr := args.Host + ":11211"
    payload := []byte("stats\n")
    resp, err := util.TcpSend(addr, payload)
    if err != nil {
        return nil, err
    }
    if bytes.Contains(resp, []byte("STAT pid")) {
        return util.VulnerableTcpOrUdpResult(addr, "",
            []string{string(payload)},
            []string{string(resp)},
        ),nil
    }
    return &util.InVulnerableResult, nil
}

func init() {
    ScriptRegister("poc-go-memcached-unauth", MemcachedUnauthority)
}

說明:

  • 腳本的入參必須為*ScriptScanArgs,返回值必須為(*util.ScanResult, error)
  • 腳本中必須定義init方法用來注冊腳本,ScriptRegister方法的第一個值為前端配置的規則內容中的名稱,第二個為要運行的方法名。
  • 腳本編寫完之后重新編譯pocassist。go build -o pocassist

6. appendparam

參數級漏洞檢測。

目前僅解析了query stringpost body 中的參數(json解析已在計劃中)。

參數級漏洞檢測只需要在前端配置payload列表(目前前端未顯示,下一版修復)。

appendparam為依次在每個參數值后面拼接payload。

例如,檢測sql注入時,可定義payload為' / %2527 等,原始請求為?aaa=bbb,那么poc運行時會依次發兩個請求,?aaa=bbb'?aaa=bbb%2327

7. replaceparam

參數級漏洞檢測。

目前僅解析了query stringpost body 中的參數(json解析已在計劃中)。

參數級漏洞檢測只需要在前端配置payload列表(目前前端未顯示,下一版修復)。

replaceparam為依次直接使用payload替換原始參數值。

例如,檢測ssrf時,可定義payload定義為反連平臺的domain,原始請求為?aaa=bbb,那么poc運行時發起的請求為?aaa=你的reverseDomain'

0x06 常見問題

  1. config.yaml 加載失敗:config.yaml要與pocassist二進制文件放置于同一目錄中。

  2. 使用mysql時,數據庫初始化失敗:如果后端使用mysql數據庫,一定先創建數據庫,導入數據,并將數據庫信息更新至config.yaml后,再運行pocassist。

  3. 目前前端有一個小bug,首次登陸成功之后,跳轉至/vul時會顯示空,需要強制刷新下。

  4. go get ./... connection error

啟用goproxy(請參閱此文章以進行golang升級):

go env -w GOPROXY=https://goproxy.cn,direct go env -w GO111MODULE=on

  1. 如果使用前后端分離部署的師傅可自行打包前端。

https://github.com/jweny/pocassistweb

0x07 todo

  • 收集師傅們在使用過程中遇到的問題
  • 目前cli端的批量快掃功能為臨時方案,后續所有批量快掃功能web端都將支持。
  • 發現潛在bug
  • json參數解析
  • 修復前端bug
  • 初次加載時要強制刷新
  • 參數級掃描:payload列表前端未提供在線編輯

0x08 免責聲明

未經授權,使用pocassist攻擊目標是非法的。pocassist僅用于安全測試目的。

為避免被惡意使用,本項目所有收錄的poc均為漏洞的理論判斷,不存在漏洞利用過程,不會對目標發起真實攻擊和漏洞利用。

0x09 參考項目


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1588/