Python 黑客——使用Python破解门禁系统

如何使用Python破解门禁系统

前言

Solesec白帽团队楚轩大校原创文章

正文

说起黑客,从小的我就觉得黑客很炫酷,我以前经常看小说,说的一般就是一个黑客一下子就可以把监控啊啥的黑掉。还可以让所有的门一瞬间打开。和同学合作忙了好几天,终于做到了使用python让整栋楼的门一瞬间全部打开且都关不上。事情从头说起。

我们这学期有python课,期末考试说的是用python来做一个项目进行答辩。我们学校有一个信息安全工作室,我一般就在里面学习,但是经常有人来敲门,就觉得很麻烦,就想做一个开门的东西,点一下就开门。我这里先给大家讲一讲我自己一年以来对物联网的一些经验。

一般来说,学校啊,大企业啊都会有门禁系统,指纹系统,监控系统。这三个系统都是必备的,现在普遍大家都在搞web安全,但是会忽略很多其他地方的安全,我今天主要以门禁来讲。门禁系统现在一般都是用的物联网,也就是说那个门禁机是有ip地址的。先说一下开门的逻辑。刷卡——>门上的电磁铁断电——>断电之后电磁铁失去功效——>开门。大概理论就是这样,但是既然是物联网,管理员一般使用的是一个集成的门禁管理系统或者一个集成的监控系统来统一管理监控和门禁。但是忽略了一点,每一个摄像头,每一个门禁机,都会有一个独立的ip地址,管理员往往把集成管理平台的安全保障的很好,但是往往会忽略这一个个设备独立的ip地址。听不懂?没关系,我上两张图。

看到了吗?一图很明显是管理员用来管理的,这个的密码啊验证码啊啥的防护的非常非常严格。但是管理员往往忽略了这些单独的摄像头。单独的物联网设备也会有一个属于自己的独立的ip地址,当然这是在内网。

监控是这样,门禁系统也是如此。

这个图明显的是一个管理员用来管理的cs端,这是门禁系统,这个cs端管理了所有的门禁系统,但是管理员常常也会忽略这些单独门禁系统的bs端的安全,通过扫描80端口开放的方法大概花一周时间便可以找到这些存在于内网的单独的设备。

这便是单独的门禁机的ip的web管理界面。这些单独的机器设备一般在大企业的内网里面会有成百上千台。花一两天时间扫描一下端口便会把他们暴露出来。管理员常常只会注重集中管理的设备的安全而不会注重这些单独一个一个的设备的安全。

重点

这个时候正题来了。这篇文章的主题是python黑客。当然会用python来搞点好玩的东西用来期末答辩。思路如下。看到那个图里的远程开门没,要利用的东西就是这个。首先是知道这个单独的机器的登陆账号密码。密码很简单,就是默认的弱口令。进去之后使用python发http请求,就是python模拟登陆一下,然后模拟点击那个远程开门。门就可以开了。但是这肯定远远不够,可以来个大胆的想法,如果我们加一个循环呢?是不是门就一直开了关不掉了。再然后我们是不是可以把多个设备一起发http请求,让所有的门都一直开着关不掉?当然可以,但是物联网设备和普通的模拟登陆不一样。我们需要先分析他的逻辑工作过程,这个很重要很重要,我就是在这个问题上卡了好几天最后去问师兄才解决。

首先来分析一下这个门禁机的工作流程。使用burpsuite来分析他的请求,我这里就直接说我得出的结论了,大家如果要对不同的设备做操作一定要用burpsuite来分析逻辑流程。

首先来到登陆框,这里直接刷新

这个时候我没有登陆。只是单纯的刷新了一次。注意这里有一个cookie:sessionid=15xxxx,这是一个递增的数,我最开始没有注意他,所以一直导致模拟登陆失败。此时我输入正确的账号密码然后点击登陆,抓包。

这里可以知道/csl/check 这个文件处理我们传去的username和password。但是这个cookie依然是我们刚刚那个,这里我直接说大量测试之后的结论。在访问这个页面的时候就会给你一个sessionid,如果登陆成功,那么这个sessionid就会生效,如果登陆失败,那么这个sessionid就会无效。所以,一旦登陆成功,那么我们的请求里如果带有这个一进网页就给我们的,并成功登陆了的sessionid,就可以操作登陆后的操作,也就是开门。这句话有点绕,可以仔细多读几遍。

现在来验证一下得出的结论是不是真的。我刚刚图里的sessionid是1514067318。我刚刚登陆成功了,我现在退出登陆,重新乱输一个密码,然后直接访问一下登陆后的页面。

这账号密码很明显是乱输入的,但是注意观察,我们的sessionid并没有变化。这个web是用csl/check这个文件来验证账号密码是否正确的,刚刚我们用这个sessionid=1514067318已经成功登陆了一次,已经可以用这个sessionid来做登陆后的操作了,现在如果乱输入密码,再点登陆,sessionid没有变,但是密码是错误的,所以过不了check这一关。

但是,我刚刚说过了。我花了大量时间来验证这个网站的逻辑流程,当我们一访问这个网站的时候就会同时获取一个sessionid,如果登陆成功,sessionid便可以用来访问登陆后的界面,并保持一段时间都可以访问登陆后的界面。如果失败,那这个sessionid便没有用了。好了这个时候我们换一个浏览器来验证我的猜想。

看这里 menu是登陆后才能访问的界面。我直接换了浏览器去访问这个界面,sessionid已经变化,所以他直接给我谈回了登陆界面。但是,如果我把这个sessionid改成刚刚另一个浏览器成功登陆的sessionid 1514067318 呢?

