# poc编辑手册

# 0x01 规则体系

pocassist 借鉴了 xray 的 poc 框架 phantasm ,通过 CEL 表达式定义 poc。

用一句话来讲,就是根据自定义的规则原始请求变形,然后获取变形后的响应,再检查响应是否匹配规则中定义的表达式。

# 1-1 rules

TIP

pocassist 使用单个rule定义单个请求。使用rules定义一组请求。

如果当前rule表达式匹配成功,就进行下一个rule,如果不匹配则退出执行。 如果成功执行完了最后一个 rule,那么代表目标存在漏洞。

# 1-2 groups

当多种情况都是为了检测同一个漏洞时,可以使用groupsgroups可以理解为一组rules。只要有一组规则执行成功,该漏洞就认为存在。

WARNING

因此:groupsrules 应当只存在一个。pocassist 也做了限制,只能选择一种类型。

# 1-3 前端字段与xray对比

pocassist前端字段名 xray yaml 字段名
名称 name (opens new window)
规则类型 roles/groups rules / groups (opens new window)
添加变量 set (opens new window)
请求方法 method (opens new window)
请求路径 path (opens new window)
请求头 headers (opens new window)
请求体 body (opens new window)
跟随跳转 follow_redirects (opens new window)
提取规则 search (opens new window)
表达式 expression (opens new window)

支持 xray 所有内部变量和表达式函数 (opens new window)

# 0x02 规则类型

与 xray 不同的是,pocassist 定义了一个变量,叫规则类型

WARNING

规则类型将直接决定 rule 如何对原始请求变形。

对于原始请求,pocassist 支持解析完整请求报文,和根据url生成GET请求报文。

例如测试目标为testphp.vulnweb.com,则原始请求报文为:

GET / HTTP/1.1
Host: testphp.vulnweb.com
User-Agent: 配置文件里的UA
Connection: close
1
2
3
4

::tip

pocassist 的规则体系中,内置了以下几种规则类型。接下来我们看下同一条规则在不同类型下,是如何对原始请求进行变形的。

:::

为了观察 pocassist 的发包情况,可在config.yaml中设置burpsuite代理:

proxy: "127.0.0.1:8080"

# 2-1 directory

目录级扫描。pocassist 将认为检测目标为目录,即使是普通 url 也认为是目录。

TIP

变形后的请求路径:原始请求路径 + "/" + 规则中定义的path

变形后的请求头:使用规则定义。

举例:

burp-dir

发出的请求:

burp-dir-1

由于响应中有"not found"字样,所以命中了规则

burp-dir-2

# 2-2 text

内容检测。pocassist 将认为检测目标为原始请求的响应,所以将直接发起原始请求。

TIP

也就是说该类型的poc只需要定义cel表达式。(其他字段即使填写也会被忽略)

burp-text

发出的请求:

burp-text-1

# 2-3 url

url级漏洞检测。pocassist 将认为检测目标为原始请求的uri。因此变形后的请求路径为原始请求的uri,除了路径外,均使用规则定义。

TIP

也就是说该类型的path指定为"/"即可,即使输出"/anything",后面的也会被忽略。

burp-url

发出的请求:

burp-url-1

# 2-4 server

服务级漏洞检测。pocassist 将认为检测目标运行在一级目录下,也就是host:port/下。

因此变形后的请求路径为host:port/+规则定义的path,请求头、请求body均使用规则定义。

举例:

目标url为

https://jweny.top/aaa/bbb.cc.php

规则中定义的path为

/user/zs.php?do=save

规则运行时变形的请求为

https://jweny.top/user/zs.php?do=save

burp-server

发出的请求将直接忽略域名后的子目录:

burp-server-1

# 2-5 param

参数级漏洞检测。pocassist 将认为检测目标为原始请求中的参数。

TIP

pocassist 目前仅支持解析query stringpost body 中的form datajson解析已在计划中)。

参数级漏洞检测只需要在前端配置payload列表,pocassist 将依次将每个参数根据payload列表进行变形。

TIP

也就是说,参数级检测发起的请求数为:参数个数 * payload个数

参数变形目前内置了两种类型

  • appendparam 在原参数值后面拼接payload
  • replaceparam 将原参数直接替换为payload

# 2-5-1 appendparam

