几款web指纹识别工具分析

admin 2023年3月11日23:29:02评论62 views字数 7419阅读24分43秒阅读模式

高质量的安全文章,安全offer面试经验分享

尽在 # 掌控安全EDU #

作者:掌控安全老师

Webfinger

简介

这是一款很小巧的工具,由Python2编写,使用Fofa的指纹库
Github地址:https://github.com/se55i0n/Webfinger

运行截图如下:

几款web指纹识别工具分析

这个工具的使用体验一般,采用的是Python2。我用dedecms官网进行测试,测试结果如下图:

几款web指纹识别工具分析

源码分析

代码比较简单,在匹配之前,先连接数据库查询总条数和每条信息,使用简单的SQL语句:

  1. def check(_id):

  2. with sqlite3.connect('./lib/web.db') as conn:

  3. cursor = conn.cursor()

  4. result = cursor.execute('SELECT name, keys FROM `fofa` WHERE id='{}''.format(_id))

  5. for row in result:

  6. return row[0], row[1]

  7. def count():

  8. with sqlite3.connect('./lib/web.db') as conn:

  9. cursor = conn.cursor()

  10. result = cursor.execute('SELECT COUNT(id) FROM `fofa`')

  11. for row in result:

  12. return row[0]

使用Navicat查看Fofa库:

几款web指纹识别工具分析

一千条规则,比较齐全,如果自己要做指纹识别工具,也许可以借用这个Fofa库……

获取到Fofa指纹库的信息后,对语法进行解析:

  1. if '||' in key and '&&' not in key and '(' not in key:

  2. for rule in key.split('||'):

  3. if self.check_rule(rule, header, body, title):

  4. print '%s[+] %s %s%s' %(G, self.target, name, W)

  5. break

解析完语法后进行规则校验:

  1. def check_rule(self, key, header, body, title):

  2. try:

  3. if 'title="' in key:

  4. if re.findall(rtitle, key)[0].lower() in title.lower():

  5. return True

  6. elif 'body="' in key:

  7. if re.findall(rbody, key)[0] in body: return True

  8. else:

  9. if re.findall(rheader, key)[0] in header: return True

  10. except Exception as e:

  11. pass

这几条规则的正则如下:

  1. rtitle = re.compile(r'title="(.*)"')

  2. rheader = re.compile(r'header="(.*)"')

  3. rbody = re.compile(r'body="(.*)"')

  4. rbracket = re.compile(r'((.*))')

而其中的body和header也是比较简单的:使用requests请求获得响应header和body,并用bs4对body进行解析获得title信息

  1. r = requests.get(url=self.target, headers=agent,

  2. timeout=3, verify=False)

  3. content = r.text

  4. try:

  5. title = BeautifulSoup(content, 'lxml').title.text.strip()

  6. return str(r.headers), content, title.strip('n')

  7. except:

  8. return str(r.headers), content, ''

整体就是这样的情况了,值得一看的是语义解析这部分,比如下面这段1||2||(3&&4)的解析:
与操作优先,进行分割拿到3和4,使用num计数确保与操作中的每一项都通过检查,然后再依次进行或操作的检查,最终成功解析Fofa的规则

  1. if '&&' in re.findall(rbracket, key)[0]:

  2. for rule in key.split('||'):

  3. if '&&' in rule:

  4. num = 0

  5. for _rule in rule.split('&&'):

  6. if self.check_rule(_rule, header, body, title):

  7. num += 1

  8. if num == len(rule.split('&&')):

  9. print '%s[+] %s %s%s' % (G, self.target, name, W)

  10. break

  11. else:

  12. if self.check_rule(rule, header, body, title):

  13. print '%s[+] %s %s%s' % (G, self.target, name, W)

  14. break

总结

· 一个小巧的工具,代码不多,功能实用
· sqlite数据库导致自定义规则困难,不利于拓展
· 也许可以采用多线程多进程的技术提高效率
· Fofa指纹库也许可以借用来完成自己的工具

Test404轻量CMS指纹识别

简介

类似御剑,界面都是C++风格,不过它的规则更完善

几款web指纹识别工具分析

源码分析

并没有开源,我们看一下规则库:
第一个是关键url,推测是根据状态码来判断
第二个是title内容,应该是根据包含关系来判断
第三个是md5,猜测是ICO文件的MD5分析

  1. /include/fckeditor/fckstyles.xml|phpmaps|6d188bfb42115c62b22aa6e41dbe6df3

  2. /plus/bookfeedback.php|dedecms|647472e901d31ff39f720dee8ba60db9

  3. /js/ext/resources/css/ext-all.css|泛微OA|ccb7b72900a36c6ebe41f7708edb44ce

总结

类似御剑,适合新手,并且规则更完善

