SaiFD指纹识别工具

    碍于各种琐碎和杂事,好久没写文章了,最近完成了一个简单的网站指纹识别工具demo,分享一下。

    采用的是执行脚本+cms.json的格式,脚本调用cms.json文件中的cms指纹特征来进行识别,然后返回对当前网站判断的结果,列出是某种cms的可能性,概率从高到低排列,由于没那么多精力收集指纹库,目前仅支持五种cms识别,可按json文件里的格式添加更多类型的CMS指纹

#Saifingerprint V1.0
#-*- coding: utf-8 -*-
#@time      :
#@auther    :
#@version   :

import sys
import urllib,urllib2
import re
import socket
import json

#输入网站格式检查
def http_check(obj):
    m=re.match(r'^(https?|ftp|file)://.+$',obj)
    if m:
        is_alive(obj)
    else:
        print u"url格式不正确!"
        exit()
#对网址进行存活探测
def is_alive(obj):
    try:
        res=urllib2.urlopen(obj,timeout=1)
        print u"this web is alive,starting verify..."
    except Exception,e:
        print u"连接超时,请确认url是否存活!"
        exit()

#进行文件匹配探测
def file_identify(obj):
    match_count_flow=10.0
    match_count_fix=10.0
    match_count_add=0.0
    result_dic={}
    json_file=file("cms.json")
    finger=json.load(json_file)
    #遍历json所有主key
    for i in finger.keys():
        print ".",
    #遍历所有特征值
        for k in range(len(finger[i]['file'])):
            match_count_add+=1
            check_url=obj+str(finger[i]['file'][k])
            try:
                back_status=urllib2.urlopen(check_url,timeout=1)
                if back_status.getcode()==200:
                    match_count_flow+=1.0
                else:
                    match_count_flow-=0.5
            except Exception,e:
                match_count_flow-=0.5
        guess_result=match_count_flow/(match_count_fix+match_count_add)
        result_dic[i]=guess_result
        match_count_flow=10.0
        match_count_add=0.0
    print "."     
    return result_dic

#对分析结果进行展示
def display(obj):
    obj=analysis(obj)
    print "----------------------------"
    for i in range(len(obj)):
        print obj[i][0],":",obj[i][1]
        print "----------------------------"

#对探测结果进行分析
def analysis(f_id,p_id=0,o_id=0,mid=0):
    f_id=sorted(f_id.iteritems(), key=lambda d:d[1], reverse = True)
    return f_id           

#def other_identify(obj):
#def post_identify(obj):

    

if __name__=="__main__":
    print '''
==========================================================
=====================Saifingerprint V1.0==================
==========================================================
'''
    option={"-h":"111","-f":"file_identify","-p":"post_identify","-o":"other_identify","-m":"mix_identify"}
    op=sys.argv[1]
    tar=sys.argv[2]
    http_check(tar) 
    sel=option.get(op,u"没有这个选项,请检查后在输入")
    if op=="-h":
        print u'''
            -------------使用方法------------
            |   -h help菜单,查看工具用法    |

            |   -f 根据特征文件判断指纹      |

            |   -p 根据数据包特征判断指纹    |

            |   -o 根据其他特征判断指纹      |

            |   -m 混合判断,消耗时间较长    |
            ---------------------------------
        '''
        exit()
    try:       
        sel=sel+"(tar)"
        dis=eval(sel)
        display(dis)
    except Exception, e:
        print u"运行失败,请核对输入是否异常或是否存在该选项,输入-h查看使用方法"

目前仅支持-f选项,即只支持基于特征文件的识别,基于数据包的识别目前还在思考中,这个误报很大,会导致判断误差,等什么时候有了好的方式排除干扰再发一版出来。

运行效果如下图所示:

0E16AC2B-8B27-4572-874B-744E7BD6F661.png

下载:

saipd.zip


本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!