appendparam类型将遍历每个参数和payload,并将payload拼接在原始参数之后。

举例:检测带回显的sql报错注入。

定义payload(多个payload使用,分隔开)为' / %2527

原始请求为?aaa=bbb&ccc=ddd

那么poc运行时会依次发四个请求:

  1. ?aaa=bbb'&ccc=ddd
  2. ?aaa=bbb%2327&ccc=ddd
  3. ?aaa=bbb?ccc=ddd'
  4. ?aaa=bbb?ccc=ddd%2327

burp-param-append

burp-param-append-1

# 2-5-2 replaceparam

replaceparam类型将遍历每个参数和payload,并使用payload直接替换原始参数。

举例:通过dnslog检测ssrf

先添加变量,定义dnslog域名:

reverse newReverse()
reverseDomain reverse.domain
1
2

然后设置payload为reverseDomain。

原始请求为?aaa=bbb&ccc=ddd

那么poc运行时会依次发两个请求:

  1. ?aaa=reverseDomain&ccc=ddd
  2. ?aaa=bbb&ccc=reverseDomain

burp-param-replace

burp-param-replace-1

# 2.6 script

如果以上所有模式都漫步足疗你的需求,比如你要进行tcp发包,那么可以了解一下写go脚本。

脚本检测目前只支持开发者模式,也就是说直接使用release二进制状态下不支持动态加载go脚本到引擎中的。该缺陷正在研究修复。

先在前端配置基础信息,规则内容只填名称即可。

burp-script

然后在scripts目录下编写go脚本。源码中已提供两个demo,一个是检测memcached未授权,一个是检测tomcat弱口令。

// tomcat 弱口令
func TomcatWeakPass(args *ScriptScanArgs) (*util.ScanResult, error) {
	// 定义报文列表
	var respList []*proto.Response

	fastReq := fasthttp.AcquireRequest()
	defer fasthttp.ReleaseRequest(fastReq)

	var rawurl = ConstructUrl(args, "/")
	var fl = []string{"Application Manager", "Welcome to Tomcat"}
	var wl = []string{"admin:admin", "tomcat:tomcat", "admin:123456", "admin:", "root:root",
		"root:", "tomcat:", "tomcat:s3cret"}
	var buf bytes.Buffer
	buf.WriteString(rawurl)
	buf.WriteString("/manager/html")
	loginurl := buf.String()

	fastReq.SetRequestURI(loginurl)
	fastReq.Header.SetMethod(fasthttp.MethodGet)

	for _, value := range wl {
		authValue := "Basic " + base64.StdEncoding.EncodeToString([]byte(value))
		fastReq.Header.Set("Authorization", authValue)

		resp, err := util.DoFasthttpRequest(fastReq, true)
		if err != nil {
			return nil, err
		}
		if resp.Status == 401 || resp.Status == 403 {
			util.ResponsePut(resp)
			continue
		}

		if resp.Status == 404 {
			util.ResponsePut(resp)
			return &util.InVulnerableResult, nil
		}
		for _, flag := range fl {
			if bytes.Contains(resp.Body, []byte(flag)) {
				respList = append(respList, resp)
				return util.VulnerableHttpResult(loginurl,"user:pass is"+value, respList), nil
			}
		}
		util.ResponsePut(resp)
	}

	return &util.InVulnerableResult, nil
}

func init() {
	ScriptRegister("poc-go-tomcat-weak-pass", TomcatWeakPass)
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

说明:

  • 脚本的入参必须为*ScriptScanArgs,返回值必须为(*util.ScanResult, error)
  • 脚本中必须定义init方法用来注册脚本,ScriptRegister方法的第一个参数为规则名称,第二个参数为方法名。
  • 脚本编写完之后需要重新编译pocassist。go build -o pocassist

burp-script-1

# 2.7 导入xray yaml规则

点击上传,选择yaml文件后,yaml内容将自动刷新到规则内容

TIP

  1. 注意:规则类型、漏洞描述需要手动编辑
  2. 编辑完成之后点击保存才会保存至数据库

yaml

# 2.8 下载 yaml 规则

点击下载yaml规则,即可下载当前页面编辑好的规则。

TIP

注意:pocassist 完全兼容 xray ,但是部分细节还是有差异,例如 params等差。因此下载后需人工检查后,方可通过xray运行。