首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Web指纹识别目的Discuz识别+粗糙的版本演绎

Web指纹识别目的Discuz识别+粗糙的版本演绎

作者头像
全栈程序员站长
发布2022-01-14 16:09:39
发布2022-01-14 16:09:39
7600
举报

大家好,又见面了,我是全栈君

这个识别程序是本学期在我的职业培训项目。它是做一类似至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这个指纹库就可以,以下就是识别主程序的代码,程序输入为以回车换行切割的域名列表。输出为结果文件,代码例如以下:

代码语言:javascript
复制
#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的雏形:-)

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

版权声明:本文博主原创文章。博客,未经同意不得转载。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116952.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档