作者:jweny
项目地址:https://github.com/jweny/pocassist
pocassist 是一个 Go (Golang) 编写的全新的开源漏洞测试框架,实现对poc的在线编辑、管理、测试。
如果你不想撸代码,又想实现poc的逻辑,又想在线对靶机快速测试,那就使用pocassist吧。
pocassist借鉴了xray优秀的规则体系。通过基于CEL表达式定义poc规则。
完全兼容xray现有规则。
不仅仅是xray。pocassist除了支持定义目录级漏洞poc,还支持服务器级漏洞、参数级漏洞、url级漏洞以及对页面内容检测,如果以上还不满足你的需求,还支持加载自定义脚本。
高并发:支持批量运行poc,通过使用 ants
实例化协程池,复用 goroutine ,节省资源,提升性能。
小内存占用:使用内存复用机制。每个poc / 请求 / 响应 均使用sync.Pool
来缓存对象,减轻GC消耗。
pocassist 为单二进制文件,无依赖,也无需安装,下载后直接使用。
poc在线编辑
poc在线运行
每个poc可以关联配套的漏洞描述。
直接下载相应系统构建的二进制文件即可,下载时选择最新的版本。
下载地址:https://github.com/jweny/pocassist/releases/
pocassist分为两种模式:
如使用默认配置,可直接运行二进制文件。这里以pocassist_darwin_amd64为例:
./pocassist_darwin_amd64 -h
pocassist 的全局参数是启动的基础参数,webserver 和 cli 都将继承全局参数。
-h, --help 显示此帮助消息并退出 -b, --database 选择后端的数据库类型,目前支持sqlite和mysql,默认sqlite -d, --debug 是否启用debug模式,debug模式将输出程序运行过程中的更多细节,默认false -v, --version 显示版本并退出
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
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
的值):
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
下载的release中,会包含一个config.yaml
文件。该文件中的配置项将直接运行pocassist在运行时的状态。
注意:
在修改某项配置时,请务必理解该项的含义后再修改,否则可能会导致非预期的情况发生。
当前pocassist正在快速迭代,不保证配置文件向后兼容。请保证使用相同版本release中pocassist二进制和配置文件。
pocassist的webserver使用gin开发。在配置文件中可以使用以下配置修改gin的启动模式:
serverConfig: # 配置jwt秘钥 jwt_secret: "pocassist" # gin的运行模式 "release" 或者 "debug" run_mode: "release" # 运行日志的文件名,日志将保存在二进制所在目录 log_name : "debug.log"
对于 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"
注意:
IP:PORT
即可。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_key
和domain
即可。
# 反连平台配置: 目前使用 ceye.io reverse: api_key: "" domain: ""
poc编辑主要分为两大块:
熟悉xray规则的师傅,看到“规则内容” 这部分就很熟悉了。pocassist借鉴了xray优秀的规则体系,将xray规则中的所有的变量、方法全部实现注入到cel环境中,也就是说pocassist完全兼容xray所有规则。
因此该模块的编写可以参考xray规则的编辑手册。
注意:
规则类型
,请求路径 path
字段均必须以/
开头。请求头 headers
,填写完之后必须先点击一下保存请求头按钮,否则不会保存请求头。pocassist poc 运行时发起的请求由 原始请求 + 规则内容 共同决定。
这部分最关键的就是规则类型
。规则类型的不同,检测过程中的最终请求uri 和 参数是完全不同的。
pocassist定义了以下几种类型。
目录型扫描。检测目标为目录,请求头使用规则定义。
poc运行时发起的请求路径为原始请求路径 + "/" + 规则中定义的path
。请求头使用规则定义。
例如:
输入目标为 https://jweny.top/aaa/bbb/
,规则中定义的path为 /user/zs.php?do=save
,poc运行时的请求路径为https://jweny.top/aaa/bbb/user/zs.php?do=save
页面内容检测。检测目标为原始请求的响应,因此直接使用原始请求请求头。
poc运行时发起的请求直接为原始请求。
也就是说该类型的poc只需要定义cel表达式。(其他字段即使填写也会被忽略)
url级漏洞检测。检测路径为原始请求的uri,除了路径外,均使用规则定义。
poc运行时发起的请求路径为原始请求的路径,请求头、请求方法、post body等均使用规则定义。
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
脚本检测。脚本检测目前只支持开发者模式,也就是说直接使用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
方法的第一个值为前端配置的规则内容中的名称
,第二个为要运行的方法名。go build -o pocassist
参数级漏洞检测。
目前仅解析了query string
和post body
中的参数(json解析已在计划中)。
参数级漏洞检测只需要在前端配置payload列表(目前前端未显示,下一版修复)。
appendparam为依次在每个参数值后面拼接payload。
例如,检测sql注入时,可定义payload为'
/ %2527
等,原始请求为?aaa=bbb
,那么poc运行时会依次发两个请求,?aaa=bbb'
和?aaa=bbb%2327
参数级漏洞检测。
目前仅解析了query string
和post body
中的参数(json解析已在计划中)。
参数级漏洞检测只需要在前端配置payload列表(目前前端未显示,下一版修复)。
replaceparam为依次直接使用payload替换原始参数值。
例如,检测ssrf时,可定义payload定义为反连平台的domain,原始请求为?aaa=bbb
,那么poc运行时发起的请求为?aaa=你的reverseDomain'
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攻击目标是非法的。pocassist仅用于安全测试目的。
为避免被恶意使用,本项目所有收录的poc均为漏洞的理论判断,不存在漏洞利用过程,不会对目标发起真实攻击和漏洞利用。
本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1588/