看到没。我直接就进来了,然后此时刷新一下发现sessionid是我们后来重新获取的,这个sessionid是没有权限访问这个登陆后的界面的(因为这个sessionid没有用正确的账号密码登陆过)。所以一刷新他又会弹回登陆界面。

结论

好了说了这么多,最终的结论就是,这个网站在一访问的时候就会获取到一个sessionid,如果用这个sessionid成功登陆了,那么这个sessionid将被服务端认定为可以访问登陆后内容的sessionid,带上这个sessionid,就可以任意访问那些登陆后的界面。

这个web和其他登陆类网站最大的区别就是,其他很多登陆类网站在登陆成功后由服务端返回一个cookie给你。然后你就可以用这个cookie去访问登陆后的页面。但是这个网站就不一样了,这个网站在你一访问的时候就会给你一个cookie,如果登陆成功,那么这个cookie便会生效成为可以访问登陆界面之后的cookie。

所以这个python模拟登陆的代码 就不能和普通的模拟登陆一样,就要这样写,先访问一次网页直接获取cookie。然后把这个cookie放在header头里面。然后再用正确的账号密码登陆,此时这个header头的cookie就生效了,就可以使用这个sessionid来访问登陆后的界面了!自然可以做开门的操作了。然后无限循环,就可以让这个门关不了,然后把整栋楼的这个设备的ip都加进去。嘿嘿嘿。。。。。

代码如下,这个代码仅供参考,只能给我们这里的门禁机一直发开门请求,不同设备处理请求和验证cookie的方法是不一样的,所以我刚刚写了那么多来分析这个设备处理参数的逻辑流程,把逻辑流程弄懂了才能写出适合对应设备的代码

代码

python3环境,需要安装requests模块

import requests
import socketimport jsonfrom urllib import requestfrom http import cookiejardef get_cookie():                                        cookie = cookiejar.CookieJar()    h = request.HTTPCookieProcessor(cookie)    o = request.build_opener(h)    res = o.open('http://xx.xx.xx.xx')    c = requests.utils.dict_from_cookiejar(cookie)    a = c['SessionID']    the_cookie = 'SessionID=' + a    return the_cookiedef dl(headers,data):    url = 'http://xx.xx.xx.xx/csl/check'      #这个check是处理输入账号密码的文件    kaim_url = 'http://xx.xx.xx.xx/form/Device?act=9'                                             #这个是开门用的地址,就是一登陆进去点一下这个链接门就会开    s = requests.session()    r = s.post(url, headers=headers, data=data)    text_url = 'http://xx.xx.xx.xx/csl/menu'     #menu是登陆之后的那个界面    t = s.get(text_url, headers=headers)    q = s.get(kaim_url, headers=headers)if __name__=='__main__':        cookies = get_cookie()    headers = {'Host': 'xx.xx.xx.xx','Cookie': cookies}    data = {'username':'账号','userpwd':'密码'}    while True:     #一直发请求让门一直开        sss = dl(headers, data)        print('开门成功!')

原文发布于微信公众号 - 网络安全社区悦信安(yuexin_an)

原文发表时间:2017-12-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏友弟技术工作室

全平台最佳密码管理工具大全:支持 Windows、Linux、Mac、Android、iOS 以及企业应用

原文 当谈到网络安全的防护时,从各种网络威胁的角度来看,仅安装一个防病毒软件或运行一个安全的 Linux 操作系统,并不意味你就是足够安全的。

1.7K110
来自专栏性能与架构

服务器被入侵的教训

今天一台服务器突然停了,因为是阿里云的服务器,赶紧去阿里云查看,发现原因是阿里云监测到这台服务器不断向其他服务器发起攻击,便把这台服务器封掉了 明显是被入侵做...

69470
来自专栏ImportSource

NoSQL-ReadConsistency-读取一致性

翻译内容: NoSQL Distilled 第五章 Consistency 一致性 作者简介: ? 本节摘要: 一致性向来是分布式...

34750
来自专栏腾讯技术工程官方号的专栏

WEB加速,协议先行 ( 下)

本文分享了 STGW 及腾讯云 CLB 在 WEB 协议优化过程中的实践经验,并对WEB协议的未来进行了探讨分析。

66730
来自专栏大宽宽的碎碎念

实现一个靠谱的Web认证两种认证JWT怎么存储认证信息防止CSRF总是使用https认证信息不应该永久有效总结一下

536100
来自专栏魏艾斯博客www.vpsss.net

魏艾斯博客重装 CentOS 系统和添加 Let’s Encrypt 免费 SSL 证书过程全记录

30630
来自专栏Python、Flask、Django

【转】python 相见恨晚的第三方类库

18320
来自专栏DannyHoo的专栏

iOS开发中使用try catch获取程序崩溃原因

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

29030
来自专栏逸鹏说道

Stack Overflow 2016最新架构探秘

这篇文章主要揭秘 Stack Overflow 截止到 2016 年的技术架构。   首先给出一个直观的数据,让大家有个初步的印象。   相比于 2013 ...

34170
来自专栏码农阿宇

利用1.1.1.1进行DNS网络加速,仅需2分钟让网络更快

NEWS 近日,Cloudflare 和 APNIC联合推出了1.1.1.1DNS网络加速。 Cloudflare 运行全球规模最大、速度最快的网络之一。APN...

82950

扫码关注云+社区

领取腾讯云代金券