极路由安全设计分析姐妹篇

开篇想说两件事情:

一、非常感谢Freebuf大牛们,在其提供的网站上找到了HiWiFi固件、其中9003版本squashfs文件系统上的lua代码没有经过预编译处理,这对我们基于源码分析极路由提供了可能。地址

二、经过修炼发现HiWiFi固件解压问题,其实可以使用Windows操作系统下面的开源软件7zip解压。

那么,本期的重点是分析HiWiFi lua源码安全设计部分。

0×01 分析思路

一、了解OpenWRT Web认证过程。

二、了解HiWiFi web认证过程和HiWiFi Cloud 之间的通讯认证分析。

0×02 分析过程

测试工具:源代码阅读使用luaEdit。连接openwrt查看目录软件winscp ,因为有些文件是认证后才产生的。



一、了解OpenWRT Web认证过程。

  1.1、搭建OpenWRT虚拟运行环境

  1.2、网络分析结合lua源代码分析,了解其认证过程。

搭建OpenWRT虚拟机运行环境,下载x86架构的openWRT.vmdk文件,就强调一点如果你只使用一块无线网卡搭建环境,会失败,因为OpenWRT需要两个不同的网络LAN、WAN。

OpenWRT主要是通过内建的web服务器uHttpd配合lua脚本语言实现B/S互交。

通过抓包软件抓取交互数据包,如下:

POST http://192.168.1.10/cgi-bin/luci HTTP/1.1
Host: 192.168.1.10
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.10/cgi-bin/luci
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
username=root&password=123qwe
GET http://192.168.1.10/cgi-bin/luci/;stok=f10e9261c036d0c97db82c5eee568b34?status=1&_=0.4118332080369933 HTTP/1.1
Host: 192.168.1.10
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.10/cgi-bin/luci
Cookie: sysauth=ae896241b40cf93dbf079c08acaeffcd
Connection: keep-alive

通过web界面提供的账号和密码,返回用户在web端保持通讯的token.

stok=f10e9261c036d0c97db82c5eee568b34

和客户端认证的cookie。

Cookie: sysauth=ae896241b40cf93dbf079c08acaeffcd 时间产生cookies.

然后使用winscp登录到OpenWRT上查看文件,会发现整个登录调用文件流程如下:

通过ccache.lua处理,发现服务器端变化:/tmp/luci-sessions 产生f10e9261c036d0c97db82c5eee568b34 一个文件(session)

该文件存储一个预编译lua脚本,主要是映射的登录用户名和token的对应关系。

Json数据形式(保存的数据库形式):

return { ["secret"] = "bb8d42ed6c097b6f16ea698b22f7b0e1",
["token"] = "f10e9261c036d0c97db82c5eee568b34",
["user"] = "root" }
/usr/lib/lua/luci/ccache.lua

涉及到加密算法 16进制输出。encoded = encoded .. ("%2X" % string.byte(name, i))

由于源码太多没全部写出来,大家可以参考相关的bin文件中的代码。

然后查看:/usr/lib/lua/luci/dispatcher.lua 是怎么处理登录的:发现authenticator.htmlauth 函数。

function authenticator.htmlauth(validator, accs, default)
    local user = luci.http.formvalue("username")
    local pass = luci.http.formvalue("password")

    if user and validator(user, pass) then
         return user
    end

    require("luci.i18n")
    require("luci.template")
    context.path = {}
    luci.template.render("sysauth", {duser=default, fuser=user})
    return false

end

validator{},主要是通过对提交的密码做MD5对比校验,如果匹配则返回真。

Sysauth具体怎么产生的呢?

通过查询/usr/lib/lua/luci/sauth.lua

关键代码:

sessiontime = tonumber(luci.config.sauth.sessiontime) or 15 * 60

