pocassist 是一个 Go (Golang) 编写的全新的开源漏洞测试框架,实现对poc的在线编辑、管理、测试。
如果你不想撸代码,又想实现poc的逻辑,又想在线对靶机快速测试,那就使用pocassist吧。
项目地址: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_key
和domain
即可。
# 反连平台配置: 目前使用 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 string
和post body
中的参数(json解析已在计划中)。
参数级漏洞检测只需要在前端配置payload列表(目前前端未显示,下一版修复)。
appendparam为依次在每个参数值后面拼接payload。
例如,检测sql注入时,可定义payload为'
/ %2527
等,原始请求为?aaa=bbb
,那么poc运行时会依次发两个请求,?aaa=bbb'
和?aaa=bbb%2327
7. replaceparam
参数级漏洞检测。
目前仅解析了query string
和post body
中的参数(json解析已在计划中)。
参数级漏洞检测只需要在前端配置payload列表(目前前端未显示,下一版修复)。
replaceparam为依次直接使用payload替换原始参数值。
例如,检测ssrf时,可定义payload定义为反连平台的domain,原始请求为?aaa=bbb
,那么poc运行时发起的请求为?aaa=你的reverseDomain'
0x06 常见问题
- 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
0x07 免责声明
未经授权,使用pocassist攻击目标是非法的。pocassist仅用于安全测试目的。
为避免被恶意使用,本项目所有收录的poc均为漏洞的理论判断,不存在漏洞利用过程,不会对目标发起真实攻击和漏洞利用。