当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0154775

漏洞标题:小米路由器过滤不严可root权限修改启动项开ssh

相关厂商:小米科技

漏洞作者: New4

提交时间:2015-11-21 18:34

修复时间:2015-12-17 14:48

公开时间:2015-12-17 14:48

漏洞类型:设计不当

危害等级:低

自评Rank:1

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-11-21: 细节已通知厂商并且等待厂商处理中
2015-11-24: 厂商已经确认,细节仅向厂商公开
2015-11-27: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2016-01-18: 细节向核心白帽子及相关领域专家公开
2016-01-28: 细节向普通白帽子公开
2016-02-07: 细节向实习白帽子公开
2015-12-17: 细节向公众公开

简要描述:

小米路由器过滤不严可root权限修改启动项开ssh,攻击者通过绕过修改替换rc.local实现开启ssh获取路由器root控制权。

详细说明:

涉及文件:
r1d(2.8.16)\usr\lib\lua\luci\controller\service\datacenter.lua
r1d(2.8.16)\usr\sbin\thrifttunnel elf执行文件
THRIFT_TUNNEL_TO_DATACENTER = "thrifttunnel 0 '%s'"
entry({"api", "xqdatacenter", "request"}, call("tunnelRequest"), _(""), 301)
function tunnelRequest()
local XQCryptoUtil = require("xiaoqiang.util.XQCryptoUtil")
local payload = XQCryptoUtil.binaryBase64Enc(LuciHttp.formvalue("payload"))
local cmd = XQConfigs.THRIFT_TUNNEL_TO_DATACENTER % payload
local LuciUtil = require("luci.util")
LuciHttp.write(LuciUtil.exec(cmd))
end
function upload()
local fp
local log = require("xiaoqiang.XQLog")
local fs = require("luci.fs")
local tmpfile = "/userdisk/upload.tmp"
if fs.isfile(tmpfile) then
fs.unlink(tmpfile)
end
local filename
LuciHttp.setfilehandler(
function(meta, chunk, eof)
if not fp then
if meta and meta.name == "file" then
fp = io.open(tmpfile, "w")
filename = meta.file
filename = string.gsub(filename, "+", " ")
filename = string.gsub(filename, "%%(%x%x)",
function(h)
return string.char(tonumber(h, 16))
end)
filename = filename.gsub(filename, "\r\n", "\n")
end
end
if chunk then
fp:write(chunk)
end
if eof then
fp:close()
end
end
)
local path = LuciHttp.formvalue("target")
if string.match(path, "\/$") == nil then
path = path .. "/"
end
fs.mkdir(path, true)
local savename = filename
if fs.isfile(path .. savename) then
local basename = savename
local index = basename:match(".+()%.%w+$")
if index then
basename = basename:sub(1, index - 1)
end
local extension = savename:match(".+%.(%w+)$")
for i = 1, 100, 1 do
local tmpname = basename .. "(" .. i .. ")"
if extension then
tmpname = tmpname .. "." .. extension
end
if not fs.isfile(path .. tmpname) then
savename = tmpname
break
end
end
end
local dest = path .. savename
log.log(3, "dest=" .. dest)
fs.rename(tmpfile, dest)
local result = {}
result["code"] = 0
LuciHttp.write_json(result)
end
关键api函数,参数无过滤带入thrifttunnel 0 '%s'执行。 可实现文件复制及替换功能 详见exp。

漏洞证明:

通过:/api/xqdatacenter/request实现文件复制及替换备份。
在:/api/xqdatacenter/upload实现文件上传功能。
后通过/api/xqdatacenter/request,实现替换开机/etc/rc.local脚本实现命令间接执行。
导致攻击者获取ssh权限或实现木马植入。

openwrt 实现启用dropbear ssh功能
nvram set ssh_en=1
nvram set uart_en=1
nvram commit
sed -i ":x;N;s/ssh_en/lan_stp/;b x" /etc/init.d/dropbear
sed -i ":x;N;s/version.CHANNEL/version.ROM/;b x" /etc/init.d/dropbear
/etc/init.d/dropbear start


确定影响版本:小米路由器(R1D)ROM 2.0 稳定版 版本2.8.16(10月16日更新)
其他版本未测试

修复方案:

web参数过滤或elf执行命令检查

版权声明:转载请注明来源 New4@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-11-24 16:40

厂商回复:

需要管理员身份,漏洞利用有一定限制。感谢提交!

最新状态:

暂无