【技术分享】pocassist——全新的开源在线poc测试框架

admin 2021年10月3日08:14:26评论115 views字数 6288阅读20分57秒阅读模式
【技术分享】pocassist——全新的开源在线poc测试框架

 

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

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

作者:jweny@360云安全

项目地址:https://github.com/jweny/pocassist


【技术分享】pocassist——全新的开源在线poc测试框架

特性

规则体系

  • pocassist借鉴了xray优秀的规则体系。基于CEL表达式定义poc规则。

  • 完全兼容xray现有规则。

  • 不仅仅是xray。pocassist除了支持定义目录级漏洞poc,还支持服务器级漏洞、参数级漏洞、url级漏洞以及对页面内容检测,如果以上还不满足你的需求,还支持加载自定义脚本。

性能

高并发:支持批量运行poc,通过使用 ants实例化协程池,复用 goroutine ,节省资源,提升性能。

资源

小内存占用:使用内存复用机制。每个poc / 请求 / 响应 均使用sync.Pool 来缓存对象,减轻GC消耗。

易用

pocassist 为单二进制文件,无依赖,也无需安装,下载后直接使用。

 

【技术分享】pocassist——全新的开源在线poc测试框架

Demo

【技术分享】pocassist——全新的开源在线poc测试框架

poc管理

【技术分享】pocassist——全新的开源在线poc测试框架

poc在线编辑

【技术分享】pocassist——全新的开源在线poc测试框架

poc在线运行

【技术分享】pocassist——全新的开源在线poc测试框架

漏洞管理

每个poc可以关联配套的漏洞描述。

【技术分享】pocassist——全新的开源在线poc测试框架

【技术分享】pocassist——全新的开源在线poc测试框架

 

【技术分享】pocassist——全新的开源在线poc测试框架

快速开始

下载

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

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

运行

pocassist分为两种模式:

  • web:提供web页面进行在线poc编辑和测试

  • cli:提供批量扫描功能

【技术分享】pocassist——全新的开源在线poc测试框架

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

./pocassist_darwin_amd64 -h

全局参数

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

【技术分享】pocassist——全新的开源在线poc测试框架

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

web端

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

【技术分享】pocassist——全新的开源在线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

【技术分享】pocassist——全新的开源在线poc测试框架

-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


【技术分享】pocassist——全新的开源在线poc测试框架

个性化配置

下载的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.ioreverse:  api_key: ""  domain: ""

 

【技术分享】pocassist——全新的开源在线poc测试框架

poc编辑手册

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

【技术分享】pocassist——全新的开源在线poc测试框架

前端配置完基础信息,可以在scripts目录下编写go脚本。源码中已提供两个demo,一个是检测memcached未授权,一个是检测tomcat弱口令。

func MemcachedUnauthority(args *ScriptScanArgs) (*util.ScanResult, error) {    addr := args.Host + ":11211"    payload := []byte("statsn")    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'

 

【技术分享】pocassist——全新的开源在线poc测试框架

常见问题

  • config.yaml 加载失败:config.yaml要与pocassist二进制文件放置于同一目录中。

  • 使用mysql时,数据库初始化失败:如果后端使用mysql数据库,一定先创建数据库,导入数据,并将数据库信息更新至config.yaml后,再运行pocassist。

  • 目前前端有一个小bug,首次登陆成功之后,跳转至/vul时会显示空,需要强制刷新下。

  • go get ./... connection error启用goproxy(请参阅此文章以进行golang升级):

go env -w GOPROXY= https://goproxy.cn,direct
go env -w GO111MODULE=on
如果使用前后端分离部署的师傅可自行打包前端。https://github.com/jweny/pocassistweb

 

【技术分享】pocassist——全新的开源在线poc测试框架

免责声明

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

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

 

【技术分享】pocassist——全新的开源在线poc测试框架

参考项目

https://github.com/chaitin/xray/tree/master/pocs
https://phith0n.github.io/xray-poc-generation/
https://github.com/jjf012/gopoc
https://codelabs.developers.google.com/codelabs/cel-go#0

(点击“阅读原文”查看链接)

【技术分享】pocassist——全新的开源在线poc测试框架

- End -

精彩推荐

【技术分享】WebLogic T3协议反序列化 0day 漏洞分析

【技术分享】pcap workshop Learning Part 1

【技术分享】KLEE 源码阅读笔记

【技术分享】pocassist——全新的开源在线poc测试框架

戳“阅读原文”查看更多内容

本文始发于微信公众号(安全客):【技术分享】pocassist——全新的开源在线poc测试框架

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年10月3日08:14:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【技术分享】pocassist——全新的开源在线poc测试框架http://cn-sec.com/archives/387617.html

发表评论

匿名网友 填写信息