Spaghetti扫描器源码分析之指纹识别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bnxf00000/article/details/78167694

      Spaghetti是一个开源的Web扫描器。看了一下它的介绍,有关于指纹识别的组件。那就看看源码了解一下。

      源码上看对指纹的识别,还是对response里面的项进行正则匹配,来进行特定指纹的识别。首先源码里面,定义了一个自己的request处理类,看了一下里面对GET和POST请求的参数都是一样的,也真是诡异,这有啥好封装的。唯一多了一个随机选择User-Agent项,可是这一项源码里面是定义了一个User-Agent的元组,然后利用随机数进行选择某一项。这里其实没有必要,python里面有专门的随机产生User-Agent的包叫fake-useragent

      指纹识别组件里面针对os、server、waf、cms等进行了识别。看下源码checkall.py:

 
 
class Checkall:
	def __init__(self,agent,proxy,redirect,timeout,url,cookie):
		self.url = url
		self.cookie = cookie
		self.output = output.Output()
		self.request = request.Request(
			agent = agent,
			proxy = proxy,
			redirect = redirect,
			timeout = timeout
			)
 
 
	def run(self):
		self.output.info('Starting fingerprints module...')
		try:
			resp = self.request.send(
				url = self.url,
				method = "GET",
				payload = None,
				headers = None,
				cookies = self.cookie
				)
			ser = server.Server(self.url).run(resp.headers)
			self.output.plus('Server: %s'%ser)
			os_ = ([x for x in os.Os(resp.headers)])
			for x in os_:
				if x != None:
					self.output.plus('Operating system: %s'%x)
			firewall = ([x for x in waf.Waf(resp.headers,resp.content)])
			for x in firewall:
				if x != None:
					self.output.plus('Firewall: %s'%x)
			cms_ = ([x for x in cms.Cms(resp.content)])
			for x in  cms_:
				if x != None:
					self.output.plus('Content Management System (CMS): %s'%x)
			lang_ = ([x for x in lang.Lang(resp.content,resp.headers)])
			for x in lang_:
				if x != None:
					self.output.plus('Language: %s'%x)
			frame = ([x for x in framework.Framework(resp.headers,resp.content)])
			for x in frame:
				if x != None:
					self.output.plus('Framework: %s'%x)
			headers.Headers().run(resp.headers)
			cookie.Cookie().run(resp.headers)
		except Exception,e:
			pass

      从源码中可以看到,主要是对http response的header部分和content部分进行特别的正则匹配来进行识别。这个识别还是很粗糙的,因为很多时候http response里面server部分有时候没内容,然后os部分有时候也没有内容。

      cms的识别主要对drupal、joomla、magento、wordpress进行了初步识别,都是寻找各个cms中特有的文件。waf部分文件比较多,每个特别waf的特征码不一样吧。

      对采用何种编程语言的识别有点意思,也是response header和content部分特别字段的正则匹配。看下python语言的识别。lang/python.py:

 
 
class Python:
	@staticmethod	
	def run(content,headers):
		_ = False
		for item in headers.items():
			_  = re.search(r'python|zope|zserver|wsgi|plone|_ZopeId',item[1],re.I) is not None
			_ |= re.search(r'\.py$',content) is not None
			if _:
				return "Python"
				break

      有些关键词我也不太清楚。

      框架的识别看着是把上面几种常见单独弄出来之后,又在framework下面对更多种类的框架进行了识别。这里倒是可以自己增加一些额外的框架识别代码,进行扩充。看下framework/django.py:

 
 
class Django:
	@staticmethod	
	def run(headers):
		_ = False
		for item in headers.items():
			_ = re.search(r'csrftoken=',item[1],re.I) is not None
			if _:
				return "Django (Python)"
				break

      感觉识别有点简单,csrftoken确实是django中防止csrf的机制。

      作为整体扫描器的一部分,指纹识别这块还是比较简陋的。单纯以这款扫描器来讲,这些指纹信息也只是展示给用户看的,如果后续做针对特定指纹的poc验证,那还是需要做的精细一些的。

      指纹识别单独拿出来做的话,还是可以在whatweb的基础上造造轮子吧。

猜你喜欢

转载自blog.csdn.net/bnxf00000/article/details/78167694