lua代码审计记录

某3C G3系列 REC 路由器

在网上翻着翻着 翻到lua的源码 那就审审看 意外发现一个老版本固件中存在的洞

该洞只存在于老版本固件中!!!!!

1、利用条件 登录

该漏洞存在与后台的 tracert中 访问该路由需要登录 在登录时 有的用户会把 密码放到提示中 利用该条件可以正常登录后台

同时 在验证码方面 在访问验证码的url后会直接返回 密码提示、验证码结果

image-20240222205351228

2、rec

后台地址:系统工具-网络诊断-Tracert

image-20240420214706798

其他版本

image-20240420214432778

url:/cgi-bin/luci/admin/systemTools/networkDiag/tracert/gettracert

直接修改hostName即可

image-20240222205534736

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、修复建议

升级最新版固件

不要暴露在公网