Cmscan

简介

与Webfinger类似,这也是一款小巧的工具
github地址:https://github.com/ldbfpiaoran/cmscan

源码分析

从开发角度来看,这个工具的代码并不是很规范,简单分析下吧:
首先是对title的解析,使用了bs4:title = bresponse.findAll(‘title’)
定义了一个大字典作为规则数据库:

  1. title = {'phpMyAdmin':'phpMyAdmin',

  2. 'seacms':'海洋CMS',

  3. 'Powered by ASPCMS':'ASPCMS',

  4. 'Powered by CmsEasy':'CmsEasy',

  5. .....

  6. }

然后用正则直接去搜,有一点疑问,上面的title规则并不是正则格式,只是简单的字符串,为什么不用if key.lower() in title.lower()这样更简单的方式,理论上正则的效率是不如这种方式的

  1. def scan_title():

  2. titlerule = rule.title

  3. web_information = 0

  4. for key in titlerule.keys():

  5. req = re.search(key,title,re.I)

  6. if req:

  7. web_information = titlerule[key]

  8. break

  9. else:

  10. continue

  11. return web_information

类似地,分析响应头也是这样的道理,简单加入了&符号的解析,不如webfinger写的好;分析body的内容和这个类似,就不再复制过来了

  1. def scan_head():

  2. headrule = rule.head

  3. web_information = 0

  4. for key in headrule.keys():

  5. if '&' in key:

  6. keys = re.split('&',key)

  7. if re.search(keys[0],header,re.I) and re.search(keys[1],response,re.I) :

  8. web_information = headrule[key]

  9. break

  10. else:

  11. continue

  12. else:

  13. req = re.search(key,header,re.I)

  14. if req:

  15. web_information = headrule[key]

  16. break

  17. else:

  18. continue

  19. return web_information

关于文件头的获取,也只是简单的requests:

  1. response = requests.get(url=url, headers=headers)

  2. bresponse = BeautifulSoup(response.text, "lxml")

  3. title = bresponse.findAll('title')

  4. for i in title:

  5. title = i.get_text()

  6. head = response.headers

  7. response = response.text

  8. header = ''

  9. for key in head.keys():

  10. header = header+key+':'+head[key]

发现它还提供了一个下载规则的脚本,大概内容是爬取Fofa库,用bs4解析,拿到规则:

  1. response = requests.get(url=url,headers=headers)

  2. response = BeautifulSoup(response.text,"lxml")

  3. rules = response.findAll('div',{'class':'panel panel-default'})

  4. rule = {}

  5. for i in rules:

  6. rule_len = len(i.findAll('a'))

  7. if rule_len > 0 :

  8. rulelist = i.findAll('a')

  9. temporary = {}

  10. for b in rulelist:

  11. s = un_base(b.attrs['href'])

  12. temporary[b.get_text()] = s

  13. rule[i.find('label').get_text()] = temporary

然后保存到mysql中,供后续使用:

  1. def saverule(types,name,rules):

  2. try:

  3. conn = pymysql.connect(host='127.0.0.1',user='root',passwd='521why1314',db='mysql',charset='utf8')

  4. conn = conn.cursor()

  5. conn.execute('use rules')

  6. savesql = 'insert into `fofarule` (`types`,`name`,`rules`) VALUES (%s,%s,%s)'

  7. conn.execute(savesql,(types,name,rules))

  8. except:

  9. conn.close()

总结

很简单的小工具,代码质量不高,看得出来是新手之作。原理和之前webfinger差不多,都是对header,title,body中的关键字做匹配,这里是写在代码中,webfinger是写入sqlite数据库

Gwhatweb

简介

简洁的CMS识别工具,代码比较规范,使用协程技术,大大提高IO操作较多的程序的效率
github地址:https://github.com/boy-hack/gwhatweb

源码分析

首先看看规则,主要是url和md5的指纹识别,不包含响应头

  1. {

  2. "url": "/images/admin/login/logo.png",

  3. "re": "",

  4. "name": "Phpwind网站程序",

  5. "md5": "b11431ef241042379fee57a1a00f8643"

  6. },

使用线程安全的Queue,将规则读入队列

  1. def __init__(self,url):

  2. self.tasks = Queue()

  3. self.url = url.rstrip("/")

  4. fp = open('data.json')

  5. webdata = json.load(fp, encoding="utf-8")

  6. for i in webdata:

  7. self.tasks.put(i)

  8. fp.close()

  9. print("webdata total:%d"%len(webdata))

记录执行时间,并开启协程

  1. def _boss(self):

  2. while not self.tasks.empty():

  3. self._worker()

  4. def whatweb(self,maxsize=100):

  5. start = time.clock()

  6. allr = [gevent.spawn(self._boss) for i in range(maxsize)]

  7. gevent.joinall(allr)

  8. end = time.clock()

  9. print ("cost: %f s" % (end - start))

