Python安全小工具之日志分析识别AWVS扫描

本篇文章主要先从客户端和服务端分析AWVS扫描的特征,然后再稍微修改一下Apache的access.log的日志格式、使之可以显示POST请求行内容,最后编写分析识别AWVS扫描的脚本。


AWVS工具的扫描分析:

Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞。

AWVS在扫描目标网站的时候,首先会爬取目标网站的所有链接,包括被注释掉的浏览器不显示的链接。可以利用这一点,来区分是真人访问还是浏览器扫描。

这里由于是比较早的测试分析,使用的版本是AWVS 10.5。

客户端角度分析:

这里主要在扫描者的主机上使用Wireshark抓包分析AWVS扫描的一些特征。

1、扫描testhtml5.vulnweb.com

三次握手建立之后,AWVS首先会发送如下请求包尝试访问不存在的目录/acunetix-wvs-test-for-some-inexistent-file来查看Web服务器返回的错误页面,其中可以看出该版本中其header的User-Agent已经没有awvs字符而是将多个不同浏览器的UA放在一起:

Python安全小工具之日志分析识别AWVS扫描_第1张图片


在cookie字段中发现尝试溢出的请求:

Cookie: acunetixCookie=AAAAAAAAA

Python安全小工具之日志分析识别AWVS扫描_第2张图片


对于User-Agent的内容,和之前版本的标识为awvs的不同,其将UA修改为正常的UA,因而对于较新版本的AWVS无法利用UA进行简单的判断:

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21


不过会存在一些测试User-Agent字段的可以利用来判断:

User-Agent: ;print(md5(acunetix_wvs_security_test));

Python安全小工具之日志分析识别AWVS扫描_第3张图片


期间会有CONNECT方法请求代理服务器去访问目标站点,代理服务器为awvs的站点:

CONNECT www.acunetix.wvs:443 HTTP/1.1


然后是GET方法访问该代理服务器站点:

GET http://www.acunetix.wvs HTTP/1.1



查看所有TCP的POST请求头内容,括号中的内容为Content-Type,其中进行测试的Content-Type字段的值为:acunetix/wvs

而其他的大多数的Content-Type的值为:application/x-www-form-urlencoded

Python安全小工具之日志分析识别AWVS扫描_第4张图片

且该测试的POST包的内容为:acunetix test

Python安全小工具之日志分析识别AWVS扫描_第5张图片


POST请求中有一些是尝试扫描发现cgi-bin目录下的php文件:

Python安全小工具之日志分析识别AWVS扫描_第6张图片

其中请求正文的内容包含字符串:acunetix-php-cgi-rce

Python安全小工具之日志分析识别AWVS扫描_第7张图片

将URL编码的内容解码为:

-d+allow_url_include=on+-d+safe_mode=off+-d+suhosin.simulation=on+-d+disable_functions=""+-d+open_basedir=none+-d+auto_prepend_file=php://input+-d+cgi.force_redirect=0+-d+cgi.redirect_status_env=0+-n


其中有的POST请求包尝试登陆时会在请求头中出现以下标识的字段:

Acunetix-Aspect: enabled

Acunetix-Aspect-Password: 082119f75623eb7abd7bf357698ff66c

Acunetix-Aspect-Queries: filelist;aspectalerts

Python安全小工具之日志分析识别AWVS扫描_第8张图片


接着查看TCP中包含”wvs”的包:

发现一些直接在URL上添加payload进行测试,且测试用的数据为:acunetix_wvs_security_test



接着查看TCP中包含”acunetix”的包:

典型的特征在一些GET方法的请求行中出现相应的标志内容:


还有一些是尝试在URL中将内容写入缓存的标志字段处:cache/acunetix


对于header头中的Accept字段,将希望接收的内容类型设置为不存在的类型使其报错:

Accept: acunetix/wvs

Python安全小工具之日志分析识别AWVS扫描_第9张图片

