python指纹识别_python安全编程之指纹识别
什么是cms
CMS是Content Management System的缩写,意为"内容管理系统",这是百度百科的解释,意思是相当于网站的建站模板,整个网站架构已经集成好了,只需要你部署和安装,便可以搭起一个网站,这样虽然方便了开发人员建设网站,但也带来新的安全问题,如果cms本身有安全问题如一些高危漏洞,那么使用这个cms的所有网站都会存在这种安全漏洞,所以我们在进行渗透测试的时候,如果可以探测出网站使用的框架,那么我们便可以寻找这个框架的漏洞,从而成功拿下这个网站,所以在渗透过程中,探测网站的cms是一件很重要的事,网上有开源的常见的cms的字典库,我们可以手写一个cms识别程序来对cms进行识别,方便我们进行渗透。
常见的指纹识别方式
1、特定文件的MD5
一些网站的特定图片文件、js文件、CSS等静态文件,如favicon.ico、css、logo.ico、js等文件一般不会修改,通过爬虫对这些文件进行抓取并比对md5值,如果和规则库中的Md5一致则说明是同一CMS。这种方式速度比较快,误报率相对低一些,但也不排除有些二次开发的CMS会修改这些文件。
2、正常页面或错误网页中包含的关键字
先访问首页或特定页面如robots.txt等,通过正则的方式去匹配某些关键字,如Powered by Discuz、dedecms等。
或者可以构造错误页面,根据报错信息来判断使用的CMS或者中间件信息,比较常见的如tomcat的报错页面。
3、请求头信息的关键字匹配
根据网站response返回头信息进行关键字匹配,whatweb和Wappalyzer就是通过banner信息来快速识别指纹,之前fofa的web指纹库很多都是使用的这种方法,效率非常高,基本请求一次就可以,但搜集这些规则可能会耗时很长。而且这些banner信息有些很容易被改掉。
根据response header一般有以下几种识别方式:
查看http响应报头的X-Powered-By字段来识别;
根据Cookies来进行判断,比如一些waf会在返回头中包含一些信息,如360wzws、Safedog、yunsuo等;
根据header中的Server信息来判断,如DVRDVS-Webs、yunjiasu-nginx、Mod_Security、nginx-wallarm等;
根据WWW-Authenticate进行判断,一些路由交换设备可能存在这个字段,如NETCORE、huawei、h3c等设备。
4、部分URL中包含的关键字,比如wp-includes、dede等URL关键特征
通过规则库去探测是否有相应目录,或者根据爬虫结果对链接url进行分析,或者对robots.txt文件中目录进行检测等等方式,通过url地址来判别是否使用了某CMS,比如wordpress默认存在wp-includes和wp-admin目录,织梦默认管理后台为dede目录,solr平台可能使用/solr目录,weblogic可能使用wls-wsat目录等。
5、开发语言的识别
web开发语言一般常见的有PHP、jsp、aspx、asp等,常见的识别方式有:
通过爬虫获取动态链接进行直接判断是比较简便的方法。
asp判别规则如下]*?href=(‘|”)[^http][^>]*?\.asp(\?|\#|\1),其他语言可替换相应asp即可。
通过X-Powered-By进行识别
比较常见的有X-Powered-By: ASP.NET或者X-Powered-By: PHP/7.1.8
通过Set-Cookie进行识别
这种方法比较常见也很快捷,比如Set-Cookie中包含PHPSSIONID说明是php、包含JSESSIONID说明是java、包含ASP.NET_SessionId说明是aspx等。
下面是我在github上找到的一个大佬写的cms脚本识别工具(自己写的就不放了,惨不忍睹),大佬写的很好,可以当做生产力工具来使用了。
import json#字典为json文件格式
importthreadingimportrequestsimport hashlib#用于md5加密
from concurrent.futures importThreadPoolExecutor, as_completed, FIRST_EXCEPTION, wait, ALL_COMPLETEDfrom optparse importOptionParser#查找cms静态文件,并计算哈希值,获取静态文件的url相对路径,根据此生成cms特征集
threadingLock=threading.Lock()
show_count=0
SCAN_COMPLATED=Falsedef md5encode(text):#将关键字md5加密
m =hashlib.md5()
m.update(text.encode("utf-8"))returnm.hexdigest()defcheck_file_is_ok(url, path):"""head 请求方式去判断文件是否存在, 减少正文响应时间
:param url:
:param path:
:return:"""target= url + path#拼接url和路径
r =requests.head(target)if r.status_code == 200:#判断页面状态码
returnTruereturnFalsedefget_request_md5(url, path, pattern):"""通过请求路径获取内容的md5
:param url:
:param path:
:param pattern:
:return:"""target= url +path
r=requests.get(target)
r_md5=md5encode(r.text)if pattern ==r_md5:returnTruereturnFalsedefload_cms_fingers(fingers):"""加载CMS指纹
:return:"""with open(fingers) as f:
data=json.load(f)print("Update Time: {}".format(data.get("update_time")))print("CMS Fingers Count: {}".format(len(data['data'])))return data['data']defread_url_file_to_list(filename):"""读 URL 文件为列表
:param filename:
:return:"""with open(filename) as f:return [x.strip() for x inf.readlines()]defcheck_thread(item):global show_count#在函数中调用全局变量
globalSCAN_COMPLATED
url, finger=item
path= finger.get("path")
path= path if path[0] == "/" else "/" +path
threadingLock.acquire()
show_count+= 1
if notSCAN_COMPLATED:print('\r', "扫描进度 {}/{}".format(show_count, fingers_count), end='', flush=True)
threadingLock.release()ifcheck_file_is_ok(url, path):
match_pattern= finger.get("match_pattern")
result=get_request_md5(url, path, match_pattern)ifresult:
threadingLock.acquire()if notSCAN_COMPLATED:print("\nHint CMS名称: {}".format(finger.get("cms")))print("Hint 指纹文件: {}".format(finger.get("path")))print("Hint Md5: {}\n".format(finger.get("match_pattern")))
SCAN_COMPLATED=True
threadingLock.release()raise Exception("任务结束")
threadingLock.release()if __name__ == '__main__':
usage= "%prog -u \"http://xxxx.com\" -t threads_number"parser= OptionParser(usage=usage)print("指纹识别------2.0")
parser.add_option("-u", "--url", dest="url", help="目标URL")
parser.add_option("-f", "--file", dest="file", help="url文件", default=None)
parser.add_option("-s", "--fingers", dest="fingers", help="指定指纹文件", default="fingers_simple.json")
parser.add_option("-t", "--threads", dest="threads", type="int", default=10, help="线程大小, 默认为 10")
options, args=parser.parse_args()if not options.url and notoptions.file:
parser.print_help()
exit(0)
fingers=load_cms_fingers(options.fingers)ifoptions.file:
urls=read_url_file_to_list(options.file)else:
urls=[options.url]for url inurls:
SCAN_COMPLATED=False
show_count=0print("扫描目标: {}".format(url))
fingers_count=len(fingers)
executor= ThreadPoolExecutor(max_workers=options.threads)
tasks= [executor.submit(check_thread, ((url, finger))) for finger infingers]
wait(tasks, return_when=FIRST_EXCEPTION)for task inreversed(tasks):
task.cancel()
wait(tasks, return_when=ALL_COMPLETED)
大佬的脚本是将cms的md5特征值以json格式存储为一个字典,调用字典对网站进行检测,同时还加入了验证机制,验证文件是否存在,减少响应时间等。大家可以学习下。
很多时候我们习惯用云悉等在线工具对cms进行识别,手写的这种脚本可能因为识别速度和精度问题比不上在线的工具强大,但是我们还是需要尝试手写一些工具,对于工具,我们不仅要会用,还要深挖其原理,尝试自己写,不能停留在脚本小子,等到技术积累到一定程度,我们手写的工具也可以成为生产力。
python指纹识别_python安全编程之指纹识别相关推荐
- python udp通信_Python网络编程(三)
回顾 在<Python进阶记录之网络编程(二)>中,我们介绍了UDP端口号的基本概念和作用以及Python中UDP服务端的端口绑定和简单创建.今天我们利用UDP server和UDP cl ...
- tensorflow+python flask进行手写识别_python+flask搭建CNN在线识别手写中文网站!简直太屌了!...
原标题:python+flask搭建CNN在线识别手写中文网站!简直太屌了! 使用python+flask搭建的一个网站,然后从网页的写字板上获取鼠标手写的汉字经过转码后传回后台,并经过图片裁剪处理之 ...
- python图像识别系统_Python图像处理之图片文字识别功能(OCR)
OCR与Tesseract介绍 将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同的几 ...
- python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...
python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...
- python编写函数_python函数式编程
函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是"怎么干",而函数函数式编程的思考方式是我要"干什么". 至于函数式编程的特点 ...
- python 线程同步_Python并发编程-线程同步(线程安全)
Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...
- python线程唤醒_Python 并发编程(一)之线程
常用用法 t.is_alive() Python中线程会在一个单独的系统级别线程中执行(比如一个POSIX线程或者一个Windows线程) 这些线程将由操作系统来全权管理.线程一旦启动,将独立执行直到 ...
- python高级应用_Python高级编程技巧
Python 高级编程技巧 本文展示一些高级的 Python 设计结构和它们的使用方法.在日常工作中,你可以根据需要 选择合适的数据结构, 例如对快速查找性的要求. 对数据一致性的要求或是对索引的要求 ...
- python作品阐述_Python网络编程基础的作品鉴赏-
Python网络编程基础的作品鉴赏 Python网络编佳入门图书!175个完整,实践出真知,SocketsDNS.Web Service.FTP.Email.SMTP.POP.IMAP.SocketS ...
最新文章
- android 字体上添加横线,字体下面添加下划线
- python subprocess库 终端命令行命令
- python 执行报错AttributeError: 'list' object has no attribute 'g'
- java中sleep()、wait()相同与不同详解
- 服务发现 - consul 的介绍、部署和使用
- python数据分析包pandas_Python 数据分析包:pandas 基础
- linux java 查找进程中的线程
- 任务调度及远端管理(基于Quartz.net)
- 冠榕智能灯光控制协议分析(controller-node)
- 无限踩坑系列(6)-mySQL数据库链接错误
- 仿Jquery链式操作的xml操作类
- flex布局_flex布局的 flex(felx-grow、flex-shrink、flex-basis)详解
- python查找客户总金额_该程序查找需要支付给所有表现良好的Python的最低金额
- JZ46把数字翻译成字符串
- [转载] Python字符串的截取
- 回顾︱时间序列预测与分解有哪些模型?(一)
- 6N137S周边电阻选择和传输速率(在开关特性中有描述,上升时间下降时间等参数)
- HTML特效代码大全(完整)
- Kibana server is not ready yet
- 用python做一个飞机大战(一)