lua代码审计记录
某3C G3系列 REC 路由器
在网上翻着翻着 翻到lua的源码 那就审审看 意外发现一个老版本固件中存在的洞
该洞只存在于老版本固件中!!!!!
1、利用条件 登录
该漏洞存在与后台的 tracert中 访问该路由需要登录 在登录时 有的用户会把 密码放到提示中 利用该条件可以正常登录后台
同时 在验证码方面 在访问验证码的url后会直接返回 密码提示、验证码结果
2、rec
后台地址:系统工具-网络诊断-Tracert
其他版本
url:/cgi-bin/luci/admin/systemTools/networkDiag/tracert/gettracert
直接修改hostName即可
3、代码分析:
文件路径:\usr\lib\lua\luci\controller\admin\tracert.lua
关键方法:get_tracert()
关键片段:
local sourceIp = luci.http.formvalue("IP")
.........
if (sinterface ~= "AUTO") and (sourceIp ~= "AUTO") then
cmd = "traceroute -I -w 1 -i "..sDevice.." -s "..sourceIp.." -m 30 "..sHostName
elseif(sinterface == "AUTO") and (sourceIp ~= "AUTO") then
cmd = "traceroute -I -w 1 -s "..sourceIp.." -m 30 "..sHostName
elseif(sourceIp == "AUTO") and (sinterface ~= "AUTO") then
cmd = "traceroute -I -w 1 -i "..sDevice.." -m 30 "..sHostName
else
cmd = "traceroute -I -w 1 -m 30 "..sHostName
end
--[[创建tracert进程]]--
if (match == 0) and (sstartFlag == 1) then
sys.call("echo "..str.." > /tmp/tracertrecord")
sys.call("lua /usr/libexec/adapter/pingtracertfunc.lua "..cmd.." &")
sys.call("sleep 1")
end
由此可得 在后端接受数据后 直接拼接shell指令导致的
在最新版固件中 加了check_Host函数用于检测输入的正确性
function check_Host(HostName)
local checkresult = 1 --[[1:表示合法 0:表示不合法]]--
local cut_tab = {}
local i = 0
if HostName == nil then
checkresult = 0
return checkresult
end
if string.find(HostName, "^[%w%-%.]+$") == nil then
checkresult = 0
return checkresult
end
while true do
i = string.find(HostName,"-",i+1)
if i == nil then
break
end
cut_tab[#cut_tab+1] = i
end
if cut_tab[1] == 1 then
checkresult = 0
return checkresult
end
return checkresult
end
4、修复建议
升级最新版固件
不要暴露在公网