pocassist——全新的开源在线poc测试框架

 

pocassist 是一个 Go (Golang) 编写的全新的开源漏洞测试框架,实现对poc的在线编辑、管理、测试。

如果你不想撸代码,又想实现poc的逻辑,又想在线对靶机快速测试,那就使用pocassist吧。

作者:jweny@360云安全

项目地址:https://github.com/jweny/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可以关联配套的漏洞描述。

 

0x03 快速开始

下载

直接下载相应系统构建的二进制文件即可,下载时选择最新的版本。

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

运行

pocassist分为两种模式:

  • web:提供web页面进行在线poc编辑和测试
  • cli:提供批量扫描功能

如使用默认配置,可直接运行二进制文件。这里以pocassist_darwin_amd64为例:

./pocassist_darwin_amd64 -h

全局参数

pocassist 的全局参数是启动的基础参数,webserver 和 cli 都将继承全局参数。

-h, --help  显示此帮助消息并退出
-b, --database  选择后端的数据库类型,目前支持sqlite和mysql,默认sqlite
-d, --debug  是否启用debug模式,debug模式将输出程序运行过程中的更多细节,默认false
-v, --version  显示版本并退出

web端

pocassist的server模块是整个项目的核心,通过web实现在线poc编辑。

-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

-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编辑手册

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只需要在前端配置漏洞编号、规则类型、是否启用、漏洞描述、规则内容中的名称即可,没有配置的话,脚本不会加载到引擎中。

前端配置完基础信息,可以在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 免责声明

未经授权,使用pocassist攻击目标是非法的。pocassist仅用于安全测试目的。

为避免被恶意使用,本项目所有收录的poc均为漏洞的理论判断,不存在漏洞利用过程,不会对目标发起真实攻击和漏洞利用。

 

0x08 参考项目

(完)