Web指纹识别之Discuz识别+粗略版本判断

这个识别程序是本学期我的专业实训上的一个项目,就是做一个类似于Zoomeye的东西,然后使用ES进行整合,从而做出搜索引擎的模样。那么首先就要有能力去网上识别出相应的Web组件,如用户输入关键词:Discuz X3.0,我就要显示出相应版本的内容才OK。作为识别子程序,我这里暂且分享一下识别Web组件的思路。

我是从浅谈web指纹识别技术一文中找到的思路。对于Discuz的网站,第一时间想的就是识别footer了,但是问题在于,做的好的一些网站往往会将“Powered By”字样修改,所以为了配合footer字样进行识别,我使用了robots.txt和比较隐蔽的meta标签来进行共同识别。而粗略的版本信息,则是从robots.txt中获取的。

指纹全部放在一起进行管理,方便日后进行指纹的添加:

discuz_feature.py:

这个文件中只有一个字典用来存放相应的指纹信息,我不可能做得很细(时间不允许啊),所以只有footer信息、robots信息、meta信息三个类型的指纹。

在主程序中直接load这个指纹库即可,下面就是识别主程序的代码,程序输入为以回车换行分割的域名列表,输出为结果文件,代码如下:

#coding=utf-8
import requests
from bs4 import BeautifulSoup
import re
from discuz_feature import matches
'''
Discuz 指纹识别
1.meta数据元识别
2.intext识别
3.robots.txt识别
'''
class DiscuzDetector():
	'''构造方法'''
	def __init__(self,url):
		if url.startswith("http://"):
			self.url = url
		else:
			self.url = "http://%s" % url
		try:
			self.r = requests.get(self.url,timeout=8)
			self.page_content = self.r.content
		except Exception, e:
			print e
			self.r = None
			self.page_content = None
		
	'''识别meta标签'''
	def meta_detect(self):
		if not self.r:
			return False
		pattern = re.compile(r'<meta name=".*?" content="(.+)" />')
		infos = pattern.findall(self.page_content)
		conditions = matches['meta'][0] or matches['meta'][1]
		if infos:
			for x in infos:
				if x.count(conditions) != 0:
					return True
					break
		else:
			return False


	'''discuz 版本识别'''
	def robots_dz_xx_detect(self):
		if not self.r:
			return (False,None)
		robots_url = "%s%s" % (self.url,"/robots.txt")
		robots_content = requests.get(robots_url).content
		if not robots_content:
			return (False,None)
		robots_feature_xx = matches['robots_for_xx']
		robots_feature_Xx = matches['robots_for_Xx']
		robots_list = robots_content.split("\r\n")
		pattern = re.compile(r'# robots\.txt for (.+)')
		version_info = []
		for x in robots_list:
			#如果robots.txt中含有# robots.txt for Discuz! X3 行  则直接判断版本
			version_info = pattern.findall(x)
			if version_info != [] and robots_content.count("Version" and "Discuz!"):
				if robots_content.count("Version" and "Discuz!"):
					pattern = re.compile(r'# Version (.+)')
					version_number = pattern.findall(str(robots_content))
					if version_number:
						version_info.append(version_number)
				return (True,version_info)
			else:
				#若版本信息被删除则识别出版本
				is_xx = (x in robots_feature_xx)
				is_Xx = (x in robots_feature_Xx)
				if is_Xx or is_xx:
					#判断为discuz
					#判断版本
					if is_Xx == True:
						version_info = 'Discuz Xx'
						return (True,version_info)
					else:
						version_info = 'Discuz xx'
						return (True,version_info)
		#不是discuz
		return (False,None)



	'''检测网页中的discuz字样'''
	def detect_intext(self):
		if not self.r:
			return False
		text_feature = matches['intext'][0] or matches['intext'][1]
		if self.page_content.count(text_feature) != 0:
			return True
		else:
			return False


	'''判别方法'''
	def get_result(self):
		if not self.r:
			return (False,'Not Discuz!')
		is_meta = self.meta_detect()
		res = self.robots_dz_xx_detect()
		is_dz_robots = res[0]
		version_info = res[1]
		print version_info
		is_intext = self.detect_intext()

		if is_meta or is_dz_robots or is_intext:
			#print 'Find Discuz!'
			if version_info:
				# return (True,'Find! Version:%s' % (version_info[0]))
				return (True,'%s' % (version_info[0]))
			else:
				return (True,'Version:Unknown') 
		else:
			return (False,'Not Discuz!')
    	

if __name__ == '__main__':
	
	'''读文件识别'''
	f = open('discuz.txt','r')
	wf = open('results.txt','a')
	file_content = f.read()
	dz_url_list = file_content.split('\n')
	for url in dz_url_list:
		print url
		detector = DiscuzDetector(url)
		ret = detector.get_result()
		print ret
		if ret[0]:
			wf.write("%s\t%s\n" % (url,ret[1]))
		else:
			continue
	wf.close()
	f.close()

里面的discuz.txt就是需要识别的域名列表文件,输出为results.txt,程序执行如下:

看来X3.x的版本用的挺多。

在某些情况下,需要做批量利用,对这个脚本稍加修改就可以帮助识别出域名数据库中的Discuz的站点。你需要做的只是把漏洞攻击代码作为后续模块进行攻击即可。

当然,关于批量利用,使用web指纹识别这种方法虽然准确性高,但是比较费时间,不适合大规模的扫描,这种情况下,一般都是Fuzzing跑字典去做。

使用Elasticsearch整合的效果如下:

如果希望做的有模有样的话,那么就要添加后面的监控与漏洞攻击模块了,使用RESTful接口做出API是最好的、最灵活的选择,以后会逐渐完善,争取做出zoomeye的雏形:-)


另外,转载请注明出处啊大哥们!!




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。