上面的Accept字段的值有小部分是,其余Accept的值都为*/*


Accept-Language、Referer、X-Forwarded-Host、Host、X-Forwarded-For字段也会存在注入测试:

Accept-Language: ;print(md5(acunetix_wvs_security_test));

Python安全小工具之日志分析识别AWVS扫描_第10张图片

Referer: ;print(md5(acunetix_wvs_security_test));

Python安全小工具之日志分析识别AWVS扫描_第11张图片

X-Forwarded-Host: ;print(md5(acunetix_wvs_security_test));

Python安全小工具之日志分析识别AWVS扫描_第12张图片

Host: ;print(md5(acunetix_wvs_security_test));


X-Forwarded-For: ;print(md5(acunetix_wvs_security_test));

Python安全小工具之日志分析识别AWVS扫描_第13张图片


查看POST的包:

在进行注入测试时,有的URL是存在injected_by_wvs字符串的

Python安全小工具之日志分析识别AWVS扫描_第14张图片


整个扫描的大致流程为:和目标站点三次握手连接成功后,先访问不存在的目录/acunetix-wvs-test-for-some-inexistent-file,接着尝试访问robots.txt,然后进行各种目录文件的爬去、遍历扫描和进行相关漏洞的检测。


服务端角度分析:

这里主要从Web服务器的日志的角度分析AWVS的扫描特征,以Apache为例,修改Apache日志格式:

Apache的访问日志access.log的路径为/var/log/access.log

而Apache的配置文件在旧版本中是为httpd.conf,可以通过命令以下命令查看其路径:find . -name ‘httpd.conf’

而在最近的版本中,其配置文件已改为apache2.conf,路径为/etc/apache2/apache2.conf

vim该文件进行修改,然后输入/CustomLog 来查看相应的内容,其中LogFormat为修改日志格式的地方:

Python安全小工具之日志分析识别AWVS扫描_第15张图片



使用AWVS扫描后再次查看access.log日志:

Python安全小工具之日志分析识别AWVS扫描_第16张图片

Python安全小工具之日志分析识别AWVS扫描_第17张图片


可以发现header中的每个上面总结的字段都可以发现有AWVS相关的字样,即验证了上面总结的方法的有效性。

但是日志的缺点就是没能记录POST请求的相关内容。

另外,这里补充一个之前没找到的一个特征:

Python安全小工具之日志分析识别AWVS扫描_第18张图片

期间AWVS会尝试访问http://testasp.vulnweb.com/t/fit.txt ,该站点是属于AWVS维护的,也是可以作为检测的特征之一。


修改Apache日志格式使之记录POST请求:

注意,这里修改日志格式也只是能显示POST请求行内容而无法显示提交的具体的数据。

参考:https://www.cyberciti.biz/faq/apache-mod_dumpio-log-post-data/

sudo a2enmod dump_io

/etc/init.d/apache2 force-reload

vi apache2.conf修改如下:

DumpIOInput On

DumpIOLogLevel debug

DumpIOOutput On

service apache2 restart

查看access.log日志,可以看到POST请求行和POST请求header的字段中存在标识字符串“acunetix”:



扫描特征小结:

除了具有扫描器一般的扫描特征外,还有着其标志性的特征:

(1)根据GET、POST请求行中是否存在“acunetix”、“injected_by_wvs”、“wvstest”、“vulnweb.com”等AWVS标识的字符串来判断;

(2)根据在前期测试的GET请求中是否尝试访问/acunetix-wvs-test-for-some-inexistent-file目录来判断;

(3)根据User-Agent,对于旧版本的AWVS且扫描者没有修改UA的情况下可以直接判断UA的值是否含有awvs即可,在新版的AWVS中UA虽然修改为正常的UA但存在一部分是进行User-Agent字段测试的请求包,即可判断是否含有“acunetix”进而可以判断;

(4)搜索header中Cookie字段的值是否为“acunetixCookie=AAAAA”(A很多),即根据AWVS进行cookie溢出注入的测试来判断;

(5)根据header中的多个字段的值,如Host、Accept、Content-Type、Referer、Accept-Language、X-Forwarded-For、X-Forwarded-Host字段的值是否存在“acunetix”字符串来判断;

(6)根据header中是否存在Acunetix-Aspect、Acunetix-Aspect-Password、Acunetix-Aspect-Queries等字段来判断;

(7)根据POST请求提交的内容中是否包含“acunetix”来判断;

(8)根据是否存在CONNECT方法或GET方法请求acunetix的相关站点来判断;

(9)根据GET请求行中是否存在参数wvstest来判断;


编写日志分析识别脚本:

说到底,分析一堆特征,就是为了建立一个黑名单列表,基于黑名单分析日志文件,识别是否有恶意IP对服务器进行AWVS扫描。

这里的黑名单列表就只列出关键性的几个特征即可,以降低误报率。

#!/usr/bin/python
#coding=utf-8

blacklist = ['acunetix', 'awvs', 'wvstest', 'vulnweb.com', 'injected_by_wvs']
ips = []

try:
	with open('/var/log/apache2/access.log','r') as f:
		for i in f.readlines():
			for j in blacklist:
				if j in i:
					ip = i.split(' ')[0]
					if ip not in ips:
						ips.append(ip)
						print "[+]Found AWVS Scan!"
						print "[+]IP Address: " + ip
						print "[+]The Detail Info: "
						print i.strip('\n').strip('\r')
						print
		
		if len(ips) == 0:
			print "[*]There is no action of AWVS scan."

except Exception as e:
	print "[-]Can't open the Apache2's access.log!"
	print e

该脚本实现了对恶意扫描的IP地址的去重。

看看运行结果:

Python安全小工具之日志分析识别AWVS扫描_第19张图片


这里只是以Apache的access.log日志文件为例,AWVS扫描的特征是一致的,其他的Web日志只需要稍微修改下格式都能通用。

你可能感兴趣的:(Web安全,脚本,安全开发)