下面是规则匹配的关键函数:首先从队列取规则,requests发请求,拿到的响应body先用正则匹配,然后再用MD5匹配

  1. def _worker(self):

  2. data = self.tasks.get()

  3. test_url = self.url + data["url"]

  4. rtext = ''

  5. try:

  6. r = requests.get(test_url,timeout=10)

  7. if (r.status_code != 200):

  8. return

  9. rtext = r.text

  10. if rtext is None:

  11. return

  12. except:

  13. rtext = ''

  14. if data["re"]:

  15. if (rtext.find(data["re"]) != -1):

  16. result = data["name"]

  17. print("CMS:%s Judge:%s re:%s" % (result, test_url, data["re"]))

  18. self._clearQueue()

  19. return True

  20. else:

  21. md5 = self._GetMd5(rtext)

  22. if (md5 == data["md5"]):

  23. result = data["name"]

  24. print("CMS:%s Judge:%s md5:%s" % (result, test_url, data["md5"]))

  25. self._clearQueue()

  26. return True

御剑WEB指纹识别系统

简介

国产工具,不开源,看上去应该是C++/C#编写的,使用多线程技术,类似目录扫描的主动的方式进行探测和识别,对新手比较友好

几款web指纹识别工具分析

源码分析

这个工具并没有开源,我们简单看一下它的规则库,只是对响应Body进行关键字和正则的匹配,库的数量也不是很多,算是中规中矩的小工具吧

  1. #范例:链接------关键字------CMS别称

  2. #范例:连接------正则表达式------匹配关键字------CMS别称

  3. /install/------aspcms------AspCMS

  4. /about/_notes/dwsync.xml------aspcms------AspCMS

  5. /admin/_Style/_notes/dwsync.xml------aspcms------AspCMS

  6. /apply/_notes/dwsync.xml------aspcms------AspCMS

  7. /config/_notes/dwsync.xml------aspcms------AspCMS

  8. /fckeditor/fckconfig.js------aspcms------AspCMS

  9. /gbook/_notes/dwsync.xml------aspcms------AspCMS

  10. /inc/_notes/dwsync.xml------aspcms------AspCMS

  11. /plug/comment.html------aspcms------AspCMS

总结

御剑曾经做过鼎鼎大名的web目录扫描工具,做出的指纹识别也是不错的,适合新手

FingerPrint

简介

Perl语言编写,使用Wappalyzer工具的库。代码非常规范,注释齐全。看来作者github信息,似乎是百度的小姐姐,做安全的妹子确实很少的,更何况是BAT的大佬,膜拜。不说废话了,继续看代码
github地址:https://github.com/tanjiti/FingerPrint

源码分析

开头引入用到的函数开头引入用到的函数,需要自行安装
cpan -i WWW::Wappalyzer

  1. use WWW::Wappalyzer qw(detect get_categories add_clues_file);

核心代码很简短,发请求,将响应内容传入Wappalyzer提供的接口,然后输出结果

  1. sub getFP{

  2. my ($url,$rule_file) = @_;

  3. my $response = sendHTTP($url);

  4. #add your new finger print rule json file

  5. add_clues_file($rulefile) if $rulefile and -e $rulefile;

  6. my %detected = detect(

  7. html => $response->decoded_content,

  8. headers => $response->headers,

  9. url => $uri,

  10. # cats => ["cms"],

  11. );

  12. my $result = jsonOutput($url,%detected);

  13. return $result;

  14. }

官方文档:
https://metacpan.org/pod/WWW::Wappalyzer

官方代码:
https://metacpan.org/release/WWW-Wappalyzer/source/lib/WWW/Wappalyzer.pm

简单看了下,和JavaScript格式的Wappalyzer代码逻辑有点像,相当于是用Perl实现了一遍

总结

简单小巧的工具,不采用Perl语言,Python/Golang其实都是很好的选择。

申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.


回顾往期内容

Xray挂机刷漏洞

零基础学黑客,该怎么学?

网络安全人员必考的几本证书!

文库|内网神器cs4.0使用说明书

代码审计 | 这个CNVD证书拿的有点轻松

【精选】SRC快速入门+上分小秘籍+实战指南

    代理池工具撰写 | 只有无尽的跳转,没有封禁的IP!

几款web指纹识别工具分析


扫码白嫖视频+工具+进群+靶场等资料


几款web指纹识别工具分析

 


几款web指纹识别工具分析

 扫码白嫖


 还有免费的配套靶场交流群

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月11日23:29:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   几款web指纹识别工具分析https://cn-sec.com/archives/1599399.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息