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

来源:互联网 发布:淘宝直播销量权重 编辑:程序博客网 时间:2024/06/06 19:54

      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的基础上造造轮子吧。