local function _checkid(id)
    return not not (id and #id == 32 and id:match("^[a-fA-F0-9]+$"))
end

--- Write session data to a session file.
-- @param id Session identifier
-- @param data    Session data table
function write(id, data)
    if not sane() then
         prepare()
    end

    assert(_checkid(id), "Security Exception: Session ID is invalid!")
    assert(type(data) == "table", "Security Exception: Session data invalid!")

    data.atime = luci.sys.uptime()

    _write(id, luci.util.get_bytecode(data))
end

从上面代码可以看出session生成和时间有关,要想破解这个需要通过系统时间遍历。有点难度呀。

当然在极路由上 我发现在这之前会有一个函数调用   authenticator{}; 但是在lua代码中没有找到具体的函数编写内容,后来通过luaedit工具做全文内容检索发现。在libauth.so文件中。这个在最后章节讲解。

小结:可以看出,只有认证通过了才会在openwrt上产生服务器端token,保存在uhttpd服务器的本地文件中。整个过程基本上无法伪造,登录验证体系比较安全,当然也有漏洞,包括遍历密码尝试等。

 

二、了解HiWiFi web认证过程和HiWiFi Cloud 之间的通讯认证分析。

我申请了极路由的root权限通过winscp登录查看其目录新产生的文件。本来想逆向lua最新的源代码unlua 和luadec 两个开源的反编译工具都无法通过,所以只好看H5661-9003版本软件。

GET /cgi-bin/turbo/;stok=7523cc581c1bccca1db1ea1866c90b95/api/system/check_network_connect?_=1440172033296 HTTP/1.1
Host: 192.168.199.1
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36
Referer: http://192.168.199.1/cgi-bin/turbo/admin_web
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
Cookie: sysauth=d4b90df6bee107655b1672c244dd8b75; is_mobile=0

整个过程和openwrt类似,但是做了一些改动。把路径改变成:/cgi-bin/turbo/admin_web,然后推送ajax 脚本检测相关内容。

改进部分:

(1)通过云端参与密钥生成。

LOCAL_KEY='oLKmbg1g'
APP_LOGIN_AUTH_FILE='/etc/app/appcloudkey'

putkey() {
  echo "$1" | grep -q -E "^[a-z0-9_]+$"
  if [ $(echo $?) != 0 ]; then
    return 1
  fi
  touch "${APP_LOGIN_AUTH_FILE}"
  echo "$1" >"${APP_LOGIN_AUTH_FILE}"
  return 0
}

validate() {
  userkey="$1"
  randkey="$2"
  echo "${userkey}" | grep -q -E "^[a-f0-9]{32}$"
  if [ $(echo $?) != 0 ]; then
    echo false
    return 1
  fi
  echo "${randkey}" | grep -q -E "^[a-f0-9]{8,}$"
  if [ $(echo $?) != 0 ]; then
    echo false
    return 1
  fi
  touch "${APP_LOGIN_AUTH_FILE}"
  key=$(cat "$APP_LOGIN_AUTH_FILE")
  echo "${key}" | grep -q -E "^[a-z0-9]+$"
  if [ $(echo $?) != 0 ]; then
    echo false
    return 1
  fi
  sign=$(echo -n "$LOCAL_KEY""${key}""${randkey}"|md5sum|awk '{print $1}')
  if [ ${userkey} == "${sign}" ] 2>/dev/null; then
    echo true
    return 0
  fi
  echo false
  return 1
}

(2)增加登录重试次数限定(10次)。通过校验/tmp/loginerrnum 存储的次数

local loginlock_time = 10
function up_loginlock()
local num = fs.readfile("/tmp/loginerrnum") or 0
num=num+1
fs.writefile("/tmp/loginerrnum", num)
end
function unset_loginlock()
fs.writefile("/tmp/loginerrnum", 0)
end
function get_loginlock()
local num = fs.readfile("/tmp/loginerrnum") or 0
return num
end

function authenticator.jsonauth(validator, accs, default)
if user and validator(user, pass) and user~="root" then
luci.util.unset_loginlock()
return user
end
context.path = {}
local json_msg = '{"code":"99999","msg":"not auth."}'
luci.http.write(json_msg)
return false
end

(3)对openapi调用设置沙盒权限,以及更为严格的token获取方式。

在 /usr/lib/lua/luci/dispatcher.lua 中

authenticator{};没找到实现的方法。

通过查询目录发现usr/lib/libauth.so 可能存在认证信息。然后把它丢到IDA中。选择MIPS little endian

先通过cache_load_token_v3读取本地存储token。如果没有那么申请token

https://auth.hiwifi.com/tokenv2?app=%s&checksum=%s&name=%s&cnonce=%d&nonce=%s
checksum(校验和)、name(设备MAC地址)、
cnonce(本地产生的随机数) Cnonce  时间和加盐处理

nonce是通过云平台自动产生的,算法只有云自己知道。

这里要找的就是checksum值。

查找tw_get_uuid,通过查找发现在tw.so文件中

当然你也可以使用python语言调用so库,来测试其加密算法。

UUID是通过设备mac地址,外加一个常量123456789123 等再加上复杂的算法生成,那么由于每台设备的uuid并不相同,所以即使得到对方的MAC地址,也无法通过伪造请求来进行利用。这种多因素校验的机制,极大的保障了云平台用户的安全。

沙盒部分,其实就是现在通过openapi登录取得密钥的访问目录限制,防止二次开发人员开发恶意程序,然后数以百万路由器。

0×03 安全设计总结

可以看出,极路由从openwrt->hiwifi 9003->hiwifi 9008(目前极1s用的最多的版本),整个固件的软件安全部分设计越来越复杂。

变态的安全设计也是符合业务需求:

(1)基本安全的保障:开原版lua源代码可见,必须在发布设备前要做预编译处理。核心的算法和认证库放到so文件中。

(2)由于要做路由器软件market,那么,把云的key验证机制结合进来后,即使你破解了本地算法,云算法你不了解也白搭。

最后,为这种信息安全的工匠精神点个赞。

时间: 2024-09-19 14:38:20

极路由安全设计分析姐妹篇的相关文章

极路由怎么下载视频

  极路由器远程下载视频利用的是迅雷远程下载,因此前提是你的极路由要事先添加到迅雷远程下载设备清单,需要注意的是极路由1代不支持远程下载,极路由1S支持下载到SD,极路由2及以后型号支持下载到外部存储设备(如移动硬盘) 使用极路由器下载视频使用的是迅雷影音软件,下面介绍详细教程 极路由怎么下载视频 极路由远程下载视频教程 下载个迅雷影音(记得是影音,其他迅雷产品,例如迅雷看看对路由器支持不够给力 2.在迅雷影音里面登录之前的绑定路由器的迅雷帐号 3.找你喜欢的片子 4.选择要下到哪里 5.选择喜

极路由使用评测

  笔者入手极路由,属于"第二三批工程机用户",其实这款路由刚推出的第一时间,我已经有所动心,但并没有立即购买的冲动,因为那时我有一台运行OpenWRT的无线路由,刚刷了新固件,运行很稳定,而且可以多拨(陕西电信还是很良心的),所以不打算花199尝试这个新产品. 这是一篇非常平实的产品体验文.像极路由这样的智能路由器,看多了网上的炒作,究竟如何,笔者在使用了5个月之后,来给大家一个解答. 笔者是一个喜好折腾的人,曾经购买过FW300对其加装Flash和USB口,刷上第三方固件实现脱机下

极路由hiwifi怎么样?

笔者是一个喜好折腾的人,曾经购买过FW300对其加装Flash和USB口,刷上第三方固件实现脱机下载. 笔者入手极路由,属于"第二三批工程机用户",其实这款路由刚推出的第一时间,我已经有所动心,但并没有立即购买的冲动,因为那时我有一台运行OpenWRT的无线路由,刚刷了新固件,运行很稳定,而且可以多拨,所以不打算花199尝试这个新产品. 后来因为有事在河南住了一段时间,一个集体宿舍,不到10个人,某个用台机的哥们拉了一条4M的联通宽带,他说他有无线路由,但是不会设置.原来是一台FAST

极路由怎么屏蔽广告

  1.确保电脑(手机也是可以设置的)已经连接极路由,在电脑上打开浏览器,进入hiwifi.com,输入后台登录密码(默认admin)即可进入极路由管理后台,点击"云插件". 2.切换到"全部插件",在"加速服务"下点击"屏蔽视频广告"插件. 3.进入"屏蔽视频广告"页面,点击[免费安装]按钮就可以了. 什么都不用设置,屏蔽视频广告就已经默默进行了,不信打开个视频网站试试. 屏蔽视频广告插件相关信息[功能简

极路由怎么升级固件

  1.在电脑上用浏览器打开极路由后台管理地址hiwifi.com,输入后台设置登录密码(默认admin)进入极路由管理后台.有更新时,系统状态右上角会显示一个黄色叹号,点击"系统状态"图标. 2.在系统状态界面点击"现在升级". 3.在"路由器固件自助升级也难"往下滑动到底部,点击[下载并安装]按钮. 4.极路由会自动下载新版固件并进行升级,这时千万不要把路由器电源给断了,同时也不要进行其他操作,耐心等待升级完成即可.

极路由手机客户端怎么用

  在使用极路由客端之前需要把你的路由器与极路由的的硬件绑定才可以使用手机客户端进入远程操作.下载好客户端软件以后点击进入并且登陆到极路由. 登陆成功以后就可以操作操作极路由的相关设置,我使用比较多的是我查查,其它的相关功能使用的比较少我就不演示了.说一下这一个功能是怎么样了就可以了. 我在查查看就可以看所有已连接到路由器里的设备.点击一个设备可以看到这个设备当前使用网络的情况. 进入这个设备网络流量详情,点击右上角处的三点.就可以看到更改设备名称,限速,断开网络.这三个功能是我使用最多的. 重

极路由怎么绑定解除hiwifi账号

  进入路由器以后来点击[云插件] 进入极路由云平台后就可以看到右边有一个[绑定HIWIFI账号可远程管理路由器]的字样.点击此处. 输入你的HIWIFI账号和密码点击[登录] HIWIFI账号密码成功能登陆就会自动完绑定. 点击路由器信息,就可以看到绑定者:XXX点击[解除绑定]这样就解除了路由器与HIWIFI账号的绑定.解除绑定以后极路由器客户端就不能控制操作中极路由.

极路由如何防止别人盗用无线网络

  以下是小编为大家收集整理的<极路由如何防止别人盗用无线网络>全部内容,如果您喜欢小编的推荐,请继续关注学习啦. 为防止别人盗用你的无线网络,建议您设置高安全等级加密方法:WPA-PSK/WPA2-PSK安全类型,有效防止蹭网. 极路由以用户需求为设计理念,硬件部分采用高端材质,100%无铅,全贴片元件,蓝色阻焊漆,更安全,更环保,全铝合金壳体,散热性极佳,美观时尚.软件部分首创1+X加速引擎,内置8G/16G存储空间,提供完美的加速服务;首创市场平台,聚合各类应用,使得路由器真正智能化;手

极路由的无线穿墙模式怎么用

  以下是小编为大家收集整理的<极路由的无线穿墙模式怎么用>全部内容,如果您喜欢小编的推荐,请继续关注学习啦. 在市面上,你们可以看到很多写着"穿墙王","超级穿墙王","无敌穿墙王"的产品,那么这类极路由的无线穿墙模式怎么用呢?首先,我们来了解一下它的分类,这类产品的穿墙可以分为两类: 一. 硬件设计上增加PA,放大机器的发射功率,不按照国家CCC的标准做.简称"硬穿墙",这类产品很危险,你们选用时要小心,如果厂