前言
在开源领域,从来不缺少优秀的漏洞POC框架和POC,现今情况下,当有相关漏洞的漏洞情报出现的时候,其用于漏洞的验证的POC代码或利用请求都会很快的被公布在互联网上,比如Nuclei等漏洞检测框架也会即时得跟进新的漏洞,并以漏洞检测模板的形式进行更新,如nuclei 的nuclei-temaplte 仓库几乎每天都会出现新的漏洞需求和检测模板提交。对于漏洞检测模板而言,其主要目的用来验证目标是否存在漏洞,但仔细了解漏洞检测的机制之后,漏洞检测大多数情况下实际就是构造请求和判断响应的过程,那么基于此,是否可以反向思维,通过判断漏洞验证的请求来返回迷惑性的结果,扰乱扫描器的判断呢,其实本质还是honeypot的思路,也可以称“漏洞伪装”,本文将设计一个兼容nuclei扫描模版漏洞伪装框架来
Nuclei Template
如下为nuclei的漏洞检测模板:
通过上面nuclei的YAML格式POC的主要字段可以了解到,POC的本质是通过一个或多个构造的请求来发送给指定目标,通过判断目标相应之后的状态来判断漏洞的存在;请求可以通过修改协议请求中各部位信息来构造,如修改请求header,请求参数,甚至构造修改的TCP流的数据等,而判断漏洞主要通过响应的状态和内容来判断,一般判断方式有:
- 判断请求响应体是否包含匹配的字段,如请求POC构造为读取/etc/passwd 文件,则可以通过判断响应内容是否包含root: 来判断漏洞存在,该方式也是较为常用的方式,判断页面报错,判断指纹等都属于该方式
- 判断目标执行触发的操作状态,如构造请求载荷让目标执行时间延时,或者向外发起请求连接,如Dnslog等,常见的场景为在漏洞无法通过页面响应内容来判断漏洞存在的情况下,就可以通过改方式来让目标执行相应的操作,如让目标触发指定域名的dnslog请求,当dnslog平台接收到目标发送的请求时,判断漏洞存在;
与之漏洞检测模板对应的,漏洞伪装的模板,正是通过判断POC发送的请求,来响应对应内容信息。
技术实现
将nuclei模板转换为漏洞伪装模板
1、将Matchers 转换为python的Expr
Matchers想当于nuclei的响应验证的方法,Matchers类型分为status,size,regex,word,dsl,binary几种,每种对应不同的匹配方式,如正则匹配,字符匹配等。
matchers:
- type: regex
part: body
regex:
- "root:.*:0:0:"
- type: word
part: header
words:
- "aiohttp"
- "application/octet-stream"
condition: and
- type: status
status:
- 200
首先将Matchers 转换为python的Expr,如上Matchers转换后的效果如下效果如下
contains(body,'root:.*:0:0:') and contains(header,'aiohttp') and contains(header,'application/octet-stream') and status_code==200
2、生成python expr 形式的dsl转换漏洞伪装的语法
第一步生成python expr格式的dsl ,主要目的实际是为了提供一个统一的语法便于将其转换为其它语法形式,,中间层做了一些AST语法解析的处理,经过处理后的转换效果如下。
漏洞伪装服务
漏洞伪装服务的基本架构入下,本质上是通过mitmproxy作为中间人代理,并在代理过程中解析来自攻击者的请求,通过判断请求中是否包含响应的字符,从而返回伪装响应。
如以下漏洞伪装模板,处理逻辑为判断请求中是否包含/static/../../../../etc/passwd
,当命中的情况下,返回包含root:.*:0:0:
以及header 包含VulTrap: aiohttpapplication/octet-stream
的响应
id: CVE-2024-23334
traps:
- request:
method: GET
path: /static/../../../../etc/passwd
headers: null
body: null
response:
status_code: 200
headers:
VulTrap: aiohttpapplication/octet-stream
body: 'root:.*:0:0:'
请求效果如下
使用nuclei检测效果如下:
安装&部署
相关代码已打包为docker 镜像,可以通过docker 进行直接部署,部署方式如下。
docker run -p 8002:8002 -it --rm qingzhaoli/vultrap:latest trapserver
Todo
- 目前还只支持http协议模板的伪装,后续可支持多协议伪装
- nuclei中包含一些依赖请求顺序的模板,后续可考虑优化
- 支持其它poc框架的伪装